diff --git a/src/BSON/Regex.c b/src/BSON/Regex.c index efa6d58d2..b4b7d6d31 100644 --- a/src/BSON/Regex.c +++ b/src/BSON/Regex.c @@ -54,16 +54,20 @@ static bool php_phongo_regex_init(php_phongo_regex_t *intern, const char *patter phongo_throw_exception(PHONGO_ERROR_INVALID_ARGUMENT TSRMLS_CC, "Pattern cannot contain null bytes"); return false; } - - if (strlen(flags) != flags_len) { - phongo_throw_exception(PHONGO_ERROR_INVALID_ARGUMENT TSRMLS_CC, "Flags cannot contain null bytes"); - return false; - } - intern->pattern = estrndup(pattern, pattern_len); intern->pattern_len = pattern_len; - intern->flags = estrndup(flags, flags_len); - intern->flags_len = flags_len; + + if (flags) { + if (strlen(flags) != flags_len) { + phongo_throw_exception(PHONGO_ERROR_INVALID_ARGUMENT TSRMLS_CC, "Flags cannot contain null bytes"); + return false; + } + intern->flags = estrndup(flags, flags_len); + intern->flags_len = flags_len; + } else { + intern->flags = estrdup(""); + intern->flags_len = 0; + } return true; } @@ -92,7 +96,7 @@ static bool php_phongo_regex_init_from_hash(php_phongo_regex_t *intern, HashTabl return false; } -/* {{{ proto void Regex::__construct(string $pattern, string $flags) +/* {{{ proto void Regex::__construct(string $pattern [, string $flags]) Constructs a new BSON regular expression type. */ PHP_METHOD(Regex, __construct) { @@ -100,14 +104,14 @@ PHP_METHOD(Regex, __construct) zend_error_handling error_handling; char *pattern; phongo_zpp_char_len pattern_len; - char *flags; - phongo_zpp_char_len flags_len; + char *flags = NULL; + phongo_zpp_char_len flags_len = 0; zend_replace_error_handling(EH_THROW, phongo_exception_from_phongo_domain(PHONGO_ERROR_INVALID_ARGUMENT), &error_handling TSRMLS_CC); intern = Z_REGEX_OBJ_P(getThis()); - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &pattern, &pattern_len, &flags, &flags_len) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s", &pattern, &pattern_len, &flags, &flags_len) == FAILURE) { zend_restore_error_handling(&error_handling TSRMLS_CC); return; } diff --git a/tests/bson/bson-regex-003.phpt b/tests/bson/bson-regex-003.phpt new file mode 100644 index 000000000..9de943e02 --- /dev/null +++ b/tests/bson/bson-regex-003.phpt @@ -0,0 +1,36 @@ +--TEST-- +MongoDB\BSON\Regex with flags omitted +--FILE-- +getPattern()); +printf("Flags: %s\n", $regexp->getFlags()); +printf("String representation: %s\n", $regexp); + +$tests = array( + array("regex" => $regexp), +); + +foreach($tests as $n => $test) { + $s = fromPHP($test); + echo "Test#{$n} ", $json = toJSON($s), "\n"; + $bson = fromJSON($json); + $testagain = toPHP($bson); + var_dump(toJSON(fromPHP($test)), toJSON(fromPHP($testagain))); + var_dump((object)$test == (object)$testagain); +} +?> +===DONE=== + +--EXPECTF-- +Pattern: regexp +Flags: +String representation: /regexp/ +Test#0 { "regex" : { "$regex" : "regexp", "$options" : "" } } +string(54) "{ "regex" : { "$regex" : "regexp", "$options" : "" } }" +string(54) "{ "regex" : { "$regex" : "regexp", "$options" : "" } }" +bool(true) +===DONE=== diff --git a/tests/bson/bson-regex-004.phpt b/tests/bson/bson-regex-004.phpt new file mode 100644 index 000000000..0f6cca88e --- /dev/null +++ b/tests/bson/bson-regex-004.phpt @@ -0,0 +1,20 @@ +--TEST-- +MongoDB\BSON\Regex debug handler with flags omitted +--FILE-- + +===DONE=== + +--EXPECTF-- +object(MongoDB\BSON\Regex)#%d (%d) { + ["pattern"]=> + string(6) "regexp" + ["flags"]=> + string(0) "" +} +===DONE=== diff --git a/tests/bson/bson-regex-serialization-002.phpt b/tests/bson/bson-regex-serialization-002.phpt new file mode 100644 index 000000000..ea03996e5 --- /dev/null +++ b/tests/bson/bson-regex-serialization-002.phpt @@ -0,0 +1,27 @@ +--TEST-- +MongoDB\BSON\Regex serialization with flags omitted +--FILE-- + +===DONE=== + +--EXPECTF-- +object(MongoDB\BSON\Regex)#%d (%d) { + ["pattern"]=> + string(6) "regexp" + ["flags"]=> + string(0) "" +} +string(76) "O:18:"MongoDB\BSON\Regex":2:{s:7:"pattern";s:6:"regexp";s:5:"flags";s:0:"";}" +object(MongoDB\BSON\Regex)#%d (%d) { + ["pattern"]=> + string(6) "regexp" + ["flags"]=> + string(0) "" +} +===DONE===