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

Commit 76626f8

Browse files
committed
Merged pull request #76
2 parents 43f7650 + 896ec02 commit 76626f8

File tree

5 files changed

+54
-56
lines changed

5 files changed

+54
-56
lines changed

ext_mongodb.php

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -151,17 +151,31 @@ public function __debugInfo() : array
151151

152152
$ret['nInserted'] = $this->nInserted;
153153
$ret['nMatched'] = $this->nMatched;
154-
if ($this->omit_nModified) {
155-
$ret['nModified'] = null;
156-
} else {
157-
$ret['nModified'] = $this->nModified;
158-
}
154+
$ret['nModified'] = $this->nModified;
159155
$ret['nRemoved'] = $this->nRemoved;
160156
$ret['nUpserted'] = $this->nUpserted;
161157

162158
$ret['upsertedIds'] = (array) $this->upsertedIds;
163-
$ret['writeErrors'] = $this->writeErrors;
164-
$ret['writeConcernError'] = $this->writeConcernError;
159+
$ret['writeErrors'] = array_map(
160+
function($value) {
161+
$a = [
162+
'index' => $value->getIndex(),
163+
'code' => $value->getCode(),
164+
'errmsg' => $value->getMessage(),
165+
];
166+
167+
return $a;
168+
},
169+
$this->writeErrors
170+
);
171+
if (is_object($this->writeConcernError) && $this->writeConcernError instanceof \MongoDB\Driver\WriteConcernError) {
172+
$ret['writeConcernError'] = [
173+
'code' => $this->writeConcernError->getCode(),
174+
'errmsg' => $this->writeConcernError->getMessage(),
175+
];
176+
} else {
177+
$ret['writeConcernError'] = NULL;
178+
}
165179

166180
if ($this->writeConcern) {
167181
$ret['writeConcern'] = $this->writeConcern;

src/MongoDB/Driver/WriteResult.cpp

Lines changed: 27 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -63,21 +63,21 @@ const StaticString
6363
s_nRemoved("nRemoved"),
6464
s_nInserted("nInserted"),
6565
s_nModified("nModified"),
66-
s_omit_nModified("omit_nModified"),
6766
s_writeConcern("writeConcern"),
67+
s_upserted("upserted"),
6868
s_upsertedIds("upsertedIds"),
6969
s_writeErrors("writeErrors"),
7070
s_errmsg("errmsg"),
7171
s_message("message"),
7272
s_code("code"),
7373
s_index("index"),
7474
s_info("info"),
75-
s_writeConcernError("writeConcernError");
75+
s_writeConcernError("writeConcernError"),
76+
s_writeConcernErrors("writeConcernErrors");
7677

77-
Object hippo_write_result_init(mongoc_write_result_t *write_result, bson_error_t *error, mongoc_client_t *client, int server_id, int success, const mongoc_write_concern_t *write_concern)
78+
Object hippo_write_result_init(bson_t *reply, bson_error_t *error, mongoc_client_t *client, int server_id, int success, const mongoc_write_concern_t *write_concern)
7879
{
7980
static Class* c_writeResult;
80-
std::string message;
8181

8282
c_writeResult = Unit::lookupClass(s_MongoDriverWriteResult_className.get());
8383
assert(c_writeResult);
@@ -88,16 +88,20 @@ Object hippo_write_result_init(mongoc_write_result_t *write_result, bson_error_t
8888
wr_data->m_server_id = server_id;
8989
wr_data->m_write_concern = mongoc_write_concern_copy(write_concern);
9090

91-
obj->o_set(s_nUpserted, Variant((int64_t) write_result->nUpserted), s_MongoDriverWriteResult_className);
92-
obj->o_set(s_nMatched, Variant((int64_t) write_result->nMatched), s_MongoDriverWriteResult_className);
93-
obj->o_set(s_nRemoved, Variant((int64_t) write_result->nRemoved), s_MongoDriverWriteResult_className);
94-
obj->o_set(s_nInserted, Variant((int64_t) write_result->nInserted), s_MongoDriverWriteResult_className);
95-
obj->o_set(s_nModified, Variant((int64_t) write_result->nModified), s_MongoDriverWriteResult_className);
96-
obj->o_set(s_omit_nModified, Variant((int64_t) write_result->omit_nModified), s_MongoDriverWriteResult_className);
91+
/* Convert the whole BSON reply into a Variant */
92+
Variant v;
93+
Array a;
94+
hippo_bson_conversion_options_t options = HIPPO_TYPEMAP_DEBUG_INITIALIZER;
9795

98-
if (!success) {
99-
message = "BulkWrite error";
100-
}
96+
BsonToVariantConverter convertor(bson_get_data(reply), reply->len, options);
97+
convertor.convert(&v);
98+
a = v.toArray();
99+
100+
obj->o_set(s_nUpserted, Variant(a[s_nUpserted]), s_MongoDriverWriteResult_className);
101+
obj->o_set(s_nMatched, Variant(a[s_nMatched]), s_MongoDriverWriteResult_className);
102+
obj->o_set(s_nRemoved, Variant(a[s_nRemoved]), s_MongoDriverWriteResult_className);
103+
obj->o_set(s_nInserted, Variant(a[s_nInserted]), s_MongoDriverWriteResult_className);
104+
obj->o_set(s_nModified, Variant(a[s_nModified]), s_MongoDriverWriteResult_className);
101105

102106
if (write_concern) {
103107
Array debugInfoResult = Array::Create();
@@ -108,27 +112,17 @@ Object hippo_write_result_init(mongoc_write_result_t *write_result, bson_error_t
108112
obj->o_set(s_writeConcern, Variant(), s_MongoDriverWriteConcern_className);
109113
}
110114

111-
if (!bson_empty0(&write_result->upserted)) {
112-
Variant v;
113-
hippo_bson_conversion_options_t options = HIPPO_TYPEMAP_DEBUG_INITIALIZER;
114-
115-
BsonToVariantConverter convertor(bson_get_data(&write_result->upserted), write_result->upserted.len, options);
116-
convertor.convert(&v);
117-
obj->o_set(s_upsertedIds, v.toArray(), s_MongoDriverWriteResult_className);
115+
if (a.exists(s_upserted)) {
116+
obj->o_set(s_upsertedIds, a[s_upserted], s_MongoDriverWriteResult_className);
118117
} else {
119118
Array a = Array::Create();
120119
obj->o_set(s_upsertedIds, a, s_MongoDriverWriteResult_className);
121120
}
122121

123-
if (!bson_empty0(&write_result->writeErrors)) {
124-
Variant v;
125-
hippo_bson_conversion_options_t options = HIPPO_TYPEMAP_DEBUG_INITIALIZER;
122+
if (a.exists(s_writeErrors)) {
126123
Array writeErrors = Array::Create();
127124

128-
BsonToVariantConverter convertor(bson_get_data(&write_result->writeErrors), write_result->writeErrors.len, options);
129-
convertor.convert(&v);
130-
131-
for (ArrayIter iter(v.toArray()); iter; ++iter) {
125+
for (ArrayIter iter(a[s_writeErrors].toArray()); iter; ++iter) {
132126
const Variant& value = iter.second();
133127
static Class* c_writeError;
134128

@@ -140,8 +134,6 @@ Object hippo_write_result_init(mongoc_write_result_t *write_result, bson_error_t
140134

141135
if (a_we.exists(s_errmsg)) {
142136
we_obj->o_set(s_message, a_we[s_errmsg], s_MongoDriverWriteError_className);
143-
message += " :: ";
144-
message.append(a_we[s_errmsg].toString().c_str());
145137
}
146138
if (a_we.exists(s_code)) {
147139
we_obj->o_set(s_code, a_we[s_code], s_MongoDriverWriteError_className);
@@ -159,15 +151,10 @@ Object hippo_write_result_init(mongoc_write_result_t *write_result, bson_error_t
159151
obj->o_set(s_writeErrors, writeErrors, s_MongoDriverWriteResult_className);
160152
}
161153

162-
if (!bson_empty0(&write_result->writeConcernErrors)) {
163-
Variant v;
164-
hippo_bson_conversion_options_t options = HIPPO_TYPEMAP_DEBUG_INITIALIZER;
154+
if (a.exists(s_writeConcernErrors)) {
165155
Array a_v;
166156

167-
BsonToVariantConverter convertor(bson_get_data(&write_result->writeConcernErrors), write_result->writeConcernErrors.len, options);
168-
convertor.convert(&v);
169-
170-
a_v = v.toArray();
157+
a_v = a[s_writeConcernErrors].toArray();
171158

172159
static Class* c_writeConcernError;
173160

@@ -180,8 +167,6 @@ Object hippo_write_result_init(mongoc_write_result_t *write_result, bson_error_t
180167

181168
if (first_item.exists(s_errmsg)) {
182169
wce_obj->o_set(s_message, first_item[s_errmsg], s_MongoDriverWriteConcernError_className);
183-
message += " :: ";
184-
message.append(first_item[s_errmsg].toString().c_str());
185170
}
186171
if (first_item.exists(s_code)) {
187172
wce_obj->o_set(s_code, first_item[s_code], s_MongoDriverWriteConcernError_className);
@@ -197,16 +182,13 @@ Object hippo_write_result_init(mongoc_write_result_t *write_result, bson_error_t
197182
}
198183

199184
if (success == 0) {
200-
if (
201-
bson_empty0(&write_result->writeErrors) &&
202-
bson_empty0(&write_result->writeConcernErrors)
203-
) {
204-
throw MongoDriver::Utils::throwExceptionFromBsonError(error);
205-
} else {
206-
auto bw_exception = MongoDriver::Utils::throwBulkWriteException(message);
185+
if ((error->domain == MONGOC_ERROR_COMMAND && error->code != MONGOC_ERROR_COMMAND_INVALID_ARG) || error->domain == MONGOC_ERROR_WRITE_CONCERN) {
186+
auto bw_exception = MongoDriver::Utils::throwBulkWriteException(error->message);
207187
bw_exception->o_set(s_MongoDriverExceptionBulkWriteException_writeResult, obj, MongoDriver::s_MongoDriverExceptionBulkWriteException_className);
208188

209189
throw bw_exception;
190+
} else {
191+
throw MongoDriver::Utils::throwExceptionFromBsonError(error);
210192
}
211193
}
212194

src/MongoDB/Driver/WriteResult.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ class MongoDBDriverWriteResultData
4949
Object HHVM_METHOD(MongoDBDriverWriteResult, getServer);
5050
bool HHVM_METHOD(MongoDBDriverWriteResult, isAcknowledged);
5151

52-
Object hippo_write_result_init(mongoc_write_result_t *write_result, bson_error_t *error, mongoc_client_t *client, int server_id, int success, const mongoc_write_concern_t *write_concern);
52+
Object hippo_write_result_init(bson_t *reply, bson_error_t *error, mongoc_client_t *client, int server_id, int success, const mongoc_write_concern_t *write_concern);
5353

5454
}
5555
#endif

tests/MongoDBDriverBulkWrite_error-001.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,4 @@ try {
2626
}
2727
?>
2828
--EXPECTF--
29-
BulkWriteException: BulkWrite error :: E11000 duplicate key error index: demo.test.$_id_ dup key: { : 1 }
29+
BulkWriteException: E11000 duplicate key error index: demo.test.$_id_ dup key: { : 1 }

utils.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,7 @@ HPHP::Object Utils::doExecuteBulkWrite(const HPHP::String ns, mongoc_client_t *c
187187
char *database;
188188
char *collection;
189189
int success;
190+
bson_t reply = BSON_INITIALIZER;
190191

191192
/* Prepare */
192193
if (!MongoDriver::Utils::splitNamespace(ns, &database, &collection)) {
@@ -211,10 +212,11 @@ HPHP::Object Utils::doExecuteBulkWrite(const HPHP::String ns, mongoc_client_t *c
211212
}
212213

213214
/* Run operation */
214-
success = mongoc_bulk_operation_execute(bulk_data->m_bulk, NULL, &error);
215+
success = mongoc_bulk_operation_execute(bulk_data->m_bulk, &reply, &error);
215216

216217
/* Prepare result */
217-
HPHP::Object obj = HPHP::hippo_write_result_init(&bulk_data->m_bulk->result, &error, client, bulk_data->m_bulk->hint, success, write_concern);
218+
HPHP::Object obj = HPHP::hippo_write_result_init(&reply, &error, client, bulk_data->m_bulk->hint, success, write_concern);
219+
bson_destroy(&reply);
218220

219221
return obj;
220222
}

0 commit comments

Comments
 (0)