SEXP R_mongo_collection_update(SEXP ptr_col, SEXP ptr_selector, SEXP ptr_update, SEXP ptr_filters, SEXP upsert, SEXP multiple, SEXP replace){ mongoc_collection_t *col = r2col(ptr_col); bson_t *selector = r2bson(ptr_selector); bson_t *update = r2bson(ptr_update); bool success; bson_t opts; bson_init (&opts); BSON_APPEND_BOOL (&opts, "upsert", Rf_asLogical(upsert)); if(!Rf_isNull(ptr_filters)) BSON_APPEND_ARRAY (&opts, "arrayFilters", r2bson(ptr_filters)); bson_error_t err; bson_t reply; if(Rf_asLogical(replace)){ success = mongoc_collection_replace_one(col, selector, update, &opts, &reply, &err); } else { success = Rf_asLogical(multiple) ? mongoc_collection_update_many(col, selector, update, &opts, &reply, &err) : mongoc_collection_update_one(col, selector, update, &opts, &reply, &err); } if(!success) stop(err.message); return bson2list(&reply); }
SEXP R_mongo_client_server_status(SEXP ptr_client) { bson_t reply; bson_error_t err; mongoc_client_t *client = r2client(ptr_client); if(!mongoc_client_get_server_status(client, NULL, &reply, &err)) stop(err.message); return bson2list(&reply); }
SEXP R_mongo_collection_stats(SEXP ptr_col){ mongoc_collection_t *col = r2col(ptr_col); bson_t reply; bson_error_t err; if(!mongoc_collection_stats(col, NULL, &reply, &err)) stop(err.message); SEXP out = PROTECT(bson2list(&reply)); bson_destroy (&reply); UNPROTECT(1); return out; }
SEXP R_mongo_collection_command_simple(SEXP ptr_col, SEXP command){ mongoc_collection_t *col = r2col(ptr_col); bson_t *cmd = r2bson(command); bson_t reply; bson_error_t err; if(!mongoc_collection_command_simple(col, cmd, NULL, &reply, &err)) stop(err.message); SEXP out = PROTECT(bson2list(&reply)); bson_destroy (&reply); UNPROTECT(1); return out; }
SEXP R_mongo_collection_insert_page(SEXP ptr_col, SEXP json_vec, SEXP stop_on_error){ if(!Rf_isString(json_vec) || !Rf_length(json_vec)) stop("json_vec must be character string of at least length 1"); //ordered means serial execution bool ordered = Rf_asLogical(stop_on_error); //create bulk operation bson_error_t err; bson_t *b; bson_t reply; mongoc_bulk_operation_t *bulk = mongoc_collection_create_bulk_operation_with_opts (r2col(ptr_col), NULL); for(int i = 0; i < Rf_length(json_vec); i++){ b = bson_new_from_json ((uint8_t*) Rf_translateCharUTF8(Rf_asChar(STRING_ELT(json_vec, i))), -1, &err); if(!b){ mongoc_bulk_operation_destroy (bulk); stop(err.message); } mongoc_bulk_operation_insert(bulk, b); bson_destroy (b); b = NULL; } //execute bulk operation bool success = mongoc_bulk_operation_execute (bulk, &reply, &err); mongoc_bulk_operation_destroy (bulk); //check for errors if(!success){ if(ordered){ Rf_errorcall(R_NilValue, err.message); } else { Rf_warningcall(R_NilValue, "Not all inserts were successful: %s\n", err.message); } } //get output SEXP out = PROTECT(bson2list(&reply)); bson_destroy (&reply); UNPROTECT(1); return out; }
SEXP R_mongo_cursor_next_page(SEXP ptr, SEXP size){ mongoc_cursor_t *c = r2cursor(ptr); int n = asInteger(size); const bson_t *b = NULL; SEXP list = PROTECT(allocVector(VECSXP, n)); int total = 0; for(int i = 0; i < n && mongoc_cursor_next(c, &b); i++){ SET_VECTOR_ELT(list, i, bson2list((bson_t*) b)); total++; } //iterator exhausted if(total == 0){ UNPROTECT(1); return R_NilValue; } //found a full page if(total == n){ UNPROTECT(1); return list; } //not a full page SEXP shortlist = PROTECT(allocVector(VECSXP, total)); for(int i = 0; i < total; i++){ SET_VECTOR_ELT(shortlist, i, VECTOR_ELT(list, i)); } UNPROTECT(2); //also check for errors bson_error_t err; if(mongoc_cursor_error (c, &err)) stop(err.message); return shortlist; }
SEXP R_bson_to_list(SEXP ptr) { bson_t *b = r2bson(ptr); return bson2list(b); }