Commit Graph

1372 Commits

Author SHA1 Message Date
Daniele Alessandri ee45de4f0e Rename base response interface to Predis\Response\ResponseInterface. 2013-12-07 15:22:42 +01:00
Daniele Alessandri 6ece8c40a0 Merge branch 'v0.9/response-status' 2013-12-07 15:16:20 +01:00
Daniele Alessandri 373d30b070 Use Predis\Response\Status to identify all kinds of status responses.
Status response objects are needed mostly to make it possible from the
client perspective to differentiate a status response with the payload
"OK" from a normale bulk reply containing "OK".

The biggest change is for commands returning +OK responses: these were
previously translated to TRUE (bool value), but they are now returned
as instances of Predis\Response\Status. Just to illustrate an example
of the possibilities with this change we will use SET since it is the
most widely used command returning +OK:

  $response = $client->set('foo', 'bar');

  echo $response;         // 'OK'
  $response == 'OK';      // TRUE
  isset($response->ok);   // TRUE
  $response == true;      // TRUE
  $response === true;     // FALSE
  $response instanceof Predis\Response\ObjectInterface;     // TRUE
  $response instanceof Predis\Response\Status;              // TRUE

For those checking responses returned by commands such as SET or PONG,
the breaking change basically lies in the usage of strict comparison:
doing $response === true will now evaluate to FALSE instead of TRUE.

By default Predis caches common status responses such as OK or QUEUED
to lower the memory usage when using pipelines or transactions.
2013-12-07 15:15:23 +01:00
Daniele Alessandri ac8d0c1f42 Fix example.
[ci skip]
2013-12-02 16:12:43 +01:00
Daniele Alessandri cf70d2f20e Minor code styling changes in Predis\Connection. 2013-12-02 16:05:05 +01:00
Daniele Alessandri ccf8822b4b Minor change in stream connection destructor. 2013-12-02 15:45:29 +01:00
Daniele Alessandri d27d3b0acb Cache value casters in static member variable.
This optimization is mostly useful since connection parameters can be
instantiated more than one time in a script when using clustering or
replication.
2013-12-02 14:34:02 +01:00
Daniele Alessandri 5b7504b069 Simplify connection factory class by removing dependency on profile.
A profile is not needed to create instances of basic initialization
commands such as AUTH (authentication) and SELECT (database selection)
since they do not need prefixing and other stuff.

If needed, developers can still extend the base connection factory to
make it use a server profile and configure the client to use it using
options.
2013-12-02 13:01:37 +01:00
Daniele Alessandri 6ef8e99822 Make sure raw commands IDs are normalized to uppercase. 2013-12-02 11:42:06 +01:00
Daniele Alessandri 4bf0ee4c6a Rename ConnectionInterface::writeCommand() to writeRequest().
This name is more consistent with its counterpart, readResponse().
2013-12-02 11:08:14 +01:00
Daniele Alessandri 59b9319bb8 [tests] Minor tweak for timeouts. 2013-12-02 10:46:44 +01:00
Daniele Alessandri bcf92a7548 [tests] Fix tests under PHP 5.3 due to another dumb mistake.
Seriously, I am startint to hate PHP 5.3...
2013-12-01 15:27:42 +01:00
Daniele Alessandri d2c001812f [tests] Rename test case classes. 2013-12-01 15:11:09 +01:00
Daniele Alessandri 3ae3414a0d [tests] Normalize casing of command identifiers in constraint.
We do not care much about the casing of command IDs in our constraint,
so it makes no difference for use if it is "SET" or "set".
2013-12-01 14:00:57 +01:00
Daniele Alessandri a00ffbf53f Rework examples for plain Redis commands. 2013-12-01 13:42:10 +01:00
Daniele Alessandri 583b924085 Add the ability for the client to send raw commands to Redis.
When sending raw commands their arguments are not filtered, responses
are not parsed and key prefixes are not applied. The client also does
not throw any exception on Redis errors regardless of its settings.

The first parameter takes the raw arguments of the command (included
its identifier) as defined by the Redis documentation while the second
optional parameter is always populated by reference to indicate when
Redis actually returned an error response.

  $client->raw(['PING']);                // "PONG"
  $client->raw(['SET','foo','bar']);     // "OK"
  $client->raw(['GET','foo'], $err);     // "bar", $err=FALSE
  $client->raw(['LPUSH','foo',1], $err); // "WRONGTYPE...", $err=TRUE

Internally, this method creates instances of Predis\Command\RawCommand
that get passed to the underlying connection instance for execution as
if they were usual commands defined by Predis.

Raw commands work in both cluster and replication scenarios since they
are recognized by their command ID, but key prefixing is not supported
since it is done by the profile instance when instantiating commands.
2013-12-01 13:42:03 +01:00
Daniele Alessandri 3c77d3b0c1 Update examples. 2013-12-01 11:28:56 +01:00
Daniele Alessandri e049db124c By convention all of the Redis command identifiers are uppercase. 2013-12-01 10:45:37 +01:00
Daniele Alessandri b2e0dc62fe [tests] Fix dumb mistake when running tests with older profiles. 2013-11-30 20:06:37 +01:00
Daniele Alessandri f7ff65e0fa Merge branch 'v0.9/test-suite-improvements' 2013-11-30 19:39:12 +01:00
Daniele Alessandri b253bdc41e [tests] Improve the basic framework of our test suite.
We now have a base test case class for Predis (namely PredisTestCase)
grouping various commonly used utility methods shared by all of the
tests in the suite, greatly improving reusability.
2013-11-30 19:38:27 +01:00
Daniele Alessandri 7f690cb62e [tests] Add a PHPUnit constraint to verify commands.
Commands are verified by checking their IDs and optionally arguments.
Passing a command instance is only a shortcut to set the expected ID
and arguments, commands are never compared for identity but always for
equivalence.
2013-11-30 17:14:42 +01:00
Daniele Alessandri cb3cd050ab Update CHANGELOG.
Remove recently added lines as they are not entirely true, the client
currently does not apply any key prefixing for any command not created
by Redis profiles even though it is possible now, contrary to v0.8.

[ci skip]
2013-11-30 15:12:36 +01:00
Daniele Alessandri c4e0d9df92 Update CHANGELOG.
[ci skip]
2013-11-30 14:55:12 +01:00
Daniele Alessandri 41ea336175 [tests] Update tests for Predis\Command\Command. 2013-11-30 14:45:51 +01:00
Daniele Alessandri 5d40b85f10 Update CHANGELOG. 2013-11-30 14:42:02 +01:00
Daniele Alessandri b7ac108d43 Merge branch 'v0.9/commands' 2013-11-30 14:35:45 +01:00
Daniele Alessandri cf581a3b49 Add new command class useful to execute "raw" Redis commands.
By raw we mean that input arguments are not filtered and responses are
not parsed, which means arguments must follow the command signature as
defined by Redis and complex responses are left untouched.

When instantiating an instance of `Predis\Command\RawCommand` you must
pass at least the command ID. You can pass further arguments in the
array or you can just set them later with `RawCommand::setArguments()`
but you cannot modify the command ID once instantiated.

  $command = new Predis\Command\RawCommand(['SET', 'foo', 'bar']);
  $response = $client->executeCommand($command);

While higher level abstractions built upon `Predis\Client` should just
use commands created by the profile in use, inner parts of the library
might use raw commands to provide certain functionalities making sure
that input and output of commands are always consistent, independent
of the profile.
2013-11-30 14:30:33 +01:00
Daniele Alessandri bb4b8c3c35 Fix phpdoc. 2013-11-30 13:08:31 +01:00
Daniele Alessandri 09895f27bf Rename command class for scripting to Predis\Command\ScriptCommand.
We also changed our wording to indentify this kind of abstraction so
instead of using "scripted commands" (kind of broken English) we now
use "scriptable commands".
2013-11-30 12:43:21 +01:00
Daniele Alessandri 980edf2f7b Rename base command class to Predis\Command\Command. 2013-11-30 12:24:43 +01:00
Daniele Alessandri c8e20e428a Remove interface defining objects aware of command processing.
It was too broad in concept and not really that useful, so for now we
assume that only our base Predis\Profile\RedisProfile class can handle
command processing and we will decide later if we want to add a couple
of more methods to Predis\Profile\ProfileInterface.
2013-11-30 10:27:51 +01:00
Daniele Alessandri 7a56856d46 Make option "prefix" accept command processor instances. 2013-11-30 10:00:30 +01:00
Daniele Alessandri fc4e279b9a [tests] Fix tests on PHP 5.3.
Stupid PHP 5.3.
2013-11-29 23:39:50 +01:00
Daniele Alessandri 09b0750cb7 [tests] Improve tests of TTL. 2013-11-29 23:27:59 +01:00
Daniele Alessandri d52daacba9 [tests] Improve base command test case. 2013-11-29 23:27:56 +01:00
Daniele Alessandri 00247abc50 [tests] Add missing tests for SETNX.
For some obscure reason Predis/Command/StringSetPreserve had no tests.
2013-11-29 22:50:09 +01:00
Daniele Alessandri 862da9a3b2 [tests] Add "count" argument to SRANDMEMBER (since Redis >= 2.6). 2013-11-29 22:45:35 +01:00
Daniele Alessandri d6173bb33b Merge branch 'v0.9/external-prefixer' 2013-11-29 22:40:46 +01:00
Daniele Alessandri d0b431016d Move key prefixing logic from command classes to prefix processor.
While command classes define how the client should filter arguments or
parse responses, key prefixing depends on the actual command signature
as defined by Redis so it really is something that should be handled
separately as the norm.

Developers can define new handlers or override existing ones, but they
can still define the key prefixing logic inside their command classes
by implementing Predis\Command\PrefixableCommandInterface: the key
prefix processor will just use that by overriding any defined handler.
2013-11-29 22:36:32 +01:00
Daniele Alessandri 5856bde198 Fix phpdoc.
[ci skip]
2013-11-29 11:14:56 +01:00
Daniele Alessandri 4840736503 Apply some minor internal changes to concrete connection classes. 2013-11-23 11:08:38 +01:00
Daniele Alessandri 2d39408c0f Add a method to the pipeline to fetch the connection from the client.
In this method we can put the logic needed to prepare the connection
right before sending the queued commands to the server (e.g. switching
to the master server when connected in replication mode).
2013-11-22 15:41:50 +01:00
Daniele Alessandri 374101cfc3 Apply minor change. 2013-11-22 12:17:57 +01:00
Daniele Alessandri cec7c24236 Merge branch 'v0.9/server-profile' 2013-11-22 12:15:08 +01:00
Daniele Alessandri 2a5483df90 Reorganize the Predis\Profile namespace.
The profile factory code has been extrapolated into a the new class
Predis\Profile\Factory (final and with only static methods).
2013-11-22 12:01:29 +01:00
Daniele Alessandri 0a60a156f0 Merge branch 'v0.9/transaction-multiexec-state' 2013-11-17 16:20:29 +01:00
Daniele Alessandri 1e0ef2a64d Move check for WATCH and UNWATCH support. 2013-11-17 16:17:24 +01:00
Daniele Alessandri 30e74e36aa Update CHANGELOG. 2013-11-17 16:05:12 +01:00
Daniele Alessandri 1125809de9 Force exceptions on error responses for transaction control commands.
Commands such as MULTI, EXEC, DISCARD, WATCH and UNWATCH disregard the
the "exceptions" client option and always result in an exception being
thrown on error responses even when the client is configured to return
those errors ("exceptions" set to FALSE).
2013-11-17 15:58:26 +01:00