Skip to content
This repository was archived by the owner on Dec 23, 2021. It is now read-only.

Commit a779d0d

Browse files
committed
Merged pull request #98
2 parents 56b86c0 + 2dece8c commit a779d0d

File tree

3 files changed

+49
-16
lines changed

3 files changed

+49
-16
lines changed

src/MongoDB/Driver/BulkWrite.cpp

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ IMPLEMENT_GET_CLASS(MongoDBDriverBulkWriteData);
3434
const StaticString s_MongoDBDriverBulkWrite_ordered("ordered");
3535
const StaticString s_MongoDBDriverBulkWrite_bypassDocumentValidation("bypassDocumentValidation");
3636

37+
#define BYPASS_UNSET -1
38+
3739
void HHVM_METHOD(MongoDBDriverBulkWrite, __construct, const Variant &bulkWriteOptions)
3840
{
3941
MongoDBDriverBulkWriteData* data = Native::data<MongoDBDriverBulkWriteData>(this_);
@@ -48,13 +50,14 @@ void HHVM_METHOD(MongoDBDriverBulkWrite, __construct, const Variant &bulkWriteOp
4850

4951
data->m_bulk = mongoc_bulk_operation_new(b_ordered);
5052
data->m_num_ops = 0;
53+
data->m_ordered = b_ordered;
54+
data->m_bypass = BYPASS_UNSET;
5155

5256
if (!options.isNull()) {
5357
if (options.exists(s_MongoDBDriverBulkWrite_bypassDocumentValidation)) {
54-
mongoc_bulk_operation_set_bypass_document_validation(
55-
data->m_bulk,
56-
options[s_MongoDBDriverBulkWrite_bypassDocumentValidation].toBoolean()
57-
);
58+
bool bypass = !!options[s_MongoDBDriverBulkWrite_bypassDocumentValidation].toBoolean();
59+
mongoc_bulk_operation_set_bypass_document_validation(data->m_bulk, bypass);
60+
data->m_bypass = bypass;
5861
}
5962
}
6063
}
@@ -184,6 +187,7 @@ const StaticString
184187
s_database("database"),
185188
s_collection("collection"),
186189
s_ordered("ordered"),
190+
s_bypassDocumentValidation("bypassDocumentValidation"),
187191
s_executed("executed"),
188192
s_server_id("server_id"),
189193
s_write_concern("write_concern");
@@ -193,20 +197,27 @@ Array HHVM_METHOD(MongoDBDriverBulkWrite, __debugInfo)
193197
MongoDBDriverBulkWriteData* data = Native::data<MongoDBDriverBulkWriteData>(this_);
194198
Array retval = Array::Create();
195199

196-
if (data->m_bulk->database) {
197-
retval.set(s_database, data->m_bulk->database);
200+
if (data->m_database) {
201+
retval.set(s_database, data->m_database);
198202
} else {
199203
retval.set(s_database, Variant());
200204
}
201205

202-
if (data->m_bulk->collection) {
203-
retval.set(s_collection, data->m_bulk->collection);
206+
if (data->m_collection) {
207+
retval.set(s_collection, data->m_collection);
204208
} else {
205209
retval.set(s_collection, Variant());
206210
}
207211

208-
retval.set(s_ordered, data->m_bulk->flags.ordered);
209-
retval.set(s_executed, data->m_bulk->executed);
212+
retval.set(s_ordered, data->m_ordered);
213+
214+
if (data->m_bypass != BYPASS_UNSET) {
215+
retval.set(s_bypassDocumentValidation, (bool) !!data->m_bypass);
216+
} else {
217+
retval.set(s_bypassDocumentValidation, Variant());
218+
}
219+
220+
retval.set(s_executed, data->m_executed);
210221
retval.set(s_server_id, (int64_t) mongoc_bulk_operation_get_hint(data->m_bulk));
211222

212223
if (mongoc_bulk_operation_get_write_concern(data->m_bulk)) {

src/MongoDB/Driver/BulkWrite.h

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,17 +30,32 @@ class MongoDBDriverBulkWriteData
3030
static const StaticString s_className;
3131

3232
mongoc_bulk_operation_t *m_bulk;
33-
size_t m_num_ops;
33+
size_t m_num_ops;
34+
bool m_ordered;
35+
int m_bypass;
36+
char *m_database;
37+
char *m_collection;
38+
bool m_executed;
3439

3540
static Class* getClass();
3641

3742
void sweep() {
3843
mongoc_bulk_operation_destroy(m_bulk);
44+
45+
if (m_database) {
46+
free(m_database);
47+
}
48+
if (m_collection) {
49+
free(m_collection);
50+
}
3951
}
4052

4153
MongoDBDriverBulkWriteData() {
4254
m_bulk = NULL;
4355
m_num_ops = 0;
56+
m_database = NULL;
57+
m_collection = NULL;
58+
m_executed = false;
4459
}
4560

4661
~MongoDBDriverBulkWriteData() {

utils.cpp

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -184,19 +184,25 @@ HPHP::Object Utils::doExecuteBulkWrite(const HPHP::String ns, mongoc_client_t *c
184184
{
185185
HPHP::MongoDBDriverBulkWriteData* bulk_data = HPHP::Native::data<HPHP::MongoDBDriverBulkWriteData>(bulk.get());
186186
bson_error_t error;
187-
char *database;
188-
char *collection;
189187
int success;
190188
bson_t reply = BSON_INITIALIZER;
191189

190+
/* Free previous database/collection, until PHPC-676 and HHVM-222 are resolved */
191+
if (bulk_data->m_database) {
192+
free(bulk_data->m_database);
193+
}
194+
if (bulk_data->m_collection) {
195+
free(bulk_data->m_collection);
196+
}
197+
192198
/* Prepare */
193-
if (!MongoDriver::Utils::splitNamespace(ns, &database, &collection)) {
199+
if (!MongoDriver::Utils::splitNamespace(ns, &bulk_data->m_database, &bulk_data->m_collection)) {
194200
throw throwInvalidArgumentException("Invalid namespace provided: " + ns);
195201
}
196202

197203
/* Setup operation */
198-
mongoc_bulk_operation_set_database(bulk_data->m_bulk, database);
199-
mongoc_bulk_operation_set_collection(bulk_data->m_bulk, collection);
204+
mongoc_bulk_operation_set_database(bulk_data->m_bulk, bulk_data->m_database);
205+
mongoc_bulk_operation_set_collection(bulk_data->m_bulk, bulk_data->m_collection);
200206
mongoc_bulk_operation_set_client(bulk_data->m_bulk, client);
201207

202208
/* Deal with write concerns */
@@ -213,6 +219,7 @@ HPHP::Object Utils::doExecuteBulkWrite(const HPHP::String ns, mongoc_client_t *c
213219

214220
/* Run operation */
215221
success = mongoc_bulk_operation_execute(bulk_data->m_bulk, &reply, &error);
222+
bulk_data->m_executed = true;
216223

217224
/* Prepare result */
218225
HPHP::Object obj = HPHP::hippo_write_result_init(&reply, &error, client, mongoc_bulk_operation_get_hint(bulk_data->m_bulk), success, write_concern);

0 commit comments

Comments
 (0)