From 6845db6dd3d5d3208415d343d3bde9a64dbc1b75 Mon Sep 17 00:00:00 2001 From: c9s Date: Sun, 21 Feb 2021 00:58:34 +0800 Subject: [PATCH] refactor database configure method --- pkg/bbgo/environment.go | 44 ++++++++++++++++++++++++++++++----------- pkg/cmd/backtest.go | 3 +-- pkg/cmd/cancel.go | 2 +- pkg/cmd/pnl.go | 3 ++- pkg/cmd/run.go | 2 +- pkg/cmd/sync.go | 2 +- pkg/cmd/utils.go | 24 ---------------------- pkg/server/setup.go | 2 +- 8 files changed, 39 insertions(+), 43 deletions(-) diff --git a/pkg/bbgo/environment.go b/pkg/bbgo/environment.go index bc7b074b9..902ad1ff2 100644 --- a/pkg/bbgo/environment.go +++ b/pkg/bbgo/environment.go @@ -47,10 +47,10 @@ type Environment struct { Notifiability PersistenceServiceFacade *service.PersistenceServiceFacade - DatabaseService *service.DatabaseService - OrderService *service.OrderService - TradeService *service.TradeService - TradeSync *service.SyncService + DatabaseService *service.DatabaseService + OrderService *service.OrderService + TradeService *service.TradeService + TradeSync *service.SyncService // startTime is the time of start point (which is used in the backtest) startTime time.Time @@ -69,6 +69,10 @@ func NewEnvironment() *Environment { syncStartTime: time.Now().AddDate(-1, 0, 0), // defaults to sync from 1 year ago sessions: make(map[string]*ExchangeSession), startTime: time.Now(), + + PersistenceServiceFacade: &service.PersistenceServiceFacade{ + Memory: service.NewMemoryService(), + }, } } @@ -96,7 +100,28 @@ func (environ *Environment) SelectSessions(names ...string) map[string]*Exchange return sessions } -func (environ *Environment) ConfigureDatabase(ctx context.Context, driver string, dsn string) error { +func (environ *Environment) ConfigureDatabase(ctx context.Context) error { + // configureDB configures the database service based on the environment variable + if driver, ok := os.LookupEnv("DB_DRIVER"); ok { + + if dsn, ok := os.LookupEnv("DB_DSN"); ok { + return environ.ConfigureDatabaseDriver(ctx, driver, dsn) + } + + } else if dsn, ok := os.LookupEnv("SQLITE3_DSN"); ok { + + return environ.ConfigureDatabaseDriver(ctx, "sqlite3", dsn) + + } else if dsn, ok := os.LookupEnv("MYSQL_URL"); ok { + + return environ.ConfigureDatabaseDriver(ctx, "mysql", dsn) + + } + + return nil +} + +func (environ *Environment) ConfigureDatabaseDriver(ctx context.Context, driver string, dsn string) error { environ.DatabaseService = service.NewDatabaseService(driver, dsn) err := environ.DatabaseService.Connect() if err != nil { @@ -235,16 +260,12 @@ func (environ *Environment) Init(ctx context.Context) (err error) { } func (environ *Environment) ConfigurePersistence(conf *PersistenceConfig) error { - var facade = &service.PersistenceServiceFacade{ - Memory: service.NewMemoryService(), - } - if conf.Redis != nil { if err := env.Set(conf.Redis); err != nil { return err } - facade.Redis = service.NewRedisPersistenceService(conf.Redis) + environ.PersistenceServiceFacade.Redis = service.NewRedisPersistenceService(conf.Redis) } if conf.Json != nil { @@ -255,10 +276,9 @@ func (environ *Environment) ConfigurePersistence(conf *PersistenceConfig) error } } - facade.Json = &service.JsonPersistenceService{Directory: conf.Json.Directory} + environ.PersistenceServiceFacade.Json = &service.JsonPersistenceService{Directory: conf.Json.Directory} } - environ.PersistenceServiceFacade = facade return nil } diff --git a/pkg/cmd/backtest.go b/pkg/cmd/backtest.go index 257966f8d..ab7ad6d5f 100644 --- a/pkg/cmd/backtest.go +++ b/pkg/cmd/backtest.go @@ -111,8 +111,7 @@ var BacktestCmd = &cobra.Command{ } environ := bbgo.NewEnvironment() - - if err := configureDB(ctx, environ) ; err != nil { + if err := environ.ConfigureDatabase(ctx) ; err != nil { return err } diff --git a/pkg/cmd/cancel.go b/pkg/cmd/cancel.go index af4526587..fafd900ef 100644 --- a/pkg/cmd/cancel.go +++ b/pkg/cmd/cancel.go @@ -62,7 +62,7 @@ var CancelCmd = &cobra.Command{ } environ := bbgo.NewEnvironment() - if err := configureDB(ctx, environ) ; err != nil { + if err := environ.ConfigureDatabase(ctx) ; err != nil { return err } diff --git a/pkg/cmd/pnl.go b/pkg/cmd/pnl.go index 31fa36bc1..b42cfb4b4 100644 --- a/pkg/cmd/pnl.go +++ b/pkg/cmd/pnl.go @@ -57,10 +57,11 @@ var PnLCmd = &cobra.Command{ environ := bbgo.NewEnvironment() - if err := configureDB(ctx, environ) ; err != nil { + if err := environ.ConfigureDatabase(ctx) ; err != nil { return err } + var trades []types.Trade tradingFeeCurrency := exchange.PlatformFeeCurrency() if strings.HasPrefix(symbol, tradingFeeCurrency) { diff --git a/pkg/cmd/run.go b/pkg/cmd/run.go index bc4e3a733..100c4763e 100644 --- a/pkg/cmd/run.go +++ b/pkg/cmd/run.go @@ -165,7 +165,7 @@ func newNotificationSystem(userConfig *bbgo.Config, persistence bbgo.Persistence } func BootstrapEnvironment(ctx context.Context, environ *bbgo.Environment, userConfig *bbgo.Config) error { - if err := configureDB(ctx, environ) ; err != nil { + if err := environ.ConfigureDatabase(ctx) ; err != nil { return err } diff --git a/pkg/cmd/sync.go b/pkg/cmd/sync.go index a2e055406..f06087852 100644 --- a/pkg/cmd/sync.go +++ b/pkg/cmd/sync.go @@ -50,7 +50,7 @@ var SyncCmd = &cobra.Command{ } environ := bbgo.NewEnvironment() - if err := configureDB(ctx, environ); err != nil { + if err := environ.ConfigureDatabase(ctx) ; err != nil { return err } diff --git a/pkg/cmd/utils.go b/pkg/cmd/utils.go index 9298cc659..7aca4e9cb 100644 --- a/pkg/cmd/utils.go +++ b/pkg/cmd/utils.go @@ -1,10 +1,6 @@ package cmd import ( - "context" - "os" - - "github.com/c9s/bbgo/pkg/bbgo" "github.com/c9s/bbgo/pkg/types" ) @@ -14,23 +10,3 @@ func inBaseAsset(balances types.BalanceMap, market types.Market, price float64) return (base.Locked.Float64() + base.Available.Float64()) + ((quote.Locked.Float64() + quote.Available.Float64()) / price) } -// configureDB configures the database service based on the environment variable -func configureDB(ctx context.Context, environ *bbgo.Environment) error { - if driver, ok := os.LookupEnv("DB_DRIVER"); ok { - - if dsn, ok := os.LookupEnv("DB_DSN"); ok { - return environ.ConfigureDatabase(ctx, driver, dsn) - } - - } else if dsn, ok := os.LookupEnv("SQLITE3_DSN"); ok { - - return environ.ConfigureDatabase(ctx, "sqlite3", dsn) - - } else if dsn, ok := os.LookupEnv("MYSQL_URL"); ok { - - return environ.ConfigureDatabase(ctx, "mysql", dsn) - - } - - return nil -} diff --git a/pkg/server/setup.go b/pkg/server/setup.go index 03cf7e445..cf1f14f40 100644 --- a/pkg/server/setup.go +++ b/pkg/server/setup.go @@ -69,7 +69,7 @@ func (s *Server) setupConfigureDB(c *gin.Context) { return } - if err := s.Environ.ConfigureDatabase(c, payload.Driver, payload.DSN); err != nil { + if err := s.Environ.ConfigureDatabaseDriver(c, payload.Driver, payload.DSN); err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return }