@@ -3927,6 +3927,79 @@ int redis_object_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
39273927 return SUCCESS ;
39283928}
39293929
3930+ int
3931+ redis_geoadd_cmd (INTERNAL_FUNCTION_PARAMETERS , RedisSock * redis_sock ,
3932+ char * * cmd , int * cmd_len , short * slot , void * * ctx )
3933+ {
3934+ zval * z_args , * z_ele ;
3935+ smart_string cmdstr = {0 };
3936+ zend_bool ch = 0 ;
3937+ zend_string * zstr ;
3938+ char * mode = NULL ;
3939+ int argc , i ;
3940+
3941+ // We at least need a key and one value
3942+ if ((argc = ZEND_NUM_ARGS ()) < 5 || argc % 3 != 2 ) {
3943+ zend_wrong_param_count ();
3944+ return FAILURE ;
3945+ }
3946+
3947+ // Make sure we at least have a key, and we can get other args
3948+ z_args = ecalloc (argc , sizeof (* z_args ));
3949+ if (zend_get_parameters_array (ht , argc , z_args ) == FAILURE ) {
3950+ efree (z_args );
3951+ return FAILURE ;
3952+ }
3953+
3954+ if (Z_TYPE (z_args [1 ]) != IS_NULL ) {
3955+ if (Z_TYPE (z_args [1 ]) != IS_ARRAY ) {
3956+ php_error_docref (NULL , E_WARNING , "Invalid options value" );
3957+ efree (z_args );
3958+ return FAILURE ;
3959+ }
3960+ ZEND_HASH_FOREACH_VAL (Z_ARRVAL (z_args [1 ]), z_ele ) {
3961+ ZVAL_DEREF (z_ele );
3962+ if (Z_TYPE_P (z_ele ) == IS_STRING ) {
3963+ if (zend_string_equals_literal_ci (Z_STR_P (z_ele ), "NX" ) ||
3964+ zend_string_equals_literal_ci (Z_STR_P (z_ele ), "XX" ))
3965+ {
3966+ mode = Z_STRVAL_P (z_ele );
3967+ } else if (zend_string_equals_literal_ci (Z_STR_P (z_ele ), "CH" )) {
3968+ ch = 1 ;
3969+ }
3970+ }
3971+ } ZEND_HASH_FOREACH_END ();
3972+ }
3973+
3974+ /* Initialize our command */
3975+ REDIS_CMD_INIT_SSTR_STATIC (& cmdstr , argc - 1 + (mode != NULL ) + ch , "GEOADD" );
3976+
3977+ /* Append key */
3978+ zstr = zval_get_string (& z_args [0 ]);
3979+ redis_cmd_append_sstr_key (& cmdstr , ZSTR_VAL (zstr ), ZSTR_LEN (zstr ), redis_sock , slot );
3980+ zend_string_release (zstr );
3981+
3982+ /* Append options */
3983+ if (mode != NULL ) {
3984+ redis_cmd_append_sstr (& cmdstr , mode , strlen (mode ));
3985+ }
3986+ REDIS_CMD_APPEND_SSTR_OPT_STATIC (& cmdstr , ch , "CH" );
3987+
3988+ /* Append members */
3989+ for (i = 2 ; i < argc ; ++ i ) {
3990+ redis_cmd_append_sstr_zval (& cmdstr , & z_args [i ], redis_sock );
3991+ }
3992+
3993+ // Cleanup arg array
3994+ efree (z_args );
3995+
3996+ // Push out values
3997+ * cmd = cmdstr .c ;
3998+ * cmd_len = cmdstr .len ;
3999+
4000+ return SUCCESS ;
4001+ }
4002+
39304003/* GEODIST */
39314004int redis_geodist_cmd (INTERNAL_FUNCTION_PARAMETERS , RedisSock * redis_sock ,
39324005 char * * cmd , int * cmd_len , short * slot , void * * ctx )
0 commit comments