package main import ( "database/sql" "flag" "gitlab.com/digineat/go-broker-test/internal/model" "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 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) } } // Sleep for the specified interval time.Sleep(*pollInterval) } }