Skip to content

Commit ece1215

Browse files
committed
feat: add variabls argument to Jq\Run class methods
1 parent 4f9e811 commit ece1215

File tree

1 file changed

+82
-6
lines changed

1 file changed

+82
-6
lines changed

jq.c

Lines changed: 82 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,58 @@ static void php_jv_dump(zval **return_value, jv x, int flags)
238238
jv_free(x);
239239
}
240240

241+
static int php_jq_arguments(jv *arguments, zval *variables)
242+
{
243+
if (variables == NULL) {
244+
return SUCCESS;
245+
}
246+
247+
zend_string *arg_key;
248+
zval *arg_val;
249+
250+
ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(variables), arg_key, arg_val) {
251+
if (!arg_key) {
252+
continue;
253+
}
254+
255+
char *str_key = ZSTR_VAL(arg_key);
256+
if (jv_object_has(jv_copy(*arguments), jv_string(str_key))) {
257+
if (PHP_JQ_G(display_errors)) {
258+
PHP_JQ_ERR(E_WARNING,
259+
"%s: variables key has already.", str_key);
260+
}
261+
continue;
262+
}
263+
264+
if (Z_TYPE_P(arg_val) != IS_STRING) {
265+
if (PHP_JQ_G(display_errors)) {
266+
PHP_JQ_ERR(E_WARNING,
267+
"%s: variables value should be a string.", str_key);
268+
}
269+
continue;
270+
}
271+
272+
char *str_val = Z_STRVAL_P(arg_val);
273+
jv v;
274+
if (Z_STRLEN_P(arg_val) > 1 && str_val[0] == '@') {
275+
v = jv_parse(++str_val);
276+
if (!jv_is_valid(v)) {
277+
jv_free(v);
278+
zend_throw_error(zend_jq_exception_ce,
279+
"%s: invalid JSON text passed to variables.",
280+
str_key);
281+
return FAILURE;
282+
}
283+
} else {
284+
v = jv_string(str_val);
285+
}
286+
287+
*arguments = jv_object_set(*arguments, jv_string(str_key), v);
288+
} ZEND_HASH_FOREACH_END();
289+
290+
return SUCCESS;
291+
}
292+
241293
static void php_jq_filter(zval **return_value, jq_state *jq, jv json, int flags)
242294
{
243295
jv result;
@@ -502,20 +554,23 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_jq_run_fromstring, 0, 0, 2)
502554
ZEND_ARG_INFO(0, text)
503555
ZEND_ARG_INFO(0, filter)
504556
ZEND_ARG_INFO(0, flags)
557+
ZEND_ARG_INFO(0, variables)
505558
ZEND_END_ARG_INFO()
506559
ZEND_NS_METHOD(##PHP_JQ_NS, Run, fromString)
507560
{
508561
char *filter, *text;
509562
jq_state *state;
510-
jv json;
563+
jv arguments, json;
511564
size_t filter_len, text_len;
512565
zend_long flags = 0;
566+
zval *variables = NULL;
513567

514-
ZEND_PARSE_PARAMETERS_START(2, 3)
568+
ZEND_PARSE_PARAMETERS_START(2, 4)
515569
Z_PARAM_STRING(text, text_len)
516570
Z_PARAM_STRING(filter, filter_len)
517571
Z_PARAM_OPTIONAL
518572
Z_PARAM_LONG(flags)
573+
Z_PARAM_ARRAY(variables)
519574
ZEND_PARSE_PARAMETERS_END();
520575

521576
json = jv_parse_sized(text, text_len);
@@ -525,17 +580,26 @@ ZEND_NS_METHOD(##PHP_JQ_NS, Run, fromString)
525580
RETURN_FALSE;
526581
}
527582

583+
arguments = jv_object();
584+
if (php_jq_arguments(&arguments, variables) != SUCCESS) {
585+
jv_free(arguments);
586+
jv_free(json);
587+
RETURN_FALSE;
588+
}
589+
528590
filter[filter_len] = 0;
529591

530592
state = php_jq_init();
531593

532-
if (!jq_compile(state, filter)) {
594+
if (!jq_compile_args(state, filter, jv_copy(arguments))) {
595+
jv_free(arguments);
533596
jv_free(json);
534597
jq_teardown(&state);
535598
zend_throw_error(zend_jq_exception_ce,
536599
"failed to compile filter string.");
537600
RETURN_FALSE;
538601
}
602+
jv_free(arguments);
539603

540604
php_jq_filter(&return_value, state, json, flags);
541605

@@ -547,20 +611,23 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_jq_run_fromfile, 0, 0, 2)
547611
ZEND_ARG_INFO(0, file)
548612
ZEND_ARG_INFO(0, filter)
549613
ZEND_ARG_INFO(0, flags)
614+
ZEND_ARG_INFO(0, variables)
550615
ZEND_END_ARG_INFO()
551616
ZEND_NS_METHOD(##PHP_JQ_NS, Run, fromFile)
552617
{
553618
char *file, *filter;
554619
jq_state *state;
555-
jv json;
620+
jv arguments, json;
556621
size_t file_len, filter_len;
557622
zend_long flags = 0;
623+
zval *variables = NULL;
558624

559-
ZEND_PARSE_PARAMETERS_START(2, 3)
625+
ZEND_PARSE_PARAMETERS_START(2, 4)
560626
Z_PARAM_STRING(file, file_len)
561627
Z_PARAM_STRING(filter, filter_len)
562628
Z_PARAM_OPTIONAL
563629
Z_PARAM_LONG(flags)
630+
Z_PARAM_ARRAY(variables)
564631
ZEND_PARSE_PARAMETERS_END();
565632

566633
if (php_jq_load_file(&json, file) != SUCCESS) {
@@ -573,17 +640,26 @@ ZEND_NS_METHOD(##PHP_JQ_NS, Run, fromFile)
573640
RETURN_FALSE;
574641
}
575642

643+
arguments = jv_object();
644+
if (php_jq_arguments(&arguments, variables) != SUCCESS) {
645+
jv_free(arguments);
646+
jv_free(json);
647+
RETURN_FALSE;
648+
}
649+
576650
state = php_jq_init();
577651

578652
filter[filter_len] = 0;
579653

580-
if (!jq_compile(state, filter)) {
654+
if (!jq_compile_args(state, filter, jv_copy(arguments))) {
655+
jv_free(arguments);
581656
jv_free(json);
582657
jq_teardown(&state);
583658
zend_throw_error(zend_jq_exception_ce,
584659
"failed to compile filter string.");
585660
RETURN_FALSE;
586661
}
662+
jv_free(arguments);
587663

588664
php_jq_filter(&return_value, state, json, flags);
589665

0 commit comments

Comments
 (0)