/** * \brief This function tries to add new tag group to MongoDB */ int vs_mongo_taggroup_add_new(struct VS_CTX *vs_ctx, struct VSNode *node, struct VSTagGroup *tg) { bson bson_tg; int ret; bson_init(&bson_tg); bson_oid_gen(&tg->oid); bson_append_oid(&bson_tg, "_id", &tg->oid); bson_append_int(&bson_tg, "node_id", node->id); bson_append_int(&bson_tg, "taggroup_id", tg->id); bson_append_int(&bson_tg, "custom_type", tg->custom_type); bson_append_int(&bson_tg, "current_version", tg->version); bson_append_start_object(&bson_tg, "versions"); vs_mongo_taggroup_save_version(tg, &bson_tg, UINT32_MAX); bson_append_finish_object(&bson_tg); bson_finish(&bson_tg); ret = mongo_insert(vs_ctx->mongo_conn, vs_ctx->mongo_tg_ns, &bson_tg, 0); bson_destroy(&bson_tg); if(ret != MONGO_OK) { v_print_log(VRS_PRINT_ERROR, "Unable to write tag group %d of node %d to MongoDB: %s, error: %s\n", tg->id, node->id, vs_ctx->mongo_tg_ns, mongo_get_server_err_string(vs_ctx->mongo_conn)); return 0; } return 1; }
int commit_inode(struct inode * e) { bson cond, doc; mongo * conn = get_conn(); char istr[4]; struct dirent * cde = e->dirents; int res; bson_init(&doc); bson_append_start_object(&doc, "$set"); bson_append_start_array(&doc, "dirents"); res = 0; while(cde) { bson_numstr(istr, res++); bson_append_string(&doc, istr, cde->path); cde = cde->next; } bson_append_finish_array(&doc); bson_append_int(&doc, "mode", e->mode); bson_append_long(&doc, "owner", e->owner); bson_append_long(&doc, "group", e->group); bson_append_long(&doc, "size", e->size); bson_append_time_t(&doc, "created", e->created); bson_append_time_t(&doc, "modified", e->modified); if(e->data && e->datalen > 0) bson_append_string_n(&doc, "data", e->data, e->datalen); bson_append_finish_object(&doc); bson_finish(&doc); bson_init(&cond); bson_append_oid(&cond, "_id", &e->oid); bson_finish(&cond); res = mongo_update(conn, inodes_name, &cond, &doc, MONGO_UPDATE_UPSERT, NULL); bson_destroy(&cond); bson_destroy(&doc); if(res != MONGO_OK) { fprintf(stderr, "Error committing inode %s\n", mongo_get_server_err_string(conn)); return -EIO; } return 0; }
QString TMongoDriver::lastErrorString() const { return QLatin1String(mongo_get_server_err_string(mongoConnection)); }
/** * \brief This function tries to update tag group in MongoDB. It adds new * version of data. */ int vs_mongo_taggroup_update(struct VS_CTX *vs_ctx, struct VSNode *node, struct VSTagGroup *tg) { bson cond, op; bson bson_version; int ret; /* TODO: delete old version, when there is too much versions: int old_saved_version = tg->saved_version; */ bson_init(&cond); { bson_append_oid(&cond, "_id", &tg->oid); /* To be sure that right tag group will be updated */ bson_append_int(&cond, "node_id", node->id); bson_append_int(&cond, "taggroup_id", tg->id); } bson_finish(&cond); bson_init(&op); { /* Update item current_version in document */ bson_append_start_object(&op, "$set"); { bson_append_int(&op, "current_version", tg->version); } bson_append_finish_object(&op); /* Create new bson object representing current version and add it to * the object versions */ bson_append_start_object(&op, "$set"); { bson_init(&bson_version); { vs_mongo_taggroup_save_version(tg, &bson_version, UINT32_MAX); } bson_finish(&bson_version); bson_append_bson(&op, "versions", &bson_version); } bson_append_finish_object(&op); } bson_finish(&op); ret = mongo_update(vs_ctx->mongo_conn, vs_ctx->mongo_tg_ns, &cond, &op, MONGO_UPDATE_BASIC, 0); bson_destroy(&bson_version); bson_destroy(&cond); bson_destroy(&op); if(ret != MONGO_OK) { v_print_log(VRS_PRINT_ERROR, "Unable to update tag group %d to MongoDB: %s, error: %s\n", tg->id, vs_ctx->mongo_tg_ns, mongo_get_server_err_string(vs_ctx->mongo_conn)); return 0; } return 1; }
/** * \brief This function tries to connect to MongoDB server */ int vs_mongo_conn_init(struct VS_CTX *vs_ctx) { int status; vs_ctx->mongo_conn = mongo_alloc(); mongo_init(vs_ctx->mongo_conn); /* Set connection timeout */ mongo_set_op_timeout(vs_ctx->mongo_conn, 1000); /* Connect to MongoDB server */ status = mongo_client(vs_ctx->mongo_conn, vs_ctx->mongodb_server, vs_ctx->mongodb_port); if( status != MONGO_OK ) { switch ( vs_ctx->mongo_conn->err ) { case MONGO_CONN_NO_SOCKET: v_print_log(VRS_PRINT_ERROR, "No MongoDB server %s:%d socket\n", vs_ctx->mongodb_server, vs_ctx->mongodb_port); break; case MONGO_CONN_FAIL: v_print_log(VRS_PRINT_ERROR, "Connection to MongoDB server %s:%d failed\n", vs_ctx->mongodb_server, vs_ctx->mongodb_port); break; case MONGO_CONN_NOT_MASTER: v_print_log(VRS_PRINT_ERROR, "MongoDB server %s:%d is not master\n", vs_ctx->mongodb_server, vs_ctx->mongodb_port); break; default: v_print_log(VRS_PRINT_ERROR, "Failed to connect to MongoDB server %s:%d , error: %d\n", vs_ctx->mongodb_server, vs_ctx->mongodb_port, vs_ctx->mongo_conn->err); break; } mongo_dealloc(vs_ctx->mongo_conn); vs_ctx->mongo_conn = NULL; return 0; } v_print_log(VRS_PRINT_DEBUG_MSG, "Connection to MongoDB server %s:%d succeeded\n", vs_ctx->mongodb_server, vs_ctx->mongodb_port); /* There has to be some db name defined */ if(vs_ctx->mongodb_db_name == NULL) { v_print_log(VRS_PRINT_ERROR, "No database name defined\n"); mongo_dealloc(vs_ctx->mongo_conn); vs_ctx->mongo_conn = NULL; return 0; } /* Try to do when authentication is configured */ if(vs_ctx->mongodb_user != NULL && vs_ctx->mongodb_pass != NULL) { status = mongo_cmd_authenticate(vs_ctx->mongo_conn, vs_ctx->mongodb_db_name, vs_ctx->mongodb_user, vs_ctx->mongodb_pass); if(status != MONGO_OK) { v_print_log(VRS_PRINT_ERROR, "Authentication to %s database failed, error: %s\n", vs_ctx->mongodb_db_name, mongo_get_server_err_string(vs_ctx->mongo_conn)); mongo_dealloc(vs_ctx->mongo_conn); vs_ctx->mongo_conn = NULL; return 0; } v_print_log(VRS_PRINT_DEBUG_MSG, "Authentication to %s database succeeded\n", vs_ctx->mongodb_db_name); } else { v_print_log(VRS_PRINT_DEBUG_MSG, "No MongoDB authentication required\n"); } /* Namespace used for storing nodes */ vs_ctx->mongo_node_ns = (char*)malloc(sizeof(char) * (strlen(vs_ctx->mongodb_db_name) + 6 + 1)); strcpy(vs_ctx->mongo_node_ns, vs_ctx->mongodb_db_name); strcat(vs_ctx->mongo_node_ns, ".nodes"); /* Namespace used for storing tag groups and tags */ vs_ctx->mongo_tg_ns = (char*)malloc(sizeof(char) * (strlen(vs_ctx->mongodb_db_name) + 11 + 1)); strcpy(vs_ctx->mongo_tg_ns, vs_ctx->mongodb_db_name); strcat(vs_ctx->mongo_tg_ns, ".tag_groups"); /* Namespace used for storing layers */ vs_ctx->mongo_layer_ns = (char*)malloc(sizeof(char) * (strlen(vs_ctx->mongodb_db_name) + 7 + 1)); strcpy(vs_ctx->mongo_layer_ns, vs_ctx->mongodb_db_name); strcat(vs_ctx->mongo_layer_ns, ".layers"); return 1; }