@@ -51,8 +51,10 @@ const StaticString
51
51
s_MongoDBDriverManager_slaveok (" slaveok" ),
52
52
s_MongoDBDriverManager_readpreference (" readpreference" ),
53
53
s_MongoDBDriverManager_readpreferencetags (" readpreferencetags" ),
54
+ s_MongoDBDriverManager_maxstalenessms (" maxstalenessms" ),
54
55
s_MongoDBDriverManager_readPreference (" readPreference" ),
55
56
s_MongoDBDriverManager_readPreferenceTags (" readPreferenceTags" ),
57
+ s_MongoDBDriverManager_maxStalenessMS (" maxStalenessMS" ),
56
58
s_MongoDBDriverManager_readconcernlevel (" readconcernlevel" ),
57
59
s_MongoDBDriverManager_readConcernLevel (" readConcernLevel" ),
58
60
s_MongoDBDriverManager_mode (" mode" ),
@@ -134,8 +136,10 @@ static bool hippo_mongo_driver_manager_apply_rp(mongoc_uri_t *uri, const Array o
134
136
!options.exists (s_MongoDBDriverManager_slaveok) &&
135
137
!options.exists (s_MongoDBDriverManager_readpreference) &&
136
138
!options.exists (s_MongoDBDriverManager_readpreferencetags) &&
139
+ !options.exists (s_MongoDBDriverManager_maxstalenessms) &&
137
140
!options.exists (s_MongoDBDriverManager_readPreference) &&
138
- !options.exists (s_MongoDBDriverManager_readPreferenceTags)
141
+ !options.exists (s_MongoDBDriverManager_readPreferenceTags) &&
142
+ !options.exists (s_MongoDBDriverManager_maxStalenessMS)
139
143
) {
140
144
return true ;
141
145
}
@@ -184,17 +188,37 @@ static bool hippo_mongo_driver_manager_apply_rp(mongoc_uri_t *uri, const Array o
184
188
mongoc_read_prefs_set_tags (new_rp, b_tags);
185
189
}
186
190
191
+ /* Validate that readPreferenceTags are not used with PRIMARY readPreference */
187
192
if (
188
193
mongoc_read_prefs_get_mode (new_rp) == MONGOC_READ_PRIMARY &&
189
194
!bson_empty (mongoc_read_prefs_get_tags (new_rp))
190
195
) {
191
196
throw MongoDriver::Utils::throwInvalidArgumentException (" Primary read preference mode conflicts with tags" );
192
197
mongoc_read_prefs_destroy (new_rp);
193
-
194
198
return false ;
195
199
}
196
200
197
- /* This may be redundant in light of the last check (primary with tags),
201
+ /* Handle maxStalenessMS, and make sure it is not combined with PRIMARY readPreference */
202
+ if (
203
+ (options.exists (s_MongoDBDriverManager_maxstalenessms) && options[s_MongoDBDriverManager_maxstalenessms].isInteger ())
204
+ ||
205
+ (options.exists (s_MongoDBDriverManager_maxStalenessMS) && options[s_MongoDBDriverManager_maxStalenessMS].isInteger ())
206
+ ) {
207
+ if (mongoc_read_prefs_get_mode (new_rp) == MONGOC_READ_PRIMARY) {
208
+ throw MongoDriver::Utils::throwInvalidArgumentException (" Primary read preference mode conflicts with maxStalenessMS" );
209
+ mongoc_read_prefs_destroy (new_rp);
210
+
211
+ return false ;
212
+ }
213
+
214
+ if (options.exists (s_MongoDBDriverManager_maxstalenessms)) {
215
+ mongoc_read_prefs_set_max_staleness_ms (new_rp, (int32_t ) options[s_MongoDBDriverManager_maxstalenessms].toInt64 ());
216
+ } else {
217
+ mongoc_read_prefs_set_max_staleness_ms (new_rp, (int32_t ) options[s_MongoDBDriverManager_maxStalenessMS].toInt64 ());
218
+ }
219
+ }
220
+
221
+ /* This may be redundant in light of the check for primary with tags,
198
222
* but we'll check anyway in case additional validation is implemented. */
199
223
if (!mongoc_read_prefs_is_valid (new_rp)) {
200
224
throw MongoDriver::Utils::throwInvalidArgumentException (" Read preference is not valid" );
@@ -337,7 +361,8 @@ static mongoc_uri_t *hippo_mongo_driver_manager_make_uri(const char *dsn, const
337
361
!strcasecmp (s_key, " safe" ) ||
338
362
!strcasecmp (s_key, " slaveok" ) ||
339
363
!strcasecmp (s_key, " w" ) ||
340
- !strcasecmp (s_key, " wtimeoutms" )
364
+ !strcasecmp (s_key, " wtimeoutms" ) ||
365
+ !strcasecmp (s_key, " maxstalenessms" )
341
366
) {
342
367
continue ;
343
368
}
0 commit comments