79 lines
2.0 KiB
Go
Raw Normal View History

2025-05-05 23:14:27 +00:00
package main
import (
"database/sql"
"flag"
2025-05-07 00:25:34 +03:00
"gitlab.com/digineat/go-broker-test/internal/model"
2025-05-05 23:14:27 +00:00
"log"
"time"
_ "github.com/mattn/go-sqlite3"
)
func main() {
// Command line flags
dbPath := flag.String("db", "data.db", "path to SQLite database")
pollInterval := flag.Duration("poll", 100*time.Millisecond, "polling interval")
flag.Parse()
// Initialize database connection
db, err := sql.Open("sqlite3", *dbPath)
if err != nil {
log.Fatalf("Failed to open database: %v", err)
}
defer db.Close()
// Test database connection
if err := db.Ping(); err != nil {
log.Fatalf("Failed to ping database: %v", err)
}
log.Printf("Worker started with polling interval: %v", *pollInterval)
// Main worker loop
for {
// TODO: Write code here
2025-05-07 00:25:34 +03:00
rows, err := db.Query("SELECT * FROM trades_q")
if err != nil {
log.Fatalf("Failed to query trades: %v", err)
}
defer rows.Close()
results := make(map[string]*model.AccountStats)
for rows.Next() {
var trade model.Trade
if err := rows.Scan(&trade.ID, &trade.Account, &trade.Symbol, &trade.Volume, &trade.OpenPrice, &trade.ClosePrice, &trade.Side, &trade.CreatedAt, &trade.UpdatedAt); err != nil {
log.Fatalf("Failed to scan trade: %v", err)
}
if stats, ok := results[trade.Account]; ok {
stats.TradesCount++
stats.Profit += trade.CalculateProfit()
} else {
results[trade.Account] = &model.AccountStats{
Account: trade.Account,
TradesCount: 1,
Profit: trade.CalculateProfit(),
}
}
}
for accountID, stat := range results {
_, err := db.Exec(`
INSERT INTO account_stats (account, trades_count, profit, updated_at)
VALUES (?, ?, ?, CURRENT_TIMESTAMP)
ON CONFLICT(account) DO UPDATE SET
trades_count = excluded.trades_count,
profit = excluded.profit,
updated_at = CURRENT_TIMESTAMP;
`, stat.Account, stat.TradesCount, stat.Profit)
if err != nil {
log.Printf("Error updating account_stats for account %s: %v", accountID, err)
}
}
2025-05-05 23:14:27 +00:00
// Sleep for the specified interval
time.Sleep(*pollInterval)
}
}