Skip to content

Commit c0d4f60

Browse files
committed
Fixed issues with PHP 7 and the new ReadConcern
1 parent 2223b0e commit c0d4f60

File tree

9 files changed

+60
-22
lines changed

9 files changed

+60
-22
lines changed

php_phongo.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ void phongo_readconcern_init(zval *return_value, const mongoc_read_concern_t *re
253253

254254
object_init_ex(return_value, php_phongo_readconcern_ce);
255255

256-
intern = (php_phongo_readconcern_t *)zend_object_store_get_object(return_value TSRMLS_CC);
256+
intern = Z_READCONCERN_OBJ_P(return_value);
257257
intern->read_concern = mongoc_read_concern_copy(read_concern);
258258
}
259259
/* }}} */
@@ -1246,7 +1246,7 @@ const mongoc_write_concern_t* phongo_write_concern_from_zval(zval *zwrite_concer
12461246
const mongoc_read_concern_t* phongo_read_concern_from_zval(zval *zread_concern TSRMLS_DC) /* {{{ */
12471247
{
12481248
if (zread_concern) {
1249-
php_phongo_readconcern_t *intern = (php_phongo_readconcern_t *)zend_object_store_get_object(zread_concern TSRMLS_CC);
1249+
php_phongo_readconcern_t *intern = Z_READCONCERN_OBJ_P(zread_concern);
12501250

12511251
if (intern) {
12521252
return intern->read_concern;
@@ -1357,9 +1357,9 @@ void php_phongo_read_concern_to_zval(zval *retval, const mongoc_read_concern_t *
13571357
array_init_size(retval, 1);
13581358

13591359
if (level) {
1360-
add_assoc_string_ex(retval, ZEND_STRS("level"), (char *)level, 1);
1360+
ADD_ASSOC_STRING(retval, "level", (char *)level);
13611361
} else {
1362-
add_assoc_null_ex(retval, ZEND_STRS("level"));
1362+
ADD_ASSOC_NULL_EX(retval, "level");
13631363
}
13641364
} /* }}} */
13651365

php_phongo_classes.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
# define Z_CURSORID_OBJ_P(zv) php_cursorid_fetch_object(Z_OBJ_P(zv));
2828
# define Z_MANAGER_OBJ_P(zv) php_manager_fetch_object(Z_OBJ_P(zv));
2929
# define Z_QUERY_OBJ_P(zv) php_query_fetch_object(Z_OBJ_P(zv));
30+
# define Z_READCONCERN_OBJ_P(zv) php_readconcern_fetch_object(Z_OBJ_P(zv));
3031
# define Z_READPREFERENCE_OBJ_P(zv) php_readpreference_fetch_object(Z_OBJ_P(zv));
3132
# define Z_SERVER_OBJ_P(zv) php_server_fetch_object(Z_OBJ_P(zv));
3233
# define Z_BULKWRITE_OBJ_P(zv) php_bulkwrite_fetch_object(Z_OBJ_P(zv));
@@ -51,6 +52,7 @@
5152
# define Z_OBJ_CURSORID(zo) php_cursorid_fetch_object(zo);
5253
# define Z_OBJ_MANAGER(zo) php_manager_fetch_object(zo);
5354
# define Z_OBJ_QUERY(zo) php_query_fetch_object(zo);
55+
# define Z_OBJ_READCONCERN(zo) php_readconcern_fetch_object(zo);
5456
# define Z_OBJ_READPREFERENCE(zo) php_readpreference_fetch_object(zo);
5557
# define Z_OBJ_SERVER(zo) php_server_fetch_object(zo);
5658
# define Z_OBJ_BULKWRITE(zo) php_bulkwrite_fetch_object(zo);
@@ -79,6 +81,7 @@
7981
# define Z_CURSORID_OBJ_P(zv) (php_phongo_cursorid_t *)zend_object_store_get_object(zv TSRMLS_CC);
8082
# define Z_MANAGER_OBJ_P(zv) (php_phongo_manager_t *)zend_object_store_get_object(zv TSRMLS_CC);
8183
# define Z_QUERY_OBJ_P(zv) (php_phongo_query_t *)zend_object_store_get_object(zv TSRMLS_CC);
84+
# define Z_READCONCERN_OBJ_P(zv) (php_phongo_readconcern_t *)zend_object_store_get_object(zv TSRMLS_CC);
8285
# define Z_READPREFERENCE_OBJ_P(zv) (php_phongo_readpreference_t *)zend_object_store_get_object(zv TSRMLS_CC);
8386
# define Z_SERVER_OBJ_P(zv) (php_phongo_server_t *)zend_object_store_get_object(zv TSRMLS_CC);
8487
# define Z_BULKWRITE_OBJ_P(zv) (php_phongo_bulkwrite_t *)zend_object_store_get_object(zv TSRMLS_CC);
@@ -103,6 +106,7 @@
103106
# define Z_OBJ_CURSORID(zo) (php_phongo_cursorid_t *)zo;
104107
# define Z_OBJ_MANAGER(zo) (php_phongo_manager_t *)zo;
105108
# define Z_OBJ_QUERY(zo) (php_phongo_query_t *)zo;
109+
# define Z_OBJ_READCONCERN(zo) (php_phongo_readconcern_t *)zo;
106110
# define Z_OBJ_READPREFERENCE(zo) (php_phongo_readpreference_t *)zo;
107111
# define Z_OBJ_SERVER(zo) (php_phongo_server_t *)zo;
108112
# define Z_OBJ_BULKWRITE(zo) (php_phongo_bulkwrite_t *)zo;

php_phongo_structs-5.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ typedef struct {
6464
uint32_t skip;
6565
uint32_t limit;
6666
uint32_t batch_size;
67+
mongoc_read_concern_t *read_concern;
6768
} php_phongo_query_t;
6869

6970
typedef struct {

php_phongo_structs-7.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ typedef struct {
6363
uint32_t skip;
6464
uint32_t limit;
6565
uint32_t batch_size;
66+
mongoc_read_concern_t *read_concern;
6667
zend_object std;
6768
} php_phongo_query_t;
6869

@@ -178,6 +179,9 @@ static inline php_phongo_manager_t* php_manager_fetch_object(zend_object *obj) {
178179
static inline php_phongo_query_t* php_query_fetch_object(zend_object *obj) {
179180
return (php_phongo_query_t *)((char *)obj - XtOffsetOf(php_phongo_query_t, std));
180181
}
182+
static inline php_phongo_readconcern_t* php_readconcern_fetch_object(zend_object *obj) {
183+
return (php_phongo_readconcern_t *)((char *)obj - XtOffsetOf(php_phongo_readconcern_t, std));
184+
}
181185
static inline php_phongo_readpreference_t* php_readpreference_fetch_object(zend_object *obj) {
182186
return (php_phongo_readpreference_t *)((char *)obj - XtOffsetOf(php_phongo_readpreference_t, std));
183187
}

src/MongoDB/Manager.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,8 @@ PHP_METHOD(Manager, executeBulkWrite)
164164
PHP_METHOD(Manager, getReadConcern)
165165
{
166166
php_phongo_manager_t *intern;
167-
(void)return_value_ptr;
167+
DECLARE_RETURN_VALUE_USED
168+
SUPPRESS_UNUSED_WARNING(return_value_ptr)
168169

169170
intern = Z_MANAGER_OBJ_P(getThis());
170171

src/MongoDB/Query.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,11 @@ PHP_METHOD(Query, __construct)
8383
zval *zread_concern = php_array_fetchc(zoptions, "readConcern");
8484

8585
if (Z_TYPE_P(zread_concern) != IS_OBJECT || !instanceof_function(Z_OBJCE_P(zread_concern), php_phongo_readconcern_ce TSRMLS_CC)) {
86+
#if PHP_VERSION_ID >= 70000
87+
phongo_throw_exception(PHONGO_ERROR_INVALID_ARGUMENT TSRMLS_CC, "Expected \"readConcern\" option to be %s, %s given", ZSTR_VAL(php_phongo_readconcern_ce->name), zend_get_type_by_const(Z_TYPE_P(zread_concern)));
88+
#else
8689
phongo_throw_exception(PHONGO_ERROR_INVALID_ARGUMENT TSRMLS_CC, "Expected \"readConcern\" option to be %s, %s given", php_phongo_readconcern_ce->name, zend_get_type_by_const(Z_TYPE_P(zread_concern)));
90+
#endif
8791
bson_clear(&intern->query);
8892
return;
8993
}

src/MongoDB/ReadConcern.c

Lines changed: 33 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -54,14 +54,14 @@ PHP_METHOD(ReadConcern, __construct)
5454
php_phongo_readconcern_t *intern;
5555
zend_error_handling error_handling;
5656
char *level = NULL;
57-
int level_len = 0;
57+
phongo_zpp_char_len level_len = 0;
5858

5959

60-
(void)return_value; (void)return_value_ptr; (void)return_value_used;
60+
SUPPRESS_UNUSED_WARNING(return_value_ptr) SUPPRESS_UNUSED_WARNING(return_value) SUPPRESS_UNUSED_WARNING(return_value_used)
6161

6262

6363
zend_replace_error_handling(EH_THROW, phongo_exception_from_phongo_domain(PHONGO_ERROR_INVALID_ARGUMENT), &error_handling TSRMLS_CC);
64-
intern = (php_phongo_readconcern_t *)zend_object_store_get_object(getThis() TSRMLS_CC);
64+
intern = Z_READCONCERN_OBJ_P(getThis());
6565

6666
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s!", &level, &level_len) == FAILURE) {
6767
zend_restore_error_handling(&error_handling TSRMLS_CC);
@@ -84,9 +84,9 @@ PHP_METHOD(ReadConcern, getLevel)
8484
{
8585
php_phongo_readconcern_t *intern;
8686
const char *level;
87-
(void)return_value_ptr; (void)return_value_used;
87+
SUPPRESS_UNUSED_WARNING(return_value_ptr) SUPPRESS_UNUSED_WARNING(return_value_used)
8888

89-
intern = (php_phongo_readconcern_t *)zend_object_store_get_object(getThis() TSRMLS_CC);
89+
intern = Z_READCONCERN_OBJ_P(getThis());
9090

9191
if (zend_parse_parameters_none() == FAILURE) {
9292
return;
@@ -95,7 +95,7 @@ PHP_METHOD(ReadConcern, getLevel)
9595
level = mongoc_read_concern_get_level(intern->read_concern);
9696

9797
if (level) {
98-
RETURN_STRING(level, 1);
98+
PHONGO_RETURN_STRING(level);
9999
}
100100

101101
RETURN_NULL();
@@ -124,37 +124,52 @@ static zend_function_entry php_phongo_readconcern_me[] = {
124124

125125

126126
/* {{{ php_phongo_readconcern_t object handlers */
127-
static void php_phongo_readconcern_free_object(void *object TSRMLS_DC) /* {{{ */
127+
static void php_phongo_readconcern_free_object(phongo_free_object_arg *object TSRMLS_DC) /* {{{ */
128128
{
129-
php_phongo_readconcern_t *intern = (php_phongo_readconcern_t*)object;
129+
php_phongo_readconcern_t *intern = Z_OBJ_READCONCERN(object);
130130

131131
zend_object_std_dtor(&intern->std TSRMLS_CC);
132132

133133
if (intern->read_concern) {
134134
mongoc_read_concern_destroy(intern->read_concern);
135135
}
136+
137+
#if PHP_VERSION_ID < 70000
136138
efree(intern);
139+
#endif
137140
} /* }}} */
138141

139-
zend_object_value php_phongo_readconcern_create_object(zend_class_entry *class_type TSRMLS_DC) /* {{{ */
142+
phongo_create_object_retval php_phongo_readconcern_create_object(zend_class_entry *class_type TSRMLS_DC) /* {{{ */
140143
{
141-
zend_object_value retval;
142144
php_phongo_readconcern_t *intern = NULL;
143145

144-
intern = (php_phongo_readconcern_t *)ecalloc(1, sizeof *intern);
146+
intern = PHONGO_ALLOC_OBJECT_T(php_phongo_readconcern_t, class_type);
145147

146148
zend_object_std_init(&intern->std, class_type TSRMLS_CC);
147149
object_properties_init(&intern->std, class_type);
148150

149-
retval.handle = zend_objects_store_put(intern, (zend_objects_store_dtor_t) zend_objects_destroy_object, php_phongo_readconcern_free_object, NULL TSRMLS_CC);
150-
retval.handlers = &php_phongo_handler_readconcern;
151+
#if PHP_VERSION_ID >= 70000
152+
intern->std.handlers = &php_phongo_handler_readconcern;
151153

152-
return retval;
154+
return &intern->std;
155+
#else
156+
{
157+
zend_object_value retval;
158+
retval.handle = zend_objects_store_put(intern, (zend_objects_store_dtor_t) zend_objects_destroy_object, php_phongo_readconcern_free_object, NULL TSRMLS_CC);
159+
retval.handlers = &php_phongo_handler_readconcern;
160+
161+
return retval;
162+
}
163+
#endif
153164
} /* }}} */
154165

155166
HashTable *php_phongo_readconcern_get_debug_info(zval *object, int *is_temp TSRMLS_DC) /* {{{ */
156167
{
168+
#if PHP_VERSION_ID >= 70000
169+
zval retval;
170+
#else
157171
zval retval = zval_used_for_init;
172+
#endif
158173
const mongoc_read_concern_t *read_concern = phongo_read_concern_from_zval(object TSRMLS_CC);
159174

160175

@@ -178,6 +193,10 @@ PHP_MINIT_FUNCTION(ReadConcern)
178193

179194
memcpy(&php_phongo_handler_readconcern, phongo_get_std_object_handlers(), sizeof(zend_object_handlers));
180195
php_phongo_handler_readconcern.get_debug_info = php_phongo_readconcern_get_debug_info;
196+
#if PHP_VERSION_ID >= 70000
197+
php_phongo_handler_readconcern.free_obj = php_phongo_readconcern_free_object;
198+
php_phongo_handler_readconcern.offset = XtOffsetOf(php_phongo_readconcern_t, std);
199+
#endif
181200

182201
zend_declare_class_constant_stringl(php_phongo_readconcern_ce, ZEND_STRL("LOCAL"), ZEND_STRL(MONGOC_READ_CONCERN_LEVEL_LOCAL) TSRMLS_CC);
183202
zend_declare_class_constant_stringl(php_phongo_readconcern_ce, ZEND_STRL("MAJORITY"), ZEND_STRL(MONGOC_READ_CONCERN_LEVEL_MAJORITY) TSRMLS_CC);

src/contrib/php_array_api.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -515,8 +515,13 @@ void php_array_unsetl_safe(zval *zarr, const char *key, int key_len) {
515515
}
516516
#define php_array_unsetn(zarr, idx) \
517517
zend_symtable_index_del(Z_ARRVAL_P(zarr), idx)
518-
#define php_array_unsetc(zarr, litstr) \
518+
#ifdef ZEND_ENGINE_3
519+
# define php_array_unsetc(zarr, litstr) \
520+
zend_symtable_str_del(Z_ARRVAL_P(zarr), litstr, PAA_LENGTH_ADJ(sizeof(litstr) - 1))
521+
#else
522+
# define php_array_unsetc(zarr, litstr) \
519523
zend_symtable_del(Z_ARRVAL_P(zarr), litstr, PAA_LENGTH_ADJ(sizeof(litstr) - 1))
524+
#endif
520525
static inline void php_array_unsetz(zval *zarr, zval *key) {
521526
switch (Z_TYPE_P(key)) {
522527
case IS_NULL:

tests/query/query-ctor_error-001.phpt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,11 @@ foreach ($tests as $test) {
2525
?>
2626
===DONE===
2727
<?php exit(0); ?>
28-
--EXPECT--
28+
--EXPECTF--
2929
OK: Got MongoDB\Driver\Exception\InvalidArgumentException
3030
Expected "readConcern" option to be MongoDB\Driver\ReadConcern, integer given
3131
OK: Got MongoDB\Driver\Exception\InvalidArgumentException
32-
Expected "readConcern" option to be MongoDB\Driver\ReadConcern, double given
32+
Expected "readConcern" option to be MongoDB\Driver\ReadConcern, %r(double|float)%r given
3333
OK: Got MongoDB\Driver\Exception\InvalidArgumentException
3434
Expected "readConcern" option to be MongoDB\Driver\ReadConcern, string given
3535
OK: Got MongoDB\Driver\Exception\InvalidArgumentException

0 commit comments

Comments
 (0)