2024-11-18 stan
int load_orders(MYSQL *conn, const char *table)
{
size_t query_limit = 1000;
uint64_t last_id = 0;
while (true) {
sds sql = sdsempty();
sql = sdscatprintf(sql, "SELECT `id`, `t`, `side`, `create_time`, `update_time`, `user_id`, `market`, "
"`price`, `amount`, `taker_fee`, `maker_fee`, `left`, `freeze`, `deal_stock`, `deal_money`, `deal_fee` FROM `%s` "
"WHERE `id` > %"PRIu64" ORDER BY `id` LIMIT %zu", table, last_id, query_limit);
log_trace("exec sql: %s", sql);
int ret = mysql_real_query(conn, sql, sdslen(sql));
if (ret != 0) {
log_error("exec sql: %s fail: %d %s", sql, mysql_errno(conn), mysql_error(conn));
sdsfree(sql);
return -__LINE__;
}
sdsfree(sql);
MYSQL_RES *result = mysql_store_result(conn);
size_t num_rows = mysql_num_rows(result);
for (size_t i = 0; i < num_rows; ++i) {
MYSQL_ROW row = mysql_fetch_row(result);
last_id = strtoull(row[0], NULL, 0);
market_t *market = get_market(row[6]);
if (market == NULL)
continue;
order_t *order = malloc(sizeof(order_t));
memset(order, 0, sizeof(order_t));
order->id = strtoull(row[0], NULL, 0);
order->type = strtoul(row[1], NULL, 0);
order->side = strtoul(row[2], NULL, 0);
order->create_time = strtod(row[3], NULL);
order->update_time = strtod(row[4], NULL);
order->user_id = strtoul(row[5], NULL, 0);
order->market = strdup(row[6]);
order->price = decimal(row[7], market->money_prec);
order->amount = decimal(row[8], market->stock_prec);
order->taker_fee = decimal(row[9], market->fee_prec);
order->maker_fee = decimal(row[10], market->fee_prec);
order->left = decimal(row[11], market->stock_prec);
order->freeze = decimal(row[12], 0);
order->deal_stock = decimal(row[13], 0);
order->deal_money = decimal(row[14], 0);
order->deal_fee = decimal(row[15], 0);
if (!order->market || !order->price || !order->amount || !order->taker_fee || !order->maker_fee || !order->left ||
!order->freeze || !order->deal_stock || !order->deal_money || !order->deal_fee) {
log_error("get order detail of order id: %"PRIu64" fail", order->id);
mysql_free_result(result);
return -__LINE__;
}
market_put_order(market, order);
}
mysql_free_result(result);
if (num_rows < query_limit)
break;
}
return 0;
}
关键点:
int load_balance(MYSQL *conn, const char *table)
{
size_t query_limit = 1000;
uint64_t last_id = 0;
while (true) {
sds sql = sdsempty();
sql = sdscatprintf(sql, "SELECT `id`, `user_id`, `asset`, `t`, `balance` FROM `%s` "
"WHERE `id` > %"PRIu64" ORDER BY id LIMIT %zu", table, last_id, query_limit);
log_trace("exec sql: %s", sql);
int ret = mysql_real_query(conn, sql, sdslen(sql));
if (ret != 0) {
log_error("exec sql: %s fail: %d %s", sql, mysql_errno(conn), mysql_error(conn));
sdsfree(sql);
return -__LINE__;
}
sdsfree(sql);
MYSQL_RES *result = mysql_store_result(conn);
size_t num_rows = mysql_num_rows(result);
for (size_t i = 0; i < num_rows; ++i) {
MYSQL_ROW row = mysql_fetch_row(result);
last_id = strtoull(row[0], NULL, 0);
uint32_t user_id = strtoul(row[1], NULL, 0);
const char *asset = row[2];
if (!asset_exist(asset)) {
continue;
}
uint32_t type = strtoul(row[3], NULL, 0);
mpd_t *balance = decimal(row[4], asset_prec(asset));
balance_set(user_id, type, asset, balance);
}
mysql_free_result(result);
if (num_rows < query_limit)
break;
}
return 0;
}
关键点:
typedef struct order_t {
uint64_t id;
uint32_t type;
uint32_t side;
double create_time;
double update_time;
uint32_t user_id;
char *market;
char *source;
mpd_t *price;
mpd_t *amount;
mpd_t *taker_fee;
mpd_t *maker_fee;
mpd_t *left;
mpd_t *freeze;
mpd_t *deal_stock;
mpd_t *deal_money;
mpd_t *deal_fee;
} order_t;
关键字段: