Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/phpredis/phpredis.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'redis_commands.c')
-rw-r--r--redis_commands.c89
1 files changed, 39 insertions, 50 deletions
diff --git a/redis_commands.c b/redis_commands.c
index e75b1892..899839ef 100644
--- a/redis_commands.c
+++ b/redis_commands.c
@@ -5245,63 +5245,52 @@ redis_client_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
int redis_command_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
char **cmd, int *cmd_len, short *slot, void **ctx)
{
- char *kw=NULL;
- zval *z_arg;
- size_t kw_len;
-
- /* Parse our args */
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "|sz", &kw, &kw_len,
- &z_arg) == FAILURE)
- {
- return FAILURE;
- }
+ smart_string cmdstr = {0};
+ zend_string *op = NULL, *zstr;
+ zval *z_args = NULL;
+ int i, argc = 0;
- /* Construct our command */
- if (!kw) {
- *cmd_len = REDIS_CMD_SPPRINTF(cmd, "COMMAND", "");
- } else if (!z_arg) {
- /* Sanity check */
- if (strncasecmp(kw, "count", sizeof("count") - 1)) {
- return FAILURE;
- }
- /* COMMAND COUNT */
- *cmd_len = REDIS_CMD_SPPRINTF(cmd, "COMMAND", "s", "COUNT", sizeof("COUNT") - 1);
- } else if (Z_TYPE_P(z_arg) == IS_STRING) {
- /* Sanity check */
- if (strncasecmp(kw, "info", sizeof("info") - 1)) {
- return FAILURE;
- }
+ ZEND_PARSE_PARAMETERS_START(0, -1)
+ Z_PARAM_OPTIONAL
+ Z_PARAM_STR(op)
+ Z_PARAM_VARIADIC('*', z_args, argc)
+ ZEND_PARSE_PARAMETERS_END_EX(return FAILURE);
- /* COMMAND INFO <cmd> */
- *cmd_len = REDIS_CMD_SPPRINTF(cmd, "COMMAND", "ss", "INFO", sizeof("INFO") - 1,
- Z_STRVAL_P(z_arg), Z_STRLEN_P(z_arg));
+ if (op == NULL) {
+ *ctx = NULL;
+ argc = 0;
+ } else if (zend_string_equals_literal_ci(op, "COUNT")) {
+ *ctx = PHPREDIS_CTX_PTR;
+ argc = 0;
+ } else if (zend_string_equals_literal_ci(op, "DOCS") ||
+ zend_string_equals_literal_ci(op, "INFO")
+ ) {
+ *ctx = NULL;
+ } else if (zend_string_equals_literal_ci(op, "GETKEYS")) {
+ *ctx = PHPREDIS_CTX_PTR + 1;
+ } else if (zend_string_equals_literal_ci(op, "GETKEYSANDFLAGS")) {
+ *ctx = PHPREDIS_CTX_PTR + 2;
+ } else if (zend_string_equals_literal_ci(op, "LIST")) {
+ *ctx = PHPREDIS_CTX_PTR + 1;
} else {
- int arr_len;
-
- /* Sanity check on args */
- if (strncasecmp(kw, "getkeys", sizeof("getkeys")-1) ||
- Z_TYPE_P(z_arg)!=IS_ARRAY ||
- (arr_len=zend_hash_num_elements(Z_ARRVAL_P(z_arg)))<1)
- {
- return FAILURE;
- }
+ php_error_docref(NULL, E_WARNING, "Unknown COMMAND operation '%s'", ZSTR_VAL(op));
+ return FAILURE;
+ }
- zval *z_ele;
- HashTable *ht_arr = Z_ARRVAL_P(z_arg);
- smart_string cmdstr = {0};
+ REDIS_CMD_INIT_SSTR_STATIC(&cmdstr, !!op + argc, "COMMAND");
+ if (op) redis_cmd_append_sstr_zstr(&cmdstr, op);
- redis_cmd_init_sstr(&cmdstr, 1 + arr_len, ZEND_STRL("COMMAND"));
- redis_cmd_append_sstr(&cmdstr, ZEND_STRL("GETKEYS"));
+ for (i = 0; i < argc; ++i) {
+ zstr = zval_get_string(&z_args[i]);
+ redis_cmd_append_sstr(&cmdstr, ZSTR_VAL(zstr), ZSTR_LEN(zstr));
+ zend_string_release(zstr);
+ }
- ZEND_HASH_FOREACH_VAL(ht_arr, z_ele) {
- zend_string *zstr = zval_get_string(z_ele);
- redis_cmd_append_sstr(&cmdstr, ZSTR_VAL(zstr), ZSTR_LEN(zstr));
- zend_string_release(zstr);
- } ZEND_HASH_FOREACH_END();
+ puts(cmdstr.c);
- *cmd = cmdstr.c;
- *cmd_len = cmdstr.len;
- }
+ // Push out values
+ *cmd = cmdstr.c;
+ *cmd_len = cmdstr.len;
/* Any slot will do */
CMD_RAND_SLOT(slot);