瀏覽代碼

Prepare CHANGELOG.

Daniele Alessandri 13 年之前
父節點
當前提交
2c4073ecab
共有 3 個文件被更改,包括 341 次插入259 次删除
  1. 0 257
      CHANGELOG
  2. 341 0
      CHANGELOG.md
  3. 0 2
      TODO

+ 0 - 257
CHANGELOG

@@ -1,257 +0,0 @@
-v0.7.0 (2010-xx-xx)
-  * Support for long aliases (method names) for Redis commands has been dropped.
-
-  * List of the methods removed in this release:
-      - Predis\Client::create()
-        This method has been removed because it was considered redundant
-        with Predis\Client::__construct() since Predis 0.6.0.
-      - Predis\Client::pipelineSafe()
-        This method was deprecated in Predis 0.6.1 and now it has been finally
-        removed. Use Predis\Client::pipeline(array('safe' => true)).
-      - Predis\Client::rawCommand()
-        This method was removed due to interface inconsistencies with the
-        underlying connection class used internally by the client instance.
-      - Predis\Client::setProfile()
-        This method is no more part of the public API and has been made private.
-
-  * Predis now includes its own autoloader. To use it, include Autoloader.php
-    and call Predis\Autoloader::register().
-
-  * The Predis\MultiBulkCommand class has been merged into Predis\Command and
-    thus removed. If you have code that extends Predis\MultiBulkCommand but
-    you can not afford to update your code, you can always implement it again
-    as an abstract class simply by extending Predis\Command.
-
-  * The Predis\IConnection interface has been splitted in two different new
-    interfaces: Predis\IConnectionSingle and Predis\IConnectionCluster.
-
-  * Developers can now register their own classes that implements the
-    Predis\IConnectionSingle interface to handle different URI schemes such as
-    'tcp', 'unix', 'udp' or anything else. Everything is handled by the new
-    Predis\ConnectionFactory class.
-
-  * Added support for UNIX domain sockets (supported by Redis 2.2) with the new
-    Predis\UnixDomainSocketConnection class and the 'unix' scheme.
-
-  * Added the new Predis\ICommand interface. The Predis\Command class now
-    implements this interface that is used in the core bits of Predis.
-
-  * Implicit extraction of arguments when the only argument passed to a
-    multibulk command is an array is not supported anymore and must be done
-    explicitly inside Predis\Command::filterArguments().
-
-  * It is now possible to pass instances of Predis\ConnectionParameters and
-    Predis\IConnection as parameters of Predis\Client::__construct().
-
-v0.6.5 (2011-02-12)
-  * FIX: due to an untested internal change introduced in v0.6.4, a wrong
-    handling of bulk reads of zero-length values was producing protocol
-    desynchronization errors (ISSUE #20).
-
-v0.6.4 (2011-02-12)
-  * Various performance improvements (15% ~ 25%) especially when dealing with
-    long multibulk replies or when using clustered connections.
-
-  * Added the "on_retry" option to Predis\MultiExecBlock that can be used to
-    specify an external callback (or any callable object) that gets invoked
-    whenever a transaction is aborted by the server.
-
-  * Added inline (p)subscribtion via options when initializing an instance of
-    Predis\PubSubContext.
-
-v0.6.3 (2011-01-01)
-  * New commands available in the Redis v2.2 profile (dev):
-      - Strings: SETRANGE, GETRANGE, SETBIT, GETBIT
-      - Lists  : BRPOPLPUSH
-
-  * The abstraction for MULTI/EXEC transactions has been dramatically improved
-    by providing support for check-and-set (CAS) operations when using Redis >=
-    2.2. Aborted transactions can also be optionally replayed in automatic up
-    to a user-defined number of times, after which a Predis\AbortedMultiExec
-    exception is thrown.
-
-v0.6.2 (2010-11-28)
-  * Minor internal improvements and clean ups.
-
-  * New commands available in the Redis v2.2 profile (dev):
-      - Strings: STRLEN
-      - Lists  : LINSERT, RPUSHX, LPUSHX
-      - ZSets  : ZREVRANGEBYSCORE
-      - Misc.  : PERSIST
-
-  * WATCH also accepts a single array parameter with the keys that should be
-    monitored during a transaction.
-
-  * Improved the behaviour of Predis\MultiExecBlock in certain corner cases.
-
-  * Improved parameters checking for the SORT command.
-
-  * FIX: the STORE parameter for the SORT command didn't work correctly when
-    using '0' as the target key (ISSUE #13).
-
-  * FIX: the methods for UNWATCH and DISCARD do not break anymore method
-    chaining with Predis\MultiExecBlock.
-
-v0.6.1 (2010-07-11)
-  * Minor internal improvements and clean ups.
-
-  * New commands available in the Redis v2.2 profile (dev):
-      - Misc.  : WATCH, UNWATCH
-
-  * Optional modifiers for ZRANGE, ZREVRANGE and ZRANGEBYSCORE queries are
-    supported using an associative array passed as the last argument of their
-    respective methods.
-
-  * The LIMIT modifier for ZRANGEBYSCORE can be specified using either:
-      - an indexed array: array($offset, $count)
-      - an associative array: array('offset' => $offset, 'count' => $count)
-
-  * The method Predis\Client::__construct() now accepts also instances of
-    Predis\ConnectionParameters.
-
-  * Predis\MultiExecBlock and Predis\PubSubContext now throw an exception
-    when trying to create their instances using a profile that does not
-    support the required Redis commands or when the client is connected to
-    a cluster of connections.
-
-  * Various improvements to Predis\MultiExecBlock:
-      - fixes and more consistent behaviour across various usage cases.
-      - support for WATCH and UNWATCH when using the current development
-        profile (Redis v2.2) and aborted transactions.
-
-  * New signature for Predis\Client::multiExec() which is now able to accept
-    an array of options for the underlying instance of Predis\MultiExecBlock.
-    Backwards compatibility with previous releases of Predis is ensured.
-
-  * New signature for Predis\Client::pipeline() which is now able to accept
-    an array of options for the underlying instance of Predis\CommandPipeline.
-    Backwards compatibility with previous releases of Predis is ensured.
-    The method Predis\Client::pipelineSafe() is to be considered deprecated.
-
-  * FIX: The WEIGHT modifier for ZUNIONSTORE and ZINTERSTORE was handled
-    incorrectly with more than two weights specified.
-
-v0.6.0 (2010-05-24)
-  * Switched to the new multi-bulk request protocol for all of the commands
-    in the Redis 1.2 and Redis 2.0 profiles. Inline and bulk requests are now
-    deprecated as they will be removed in future releases of Redis.
-
-  * The default server profile is "2.0" (targeting Redis 2.0.x). If you are
-    using older versions of Redis, it is highly recommended that you specify
-    which server profile the client should use (e.g. "1.2" when connecting
-    to instances of Redis 1.2.x).
-
-  * Support for Redis 1.0 is now optional and it is provided by requiring
-    'Predis_Compatibility.php' before creating an instance of Predis\Client.
-
-  * New commands added to the Redis 2.0 profile since Predis 0.5.1:
-      - Strings: SETEX, APPEND, SUBSTR
-      - ZSets  : ZCOUNT, ZRANK, ZUNIONSTORE, ZINTERSTORE, ZREMBYRANK, ZREVRANK
-      - Hashes : HSET, HSETNX, HMSET, HINCRBY, HGET, HMGET, HDEL, HEXISTS,
-                 HLEN, HKEYS, HVALS, HGETALL
-      - PubSub : PUBLISH, SUBSCRIBE, UNSUBSCRIBE
-      - Misc.  : DISCARD, CONFIG
-
-  * Introduced client-level options with the new Predis\ClientOptions class.
-    Options can be passed to Predis\Client::__construct in its second argument
-    as an array or an instance of Predis\ClientOptions. For brevity's sake and
-    compatibility with older versions, the constructor of Predis\Client still
-    accepts an instance of Predis\RedisServerProfile in its second argument.
-    The currently supported client options are:
-      - profile [default: "2.0" as of Predis 0.6.0]
-        specifies which server profile to use when connecting to Redis. This
-        option accepts an instance of Predis\RedisServerProfile or a string
-        that indicates the target version.
-      - key_distribution [default: Predis\Distribution\HashRing]
-        specifies which key distribution strategy to use to distribute keys
-        among the servers that compose a cluster. This option accepts an
-        instance of Predis\Distribution\IDistributionStrategy so that users
-        can implement their own key distribution strategy. Optionally, the new
-        Predis\Distribution\KetamaPureRing class also provides a pure-PHP
-        implementation of the same algorithm used by libketama.
-      - throw_on_error [default: TRUE]
-        server errors can optionally be handled "silently": instead of throwing
-        an exception, the client returns an error response type.
-      - iterable_multibulk [EXPERIMENTAL - default: FALSE]
-        in addition to the classic way of fetching a whole multibulk reply
-        into an array, the client can now optionally stream a multibulk reply
-        down to the user code by using PHP iterators. It is just a little bit
-        slower, but it can save a lot of memory in certain scenarios.
-
-  * New parameters for connections:
-      - alias [default: not set]
-        every connection can now be identified by an alias that is useful to
-        get a certain connection when connected to a cluster of Redis servers.
-      - weight [default: not set]
-        allows the client to balance the keys asymmetrically across multiple
-        servers. This might be useful when you have servers with different
-        amounts of memory and you want to distribute the load of your keys
-        accordingly.
-      - connection_async [default: FALSE]
-        estabilish connections to servers in a non-blocking way, so that the
-        client is not blocked while the underlying resource performs the actual
-        connection.
-      - connection_persistent [default: FALSE]
-        the underlying connection resource is left open when a script ends its
-        lifecycle. Persistent connections can lead to unpredictable or strange
-        behaviours, so they should be used with extreme care.
-
-  * Introduced the Predis\Pipeline\IPipelineExecutor interface. Classes that
-    implements this interface are used internally by the Predis\CommandPipeline
-    class to change the behaviour of the pipeline when writing/reading commands
-    from one or multiple servers. Here is the list of the default executors:
-      - Predis\Pipeline\StandardExecutor
-        Exceptions generated by server errors might be thrown depending on the
-        options passed to the client (see "throw_on_error"). Instead, protocol
-        or network errors always throw exceptions. This is the default executor
-        for single and clustered connections and shares the same behaviour of
-        Predis 0.5.x.
-      - Predis\Pipeline\SafeExecutor
-        Exceptions generated by server, protocol or network errors are not
-        thrown, instead they are returned in the response array as instances of
-        ResponseError or CommunicationException.
-      - Predis\Pipeline\SafeClusterExecutor
-        This executor shares the same behaviour of Predis\Pipeline\SafeExecutor
-        but it is geared towards clustered connections.
-
-  * Support for PUBSUB is handled by the new Predis\PubSubContext class, which
-    could also be used to build a callback dispatcher for PUBSUB scenarios.
-
-  * When connected to a cluster of connections, it is now possible to get a
-    new Predis\Client instance for a single connection of the cluster by
-    passing its alias/index to the new Predis\Client::getClientFor() method.
-
-  * CommandPipeline and MultiExecBlock return their instances when invoking
-    commands, thus allowing method chaining in pipelines and multi-exec blocks.
-
-  * MultiExecBlock instances can handle the new DISCARD command.
-
-  * Connections now support float values for the connection_timeout parameter
-    to express timeouts with a microsecond resolution.
-
-  * FIX: TCP connections now respect the read/write timeout parameter when
-    reading the payload of server responses. Previously, stream_get_contents()
-    was being used internally to read data from a connection but it looks like
-    PHP does not honour the specified timeout for socket streams when inside
-    this function.
-
-  * FIX: The GET parameter for the SORT command now accepts also multiple key
-    patterns by passing an array of strings. (ISSUE #1).
-
-  * FIX: Replies to the DEL command return the number of elements deleted by
-    the server and not 0 or 1 interpreted as a boolean response. (ISSUE #4).
-
-v0.5.1 (2010-01-23)
-  * RPOPLPUSH has been changed from bulk command to inline command in Redis
-    1.2.1, so ListPopLastPushHead now extends InlineCommand. The old RPOPLPUSH
-    behavior is still available via the ListPopLastPushHeadBulk class so that
-    you can override the server profile if you need the old (and uncorrect)
-    behaviour when connecting to a Redis 1.2.0 instance.
-
-  * Added missing support for BGREWRITEAOF for Redis >= 1.2.0
-
-  * Implemented a factory method for the RedisServerProfile class to ease the
-    creation of new server profile instances based on a version string.
-
-v0.5.0 (2010-01-09)
-  * First versioned release of Predis

+ 341 - 0
CHANGELOG.md

@@ -0,0 +1,341 @@
+v0.7.0 (2011-12-xx)
+===============================================================================
+
+- Predis now adheres to the PSR-0 standard which means that there is no more a
+  single file holding all the classes of the library, but multiple files (one
+  for each class). You can use any PSR-0 compatible autoloader to load Predis
+  or just leverage the default one shipped with the library by requiring the
+  `Predis/Autoloadr.php` and call `Predis\Autoloader::register()`.
+
+- The default server profile for Redis is now 2.4. The `dev` profile supports
+  all the features of Redis 2.6 (currently unstable) such as Lua scripting.
+
+- Support for long aliases (method names) for Redis commands has been dropped.
+
+- Redis 1.0 is no more supported since the library now uses only the unified
+  protocol to serialize commands.
+
+- It is possible to prefix keys transparently on a client-level basis with the
+  new `prefix` client option.
+
+- An external connection factory is used to initialize new connection instances
+  and developers can now register their own connection classes using the new
+  `connections` client options.
+
+- It is possible to connect locally to Redis using UNIX domain sockets. Just
+  use `unix:///path/to/redis.sock` or a named array just like in the following
+  example: `array('scheme' => 'unix', 'path' => '/path/to/redis.sock');`.
+
+- If the `phpiredis` extension is loaded by PHP, it is now possible to use an
+  alternative connection class that leverages it to make Predis faster on many
+  cases, especially when dealing with big multibulk replies, with the the only
+  downside that persistent connections are not supported. Please refer to the
+  documentation to see how to activate this class using the new `connections`
+  client option.
+
+- Predis is capable to talk with Webdis, albeit with some limitations such as
+  the lack of pipelining and transactions, just by using the `http` scheme in
+  in the connection parameters. All is needed is PHP with the `curl` and the
+  `phpiredis` extensions loaded.
+
+- Way too many changes in the public API to make a list here, we just tried to
+  make all the Redis commands compatible with previous releases of v0.6 so that
+  you do not have to worry if you are simply using Predis as a client. Probably
+  the only breaking changes that should be mentioned here are:
+
+  - `throw_on_error` has been renamed to `throw_errors` and it is a connection
+    parameter instead of a client option alongside `iterable_multibulk`.
+
+  - `key_distribution` has been removed from the client options. To customize
+    the distribution strategy you must provide a callable object to the new
+    `cluster` client option to configure and then return a new instance of
+    `Predis\Network\IConnectionCluster`.
+
+  - `Predis\Client::create()` has been removed. Just use the constructor to set
+    up a new instance of `Predis\Client`.
+
+  - `Predis\Client::pipelineSafe()` was deprecated in Predis v0.6.1 and now has
+    finally removed. Use `Predis\Client::pipeline(array('safe' => true))`.
+
+  - `Predis\Client::rawCommand()` has been removed due to inconsistencies with
+    the underlying connection abstractions. You can still get the raw resource
+    out of a connection with `Predis\Network\IConnectionSingle::getResource()`
+    so that you can talk directly with Redis.
+
+- The `Predis\MultiBulkCommand` class has been merged into `Predis\Command` and
+  thus removed. Serialization of commands is now a competence of connections.
+
+- The `Predis\IConnection` interface has been splitted into two new interfaces:
+  `Predis\Network\IConnectionSingle and `Predis\Network\IConnectionCluster`.
+
+- The constructor of `Predis\Client` now accepts more type of arguments such as
+  instances of `Predis\IConnectionParameters` and `Predis\Network\IConnection`.
+
+
+v0.6.6 (2011-04-01)
+===============================================================================
+- Switched to Redis 2.2 as the default server profile (there are no changes
+  that would break compatibility with previous releases). Long command names
+  are no more supported by default but if you need them you can still require
+  Predis_Compatibility.php to avoid breaking compatibility.
+
+- Added a `VERSION` constant to `Predis\Client`.
+
+- Some performance improvements for multibulk replies (parsing them is about
+  16% faster than the previous version). A few core classes have been heavily
+  optimized to reduce overhead when creating new instances.
+
+- Predis now uses by default a new protocol reader, more lightweight and
+  faster than the default handler-based one. Users can revert to the old
+  protocol reader with the 'reader' client option set to `composable`.
+  This client option can also accept custom reader classes implementing the
+  new `Predis\IResponseReader` interface.
+
+- Added support for connecting to Redis using UNIX domain sockets (ISSUE #25).
+
+- The `read_write_timeout` connection parameter can now be set to 0 or false
+  to disable read and write timeouts on connections. The old behaviour of -1
+  is still intact.
+
+- `ZUNIONSTORE` and `ZINTERSTORE` can accept an array to specify a list of the
+  source keys to be used to populate the destination key.
+
+- `MGET`, `SINTER`, `SUNION` and `SDIFF` can accept an array to specify a list
+  of keys. `SINTERSTORE`, `SUNIONSTORE` and `SDIFFSTORE` can also accept an
+  array to specify the list of source keys.
+
+- `SUBSCRIBE` and `PSUBSCRIBE` can accept a list of channels for subscription.
+
+- __FIX__: some client-side clean-ups for `MULTI/EXEC` were handled incorrectly
+  in a couple of corner cases (ISSUE #27).
+
+
+v0.6.5 (2011-02-12)
+===============================================================================
+- __FIX__: due to an untested internal change introduced in v0.6.4, a wrong
+  handling of bulk reads of zero-length values was producing protocol
+  desynchronization errors (ISSUE #20).
+
+
+v0.6.4 (2011-02-12)
+===============================================================================
+- Various performance improvements (15% ~ 25%) especially when dealing with
+  long multibulk replies or when using clustered connections.
+
+- Added the `on_retry` option to `Predis\MultiExecBlock` that can be used to
+  specify an external callback (or any callable object) that gets invoked
+  whenever a transaction is aborted by the server.
+
+- Added inline (p)subscribtion via options when initializing an instance of
+  `Predis\PubSubContext`.
+
+
+v0.6.3 (2011-01-01)
+===============================================================================
+- New commands available in the Redis v2.2 profile (dev):
+  - Strings: `SETRANGE`, `GETRANGE`, `SETBIT`, `GETBIT`
+  - Lists  : `BRPOPLPUSH`
+
+- The abstraction for `MULTI/EXEC` transactions has been dramatically improved
+  by providing support for check-and-set (CAS) operations when using Redis >=
+  2.2. Aborted transactions can also be optionally replayed in automatic up
+  to a user-defined number of times, after which a `Predis\AbortedMultiExec`
+  exception is thrown.
+
+
+v0.6.2 (2010-11-28)
+===============================================================================
+- Minor internal improvements and clean ups.
+
+- New commands available in the Redis v2.2 profile (dev):
+  - Strings: `STRLEN`
+  - Lists  : `LINSERT`, `RPUSHX`, `LPUSHX`
+  - ZSets  : `ZREVRANGEBYSCORE`
+  - Misc.  : `PERSIST`
+
+- WATCH also accepts a single array parameter with the keys that should be
+  monitored during a transaction.
+
+- Improved the behaviour of `Predis\MultiExecBlock` in certain corner cases.
+
+- Improved parameters checking for the SORT command.
+
+- __FIX__: the `STORE` parameter for the `SORT` command didn't work correctly
+  when using `0` as the target key (ISSUE #13).
+
+- __FIX__: the methods for `UNWATCH` and `DISCARD` do not break anymore method
+  chaining with `Predis\MultiExecBlock`.
+
+
+v0.6.1 (2010-07-11)
+===============================================================================
+- Minor internal improvements and clean ups.
+
+- New commands available in the Redis v2.2 profile (dev):
+  - Misc.  : `WATCH`, `UNWATCH`
+
+- Optional modifiers for `ZRANGE`, `ZREVRANGE` and `ZRANGEBYSCORE` queries are
+  supported using an associative array passed as the last argument of their
+  respective methods.
+
+- The `LIMIT` modifier for `ZRANGEBYSCORE` can be specified using either:
+  - an indexed array: `array($offset, $count)`
+  - an associative array: `array('offset' => $offset, 'count' => $count)`
+
+- The method `Predis\Client::__construct()` now accepts also instances of
+  `Predis\ConnectionParameters`.
+
+- `Predis\MultiExecBlock` and `Predis\PubSubContext` now throw an exception
+  when trying to create their instances using a profile that does not
+  support the required Redis commands or when the client is connected to
+  a cluster of connections.
+
+- Various improvements to `Predis\MultiExecBlock`:
+  - fixes and more consistent behaviour across various usage cases.
+  - support for `WATCH` and `UNWATCH` when using the current development
+    profile (Redis v2.2) and aborted transactions.
+
+- New signature for `Predis\Client::multiExec()` which is now able to accept
+  an array of options for the underlying instance of `Predis\MultiExecBlock`.
+  Backwards compatibility with previous releases of Predis is ensured.
+
+- New signature for `Predis\Client::pipeline()` which is now able to accept
+  an array of options for the underlying instance of Predis\CommandPipeline.
+  Backwards compatibility with previous releases of Predis is ensured.
+  The method `Predis\Client::pipelineSafe()` is to be considered deprecated.
+
+- __FIX__: The `WEIGHT` modifier for `ZUNIONSTORE` and `ZINTERSTORE` was
+  handled incorrectly with more than two weights specified.
+
+
+v0.6.0 (2010-05-24)
+===============================================================================
+- Switched to the new multi-bulk request protocol for all of the commands
+  in the Redis 1.2 and Redis 2.0 profiles. Inline and bulk requests are now
+  deprecated as they will be removed in future releases of Redis.
+
+- The default server profile is `2.0` (targeting Redis 2.0.x). If you are
+  using older versions of Redis, it is highly recommended that you specify
+  which server profile the client should use (e.g. `1.2` when connecting
+  to instances of Redis 1.2.x).
+
+- Support for Redis 1.0 is now optional and it is provided by requiring
+  'Predis_Compatibility.php' before creating an instance of Predis\Client.
+
+- New commands added to the Redis 2.0 profile since Predis 0.5.1:
+  - Strings: `SETEX`, `APPEND`, `SUBSTR`
+  - ZSets  : `ZCOUNT`, `ZRANK`, `ZUNIONSTORE`, `ZINTERSTORE`, `ZREMBYRANK`,
+             `ZREVRANK`
+  - Hashes : `HSET`, `HSETNX`, `HMSET`, `HINCRBY`, `HGET`, `HMGET`, `HDEL`,
+             `HEXISTS`, `HLEN`, `HKEYS`, `HVALS`, `HGETALL`
+  - PubSub : `PUBLISH`, `SUBSCRIBE`, `UNSUBSCRIBE`
+  - Misc.  : `DISCARD`, `CONFIG`
+
+- Introduced client-level options with the new `Predis\ClientOptions` class.
+  Options can be passed to the constructor of `Predis\Client` in its second
+  argument as an array or an instance of Predis\ClientOptions. For brevity's
+  sake and compatibility with older versions, the constructor still accepts
+  an instance of `Predis\RedisServerProfile` in its second argument. The
+  currently supported client options are:
+
+  - `profile` [default: `2.0` as of Predis 0.6.0]: specifies which server
+    profile to use when connecting to Redis. This option accepts an instance
+    of `Predis\RedisServerProfile` or a string that indicates the version.
+
+  - `key_distribution` [default: `Predis\Distribution\HashRing`]: specifies
+    which key distribution strategy to use to distribute keys among the
+    servers that compose a cluster. This option accepts an instance of
+    `Predis\Distribution\IDistributionStrategy` so that users can implement
+    their own key distribution strategy. `Predis\Distribution\KetamaPureRing`
+    is an alternative distribution strategy providing a pure-PHP implementation
+    of the same algorithm used by libketama.
+
+  - `throw_on_error` [default: `TRUE`]: server errors can optionally be handled
+    "silently": instead of throwing an exception, the client returns an error
+    response type.
+
+  - `iterable_multibulk` [EXPERIMENTAL - default: `FALSE`]: in addition to the
+    classic way of fetching a whole multibulk reply into an array, the client
+    can now optionally stream a multibulk reply down to the user code by using
+    PHP iterators. It is just a little bit slower, but it can save a lot of
+    memory in certain scenarios.
+
+- New parameters for connections:
+
+  - `alias` [default: not set]: every connection can now be identified by an
+    alias that is useful to get a specific connections when connected to a
+    cluster of Redis servers.
+  - `weight` [default: not set]: allows to balance keys asymmetrically across
+    multiple servers. This is useful when you have servers with different
+    amounts of memory to distribute the load of your keys accordingly.
+  - `connection_async` [default: `FALSE`]: estabilish connections to servers
+    in a non-blocking way, so that the client is not blocked while the socket
+    resource performs the actual connection.
+  - `connection_persistent` [default: `FALSE`]: the underlying socket resource
+    is left open when a script ends its lifecycle. Persistent connections can
+    lead to unpredictable or strange behaviours, so they should be used with
+    extreme care.
+
+- Introduced the `Predis\Pipeline\IPipelineExecutor` interface. Classes that
+  implements this interface are used internally by the `Predis\CommandPipeline`
+  class to change the behaviour of the pipeline when writing/reading commands
+  from one or multiple servers. Here is the list of the default executors:
+
+  - `Predis\Pipeline\StandardExecutor`: exceptions generated by server errors
+    might be thrown depending on the options passed to the client (see the
+    `throw_on_error` client option). Instead, protocol or network errors always
+    throw exceptions. This is the default executor for single and clustered
+    connections and shares the same behaviour of Predis 0.5.x.
+  - `Predis\Pipeline\SafeExecutor`: exceptions generated by server, protocol
+    or network errors are not thrown but returned in the response array as
+    instances of `Predis\ResponseError` or `Predis\CommunicationException`.
+  - `Predis\Pipeline\SafeClusterExecutor`: this executor shares the same
+    behaviour of `Predis\Pipeline\SafeExecutor` but it is geared towards
+    clustered connections.
+
+- Support for PUB/SUB is handled by the new `Predis\PubSubContext` class, which
+  could also be used to build a callback dispatcher for PUB/SUB scenarios.
+
+- When connected to a cluster of connections, it is now possible to get a
+  new `Predis\Client` instance for a single connection of the cluster by
+  passing its alias/index to the new `Predis\Client::getClientFor()` method.
+
+- `Predis\CommandPipeline` and `Predis\MultiExecBlock` return their instances
+  when invokink commands, thus allowing method chaining in pipelines and
+  multi-exec blocks.
+
+- `Predis\MultiExecBlock` can handle the new `DISCARD` command.
+
+- Connections now support float values for the `connection_timeout` parameter
+  to express timeouts with a microsecond resolution.
+
+- __FIX__: TCP connections now respect the read/write timeout parameter when
+  reading the payload of server responses. Previously, `stream_get_contents()`
+  was being used internally to read data from a connection but it looks like
+  PHP does not honour the specified timeout for socket streams when inside
+  this function.
+
+- __FIX__: The `GET` parameter for the `SORT` command now accepts also multiple
+  key patterns by passing an array of strings. (ISSUE #1).
+
+* __FIX__: Replies to the `DEL` command return the number of elements deleted
+  by the server and not 0 or 1 interpreted as a boolean response. (ISSUE #4).
+
+
+v0.5.1 (2010-01-23)
+===============================================================================
+* `RPOPLPUSH` has been changed from bulk command to inline command in Redis
+  1.2.1, so `ListPopLastPushHead` now extends `InlineCommand`. The old behavior
+  is still available via the `ListPopLastPushHeadBulk` class so that you can
+  override the server profile if you need the old (and uncorrect) behaviour
+  when connecting to a Redis 1.2.0 instance.
+
+* Added missing support for `BGREWRITEAOF` for Redis >= 1.2.0.
+
+* Implemented a factory method for the `RedisServerProfile` class to ease the
+  creation of new server profile instances based on a version string.
+
+
+v0.5.0 (2010-01-09)
+===============================================================================
+* First versioned release of Predis

+ 0 - 2
TODO

@@ -1,5 +1,3 @@
-* Update the CHANGELOG before releasing v0.7.0 (it is completely out of sync).
-
 * Documentation! The README is obviously not enought to show how to use Predis
   as it does not cover all of its features.