Skip to content

Commit afe8fc0

Browse files
committed
Merged pull request #388
2 parents d6f7546 + 213a8f0 commit afe8fc0

File tree

4 files changed

+99
-12
lines changed

4 files changed

+99
-12
lines changed

src/BSON/Regex.c

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -54,16 +54,20 @@ static bool php_phongo_regex_init(php_phongo_regex_t *intern, const char *patter
5454
phongo_throw_exception(PHONGO_ERROR_INVALID_ARGUMENT TSRMLS_CC, "Pattern cannot contain null bytes");
5555
return false;
5656
}
57-
58-
if (strlen(flags) != flags_len) {
59-
phongo_throw_exception(PHONGO_ERROR_INVALID_ARGUMENT TSRMLS_CC, "Flags cannot contain null bytes");
60-
return false;
61-
}
62-
6357
intern->pattern = estrndup(pattern, pattern_len);
6458
intern->pattern_len = pattern_len;
65-
intern->flags = estrndup(flags, flags_len);
66-
intern->flags_len = flags_len;
59+
60+
if (flags) {
61+
if (strlen(flags) != flags_len) {
62+
phongo_throw_exception(PHONGO_ERROR_INVALID_ARGUMENT TSRMLS_CC, "Flags cannot contain null bytes");
63+
return false;
64+
}
65+
intern->flags = estrndup(flags, flags_len);
66+
intern->flags_len = flags_len;
67+
} else {
68+
intern->flags = estrdup("");
69+
intern->flags_len = 0;
70+
}
6771

6872
return true;
6973
}
@@ -92,22 +96,22 @@ static bool php_phongo_regex_init_from_hash(php_phongo_regex_t *intern, HashTabl
9296
return false;
9397
}
9498

95-
/* {{{ proto void Regex::__construct(string $pattern, string $flags)
99+
/* {{{ proto void Regex::__construct(string $pattern [, string $flags])
96100
Constructs a new BSON regular expression type. */
97101
PHP_METHOD(Regex, __construct)
98102
{
99103
php_phongo_regex_t *intern;
100104
zend_error_handling error_handling;
101105
char *pattern;
102106
phongo_zpp_char_len pattern_len;
103-
char *flags;
104-
phongo_zpp_char_len flags_len;
107+
char *flags = NULL;
108+
phongo_zpp_char_len flags_len = 0;
105109

106110

107111
zend_replace_error_handling(EH_THROW, phongo_exception_from_phongo_domain(PHONGO_ERROR_INVALID_ARGUMENT), &error_handling TSRMLS_CC);
108112
intern = Z_REGEX_OBJ_P(getThis());
109113

110-
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &pattern, &pattern_len, &flags, &flags_len) == FAILURE) {
114+
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s", &pattern, &pattern_len, &flags, &flags_len) == FAILURE) {
111115
zend_restore_error_handling(&error_handling TSRMLS_CC);
112116
return;
113117
}

tests/bson/bson-regex-003.phpt

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
--TEST--
2+
MongoDB\BSON\Regex with flags omitted
3+
--FILE--
4+
<?php
5+
6+
require_once __DIR__ . '/../utils/tools.php';
7+
8+
$regexp = new MongoDB\BSON\Regex("regexp");
9+
printf("Pattern: %s\n", $regexp->getPattern());
10+
printf("Flags: %s\n", $regexp->getFlags());
11+
printf("String representation: %s\n", $regexp);
12+
13+
$tests = array(
14+
array("regex" => $regexp),
15+
);
16+
17+
foreach($tests as $n => $test) {
18+
$s = fromPHP($test);
19+
echo "Test#{$n} ", $json = toJSON($s), "\n";
20+
$bson = fromJSON($json);
21+
$testagain = toPHP($bson);
22+
var_dump(toJSON(fromPHP($test)), toJSON(fromPHP($testagain)));
23+
var_dump((object)$test == (object)$testagain);
24+
}
25+
?>
26+
===DONE===
27+
<?php exit(0); ?>
28+
--EXPECTF--
29+
Pattern: regexp
30+
Flags:
31+
String representation: /regexp/
32+
Test#0 { "regex" : { "$regex" : "regexp", "$options" : "" } }
33+
string(54) "{ "regex" : { "$regex" : "regexp", "$options" : "" } }"
34+
string(54) "{ "regex" : { "$regex" : "regexp", "$options" : "" } }"
35+
bool(true)
36+
===DONE===

tests/bson/bson-regex-004.phpt

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
--TEST--
2+
MongoDB\BSON\Regex debug handler with flags omitted
3+
--FILE--
4+
<?php
5+
6+
$regex = new MongoDB\BSON\Regex('regexp');
7+
8+
var_dump($regex);
9+
10+
?>
11+
===DONE===
12+
<?php exit(0); ?>
13+
--EXPECTF--
14+
object(MongoDB\BSON\Regex)#%d (%d) {
15+
["pattern"]=>
16+
string(6) "regexp"
17+
["flags"]=>
18+
string(0) ""
19+
}
20+
===DONE===
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
--TEST--
2+
MongoDB\BSON\Regex serialization with flags omitted
3+
--FILE--
4+
<?php
5+
6+
var_dump($regex = new MongoDB\BSON\Regex('regexp'));
7+
var_dump($s = serialize($regex));
8+
var_dump(unserialize($s));
9+
10+
?>
11+
===DONE===
12+
<?php exit(0); ?>
13+
--EXPECTF--
14+
object(MongoDB\BSON\Regex)#%d (%d) {
15+
["pattern"]=>
16+
string(6) "regexp"
17+
["flags"]=>
18+
string(0) ""
19+
}
20+
string(76) "O:18:"MongoDB\BSON\Regex":2:{s:7:"pattern";s:6:"regexp";s:5:"flags";s:0:"";}"
21+
object(MongoDB\BSON\Regex)#%d (%d) {
22+
["pattern"]=>
23+
string(6) "regexp"
24+
["flags"]=>
25+
string(0) ""
26+
}
27+
===DONE===

0 commit comments

Comments
 (0)