PHP_METHOD(MongoGridFS, __construct) { zval *zdb, *files = 0, *chunks = 0, *zchunks; // chunks is deprecated if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O|zz", &zdb, mongo_ce_DB, &files, &chunks) == FAILURE) { return; } if (!files && !chunks) { MAKE_STD_ZVAL(files); ZVAL_STRING(files, "fs.files", 1); MAKE_STD_ZVAL(chunks); ZVAL_STRING(chunks, "fs.chunks", 1); } else { zval *temp_file; char *temp; if (Z_TYPE_P(files) != IS_STRING || Z_STRLEN_P(files) == 0 ) { #if ZEND_MODULE_API_NO >= 20060613 zend_throw_exception_ex(zend_exception_get_default(TSRMLS_C), 0 TSRMLS_CC, "MongoGridFS::__construct(): invalid prefix"); #else zend_throw_exception_ex(zend_exception_get_default(), 0 TSRMLS_CC, "MongoGridFS::__construct(): invalid prefix"); #endif /* ZEND_MODULE_API_NO >= 20060613 */ return; } MAKE_STD_ZVAL(chunks); spprintf(&temp, 0, "%s.chunks", Z_STRVAL_P(files)); ZVAL_STRING(chunks, temp, 0); MAKE_STD_ZVAL(temp_file); spprintf(&temp, 0, "%s.files", Z_STRVAL_P(files)); ZVAL_STRING(temp_file, temp, 0); files = temp_file; } // create files collection MONGO_METHOD2(MongoCollection, __construct, return_value, getThis(), zdb, files); // create chunks collection MAKE_STD_ZVAL(zchunks); object_init_ex(zchunks, mongo_ce_Collection); MONGO_METHOD2(MongoCollection, __construct, return_value, zchunks, zdb, chunks); // add chunks collection as a property zend_update_property(mongo_ce_GridFS, getThis(), "chunks", strlen("chunks"), zchunks TSRMLS_CC); zend_update_property(mongo_ce_GridFS, getThis(), "filesName", strlen("filesName"), files TSRMLS_CC); zend_update_property(mongo_ce_GridFS, getThis(), "chunksName", strlen("chunksName"), chunks TSRMLS_CC); // cleanup zval_ptr_dtor(&zchunks); zval_ptr_dtor(&files); zval_ptr_dtor(&chunks); }
/* {{{ MongoCursor->explain */ PHP_METHOD(MongoCursor, explain) { int temp_limit; zval *explain, *yes, *temp = 0; mongo_cursor *cursor = (mongo_cursor*)zend_object_store_get_object(getThis() TSRMLS_CC); MONGO_CHECK_INITIALIZED(cursor->link, MongoCursor); MONGO_METHOD(MongoCursor, reset, return_value, getThis()); // make explain use a hard limit temp_limit = cursor->limit; if (cursor->limit > 0) { cursor->limit *= -1; } MAKE_STD_ZVAL(explain); ZVAL_STRING(explain, "$explain", 1); MAKE_STD_ZVAL(yes); ZVAL_TRUE(yes); MONGO_METHOD2(MongoCursor, addOption, return_value, getThis(), explain, yes); zval_ptr_dtor(&explain); zval_ptr_dtor(&yes); MONGO_METHOD(MongoCursor, getNext, return_value, getThis()); // reset cursor to original state cursor->limit = temp_limit; zend_hash_del(HASH_P(cursor->query), "$explain", strlen("$explain")+1); MAKE_STD_ZVAL(temp); ZVAL_NULL(temp); MONGO_METHOD(MongoCursor, reset, temp, getThis()); zval_ptr_dtor(&temp); }
/* {{{ MongoCursor->explain */ PHP_METHOD(MongoCursor, explain) { int temp_limit; zval *explain, *yes; mongo_cursor *cursor = (mongo_cursor*)zend_object_store_get_object(getThis() TSRMLS_CC); MONGO_CHECK_INITIALIZED(cursor->link, MongoCursor); MONGO_METHOD(MongoCursor, reset, return_value, getThis()); // make explain use a hard limit temp_limit = cursor->limit; if (cursor->limit > 0) { cursor->limit *= -1; } MAKE_STD_ZVAL(explain); ZVAL_STRING(explain, "$explain", 1); MAKE_STD_ZVAL(yes); ZVAL_TRUE(yes); MONGO_METHOD2(MongoCursor, addOption, return_value, getThis(), explain, yes); zval_ptr_dtor(&explain); zval_ptr_dtor(&yes); MONGO_METHOD(MongoCursor, getNext, return_value, getThis()); // reset to original limit cursor->limit = temp_limit; }
PHP_METHOD(MongoDB, getDBRef) { zval *ref; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &ref) == FAILURE) { return; } MONGO_METHOD2(MongoDBRef, get, return_value, NULL, getThis(), ref); }
PHP_METHOD(MongoDB, createDBRef) { zval *ns, *obj; zval **id; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zz", &ns, &obj) == FAILURE) { return; } if (Z_TYPE_P(obj) == IS_ARRAY || Z_TYPE_P(obj) == IS_OBJECT) { if (zend_hash_find(HASH_P(obj), "_id", 4, (void**)&id) == SUCCESS) { MONGO_METHOD2(MongoDBRef, create, return_value, NULL, ns, *id); return; } else if (Z_TYPE_P(obj) == IS_ARRAY) { return; } } MONGO_METHOD2(MongoDBRef, create, return_value, NULL, ns, obj); }
/* {{{ MongoCursor::snapshot */ PHP_METHOD(MongoCursor, snapshot) { zval *snapshot, *yes; mongo_cursor *cursor = (mongo_cursor*)zend_object_store_get_object(getThis() TSRMLS_CC); MONGO_CHECK_INITIALIZED(cursor->link, MongoCursor); MAKE_STD_ZVAL(snapshot); ZVAL_STRING(snapshot, "$snapshot", 1); MAKE_STD_ZVAL(yes); ZVAL_TRUE(yes); MONGO_METHOD2(MongoCursor, addOption, return_value, getThis(), snapshot, yes); zval_ptr_dtor(&snapshot); zval_ptr_dtor(&yes); }
PHP_METHOD(MongoDB, selectCollection) { zval temp; zval *collection; mongo_db *db; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &collection) == FAILURE) { return; } db = (mongo_db*)zend_object_store_get_object(getThis() TSRMLS_CC); MONGO_CHECK_INITIALIZED(db->name, MongoDB); object_init_ex(return_value, mongo_ce_Collection); MONGO_METHOD2(MongoCollection, __construct, &temp, return_value, getThis(), collection); }
/* {{{ MongoCursor->sort */ PHP_METHOD(MongoCursor, sort) { zval *orderby, *fields; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &fields) == FAILURE) { return; } if (IS_SCALAR_P(fields)) { zend_error(E_WARNING, "MongoCursor::sort() expects parameter 1 to be an array or object"); return; } MAKE_STD_ZVAL(orderby); ZVAL_STRING(orderby, "$orderby", 1); MONGO_METHOD2(MongoCursor, addOption, return_value, getThis(), orderby, fields); zval_ptr_dtor(&orderby); }
PHP_METHOD(MongoDB, getGridFS) { zval temp; zval *arg1 = 0, *arg2 = 0; // arg2 is deprecated if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|zz", &arg1, &arg2) == FAILURE) { return; } object_init_ex(return_value, mongo_ce_GridFS); if (!arg1) { MONGO_METHOD1(MongoGridFS, __construct, &temp, return_value, getThis()); } else { MONGO_METHOD2(MongoGridFS, __construct, &temp, return_value, getThis(), arg1); } }
PHP_METHOD(MongoDB, getGridFS) { zval temp; zval *arg1 = 0, *arg2 = 0; // arg2 is deprecated if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|zz", &arg1, &arg2) == FAILURE) { return; } if (arg2) { php_error_docref(NULL TSRMLS_CC, MONGO_E_DEPRECATED, "This argument doesn't do anything. Please stop sending it"); } object_init_ex(return_value, mongo_ce_GridFS); if (!arg1) { MONGO_METHOD1(MongoGridFS, __construct, &temp, return_value, getThis()); } else { MONGO_METHOD2(MongoGridFS, __construct, &temp, return_value, getThis(), arg1); } }
PHP_METHOD(MongoDB, getGridFS) { zval temp; zval *arg1 = 0, *arg2 = 0; /* arg2 is deprecated */ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|zz", &arg1, &arg2) == FAILURE) { return; } if (arg2) { php_error_docref(NULL TSRMLS_CC, E_DEPRECATED, "The 'chunks' argument is deprecated and ignored"); } object_init_ex(return_value, mongo_ce_GridFS); if (!arg1) { MONGO_METHOD1(MongoGridFS, __construct, &temp, return_value, getThis()); } else { MONGO_METHOD2(MongoGridFS, __construct, &temp, return_value, getThis(), arg1); } }
PHP_METHOD(MongoDB, selectCollection) { zval temp; zval *z_collection; char *collection; int collection_len; mongo_db *db; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &collection, &collection_len) == FAILURE) { return; } MAKE_STD_ZVAL(z_collection); ZVAL_STRINGL(z_collection, collection, collection_len, 1); db = (mongo_db*)zend_object_store_get_object(getThis() TSRMLS_CC); MONGO_CHECK_INITIALIZED(db->name, MongoDB); object_init_ex(return_value, mongo_ce_Collection); MONGO_METHOD2(MongoCollection, __construct, &temp, return_value, getThis(), z_collection); zval_ptr_dtor(&z_collection); }
/* {{{ proto MongoGridFS::__construct(MongoDB db [, string prefix = "fs"]) Creates a new MongoGridFS object */ PHP_METHOD(MongoGridFS, __construct) { zval *zdb, *files = NULL, *chunks = NULL, *zchunks; zval *z_w = NULL; /* chunks is deprecated */ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O|zz", &zdb, mongo_ce_DB, &files, &chunks) == FAILURE) { zval *object = getThis(); ZVAL_NULL(object); return; } if (chunks) { php_error_docref(NULL TSRMLS_CC, MONGO_E_DEPRECATED, "The 'chunks' argument is deprecated and ignored"); } if (files) { zval *temp_file; char *temp; if (Z_TYPE_P(files) != IS_STRING || Z_STRLEN_P(files) == 0 ) { zend_throw_exception_ex(zend_exception_get_default(TSRMLS_C), 2 TSRMLS_CC, "MongoGridFS::__construct(): invalid prefix"); return; } MAKE_STD_ZVAL(chunks); spprintf(&temp, 0, "%s.chunks", Z_STRVAL_P(files)); ZVAL_STRING(chunks, temp, 0); MAKE_STD_ZVAL(temp_file); spprintf(&temp, 0, "%s.files", Z_STRVAL_P(files)); ZVAL_STRING(temp_file, temp, 0); files = temp_file; } else { MAKE_STD_ZVAL(files); ZVAL_STRING(files, "fs.files", 1); MAKE_STD_ZVAL(chunks); ZVAL_STRING(chunks, "fs.chunks", 1); } /* create files collection */ MONGO_METHOD2(MongoCollection, __construct, return_value, getThis(), zdb, files); /* create chunks collection */ MAKE_STD_ZVAL(zchunks); object_init_ex(zchunks, mongo_ce_Collection); MONGO_METHOD2(MongoCollection, __construct, return_value, zchunks, zdb, chunks); /* add chunks collection as a property */ zend_update_property(mongo_ce_GridFS, getThis(), "chunks", strlen("chunks"), zchunks TSRMLS_CC); zend_update_property(mongo_ce_GridFS, getThis(), "filesName", strlen("filesName"), files TSRMLS_CC); zend_update_property(mongo_ce_GridFS, getThis(), "chunksName", strlen("chunksName"), chunks TSRMLS_CC); /* GridFS is forced in our codebase to be w=1 so this property doesn't actually mean * anything, but we can't lie to the user so we have to overwrite it if the MongoDB * object that created this object was w=0. * This property is initialized in the MongoCollection (which we extend) ctor */ z_w = zend_read_property(mongo_ce_GridFS, getThis(), "w", strlen("w"), NOISY TSRMLS_CC); if (Z_TYPE_P(z_w) != IS_STRING) { convert_to_long(z_w); if (Z_LVAL_P(z_w) < 2) { zend_update_property_long(mongo_ce_GridFS, getThis(), "w", strlen("w"), 1 TSRMLS_CC); } } /* cleanup */ zval_ptr_dtor(&zchunks); zval_ptr_dtor(&files); zval_ptr_dtor(&chunks); }
/* * this should probably be split into two methods... right now appends the * getlasterror query to the buffer and alloc & inits the cursor zval. */ static zval* append_getlasterror(zval *coll, buffer *buf, int safe, int fsync TSRMLS_DC) { zval *cmd_ns_z, *cmd, *cursor_z, *temp; char *cmd_ns; mongo_cursor *cursor; mongo_collection *c = (mongo_collection*)zend_object_store_get_object(coll TSRMLS_CC); mongo_db *db = (mongo_db*)zend_object_store_get_object(c->parent TSRMLS_CC); int response; // get "db.$cmd" zval MAKE_STD_ZVAL(cmd_ns_z); spprintf(&cmd_ns, 0, "%s.$cmd", Z_STRVAL_P(db->name)); ZVAL_STRING(cmd_ns_z, cmd_ns, 0); // get {"getlasterror" : 1} zval MAKE_STD_ZVAL(cmd); array_init(cmd); add_assoc_long(cmd, "getlasterror", 1); if (safe == 1) { zval *w = zend_read_property(mongo_ce_Collection, coll, "w", strlen("w"), NOISY TSRMLS_CC); safe = Z_LVAL_P(w); } if (safe > 1) { zval *wtimeout; add_assoc_long(cmd, "w", safe); wtimeout = zend_read_property(mongo_ce_Collection, coll, "wtimeout", strlen("wtimeout"), NOISY TSRMLS_CC); add_assoc_long(cmd, "wtimeout", Z_LVAL_P(wtimeout)); } if (fsync) { add_assoc_bool(cmd, "fsync", 1); } // get cursor MAKE_STD_ZVAL(cursor_z); object_init_ex(cursor_z, mongo_ce_Cursor); MAKE_STD_ZVAL(temp); ZVAL_NULL(temp); MONGO_METHOD2(MongoCursor, __construct, temp, cursor_z, c->link, cmd_ns_z); zval_ptr_dtor(&temp); if (EG(exception)) { zval_ptr_dtor(&cmd_ns_z); return 0; } cursor = (mongo_cursor*)zend_object_store_get_object(cursor_z TSRMLS_CC); cursor->limit = -1; zval_ptr_dtor(&cursor->query); // cmd is now part of cursor, so it shouldn't be dtored until cursor is cursor->query = cmd; // append the query response = php_mongo_write_query(buf, cursor TSRMLS_CC); zval_ptr_dtor(&cmd_ns_z); if (FAILURE == response) { return 0; } return cursor_z; }