@@ -63,21 +63,21 @@ const StaticString
63
63
s_nRemoved (" nRemoved" ),
64
64
s_nInserted (" nInserted" ),
65
65
s_nModified (" nModified" ),
66
- s_omit_nModified (" omit_nModified" ),
67
66
s_writeConcern (" writeConcern" ),
67
+ s_upserted (" upserted" ),
68
68
s_upsertedIds (" upsertedIds" ),
69
69
s_writeErrors (" writeErrors" ),
70
70
s_errmsg (" errmsg" ),
71
71
s_message (" message" ),
72
72
s_code (" code" ),
73
73
s_index (" index" ),
74
74
s_info (" info" ),
75
- s_writeConcernError (" writeConcernError" );
75
+ s_writeConcernError (" writeConcernError" ),
76
+ s_writeConcernErrors (" writeConcernErrors" );
76
77
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)
78
79
{
79
80
static Class* c_writeResult;
80
- std::string message;
81
81
82
82
c_writeResult = Unit::lookupClass (s_MongoDriverWriteResult_className.get ());
83
83
assert (c_writeResult);
@@ -88,16 +88,20 @@ Object hippo_write_result_init(mongoc_write_result_t *write_result, bson_error_t
88
88
wr_data->m_server_id = server_id;
89
89
wr_data->m_write_concern = mongoc_write_concern_copy (write_concern);
90
90
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;
97
95
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);
101
105
102
106
if (write_concern) {
103
107
Array debugInfoResult = Array::Create ();
@@ -108,27 +112,17 @@ Object hippo_write_result_init(mongoc_write_result_t *write_result, bson_error_t
108
112
obj->o_set (s_writeConcern, Variant (), s_MongoDriverWriteConcern_className);
109
113
}
110
114
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);
118
117
} else {
119
118
Array a = Array::Create ();
120
119
obj->o_set (s_upsertedIds, a, s_MongoDriverWriteResult_className);
121
120
}
122
121
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)) {
126
123
Array writeErrors = Array::Create ();
127
124
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) {
132
126
const Variant& value = iter.second ();
133
127
static Class* c_writeError;
134
128
@@ -140,8 +134,6 @@ Object hippo_write_result_init(mongoc_write_result_t *write_result, bson_error_t
140
134
141
135
if (a_we.exists (s_errmsg)) {
142
136
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 ());
145
137
}
146
138
if (a_we.exists (s_code)) {
147
139
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
159
151
obj->o_set (s_writeErrors, writeErrors, s_MongoDriverWriteResult_className);
160
152
}
161
153
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)) {
165
155
Array a_v;
166
156
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 ();
171
158
172
159
static Class* c_writeConcernError;
173
160
@@ -180,8 +167,6 @@ Object hippo_write_result_init(mongoc_write_result_t *write_result, bson_error_t
180
167
181
168
if (first_item.exists (s_errmsg)) {
182
169
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 ());
185
170
}
186
171
if (first_item.exists (s_code)) {
187
172
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
197
182
}
198
183
199
184
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 );
207
187
bw_exception->o_set (s_MongoDriverExceptionBulkWriteException_writeResult, obj, MongoDriver::s_MongoDriverExceptionBulkWriteException_className);
208
188
209
189
throw bw_exception;
190
+ } else {
191
+ throw MongoDriver::Utils::throwExceptionFromBsonError (error);
210
192
}
211
193
}
212
194
0 commit comments