@@ -937,6 +937,98 @@ redis_config_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
937937 return res ;
938938}
939939
940+ int
941+ redis_function_cmd (INTERNAL_FUNCTION_PARAMETERS , RedisSock * redis_sock ,
942+ char * * cmd , int * cmd_len , short * slot , void * * ctx )
943+ {
944+ smart_string cmdstr = {0 };
945+ zend_string * op = NULL , * arg ;
946+ zval * argv = NULL ;
947+ int i , argc = 0 ;
948+
949+ ZEND_PARSE_PARAMETERS_START (1 , -1 )
950+ Z_PARAM_STR (op )
951+ Z_PARAM_OPTIONAL
952+ Z_PARAM_VARIADIC ('*' , argv , argc )
953+ ZEND_PARSE_PARAMETERS_END_EX (return FAILURE );
954+
955+ for (i = 0 ; i < argc ; ++ i ) {
956+ if (Z_TYPE (argv [i ]) != IS_STRING ) {
957+ php_error_docref (NULL , E_WARNING , "invalid argument" );
958+ return FAILURE ;
959+ }
960+ }
961+
962+ if (zend_string_equals_literal_ci (op , "DELETE" )) {
963+ if (argc < 1 ) {
964+ php_error_docref (NULL , E_WARNING , "argument required" );
965+ return FAILURE ;
966+ }
967+ } else if (zend_string_equals_literal_ci (op , "DUMP" )) {
968+ * ctx = PHPREDIS_CTX_PTR ;
969+ } else if (zend_string_equals_literal_ci (op , "FLUSH" )) {
970+ if (argc > 0 &&
971+ !zend_string_equals_literal_ci (Z_STR (argv [0 ]), "SYNC" ) &&
972+ !zend_string_equals_literal_ci (Z_STR (argv [0 ]), "ASYNC" )
973+ ) {
974+ php_error_docref (NULL , E_WARNING , "invalid argument" );
975+ return FAILURE ;
976+ }
977+ } else if (zend_string_equals_literal_ci (op , "KILL" )) {
978+ // noop
979+ } else if (zend_string_equals_literal_ci (op , "LIST" )) {
980+ if (argc > 0 ) {
981+ if (zend_string_equals_literal_ci (Z_STR (argv [0 ]), "LIBRARYNAME" )) {
982+ if (argc < 2 ) {
983+ php_error_docref (NULL , E_WARNING , "argument required" );
984+ return FAILURE ;
985+ }
986+ } else if (!zend_string_equals_literal_ci (Z_STR (argv [0 ]), "WITHCODE" )) {
987+ php_error_docref (NULL , E_WARNING , "invalid argument" );
988+ return FAILURE ;
989+ }
990+ }
991+ * ctx = PHPREDIS_CTX_PTR + 1 ;
992+ } else if (zend_string_equals_literal_ci (op , "LOAD" )) {
993+ if (argc < 1 || (
994+ zend_string_equals_literal_ci (Z_STR (argv [0 ]), "REPLACE" ) && argc < 2
995+ )) {
996+ php_error_docref (NULL , E_WARNING , "argument required" );
997+ return FAILURE ;
998+ }
999+ * ctx = PHPREDIS_CTX_PTR ;
1000+ } else if (zend_string_equals_literal_ci (op , "RESTORE" )) {
1001+ if (argc < 1 || (
1002+ argc > 1 &&
1003+ !zend_string_equals_literal_ci (Z_STR (argv [1 ]), "FLUSH" ) &&
1004+ !zend_string_equals_literal_ci (Z_STR (argv [1 ]), "APPEND" ) &&
1005+ !zend_string_equals_literal_ci (Z_STR (argv [1 ]), "REPLACE" )
1006+ )) {
1007+ php_error_docref (NULL , E_WARNING , "invalid argument" );
1008+ return FAILURE ;
1009+ }
1010+ } else if (zend_string_equals_literal_ci (op , "STATS" )) {
1011+ * ctx = PHPREDIS_CTX_PTR + 1 ;
1012+ } else {
1013+ php_error_docref (NULL , E_WARNING , "Unknown operation '%s'" , ZSTR_VAL (op ));
1014+ return FAILURE ;
1015+ }
1016+
1017+ REDIS_CMD_INIT_SSTR_STATIC (& cmdstr , 1 + argc , "FUNCTION" );
1018+ redis_cmd_append_sstr_zstr (& cmdstr , op );
1019+
1020+ for (i = 0 ; i < argc ; i ++ ) {
1021+ arg = zval_get_string (& argv [i ]);
1022+ redis_cmd_append_sstr_zstr (& cmdstr , arg );
1023+ zend_string_release (arg );
1024+ }
1025+
1026+ * cmd = cmdstr .c ;
1027+ * cmd_len = cmdstr .len ;
1028+
1029+ return SUCCESS ;
1030+ }
1031+
9401032int
9411033redis_zrandmember_cmd (INTERNAL_FUNCTION_PARAMETERS , RedisSock * redis_sock ,
9421034 char * * cmd , int * cmd_len , short * slot , void * * ctx )
0 commit comments