From 5de1de2fdd977cd835da3067eb6fda8fe0a04c8e Mon Sep 17 00:00:00 2001 From: haipo yang Date: Thu, 23 Nov 2017 18:29:43 +0800 Subject: [PATCH] market price init market from matchengine --- marketprice/config.json | 3 +- marketprice/makefile | 2 +- marketprice/mp_config.c | 2 +- marketprice/mp_config.h | 1 + marketprice/mp_message.c | 109 +++++++++++++++++++++++++++------------ matchengine/config.json | 103 +++++++++++++++++++++--------------- 6 files changed, 143 insertions(+), 77 deletions(-) diff --git a/marketprice/config.json b/marketprice/config.json index ebae38de..32f7034c 100644 --- a/marketprice/config.json +++ b/marketprice/config.json @@ -34,5 +34,6 @@ "127.0.0.1:26382", "127.0.0.1:26383" ] - } + }, + "accesshttp": "http://127.0.0.1:8080" } diff --git a/marketprice/makefile b/marketprice/makefile index da4fd717..9135cf51 100644 --- a/marketprice/makefile +++ b/marketprice/makefile @@ -1,4 +1,4 @@ TARGET := marketprice.exe INCS = -I ../network -I ../utils -LIBS = -L ../utils -lutils -L ../network -lnetwork -Wl,-Bstatic -lev -ljansson -lmpdec -lrdkafka -lz -lssl -lcrypto -lhiredis -Wl,-Bdynamic -lm -lpthread -ldl +LIBS = -L ../utils -lutils -L ../network -lnetwork -Wl,-Bstatic -lev -ljansson -lmpdec -lrdkafka -lz -lssl -lcrypto -lhiredis -lcurl -Wl,-Bdynamic -lm -lpthread -ldl include ../makefile.inc diff --git a/marketprice/mp_config.c b/marketprice/mp_config.c index 1081f6f5..01d7769b 100644 --- a/marketprice/mp_config.c +++ b/marketprice/mp_config.c @@ -50,6 +50,7 @@ static int read_config_from_json(json_t *root) ERR_RET_LN(read_cfg_int(root, "min_max", &settings.min_max, false, 60 * 24 * 365)); ERR_RET_LN(read_cfg_int(root, "hour_max", &settings.hour_max, false, 24 * 365 * 10)); ERR_RET_LN(read_cfg_real(root, "cache_timeout", &settings.cache_timeout, false, 0.45)); + ERR_RET_LN(read_cfg_str(root, "accesshttp", &settings.accesshttp, NULL)); settings.timezone = get_timezone_offset(); @@ -78,4 +79,3 @@ int init_config(const char *path) return 0; } - diff --git a/marketprice/mp_config.h b/marketprice/mp_config.h index f135ba02..ff690738 100644 --- a/marketprice/mp_config.h +++ b/marketprice/mp_config.h @@ -49,6 +49,7 @@ struct settings { int min_max; int hour_max; double cache_timeout; + char *accesshttp; }; extern struct settings settings; diff --git a/marketprice/mp_message.c b/marketprice/mp_message.c index b319d3b1..fe94a454 100644 --- a/marketprice/mp_message.c +++ b/marketprice/mp_message.c @@ -3,6 +3,8 @@ * History: yang@haipo.me, 2017/04/16, create */ +# include + # include "mp_config.h" # include "mp_message.h" # include "mp_kline.h" @@ -227,22 +229,6 @@ static int load_market(redisContext *context, struct market_info *info) return 0; } -static int add_markets_list(const char *market) -{ - redisContext *context = redis_sentinel_connect_master(redis); - if (context == NULL) - return -__LINE__; - redisReply *reply = redisCmd(context, "SADD k:markets %s", market); - if (reply == NULL) { - redisFree(context); - return -__LINE__; - } - freeReplyObject(reply); - redisFree(context); - - return 0; -} - static struct market_info *create_market(const char *market) { struct market_info *info = malloc(sizeof(struct market_info)); @@ -293,6 +279,67 @@ static struct market_info *create_market(const char *market) return info; } +static size_t post_write_callback(char *ptr, size_t size, size_t nmemb, void *userdata) +{ + sds *reply = userdata; + *reply = sdscatlen(*reply, ptr, size * nmemb); + return size * nmemb; +} + +static json_t *send_market_list_req(void) +{ + json_t *reply = NULL; + json_t *error = NULL; + json_t *result = NULL; + + json_t *request = json_object(); + json_object_set_new(request, "method", json_string("market.list")); + json_object_set_new(request, "params", json_array()); + json_object_set_new(request, "id", json_integer(time(NULL))); + char *request_data = json_dumps(request, 0); + json_decref(request); + + CURL *curl = curl_easy_init(); + sds reply_str = sdsempty(); + + struct curl_slist *chunk = NULL; + chunk = curl_slist_append(chunk, "Content-Type: application/json"); + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk); + curl_easy_setopt(curl, CURLOPT_URL, settings.accesshttp); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, post_write_callback); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &reply_str); + curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); + curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, (long)(1000)); + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, request_data); + + CURLcode ret = curl_easy_perform(curl); + if (ret != CURLE_OK) { + log_fatal("curl_easy_perform fail: %s", curl_easy_strerror(ret)); + goto cleanup; + } + + reply = json_loads(reply_str, 0, NULL); + if (reply == NULL) + goto cleanup; + error = json_object_get(reply, "error"); + if (!json_is_null(error)) { + log_error("get market list fail: %s", reply_str); + goto cleanup; + } + result = json_object_get(reply, "result"); + json_incref(result); + +cleanup: + free(request_data); + sdsfree(reply_str); + curl_easy_cleanup(curl); + curl_slist_free_all(chunk); + if (reply) + json_decref(reply); + + return result; +} + static int init_market(void) { dict_types type; @@ -304,29 +351,32 @@ static int init_market(void) if (dict_market == NULL) return -__LINE__; + json_t *r = send_market_list_req(); + if (r == NULL) + return -__LINE__; redisContext *context = redis_sentinel_connect_master(redis); if (context == NULL) return -__LINE__; - redisReply *reply = redisCmd(context, "SMEMBERS k:markets"); - if (reply == NULL) { - redisFree(context); - return -__LINE__; - } - for (size_t i = 0; i < reply->elements; ++i) { - struct market_info *info = create_market(reply->element[i]->str); + for (size_t i = 0; i < json_array_size(r); ++i) { + json_t *item = json_array_get(r, i); + const char *name = json_string_value(json_object_get(item, "name")); + log_stderr("init market %s", name); + struct market_info *info = create_market(name); if (info == NULL) { - freeReplyObject(reply); + log_error("create market %s fail", name); + json_decref(r); redisFree(context); return -__LINE__; } int ret = load_market(context, info); if (ret < 0) { - freeReplyObject(reply); + log_error("load market %s fail: %d", name, ret); + json_decref(r); redisFree(context); - return ret; + return -__LINE__; } } - freeReplyObject(reply); + json_decref(r); redisFree(context); return 0; @@ -379,11 +429,6 @@ static int market_update(const char *market, double timestamp, mpd_t *price, mpd if (info == NULL) { return -__LINE__; } - int ret = add_markets_list(market); - if (ret < 0) { - log_fatal("add market: %s fail: %d", market, ret); - return -__LINE__; - } } // update sec diff --git a/matchengine/config.json b/matchengine/config.json index b7276eb5..43aa7211 100644 --- a/matchengine/config.json +++ b/matchengine/config.json @@ -37,98 +37,117 @@ }, "assets": [ { - "name": "USD", - "prec_save": 16, - "prec_show": 4 - }, { - "name": "BTC", - "prec_save": 16, + "name": "BCH", + "prec_save": 20, "prec_show": 8 }, { - "name": "BCC", - "prec_save": 16, + "name": "BTC", + "prec_save": 12, "prec_show": 8 }, { "name": "LTC", - "prec_save": 8, + "prec_save": 12, "prec_show": 8 }, { "name": "ETH", - "prec_save": 8, + "prec_save": 12, + "prec_show": 8 + }, { + "name": "ETC", + "prec_save": 12, "prec_show": 8 }, { "name": "ZEC", - "prec_save": 8, + "prec_save": 12, + "prec_show": 8 + }, { + "name": "XMR", + "prec_save": 12, "prec_show": 8 }, { "name": "DASH", - "prec_save": 8, + "prec_save": 12, "prec_show": 8 } ], "markets": [ { - "name": "BTCUSD", + "name": "BTCBCH", "stock": { "name": "BTC", - "prec": 4 + "prec": 8 }, "money": { - "name": "USD", - "prec": 2 + "name": "BCH", + "prec": 8 }, "min_amount": "0.001" }, { - "name": "BCCUSD", + "name": "LTCBCH", "stock": { - "name": "BCC", - "prec": 4 + "name": "LTC", + "prec": 8 }, "money": { - "name": "USD", - "prec": 2 + "name": "BCH", + "prec": 8 }, "min_amount": "0.001" }, { - "name": "ETHUSD", + "name": "ETHBCH", "stock": { "name": "ETH", - "prec": 4 + "prec": 8 }, "money": { - "name": "USD", - "prec": 2 - } + "name": "BCH", + "prec": 8 + }, + "min_amount": "0.001" }, { - "name": "ZECUSD", + "name": "ETCBCH", + "stock": { + "name": "ETC", + "prec": 8 + }, + "money": { + "name": "BCH", + "prec": 8 + }, + "min_amount": "0.001" + }, { + "name": "ZECBCH", "stock": { "name": "ZEC", - "prec": 4 + "prec": 8 }, "money": { - "name": "USD", - "prec": 2 - } + "name": "BCH", + "prec": 8 + }, + "min_amount": "0.001" }, { - "name": "LTCUSD", + "name": "XMRBCH", "stock": { - "name": "LTC", - "prec": 4 + "name": "XMR", + "prec": 8 }, "money": { - "name": "USD", - "prec": 2 - } + "name": "BCH", + "prec": 8 + }, + "min_amount": "0.001" }, { - "name": "DASHUSD", + "name": "DASHBCH", "stock": { "name": "DASH", - "prec": 4 + "prec": 8 }, "money": { - "name": "USD", - "prec": 2 - } + "name": "BCH", + "prec": 8 + }, + "min_amount": "0.001" } ], "brokers": "127.0.0.1:9092",