From 2bf1bcca7377bdd5c2f44939a9dce049d5129823 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kirit=20S=C3=A6lensminde?= Date: Wed, 24 Apr 2019 09:42:24 +0700 Subject: [PATCH 1/2] Implement correct 404 response for PATCH updates when rows don't exist. --- Cpp/fostgres/response.csj.cpp | 18 ++++++++++++++++-- Cpp/fostgres/updater.cpp | 11 ++++++++++- Example/films/films.fg | 2 +- 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/Cpp/fostgres/response.csj.cpp b/Cpp/fostgres/response.csj.cpp index 738810e..774bd68 100644 --- a/Cpp/fostgres/response.csj.cpp +++ b/Cpp/fostgres/response.csj.cpp @@ -215,14 +215,28 @@ namespace { error = handler.update(linedata, records); break; } - if (error.first) return error; + if (error.first) { + return error; + } else if (error.second) { + switch (error.second) { + case 404: + return fostlib::urlhandler::view::execute( + fostlib::json{"fost.response.404"}, "", req, + fostlib::host{}); + default: + throw fostlib::exceptions::not_implemented( + __PRETTY_FUNCTION__, + "Canned response for this status code", + fostlib::coerce(error.second)); + } + } ++records; } cnx.commit(); fostlib::insert(work_done, "records", records); boost::shared_ptr response(new fostlib::text_body( fostlib::json::unparse(work_done, true), - fostlib::mime::mime_headers(), L"application/json")); + fostlib::mime::mime_headers(), "application/json")); return std::make_pair(response, 200); } diff --git a/Cpp/fostgres/updater.cpp b/Cpp/fostgres/updater.cpp index 04732fb..d8671ce 100644 --- a/Cpp/fostgres/updater.cpp +++ b/Cpp/fostgres/updater.cpp @@ -106,7 +106,16 @@ std::pair, int> fostgres::updater::insert( std::pair, int> fostgres::updater::update( fostgres::updater::intermediate_data d, std::optional row) { - cnx.update(relation.c_str(), d.first, d.second); + std::vector returning = {"*"}; + auto rs = cnx.update(relation.c_str(), d.first, d.second, returning); + auto pos = rs.begin(); + if (pos == rs.end()) { + return {nullptr, 404}; + } else if (++pos != rs.end()) { + throw fostlib::exceptions::not_implemented( + __PRETTY_FUNCTION__, + "Update for multiple rows not supported by Fostgres"); + } return {nullptr, 0}; } diff --git a/Example/films/films.fg b/Example/films/films.fg index 7a2f047..5dba7b7 100644 --- a/Example/films/films.fg +++ b/Example/films/films.fg @@ -6,7 +6,7 @@ ## `UPDATE` statements instead of `INSERT` ones. If these don't actually ## update anything then we will get a 404 back, denoting that the ## resource we're trying to update doesn't exist. -#PATCH film.slug.error / (module.path.join films.edit.csj) 404 +PATCH film.slug.error / (module.path.join films.edit.csj) 404 ## ## Add films normally From 78af04ef8e4c7e08afaf093f224fdfbc4e750aa1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kirit=20S=C3=A6lensminde?= Date: Wed, 24 Apr 2019 09:42:34 +0700 Subject: [PATCH 2/2] clang-format --- Cpp/fostgres/response.json-csv.cpp | 19 +++++++++---------- Cpp/fostgres/sql.cpp | 4 ++-- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/Cpp/fostgres/response.json-csv.cpp b/Cpp/fostgres/response.json-csv.cpp index cd1eb75..007359b 100644 --- a/Cpp/fostgres/response.json-csv.cpp +++ b/Cpp/fostgres/response.json-csv.cpp @@ -20,16 +20,15 @@ namespace { get(const fostlib::json &config, const fostgres::match &m, fostlib::http::server::request &req) { - auto data = m.arguments.size() - ? fostgres::sql( - config, req, - fostlib::coerce( - m.configuration["GET"]), - m.arguments) - : fostgres::sql( - config, req, - fostlib::coerce( - m.configuration["GET"])); + auto data = m.arguments.size() ? fostgres::sql( + config, req, + fostlib::coerce( + m.configuration["GET"]), + m.arguments) + : fostgres::sql( + config, req, + fostlib::coerce( + m.configuration["GET"])); fostlib::json result; fostlib::insert( result, "@context", diff --git a/Cpp/fostgres/sql.cpp b/Cpp/fostgres/sql.cpp index fce300b..8d6a042 100644 --- a/Cpp/fostgres/sql.cpp +++ b/Cpp/fostgres/sql.cpp @@ -266,8 +266,8 @@ std::pair, fostlib::pg::recordset> } else { return m.arguments.size() ? fostgres::sql( - cnx, fostlib::coerce(select), - m.arguments) + cnx, fostlib::coerce(select), + m.arguments) : fostgres::sql(cnx, fostlib::coerce(select)); } }