diff options
author | Christian Grothoff <christian@grothoff.org> | 2020-04-16 21:02:14 +0200 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2020-04-16 21:02:14 +0200 |
commit | 0a327ceebd3126d4adf69916e92702fe3c7a22e2 (patch) | |
tree | 8c41e76fcd0c462c83ad491cb05d55be96ca1d08 /src/backend/taler-merchant-httpd_history.c | |
parent | e28829955091835b7d4b15c04db242cff0accbcc (diff) | |
download | merchant-0a327ceebd3126d4adf69916e92702fe3c7a22e2.tar.gz merchant-0a327ceebd3126d4adf69916e92702fe3c7a22e2.tar.bz2 merchant-0a327ceebd3126d4adf69916e92702fe3c7a22e2.zip |
complete first draft of new SQL schema
Diffstat (limited to 'src/backend/taler-merchant-httpd_history.c')
-rw-r--r-- | src/backend/taler-merchant-httpd_history.c | 299 |
1 files changed, 0 insertions, 299 deletions
diff --git a/src/backend/taler-merchant-httpd_history.c b/src/backend/taler-merchant-httpd_history.c deleted file mode 100644 index dd353208..00000000 --- a/src/backend/taler-merchant-httpd_history.c +++ /dev/null @@ -1,299 +0,0 @@ -/* - This file is part of TALER - (C) 2014, 2015, 2016, 2017 INRIA - - TALER is free software; you can redistribute it and/or modify it under the - terms of the GNU Affero General Public License as published by the Free Software - Foundation; either version 3, or (at your option) any later version. - - TALER is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along with - TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/> -*/ -/** - * @file backend/taler-merchant-httpd_history.c - * @brief HTTP serving layer mainly intended to communicate with the frontend - * @author Marcello Stanisci - */ -#include "platform.h" -#include <jansson.h> -#include <taler/taler_signatures.h> -#include <taler/taler_json_lib.h> -#include "taler-merchant-httpd.h" - - -/** - * Closure for #pd_cb. - */ -struct ProcessContractClosure -{ - - /** - * Updated by #pd_cb to build the response. - */ - json_t *response; - - /** - * Set to #GNUNET_SYSERR if the database returned a contract - * that was not well-formed. - */ - int failure; - -}; - - -/** - * Function called with information about a transaction. - * - * @param cls closure of type `struct ProcessContractClosure` - * @param order_id transaction's order ID. - * @param row_id serial numer of the transaction in the table, - * used as index by the frontend to skip previous results. - */ -static void -pd_cb (void *cls, - const char *order_id, - uint64_t row_id, - const json_t *contract_terms) -{ - struct ProcessContractClosure *pcc = cls; - json_t *entry; - json_t *amount; - json_t *timestamp; - json_t *instance; - json_t *summary; - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "/history's row_id: %llu\n", - (unsigned long long) row_id); - summary = NULL; - if (-1 == json_unpack ((json_t *) contract_terms, - "{s:o, s:o, s:{s:o}, s?:o}", - "amount", &amount, - "timestamp", ×tamp, - "merchant", "instance", &instance, - "summary", &summary)) - { - GNUNET_break (0); - pcc->failure = GNUNET_SYSERR; - return; - } - - /* summary is optional, but we need something, so we use - the order ID if it is not given. */ - if (NULL == summary) - summary = json_string (order_id); - - if (NULL == (entry = - json_pack ("{s:I, s:s, s:O, s:O, s:O, s:O}", - "row_id", row_id, - "order_id", order_id, - "amount", amount, - "timestamp", timestamp, - "instance", instance, - "summary", summary))) - { - GNUNET_break (0); - pcc->failure = GNUNET_SYSERR; - return; - } - if (0 != - json_array_append_new (pcc->response, - entry)) - { - GNUNET_break (0); - pcc->failure = GNUNET_SYSERR; - json_decref (entry); - return; - } -} - - -/** - * Manage a /history request. Query the db and returns transactions - * younger than the date given as parameter - * - * @param rh context of the handler - * @param connection the MHD connection to handle - * @param[in,out] connection_cls the connection's closure (can be updated) - * @param upload_data upload data - * @param[in,out] upload_data_size number of bytes (left) in @a upload_data - * @param mi merchant backend instance, never NULL - * @return MHD result code - */ -MHD_RESULT -MH_handler_history (struct TMH_RequestHandler *rh, - struct MHD_Connection *connection, - void **connection_cls, - const char *upload_data, - size_t *upload_data_size, - struct MerchantInstance *mi) -{ - #define LOG_INFO(...) GNUNET_log (GNUNET_ERROR_TYPE_INFO, __VA_ARGS__) - const char *str; - struct GNUNET_TIME_Absolute date; - json_t *response; - MHD_RESULT ret; - unsigned int ascending = GNUNET_NO; - unsigned long long seconds; - unsigned long long start = INT64_MAX; - long long delta = -20; - enum GNUNET_DB_QueryStatus qs; - struct ProcessContractClosure pcc; - - LOG_INFO ("Serving /history\n"); - response = json_array (); - str = MHD_lookup_connection_value (connection, - MHD_GET_ARGUMENT_KIND, - "date"); - date = GNUNET_TIME_absolute_get (); - (void) GNUNET_TIME_round_abs (&date); - if (NULL != str) - { - if (1 != sscanf (str, - "%llu", - &seconds)) - { - json_decref (response); - return TALER_MHD_reply_with_error (connection, - MHD_HTTP_BAD_REQUEST, - TALER_EC_PARAMETER_MALFORMED, - "date"); - } - date.abs_value_us = seconds * 1000LL * 1000LL; - if (date.abs_value_us / 1000LL / 1000LL != seconds) - { - json_decref (response); - return TALER_MHD_reply_with_error (connection, - MHD_HTTP_BAD_REQUEST, - TALER_EC_HISTORY_TIMESTAMP_OVERFLOW, - "Timestamp overflowed"); - } - } - - /* Sanity check that we don't have some odd stale transaction running */ - db->preflight (db->cls); - - /* Here goes the cherry-picking logic */ - str = MHD_lookup_connection_value (connection, - MHD_GET_ARGUMENT_KIND, - "order_id"); - if (NULL != str) - { - pcc.response = response; - pcc.failure = GNUNET_NO; - qs = db->find_contract_terms_history (db->cls, - str, - &mi->pubkey, - &pd_cb, - &pcc); - /* single, read-only SQL statements should never cause - serialization problems */ - GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR != qs); - /* Always report on hard error as well to enable diagnostics */ - GNUNET_break (GNUNET_DB_STATUS_HARD_ERROR == qs); - if ( (0 > qs) || - (GNUNET_SYSERR == pcc.failure) ) - { - json_decref (response); - return TALER_MHD_reply_with_error (connection, - MHD_HTTP_INTERNAL_SERVER_ERROR, - TALER_EC_HISTORY_DB_FETCH_ERROR, - "db error to get history"); - } - ret = TALER_MHD_reply_json (connection, - response, - MHD_HTTP_OK); - json_decref (response); - return ret; - } - - str = MHD_lookup_connection_value (connection, - MHD_GET_ARGUMENT_KIND, - "start"); - if (NULL != str) - { - TALER_LOG_DEBUG ("'start' argument given ('%s')\n", - str); - if (1 != sscanf (str, - "%llu", - &start)) - { - json_decref (response); - return TALER_MHD_reply_with_error (connection, - MHD_HTTP_BAD_REQUEST, - TALER_EC_PARAMETER_MALFORMED, - "start"); - } - } - - str = MHD_lookup_connection_value (connection, - MHD_GET_ARGUMENT_KIND, - "delta"); - - if (NULL != str) - { - if (1 != sscanf (str, - "%lld", - &delta)) - return TALER_MHD_reply_with_error (connection, - MHD_HTTP_BAD_REQUEST, - TALER_EC_PARAMETER_MALFORMED, - "delta"); - } - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Querying history back to %s, start: %llu, delta: %lld\n", - GNUNET_STRINGS_absolute_time_to_string (date), - start, - delta); - - pcc.response = response; - pcc.failure = GNUNET_NO; - - str = MHD_lookup_connection_value (connection, - MHD_GET_ARGUMENT_KIND, - "ordering"); - if ( (NULL != str) && - (0 == strcmp ("ascending", - str)) ) - ascending = GNUNET_YES; - - qs = db->find_contract_terms_by_date_and_range (db->cls, - date, - &mi->pubkey, - start, - llabs (delta), - (delta < 0) ? GNUNET_YES : - GNUNET_NO, - ascending, - &pd_cb, - &pcc); - if ( (0 > qs) || - (GNUNET_SYSERR == pcc.failure) ) - { - /* single, read-only SQL statements should never cause - serialization problems */ - GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR != qs); - /* Always report on hard error as well to enable diagnostics */ - GNUNET_break (GNUNET_DB_STATUS_HARD_ERROR == qs); - json_decref (response); - return TALER_MHD_reply_with_error (connection, - MHD_HTTP_INTERNAL_SERVER_ERROR, - TALER_EC_HISTORY_DB_FETCH_ERROR, - "db error to get history"); - } - ret = TALER_MHD_reply_json_pack (connection, - MHD_HTTP_OK, - "{ s:o }", - "history", - response /* consumes 'response' */); - LOG_INFO ("/history, http code: %d\n", - MHD_HTTP_OK); - return ret; -} - - -/* end of taler-merchant-httpd_history.c */ |