Skip to content

Commit f37f589

Browse files
committed
PHPC-783: Use mongoc_collection_find_with_opts() for Query exec
Query struct fields have been consolidated to a filter and opts BSON documents. This also changes the Query debug output significantly.
1 parent 9e68462 commit f37f589

18 files changed

+948
-431
lines changed

php_phongo.c

+1-112
Original file line numberDiff line numberDiff line change
@@ -351,117 +351,6 @@ void phongo_writeconcern_init(zval *return_value, const mongoc_write_concern_t *
351351
}
352352
/* }}} */
353353

354-
int32_t phongo_bson_find_as_int32(bson_t *bson, const char *key, int32_t fallback)
355-
{
356-
bson_iter_t iter;
357-
358-
if (bson_iter_init_find(&iter, bson, key) && BSON_ITER_HOLDS_INT32(&iter)) {
359-
return bson_iter_int32(&iter);
360-
}
361-
362-
return fallback;
363-
}
364-
365-
bool phongo_bson_find_as_bool(bson_t *bson, const char *key, bool fallback)
366-
{
367-
bson_iter_t iter;
368-
369-
if (bson_iter_init_find(&iter, bson, key) && BSON_ITER_HOLDS_BOOL(&iter)) {
370-
return bson_iter_bool(&iter);
371-
}
372-
373-
return fallback;
374-
}
375-
376-
void phongo_bson_iter_as_document(const bson_iter_t *iter, uint32_t *document_len, const uint8_t **document)
377-
{
378-
*document = NULL;
379-
*document_len = 0;
380-
381-
if (BSON_ITER_HOLDS_DOCUMENT(iter) || BSON_ITER_HOLDS_ARRAY(iter)) {
382-
memcpy (document_len, (iter->raw + iter->d1), sizeof (*document_len));
383-
*document_len = BSON_UINT32_FROM_LE (*document_len);
384-
*document = (iter->raw + iter->d1);
385-
}
386-
}
387-
388-
bool phongo_query_init(php_phongo_query_t *query, bson_t *filter, bson_t *options TSRMLS_DC) /* {{{ */
389-
{
390-
bson_iter_t iter;
391-
392-
if (options) {
393-
query->batch_size = phongo_bson_find_as_int32(options, "batchSize", 0);
394-
query->limit = phongo_bson_find_as_int32(options, "limit", 0);
395-
query->skip = phongo_bson_find_as_int32(options, "skip", 0);
396-
397-
query->flags = 0;
398-
query->flags |= phongo_bson_find_as_bool(options, "tailable", false) ? MONGOC_QUERY_TAILABLE_CURSOR : 0;
399-
query->flags |= phongo_bson_find_as_bool(options, "slaveOk", false) ? MONGOC_QUERY_SLAVE_OK : 0;
400-
query->flags |= phongo_bson_find_as_bool(options, "oplogReplay", false) ? MONGOC_QUERY_OPLOG_REPLAY : 0;
401-
query->flags |= phongo_bson_find_as_bool(options, "noCursorTimeout", false) ? MONGOC_QUERY_NO_CURSOR_TIMEOUT : 0;
402-
query->flags |= phongo_bson_find_as_bool(options, "awaitData", false) ? MONGOC_QUERY_AWAIT_DATA : 0;
403-
query->flags |= phongo_bson_find_as_bool(options, "exhaust", false) ? MONGOC_QUERY_EXHAUST : 0;
404-
query->flags |= phongo_bson_find_as_bool(options, "partial", false) ? MONGOC_QUERY_PARTIAL : 0;
405-
406-
407-
if (bson_iter_init_find(&iter, options, "modifiers")) {
408-
uint32_t len = 0;
409-
const uint8_t *data = NULL;
410-
411-
if (! (BSON_ITER_HOLDS_DOCUMENT (&iter) || BSON_ITER_HOLDS_ARRAY (&iter))) {
412-
phongo_throw_exception(PHONGO_ERROR_INVALID_ARGUMENT TSRMLS_CC, "Expected modifiers to be array or object, %d given", bson_iter_type(&iter));
413-
return false;
414-
}
415-
416-
bson_iter_document(&iter, &len, &data);
417-
if (len) {
418-
bson_t tmp;
419-
420-
bson_init_static(&tmp, data, len);
421-
bson_copy_to_excluding_noinit(&tmp, query->query, "not-used-value", NULL);
422-
bson_destroy (&tmp);
423-
}
424-
}
425-
426-
if (bson_iter_init_find(&iter, options, "projection")) {
427-
uint32_t len = 0;
428-
const uint8_t *data = NULL;
429-
430-
if (! (BSON_ITER_HOLDS_DOCUMENT (&iter) || BSON_ITER_HOLDS_ARRAY (&iter))) {
431-
phongo_throw_exception(PHONGO_ERROR_INVALID_ARGUMENT TSRMLS_CC, "Expected projection to be array or object, %d given", bson_iter_type(&iter));
432-
return false;
433-
}
434-
435-
bson_iter_document(&iter, &len, &data);
436-
if (len) {
437-
query->selector = bson_new_from_data(data, len);
438-
}
439-
}
440-
441-
if (bson_iter_init_find(&iter, options, "sort")) {
442-
uint32_t len = 0;
443-
const uint8_t *data = NULL;
444-
445-
if (! (BSON_ITER_HOLDS_DOCUMENT (&iter) || BSON_ITER_HOLDS_ARRAY (&iter))) {
446-
phongo_throw_exception(PHONGO_ERROR_INVALID_ARGUMENT TSRMLS_CC, "Expected sort to be array or object, %d given", bson_iter_type(&iter));
447-
return false;
448-
}
449-
450-
phongo_bson_iter_as_document(&iter, &len, &data);
451-
if (len) {
452-
bson_t tmp;
453-
454-
bson_init_static(&tmp, data, len);
455-
bson_append_document(query->query, "$orderby", -1, &tmp);
456-
bson_destroy(&tmp);
457-
}
458-
}
459-
}
460-
461-
BSON_APPEND_DOCUMENT(query->query, "$query", filter);
462-
return true;
463-
} /* }}} */
464-
465354
zend_bool phongo_writeconcernerror_init(zval *return_value, bson_t *bson TSRMLS_DC) /* {{{ */
466355
{
467356
bson_iter_t iter;
@@ -716,7 +605,7 @@ int phongo_execute_query(zval *manager, const char *namespace, zval *zquery, zva
716605
mongoc_collection_set_read_concern(collection, query->read_concern);
717606
}
718607

719-
cursor = mongoc_collection_find(collection, query->flags, query->skip, query->limit, query->batch_size, query->query, query->selector, phongo_read_preference_from_zval(zreadPreference TSRMLS_CC));
608+
cursor = mongoc_collection_find_with_opts(collection, query->filter, query->opts, phongo_read_preference_from_zval(zreadPreference TSRMLS_CC));
720609
mongoc_collection_destroy(collection);
721610

722611
/* mongoc issues a warning we need to catch somehow */

php_phongo.h

-1
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,6 @@ void phongo_server_init (zval *return_value, zval *
117117
void phongo_readconcern_init (zval *return_value, const mongoc_read_concern_t *read_concern TSRMLS_DC);
118118
void phongo_readpreference_init (zval *return_value, const mongoc_read_prefs_t *read_prefs TSRMLS_DC);
119119
void phongo_writeconcern_init (zval *return_value, const mongoc_write_concern_t *write_concern TSRMLS_DC);
120-
bool phongo_query_init (php_phongo_query_t *query, bson_t *filter, bson_t *options TSRMLS_DC);
121120
mongoc_bulk_operation_t* phongo_bulkwrite_init (zend_bool ordered);
122121
bool phongo_execute_write (zval *manager, const char *namespace, php_phongo_bulkwrite_t *bulk_write, const mongoc_write_concern_t *write_concern, int server_id, zval *return_value, int return_value_used TSRMLS_DC);
123122
int phongo_execute_command (zval *manager, const char *db, zval *zcommand, zval *zreadPreference, int server_id, zval *return_value, int return_value_used TSRMLS_DC);

php_phongo_structs.h

+2-6
Original file line numberDiff line numberDiff line change
@@ -86,12 +86,8 @@ typedef struct {
8686

8787
typedef struct {
8888
PHONGO_ZEND_OBJECT_PRE
89-
bson_t *query;
90-
bson_t *selector;
91-
mongoc_query_flags_t flags;
92-
uint32_t skip;
93-
uint32_t limit;
94-
uint32_t batch_size;
89+
bson_t *filter;
90+
bson_t *opts;
9591
mongoc_read_concern_t *read_concern;
9692
PHONGO_ZEND_OBJECT_POST
9793
} php_phongo_query_t;

0 commit comments

Comments
 (0)