2024-11-07 stan
负责从数据库恢复交易系统状态,是系统启动时的关键步骤。
int init_from_db(void)
{
MYSQL *conn = mysql_connect(&settings.db_log);
if (conn == NULL) {
log_error("connect mysql fail");
log_stderr("connect mysql fail");
return -__LINE__;
}
time_t now = time(NULL);
uint64_t last_oper_id = 0;
uint64_t last_order_id = 0;
uint64_t last_deals_id = 0;
int ret = get_last_slice(conn, &last_slice_time, &last_oper_id, &last_order_id, &last_deals_id);
if (ret < 0) {
return ret;
}
log_info("last_slice_time: %ld, last_oper_id: %"PRIu64", last_order_id: %"PRIu64", last_deals_id: %"PRIu64,
last_slice_time, last_oper_id, last_order_id, last_deals_id);
log_stderr("last_slice_time: %ld, last_oper_id: %"PRIu64", last_order_id: %"PRIu64", last_deals_id: %"PRIu64,
last_slice_time, last_oper_id, last_order_id, last_deals_id);
order_id_start = last_order_id;
deals_id_start = last_deals_id;
if (last_slice_time == 0) {
ret = load_operlog_from_db(conn, now, &last_oper_id);
if (ret < 0)
goto cleanup;
} else {
ret = load_slice_from_db(conn, last_slice_time);
if (ret < 0) {
goto cleanup;
}
time_t begin = last_slice_time;
time_t end = get_today_start() + 86400;
while (begin < end) {
ret = load_operlog_from_db(conn, begin, &last_oper_id);
if (ret < 0) {
goto cleanup;
}
begin += 86400;
}
}
operlog_id_start = last_oper_id;
mysql_close(conn);
log_stderr("load success");
return 0;
cleanup:
mysql_close(conn);
return ret;
}
load_orders(): 加载订单数据load_balance(): 加载余额数据load_operlog(): 加载操作日志初始化操作日志系统,确保交易操作可被记录和追踪。
int init_operlog(void)
{
mysql_conn = mysql_init(NULL);
if (mysql_conn == NULL)
return -__LINE__;
if (mysql_options(mysql_conn, MYSQL_SET_CHARSET_NAME, settings.db_log.charset) != 0)
return -__LINE__;
nw_job_type type;
memset(&type, 0, sizeof(type));
type.on_init = on_job_init;
type.on_job = on_job;
type.on_cleanup = on_job_cleanup;
type.on_release = on_job_release;
job = nw_job_create(&type, 1);
if (job == NULL)
return -__LINE__;
list_type lt;
memset(<, 0, sizeof(lt));
lt.free = on_list_free;
list = list_create(<);
if (list == NULL)
return -__LINE__;
nw_timer_set(&timer, 0.1, true, on_timer, NULL);
nw_timer_start(&timer);
return 0;
}