bool mongoc_uri_set_option_as_bool (mongoc_uri_t *uri, const char *option, bool value) { const bson_t *options; bson_iter_t iter; BSON_ASSERT (option); if (!mongoc_uri_option_is_bool (option)) { return false; } if ((options = mongoc_uri_get_options (uri)) && bson_iter_init_find_case (&iter, options, option)) { if (BSON_ITER_HOLDS_BOOL (&iter)) { bson_iter_overwrite_bool (&iter, value); return true; } else { return false; } } bson_append_bool(&uri->options, option, -1, value); return true; }
static mongoc_uri_t *hippo_mongo_driver_manager_make_uri(const char *dsn, const Array options) { mongoc_uri_t *uri = mongoc_uri_new(dsn); if (!uri) { throw MongoDriver::Utils::throwInvalidArgumentException("Failed to parse MongoDB URI: '" + String(dsn) + "'"); } for (ArrayIter iter(options); iter; ++iter) { const Variant& key = iter.first(); const Variant& value = iter.second(); const char *s_key = key.toString().c_str(); if ( !strcasecmp(s_key, "journal") || !strcasecmp(s_key, "readpreference") || !strcasecmp(s_key, "readpreferencetags") || !strcasecmp(s_key, "safe") || !strcasecmp(s_key, "slaveok") || !strcasecmp(s_key, "w") || !strcasecmp(s_key, "wtimeoutms") ) { continue; } if (mongoc_uri_option_is_bool(s_key)) { mongoc_uri_set_option_as_bool(uri, s_key, value.toBoolean()); } else if (mongoc_uri_option_is_int32(s_key) && value.isInteger()) { mongoc_uri_set_option_as_int32(uri, s_key, (int32_t) value.toInt64()); } else if (mongoc_uri_option_is_utf8(s_key) && value.isString()) { mongoc_uri_set_option_as_utf8(uri, s_key, value.toString().c_str()); } else if (value.isString()) { if (!strcasecmp(s_key, "username")) { mongoc_uri_set_username(uri, value.toString().c_str()); } else if (!strcasecmp(s_key, "password")) { mongoc_uri_set_password(uri, value.toString().c_str()); } else if (!strcasecmp(s_key, "database")) { mongoc_uri_set_database(uri, value.toString().c_str()); } else if (!strcasecmp(s_key, "authsource")) { mongoc_uri_set_auth_source(uri, value.toString().c_str()); } } } return uri; }
bool mongoc_uri_option_is_utf8 (const char *key) { if (mongoc_uri_option_is_bool(key) || mongoc_uri_option_is_int32(key)) { return false; } if (!strcasecmp(key, "readpreferencetags") || !strcasecmp(key, "authmechanismproperties")) { return false; } if (!strcasecmp(key, "username") || !strcasecmp(key, "password") || !strcasecmp(key, "authsource") || !strcasecmp(key, "database")) { return false; } return true; }
static bool mongoc_uri_parse_option (mongoc_uri_t *uri, const char *str) { int32_t v_int; const char *end_key; char *key = NULL; char *value = NULL; bool ret = false; if (!(key = scan_to_unichar(str, '=', "", &end_key))) { goto CLEANUP; } value = bson_strdup(end_key + 1); mongoc_uri_do_unescape(&value); if (!value) { /* do_unescape detected invalid UTF-8 and freed value */ goto CLEANUP; } if (mongoc_uri_option_is_int32(key)) { v_int = (int) strtol (value, NULL, 10); BSON_APPEND_INT32 (&uri->options, key, v_int); } else if (!strcasecmp(key, "w")) { if (*value == '-' || isdigit(*value)) { v_int = (int) strtol (value, NULL, 10); BSON_APPEND_INT32 (&uri->options, "w", v_int); } else if (0 == strcasecmp (value, "majority")) { BSON_APPEND_UTF8 (&uri->options, "w", "majority"); } else if (*value) { BSON_APPEND_UTF8 (&uri->options, "w", value); } } else if (mongoc_uri_option_is_bool(key)) { bson_append_bool (&uri->options, key, -1, (0 == strcasecmp (value, "true")) || (0 == strcasecmp (value, "t")) || (0 == strcmp (value, "1"))); } else if (!strcasecmp(key, "readpreferencetags")) { mongoc_uri_parse_tags(uri, value); } else if (!strcasecmp(key, "authmechanism") || !strcasecmp(key, "authsource")) { bson_append_utf8(&uri->credentials, key, -1, value, -1); } else if (!strcasecmp(key, "readconcernlevel")) { mongoc_read_concern_set_level (uri->read_concern, value); } else if (!strcasecmp(key, "authmechanismproperties")) { if (!mongoc_uri_parse_auth_mechanism_properties(uri, value)) { goto CLEANUP; } #ifdef MONGOC_EXPERIMENTAL_FEATURES } else if (!strcasecmp (key, "appname")) { if (!mongoc_uri_set_appname (uri, value)) { MONGOC_WARNING ("Cannot set appname: %s is invalid", value); goto CLEANUP; } #endif } else { bson_append_utf8(&uri->options, key, -1, value, -1); } ret = true; CLEANUP: bson_free(key); bson_free(value); return ret; }