From 54e8b8096aeabf441b07d6194cbca82c78931f57 Mon Sep 17 00:00:00 2001 From: jstalex Date: Fri, 28 Jul 2023 11:09:46 +0300 Subject: [PATCH] wrap db tx in function --- .../candles_downloader/download_candles.go | 67 ++++++++++--------- examples/interval_bot/internal/bot/candles.go | 67 ++++++++++--------- 2 files changed, 73 insertions(+), 61 deletions(-) diff --git a/examples/interval_bot/cmd/candles_downloader/download_candles.go b/examples/interval_bot/cmd/candles_downloader/download_candles.go index 97bc686..84b7ded 100644 --- a/examples/interval_bot/cmd/candles_downloader/download_candles.go +++ b/examples/interval_bot/cmd/candles_downloader/download_candles.go @@ -216,44 +216,51 @@ func initDB(path string) (*sqlx.DB, error) { // storeCandlesInDB - Сохранение исторических свечей инструмента в бд func storeCandlesInDB(db *sqlx.DB, uid string, first, last time.Time, hc []*pb.HistoricCandle) error { - tx, err := db.Begin() - if err != nil { - return err - } + err := func() error { + tx, err := db.Begin() + if err != nil { + return err + } - insertCandle, err := tx.Prepare(`insert into candles (instrument_uid, open, close, high, low, volume, time, is_complete) + defer func() { + if err = tx.Commit(); err != nil { + log.Printf(err.Error()) + } + }() + + insertCandle, err := tx.Prepare(`insert into candles (instrument_uid, open, close, high, low, volume, time, is_complete) values (?, ?, ?, ?, ?, ?, ?, ?) `) - if err != nil { - return err - } - defer func() { - if err := insertCandle.Close(); err != nil { - log.Printf(err.Error()) + if err != nil { + return err } - }() + defer func() { + if err := insertCandle.Close(); err != nil { + log.Printf(err.Error()) + } + }() - for _, candle := range hc { - _, err := insertCandle.Exec(uid, - candle.GetOpen().ToFloat(), - candle.GetClose().ToFloat(), - candle.GetHigh().ToFloat(), - candle.GetLow().ToFloat(), - candle.GetVolume(), - candle.GetTime().AsTime().Unix(), - candle.GetIsComplete()) - if err != nil { - if errors.As(err, &sqlite3.Error{}) { - continue - } else { - return err + for _, candle := range hc { + _, err := insertCandle.Exec(uid, + candle.GetOpen().ToFloat(), + candle.GetClose().ToFloat(), + candle.GetHigh().ToFloat(), + candle.GetLow().ToFloat(), + candle.GetVolume(), + candle.GetTime().AsTime().Unix(), + candle.GetIsComplete()) + if err != nil { + if errors.As(err, &sqlite3.Error{}) { + continue + } else { + return err + } } } - } - - if err := tx.Commit(); err != nil { + return nil + }() + if err != nil { return err } - // записываем в базу время последнего обновления _, err = db.Exec(`insert or replace into updates(instrument_id, first_time, last_time) values (?, ?, ?)`, uid, first.Unix(), last.Unix()) if err != nil { diff --git a/examples/interval_bot/internal/bot/candles.go b/examples/interval_bot/internal/bot/candles.go index afd67d6..238cadc 100644 --- a/examples/interval_bot/internal/bot/candles.go +++ b/examples/interval_bot/internal/bot/candles.go @@ -355,44 +355,49 @@ func (c *CandlesStorage) initDB(path string) (*sqlx.DB, error) { // storeCandlesInDB - Сохранение исторических свечей инструмента в бд func (c *CandlesStorage) storeCandlesInDB(uid string, update time.Time, hc []*pb.HistoricCandle) error { - tx, err := c.db.Begin() - if err != nil { - return err - } - - insertCandle, err := tx.Prepare(`insert into candles (instrument_uid, open, close, high, low, volume, time, is_complete) + err := func() error { + tx, err := c.db.Begin() + if err != nil { + return err + } + defer func() { + if err := tx.Commit(); err != nil { + c.logger.Errorf(err.Error()) + } + }() + insertCandle, err := tx.Prepare(`insert into candles (instrument_uid, open, close, high, low, volume, time, is_complete) values (?, ?, ?, ?, ?, ?, ?, ?) `) - if err != nil { - return err - } - defer func() { - if err := insertCandle.Close(); err != nil { - c.logger.Errorf(err.Error()) + if err != nil { + return err } - }() + defer func() { + if err := insertCandle.Close(); err != nil { + c.logger.Errorf(err.Error()) + } + }() - for _, candle := range hc { - _, err := insertCandle.Exec(uid, - candle.GetOpen().ToFloat(), - candle.GetClose().ToFloat(), - candle.GetHigh().ToFloat(), - candle.GetLow().ToFloat(), - candle.GetVolume(), - candle.GetTime().AsTime().Unix(), - candle.GetIsComplete()) - if err != nil { - if errors.As(err, &sqlite3.Error{}) { - continue - } else { - return err + for _, candle := range hc { + _, err := insertCandle.Exec(uid, + candle.GetOpen().ToFloat(), + candle.GetClose().ToFloat(), + candle.GetHigh().ToFloat(), + candle.GetLow().ToFloat(), + candle.GetVolume(), + candle.GetTime().AsTime().Unix(), + candle.GetIsComplete()) + if err != nil { + if errors.As(err, &sqlite3.Error{}) { + continue + } else { + return err + } } } - } - - if err := tx.Commit(); err != nil { + return nil + }() + if err != nil { return err } - // записываем в базу время последнего обновления _, err = c.db.Exec(`insert or replace into updates(instrument_id, first_time, last_time) values (?, ?, ?)`, uid, c.instruments[uid].FirstUpdate.Unix(), update.Unix())