From 6b8fcfa76bfb1fbfb423001cb99d5960c47ba996 Mon Sep 17 00:00:00 2001 From: Michael Hackstein Date: Tue, 16 Feb 2016 17:07:12 +0100 Subject: [PATCH] Added a generate saved result for the new Transaction result --- .../RestHandler/RestVocbaseBaseHandler.cpp | 42 +++++++++++++++++++ arangod/RestHandler/RestVocbaseBaseHandler.h | 8 ++++ 2 files changed, 50 insertions(+) diff --git a/arangod/RestHandler/RestVocbaseBaseHandler.cpp b/arangod/RestHandler/RestVocbaseBaseHandler.cpp index 1015cb2ac3..f88bac645c 100644 --- a/arangod/RestHandler/RestVocbaseBaseHandler.cpp +++ b/arangod/RestHandler/RestVocbaseBaseHandler.cpp @@ -125,6 +125,48 @@ RestVocbaseBaseHandler::RestVocbaseBaseHandler(HttpRequest* request) RestVocbaseBaseHandler::~RestVocbaseBaseHandler() {} +void RestVocbaseBaseHandler::generateSaved( + arangodb::OperationResult const& result, + std::string const& collectionName) { + VPackSlice slice = result.slice(); + TRI_ASSERT(slice.isObject()); + + if (result.wasWaitForSync) { + createResponse(rest::HttpResponse::ACCEPTED); + } else { + createResponse(rest::HttpResponse::CREATED); + } + _response->setContentType("application/json; charset=utf-8"); + _response->setHeader("etag", 4, "\"" + slice.get("_rev").copyString() + "\""); + + std::string escapedHandle(DocumentHelper::assembleDocumentId( + collectionName, slice.get("_key").copyString(), true)); + if (_request->compatibility() < 10400L) { + // pre-1.4 location header (e.g. /_api/document/xyz) + _response->setHeader("location", 8, + std::string(DOCUMENT_PATH + "/" + escapedHandle)); + } else { + // 1.4+ location header (e.g. /_db/_system/_api/document/xyz) + if (type == TRI_COL_TYPE_EDGE) { + _response->setHeader("location", 8, + std::string("/_db/" + _request->databaseName() + + EDGE_PATH + "/" + escapedHandle)); + } else { + _response->setHeader("location", 8, + std::string("/_db/" + _request->databaseName() + + DOCUMENT_PATH + "/" + escapedHandle)); + } + } + VPackStringBufferAdapter buffer(_response->body().stringBuffer()); + VPackDumper dumper(&buffer); + try { + dumper.dump(slice); + } catch (...) { + generateError(HttpResponse::SERVER_ERROR, TRI_ERROR_INTERNAL, + "cannot generate output"); + } +} + //////////////////////////////////////////////////////////////////////////////// /// @brief check if a collection needs to be created on the fly /// diff --git a/arangod/RestHandler/RestVocbaseBaseHandler.h b/arangod/RestHandler/RestVocbaseBaseHandler.h index 06cdb2a0d7..98e19d5e36 100644 --- a/arangod/RestHandler/RestVocbaseBaseHandler.h +++ b/arangod/RestHandler/RestVocbaseBaseHandler.h @@ -164,6 +164,7 @@ class RestVocbaseBaseHandler : public RestBaseHandler { ////////////////////////////////////////////////////////////////////////////// /// @brief generates message for a saved document + /// DEPRECATED ////////////////////////////////////////////////////////////////////////////// void generateSaved(arangodb::SingleCollectionWriteTransaction<1>& trx, @@ -183,6 +184,13 @@ class RestVocbaseBaseHandler : public RestBaseHandler { type); // PROTECTED by trx here } + ////////////////////////////////////////////////////////////////////////////// + /// @brief generates message for a saved document + ////////////////////////////////////////////////////////////////////////////// + + void generateSaved(arangodb::OperationResult const& result, + std::string const& collectionName); + ////////////////////////////////////////////////////////////////////////////// /// @brief generates deleted message //////////////////////////////////////////////////////////////////////////////