Commit Graph

1361 Commits

Author SHA1 Message Date
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
Daniele Alessandri 712e6420e9 Rewrite parts of Predis\Transaction\MultiExec to make them less ugly.
We also changed some options for this class, the accepted ones are:

  - "keys": string or array of strings for automatic WATCH.
  - "cas": sets the check-and-set mode.
  - "retry": number of attempts before giving up aborted transactions.
  - "exceptions": sets whether exceptions should be thrown on error
    responses (overrides the "exceptions" client option).

The "on_retry" option has been removed.
2013-11-17 15:57:43 +01:00
Daniele Alessandri 84e0f5af7a Extract the tracking of transaction states to a separate class.
The Predis\Transaction\MultiExecState class is actually quite dummy as
it does not work as a finite-state machine, but is used to track state
using flags. It basically replicates the same behaviour of when it was
part of the Predis\Transaction\MultiExec code and it will do for now.
2013-11-17 13:15:36 +01:00
Daniele Alessandri c047c4992a Merge branch 'v0.9/pipeline-refactoring' 2013-11-17 11:07:24 +01:00
Daniele Alessandri ce706a375c Merge branch 'v0.9/add-commands' 2013-11-17 11:06:22 +01:00
Daniele Alessandri 66f22899a1 Update CHANGELOG. 2013-11-17 11:04:03 +01:00
Daniele Alessandri 620adb2fe6 New command: PUBSUB (Redis 2.8). 2013-11-17 11:02:37 +01:00
Daniele Alessandri 1b5e2d0d0d New command: SENTINEL (Redis 2.6). 2013-11-17 11:02:33 +01:00
Daniele Alessandri 3d499e82a3 Add some supported options to Predis\Client::pipeline().
Only two options available for now, used to specify which kind of
pipeline object the client should use or return:

  - "atomic": returns a pipeline wrapped in a MULTI / EXEC transaction
    (class: Predis\Pipeline\Atomic).
  - "fire-and-forget": returns a pipeline that does not read back
    responses from the server (class: Predis\Pipeline\FireAndForget).

We might add more options in the future.
2013-11-16 21:54:17 +01:00
Daniele Alessandri 8068c87e47 Rewrite a good chunk of the classes in the Predis\Pipeline namespace.
First of all we completely removed the concept of pipeline executors.
Now pipelines can be easily customized by extending our default class
Predis\Pipeline\Pipeline.

Tests coverage for the Predis\Pipeline namespace is decent but can be
definitely improved while test cases can be beautified.
2013-11-16 21:23:49 +01:00
Daniele Alessandri c6f51e82bf Rename "Array" type-hint to to "array". 2013-11-16 17:01:58 +01:00
Daniele Alessandri 944da8c9b8 Rename Predis\Cluster\Hash\CRC16HashGenerator. 2013-11-16 16:41:00 +01:00