This file shows the changes in this release of xPDO.

xPDO 2.1.5-pl (July 5, 2011)
====================================
- [#5084] Fix various xPDO::exec() calls to check for false value properly
- [#4877] Fix nested conjunctions infecting parent conjunctions
- [#5042] Prevent additional columns defined in derivative classes being marked lazy

xPDO 2.1.4-pl (May 23, 2011)
====================================
- Default cacheFlag to true in getObject/getCollection/getIterator methods
- [#4787] Add ability to determine the table class of derivatives
- [#4772] Do not flush related objects from cache on read operations
- [#4682] Fix support for driver-specific attributes on object element in schema

xPDO 2.1.3-pl (May 3, 2011)
====================================
- [#4577] Remove calls to xPDO->log() in xPDOCacheManager->writeFile()
- Add options to xPDOCacheManager::writeFile() to allow multiple attempts when exclusive locks fail

xPDO 2.1.2-pl (March 25, 2011)
====================================
- Add xPDO->getValue() convenience method for retrieving single column from single row
- [#4128] Fix Windows drive issue in xPDOTransport->pack()
- [#4125] Fix bug getting composites in xPDOObject->getFKClass()
- [#4097] Make constraint names unique for sqlsrv
- [#4047] Fix bug adding single file to zip in xPDOZip
- [#3971] Add xPDOManager API for manipulating table structures

xPDO 2.1.1-pl2 (February 21, 2011)
====================================
- Fix error in xPDOObject->getOption() when handling option overrides

xPDO 2.1.1-pl (February 20, 2011)
====================================
- [#2909] Make auto-table creation optional
- Add options and default parameters to xPDOObject->getOption()
- [#3174] Use xPDOQuery alias to build join criteria for getMany()
- [#3342] Fix use of deprecated split() function in xPDORevisionControl
- Fix modCacheManager->writeFile() not to truncate files if a mode is specified

xPDO 2.1.0-pl2 (February 16, 2011)
====================================
- Avoid PHP warning from fopen in xPDOFileCache->get()

xPDO 2.1.0-pl (February 16, 2011)
====================================
- Add proper cache file locking and format handling
- Add OPT_CACHE_FORMAT constant to xPDO
- Add support for CACHE_SERIALIZE format in xPDOFileCache implementation
- Force flush() for multiple_object_delete option in xPDOMemCache->delete()
- Implement multiple_object_delete support in xPDOAPCCache->delete()
- Return boolean from xPDOFileCache->delete() and ->flush()
- Fix xPDOFileCache->delete() and invalid calls to cacheManager->deleteTree()
- Use APCIterator to support per instance flush()'ing in xPDOAPCCache
- Prefix all cache keys with provider key
- Fix db cache methods to be called with proper options
- Add xPDOCacheManager->refresh() to empty all active cache providers
- Fix limit with sortby functionality for sqlsrv
- Fix xPDO->literal() and add missing xPDO->$_quoteChar
- Fix date/time issues (sqlsrv)

xPDO 2.0.1-pl (December 27, 2010)
====================================
- [#2927] Add ENGINE option to xPDOManager_mysql->createObjectContainer()
- Allow columns with explicit AS, ., or ( to not be escaped
- Override xPDOQuery->parseConditions() for sqlsrv
- Use SET IDENTITY INSERT in xPDOObjectVehicle->install() (sqlsrv)
- Remove LIMIT from UPDATE in xPDOObject->save()
- Fix handling of bigint with timestamp phptype (sqlsrv)
- Set host property from server property in xPDO::parseDSN()
- Remove check for errorCode on xPDO->connect()
- [#2901] Add transient parameter to xPDO->call() for use with non-db classes

xPDO 2.0.0-pl (November 27, 2010)
====================================
- [#2788] Escape database name in xPDOGenerator_mysql::writeSchema()
- Add xPDOAPCCache implementation of xPDOCacheProvider
- Refactor usages of xPDO::getObjectLoader() to use xPDO::call()
- Add xPDO::call() allowing db-specific static method overrides
- Add xPDOWinCache implementation of xPDOCache provider
- Add workaround to drop a database for sqlsrv
- Add workaround to trim PDO::quote() results for sqlsrv
- Add virtual support for LIMIT..OFFSET to sqlsrv driver
- Set dbname property from database property in xPDO::parseDSN()
- Introduce pdo_sqlsrv driver support

xPDO 2.0.0-rc3 (October 25, 2010)
====================================
- Add xPDO::getIterator() allowing more efficient traversing of result sets
- Add script to upgrade older xPDO mysql models to SCHEMA_VERSION 1.1
- Add missing attributes in xPDOSimpleObject map index element
- Do not generate primary key index for xPDOSimpleObject derivatives
- Introduce xPDO::SCHEMA_VERSION and set it to 1.1 to distinguish new format for indexes

xPDO 2.0.0-rc2 (October 20, 2010)
====================================
- Use new index metadata in maps to generate indexes for mysql
- Fix mkdir issue in xPDOGenerator::parseSchema()
- Improve schema representation of mysql indexes in xPDOGenerator_mysql::writeSchema()
- [#2579] Fix xPDOFileVehicle not calling resolve on uninstall()
- [#2414] Fix phpdoc inaccuracy and redundant assignment
- Fix caching error in xPDOObject::loadCollectionGraph()
- Make xPDOQuery::prepare() always call construct()
- [#2401] Clarify xPDO::removeCollection() return value
- [#2419] Add defined join criteria when custom criteria is provided to xPDOObject::getMany()
- [#2416] Add :NOT IN operator support for array value bindings
- [#2404] Allow xPDOTransport::install to be aborted when an xPDOVehicle fails to install
- [#XPDO-64] Fix xPDO::logTarget not to lose options after first call to xPDO::_log()
- Fix xPDOObject::_loadInstance() to work with xPDOQuery::hydrateGraphNode() properly
- Fix bug in xPDOObject::load() when caching by primary key
- Fix bug with xPDOManager_sqlite::removeSourceContainer()
- [#XPDO-62] Make getObjectGraph() respect class_key
- Add IF EXISTS to DROP DATABASE statement in xPDOManager_mysql::removeSourceContainer()
- Add xPDO::getIndexMeta() method
- Fix invalid call to xPDOManager::getPhpType() in xPDOGenerator::writeSchema()
- [#XPDO-74] Fix bug in xPDOObject::save() when updating rows with compound primary keys
- [#XPDO-72] Fix invalid call to xPDOManager::getPhpType() in xPDOGenerator::parseSchema()
- Fix accessibility of xPDOTransport::_unpack()
- Divert excess log output from xPDOVehicle classes to LOG_LEVEL_DEBUG
- Remove extra slash in path when generating class files
- Simplify includes of parent classes
- Add xPDODriver to better abstract driver-specific attributes and behavior
- Fix several references to xPDO::$_escapeChar in xPDOQuery
- Split xPDO::$_escapeChar into $_escapeCharOpen and $_escapeCharClose
- Simplify path for require_once in platform class templates
- Trim property keys and values in xPDO::parseDSN()
- [#XPDO-66] Add xPDOTransport::ARCHIVE_WITH to allow explicit use of PclZip even if ZipArchive exists
- Add xPDO::literal() method for SQL literal strings
- Introduce pdo_sqlite driver support
- Fix exception logging in xPDOManager_mysql
- Fix xPDO::parseDSN() for sqlite DSN format
- Remove xpdo.connect.inc.php (no longer used)
- Migrate to git
- [#XPDO-46] Implement support for IN operator using array as binding
- [#XPDO-51] Fix incorrect criteria variable when caching individual rows from collections by primary key
- [#XPDO-53] Fix bug preventing save of related objects when a key owner is foreign and not new
- Refactor xPDO::getManager() and xPDOManager::getGenerator() to work with other db engines besides mysql
- Replace direct references to xPDO::$_escapeChar with new xPDO::escape()
- Move xPDOGenerator::getPHPType() to xPDOManager
- Fix non-static call to xPDO::parseDSN() in xPDO::__construct()
- Make sure db-specific connect_file exists before trying to include it
- Remove unnecessary overridden _initFields() in xPDOObject derivatives
- [#XPDO-54] Fix xPDOQuery to properly recognize MySQL Fulltext search expression as a conditional clause
- [#XPDO-52] Fix fatal error when xPDOManager::createObjectContainer() cannot prepare a PDOStatement
- xPDO::log() and xPDO::$logTarget will now accept an ARRAY target with an option that is a reference to the var
- xPDO::connect() should return false on Exception
- Ensure driverOptions is set as an empty array if the value passed is not an array
- Log PDOException messages in xPDO::connect()
- [#XPDO-49] Fix inconsistent static and non-static calls to fromJSON() and toJSON() methods on xPDO
- Added xPDO::getService to load service classes
- Commented out deprecated code in xPDOVehicle dealing with PHP validators
- Fixed typo in xPDOVehicle where $r should be $v
- [#XPDO-40] Fixed getCount to work when passing a criteria with a class alias set.
- xPDOTransport: Fix several E_STRICT errors caused by static calls to methods not defined as static.
- xPDOTransportVehicle: Implemented missing _compilePayload(), and fixed errors in _installTransport() and uninstall().
- xPDOValidator: Fix several E_STRICT errors caused by inconsistent method signatures in xPDOValidationRule::isValid() derivatives.
- Fixed bug in xPDOTransportVehicle::put() referring to xPDOFileVehicle.
- xPDOManager_mysql::createSourceContainer() and removeSourceContainer() will use provided connection properties or default to current xPDO instance configuration.
- Removed dependency on mysql extension for xPDOManager_mysql::createSourceContainer() and removeSourceContainer() implementations.
- Refactored xPDOManager to be an abstract class rather than calling static methods in derivatives.
- Added support for xPDOObjectVehicle::uninstall() to operate on related_objects.
- Fixed bug in xPDOObjectVehicle::uninstall() not getting UPDATE_OBJECT value properly.
- Added xPDOTransport::UNINSTALL_OBJECT attribute and support in xPDOObjectVehicle::uninstall() [default value is true].
- Refactored xPDOCacheManager to determine new folder/file permissions via umask().
- Modified xPDOQuery_mysql::select() to trim the comma-delimited fields specified after explode()'ing the string.
- Modified xPDOVehicle::resolve() to return true if xPDOTransport::RESOLVE_FILES is set to false with file resolver types.
- Modified xPDOFileVehicle::install() to check xPDOTransport::INSTALL_FILES is not set to false before checking for the existence of the defined fileSource.
- Fixed xPDOVehicle::resolve() and xPDOFileVehicle::install() to prevent them from attempting to preserve files that do not exist.
- Added xPDOTransport::INSTALL_FILES and xPDOTransport::UNINSTALL_FILES to make xPDOFileVehicle behavior consistent with RESOLVE_FILES and RESOLVE_FILES_REMOVE.
- Updated xPDOVehicle::resolve() to properly detect if resolved when restoring preserved file archives.
- Updated xPDO and xPDOCriteria constructors to use proper PHP5 __construct().
- Added xPDOTransportVehicle class to allow transport packages to be embedded in other transport packages.
- Updated copyright dates.
- [#XPDO-42] Fixed error with xPDOQuery::parseConditions() ignoring NULL bound values.
- Fixed xPDOCriteria::toSQL() to properly handle NULL values.
- Updated/fixed xPDOZip implementation and enabled it as the preferred zip provider for xPDOTransport.
- Made xPDOVehicle an abstract class.
- [#XPDO-4] Allow nesting conditions arbitrarily deep using simple nested array format.

xPDO 2.0.0-rc1 (LastChangedRevision: 389, LastChangedDate: 2009-12-31 11:18:40 -0700 (Thu, 31 Dec 2009))
====================================
- [#XPDO-27] Allow getCount() to work with Collection Graphs.
- [#XPDO-38] Modified xPDOQuery to determine conjunctions for condition groups based on conjunction specified for first condition in the group.
- Added changelog.txt
