Structure, persistance, recovery
This commit is contained in:
@ -1,16 +1,20 @@
|
||||
CREATE TABLE IF NOT EXISTS qfixdpl_messages (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
quote_req_id TEXT NOT NULL,
|
||||
trade_id TEXT,
|
||||
j_message JSONB NOT NULL,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS idx_messages_quote_req_id ON qfixdpl_messages(quote_req_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_messages_created_at ON qfixdpl_messages(created_at);
|
||||
CREATE INDEX IF NOT EXISTS idx_messages_trade_id ON qfixdpl_messages(trade_id);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS qfixdpl_logs (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
quote_req_id TEXT NOT NULL UNIQUE,
|
||||
trade_id TEXT,
|
||||
raw_msg TEXT NOT NULL,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS idx_dpl_logs_trade_id ON qfixdpl_logs(trade_id);
|
||||
|
||||
@ -16,8 +16,8 @@ func (p *Store) SaveMessage(msg domain.TradeMessage) error {
|
||||
}
|
||||
|
||||
_, err = p.db.Exec(
|
||||
"INSERT INTO qfixdpl_messages (quote_req_id, j_message) VALUES ($1, $2)",
|
||||
msg.QuoteReqID, string(jsonBytes),
|
||||
"INSERT INTO qfixdpl_messages (quote_req_id, trade_id, j_message) VALUES ($1, NULLIF($2, ''), $3)",
|
||||
msg.QuoteReqID, msg.TradeID, string(jsonBytes),
|
||||
)
|
||||
if err != nil {
|
||||
return tracerr.Errorf("error inserting message: %w", err)
|
||||
@ -43,7 +43,7 @@ func (p *Store) SaveLog(entry domain.LogEntry) error {
|
||||
|
||||
func (p *Store) GetTodayMessages() ([]domain.TradeMessage, error) {
|
||||
rows, err := p.db.Query(
|
||||
"SELECT id, quote_req_id, j_message, created_at FROM qfixdpl_messages WHERE created_at >= current_date ORDER BY created_at ASC",
|
||||
"SELECT id, quote_req_id, trade_id, j_message, created_at FROM qfixdpl_messages WHERE created_at >= current_date ORDER BY created_at ASC",
|
||||
)
|
||||
if err != nil {
|
||||
return nil, tracerr.Errorf("error querying today messages: %w", err)
|
||||
@ -55,11 +55,12 @@ func (p *Store) GetTodayMessages() ([]domain.TradeMessage, error) {
|
||||
for rows.Next() {
|
||||
var (
|
||||
id, quoteReqID string
|
||||
tradeID *string
|
||||
jMessageRaw []byte
|
||||
createdAt time.Time
|
||||
)
|
||||
|
||||
if err := rows.Scan(&id, "eReqID, &jMessageRaw, &createdAt); err != nil {
|
||||
if err := rows.Scan(&id, "eReqID, &tradeID, &jMessageRaw, &createdAt); err != nil {
|
||||
return nil, tracerr.Errorf("error scanning message row: %w", err)
|
||||
}
|
||||
|
||||
@ -68,12 +69,18 @@ func (p *Store) GetTodayMessages() ([]domain.TradeMessage, error) {
|
||||
return nil, tracerr.Errorf("error unmarshaling j_message: %w", err)
|
||||
}
|
||||
|
||||
messages = append(messages, domain.TradeMessage{
|
||||
msg := domain.TradeMessage{
|
||||
ID: id,
|
||||
QuoteReqID: quoteReqID,
|
||||
JMessage: jMessage,
|
||||
CreatedAt: createdAt,
|
||||
})
|
||||
}
|
||||
|
||||
if tradeID != nil {
|
||||
msg.TradeID = *tradeID
|
||||
}
|
||||
|
||||
messages = append(messages, msg)
|
||||
}
|
||||
|
||||
if err := rows.Err(); err != nil {
|
||||
@ -83,6 +90,69 @@ func (p *Store) GetTodayMessages() ([]domain.TradeMessage, error) {
|
||||
return messages, nil
|
||||
}
|
||||
|
||||
func (p *Store) UpdateLogTradeID(quoteReqID, tradeID string) error {
|
||||
_, err := p.db.Exec(
|
||||
"UPDATE qfixdpl_logs SET trade_id = $1, updated_at = NOW() WHERE quote_req_id = $2",
|
||||
tradeID, quoteReqID,
|
||||
)
|
||||
if err != nil {
|
||||
return tracerr.Errorf("error updating log trade_id: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *Store) GetFullTradeLog(quoteReqID string) (domain.FullTradeLog, error) {
|
||||
rows, err := p.db.Query(
|
||||
"SELECT trade_id, raw_msg FROM qfixdpl_logs WHERE quote_req_id = $1", quoteReqID,
|
||||
)
|
||||
if err != nil {
|
||||
return domain.FullTradeLog{}, tracerr.Errorf("error querying dpl log: %w", err)
|
||||
}
|
||||
defer rows.Close()
|
||||
|
||||
if !rows.Next() {
|
||||
return domain.FullTradeLog{}, tracerr.Errorf("no log found for quoteReqID: %s", quoteReqID)
|
||||
}
|
||||
|
||||
var (
|
||||
tradeID *string
|
||||
rawMsg string
|
||||
)
|
||||
|
||||
if err := rows.Scan(&tradeID, &rawMsg); err != nil {
|
||||
return domain.FullTradeLog{}, tracerr.Errorf("error scanning dpl log row: %w", err)
|
||||
}
|
||||
|
||||
result := domain.FullTradeLog{
|
||||
QuoteReqID: quoteReqID,
|
||||
DPLEntries: strings.Split(rawMsg, "\n"),
|
||||
}
|
||||
|
||||
if tradeID != nil && *tradeID != "" {
|
||||
result.TradeID = *tradeID
|
||||
|
||||
ptRows, err := p.db.Query(
|
||||
"SELECT raw_msg FROM qfixpt_logs WHERE trade_id = $1", *tradeID,
|
||||
)
|
||||
if err != nil {
|
||||
return domain.FullTradeLog{}, tracerr.Errorf("error querying pt logs: %w", err)
|
||||
}
|
||||
defer ptRows.Close()
|
||||
|
||||
if ptRows.Next() {
|
||||
var ptRawMsg string
|
||||
if err := ptRows.Scan(&ptRawMsg); err != nil {
|
||||
return domain.FullTradeLog{}, tracerr.Errorf("error scanning pt log row: %w", err)
|
||||
}
|
||||
|
||||
result.PTEntries = strings.Split(ptRawMsg, "\n")
|
||||
}
|
||||
}
|
||||
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (p *Store) GetLogsByQuoteReqID(quoteReqID string) (domain.Logs, error) {
|
||||
selectStmt := "SELECT raw_msg FROM qfixdpl_logs WHERE quote_req_id = '" + quoteReqID + "';"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user