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