SEXP rmongo_connect(SEXP mongo_conn) { mongo* conn = _checkMongo(mongo_conn); mongo_host_port hp; SEXP host = getAttrib(mongo_conn, sym_host); int len = LENGTH(host); int i; if (len == 0) error("No hosts defined\n"); const char* name = CHAR(STRING_ELT(getAttrib(mongo_conn, sym_name), 0)); if (name[0] == '\0') { for (i = 0; i < len; i++) { mongo_parse_host(CHAR(STRING_ELT(host, i)), &hp); if (mongo_client(conn, hp.host, hp.port) == MONGO_OK) break; } if (i == len) { if (len == 1) Rprintf("Unable to connect to %s:%d, error code = %d\n", hp.host, hp.port, conn->err); else Rprintf("Unable to connect to any of the given hosts, error code = %d\n", conn->err); return mongo_conn; } } else { mongo_replica_set_init(conn, name); for (i = 0; i < len; i++) { mongo_parse_host(CHAR(STRING_ELT(host, i)), &hp); mongo_replica_set_add_seed(conn, hp.host, hp.port); } if (mongo_replica_set_client(conn) != MONGO_OK) Rprintf("Unable to connect to replset\n"); } int timeout = asInteger(getAttrib(mongo_conn, sym_timeout)); if (timeout > 0) mongo_set_op_timeout(conn, timeout); SEXP username = getAttrib(mongo_conn, sym_username); if (CHAR(STRING_ELT(username, 0))[0] != '\0') { SEXP password = getAttrib(mongo_conn, install("password")); SEXP db = getAttrib(mongo_conn, install("db")); SEXP ret = mongo_authenticate(mongo_conn, username, password, db); if (!LOGICAL(ret)[0]) { mongo_disconnect(conn); Rprintf("Authentication failed.\n"); } } return mongo_conn; }
u32 c_mongo_connection::prv_connect(const std::string& set_name, const init_type::socket_info_set_type& set) { typedef init_type::socket_info_set_citer_type iter_type; assert(!_init.empty()); if(_init.size() == 1) { iter_type i = set.begin(); return mongo_client(this, i->host().c_str(), i->port()); } mongo_replica_set_init(this, set_name.c_str()); for(iter_type i = set.begin(), isize = set.end(); i != isize; ++i) { mongo_replica_set_add_seed(this, i->host().c_str(), i->port()); } return mongo_replica_set_client(this); }
static ngx_int_t ngx_http_mongo_add_connection(ngx_cycle_t* cycle, ngx_http_gridfs_loc_conf_t* gridfs_loc_conf) { ngx_http_mongo_connection_t* mongo_conn; int status; ngx_http_mongod_server_t *mongods; volatile ngx_uint_t i; u_char host[255]; mongods = gridfs_loc_conf->mongods->elts; mongo_conn = ngx_http_get_mongo_connection( gridfs_loc_conf->mongo ); if (mongo_conn != NULL) { return NGX_OK; } mongo_conn = ngx_array_push(&ngx_http_mongo_connections); if (mongo_conn == NULL) { return NGX_ERROR; } mongo_conn->name = gridfs_loc_conf->mongo; mongo_conn->auths = ngx_array_create(cycle->pool, 4, sizeof(ngx_http_mongo_auth_t)); if ( gridfs_loc_conf->mongods->nelts == 1 ) { ngx_cpystrn( host, mongods[0].host.data, mongods[0].host.len + 1 ); status = mongo_client( &mongo_conn->conn, (const char*)host, mongods[0].port ); } else if ( gridfs_loc_conf->mongods->nelts >= 2 && gridfs_loc_conf->mongods->nelts < 9 ) { /* Initiate replica set connection. */ mongo_replica_set_init( &mongo_conn->conn, (const char *)gridfs_loc_conf->replset.data ); /* Add replica set seeds. */ for( i=0; i<gridfs_loc_conf->mongods->nelts; ++i ) { ngx_cpystrn( host, mongods[i].host.data, mongods[i].host.len + 1 ); mongo_replica_set_add_seed( &mongo_conn->conn, (const char *)host, mongods[i].port ); } status = mongo_replica_set_client( &mongo_conn->conn ); } else { ngx_log_error(NGX_LOG_ERR, cycle->log, 0, "Mongo Nginx Exception: Too many strings provided in 'mongo' directive."); return NGX_ERROR; } switch (status) { case MONGO_CONN_SUCCESS: break; case MONGO_CONN_NO_SOCKET: ngx_log_error(NGX_LOG_ERR, cycle->log, 0, "Mongo Exception: No Socket"); return NGX_ERROR; case MONGO_CONN_FAIL: ngx_log_error(NGX_LOG_ERR, cycle->log, 0, "Mongo Exception: Connection Failure."); return NGX_ERROR; case MONGO_CONN_ADDR_FAIL: ngx_log_error(NGX_LOG_ERR, cycle->log, 0, "Mongo Exception: getaddrinfo Failure."); return NGX_ERROR; case MONGO_CONN_NOT_MASTER: ngx_log_error(NGX_LOG_ERR, cycle->log, 0, "Mongo Exception: Not Master"); return NGX_ERROR; case MONGO_CONN_BAD_SET_NAME: ngx_log_error(NGX_LOG_ERR, cycle->log, 0, "Mongo Exception: Replica set name %s does not match.", gridfs_loc_conf->replset.data); return NGX_ERROR; case MONGO_CONN_NO_PRIMARY: ngx_log_error(NGX_LOG_ERR, cycle->log, 0, "Mongo Exception: Cannot connect to primary node."); return NGX_ERROR; default: ngx_log_error(NGX_LOG_ERR, cycle->log, 0, "Mongo Exception: Unknown Error"); return NGX_ERROR; } return NGX_OK; }