From 6afde4808faa6362ef856a6be51964e1c4edb0a2 Mon Sep 17 00:00:00 2001 From: c9s Date: Wed, 19 Jun 2024 15:51:16 +0800 Subject: [PATCH 1/4] use NamedQueryContext instead of NamedQuery --- pkg/bbgo/environment.go | 2 +- pkg/service/trade.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/bbgo/environment.go b/pkg/bbgo/environment.go index f819f3f28..07893aaad 100644 --- a/pkg/bbgo/environment.go +++ b/pkg/bbgo/environment.go @@ -648,7 +648,7 @@ func (environ *Environment) syncSession( log.Infof("syncing symbols %v from session %s", symbols, session.Name) syncBufferPeriod := -defaultSyncBufferPeriod - if environ.environmentConfig.SyncBufferPeriod != nil { + if environ.environmentConfig != nil && environ.environmentConfig.SyncBufferPeriod != nil { syncBufferPeriod = -environ.environmentConfig.SyncBufferPeriod.Duration() } diff --git a/pkg/service/trade.go b/pkg/service/trade.go index 01a347bca..16a64d076 100644 --- a/pkg/service/trade.go +++ b/pkg/service/trade.go @@ -335,7 +335,7 @@ func (s *TradeService) Query(options QueryTradesOptions) ([]types.Trade, error) func (s *TradeService) Load(ctx context.Context, id int64) (*types.Trade, error) { var trade types.Trade - rows, err := s.DB.NamedQuery("SELECT * FROM trades WHERE id = :id", map[string]interface{}{ + rows, err := s.DB.NamedQueryContext(ctx, "SELECT * FROM trades WHERE id = :id", map[string]interface{}{ "id": id, }) if err != nil { From 00b9c3156fd1d0654ea7d8df003823b8245135ed Mon Sep 17 00:00:00 2001 From: c9s Date: Wed, 19 Jun 2024 15:59:19 +0800 Subject: [PATCH 2/4] fix trade insertion for inserted_at field --- .../mysql/20240531163411_trades_created.sql | 4 ++-- pkg/service/reflect.go | 17 +++++++++++++++++ pkg/types/trade.go | 2 +- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/migrations/mysql/20240531163411_trades_created.sql b/migrations/mysql/20240531163411_trades_created.sql index 20cfa3f26..001b267c9 100644 --- a/migrations/mysql/20240531163411_trades_created.sql +++ b/migrations/mysql/20240531163411_trades_created.sql @@ -1,10 +1,10 @@ -- +up -- +begin -ALTER TABLE `trades` ADD COLUMN `inserted_at` DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL AFTER `traded_at`; +ALTER TABLE `trades` ADD COLUMN `inserted_at` DATETIME(3) DEFAULT CURRENT_TIMESTAMP NOT NULL AFTER `traded_at`; -- +end -- +begin -UPDATE `trades` SET `inserted_at`=`traded_at`; +UPDATE `trades` SET `inserted_at` = `traded_at`; -- +end -- +down diff --git a/pkg/service/reflect.go b/pkg/service/reflect.go index 1f8ce68a6..bcf76b08b 100644 --- a/pkg/service/reflect.go +++ b/pkg/service/reflect.go @@ -27,7 +27,9 @@ func tableNameOf(record interface{}) string { } func placeholdersOf(record interface{}) []string { + vt := reflect.ValueOf(record) rt := reflect.TypeOf(record) + if rt.Kind() == reflect.Ptr { rt = rt.Elem() } @@ -39,6 +41,12 @@ func placeholdersOf(record interface{}) []string { var dbFields []string for i := 0; i < rt.NumField(); i++ { fieldType := rt.Field(i) + fieldValue := vt.Field(i) + + if fieldType.Type.Kind() == reflect.Ptr && fieldValue.IsNil() { + continue + } + if tag, ok := fieldType.Tag.Lookup("db"); ok { if tag == "gid" || tag == "-" || tag == "" { continue @@ -52,7 +60,9 @@ func placeholdersOf(record interface{}) []string { } func fieldsNamesOf(record interface{}) []string { + vt := reflect.ValueOf(record) rt := reflect.TypeOf(record) + if rt.Kind() == reflect.Ptr { rt = rt.Elem() } @@ -64,6 +74,13 @@ func fieldsNamesOf(record interface{}) []string { var dbFields []string for i := 0; i < rt.NumField(); i++ { fieldType := rt.Field(i) + fieldValue := vt.Field(i) + + // skip value=nil field + if fieldType.Type.Kind() == reflect.Ptr && fieldValue.IsNil() { + continue + } + if tag, ok := fieldType.Tag.Lookup("db"); ok { if tag == "gid" || tag == "-" || tag == "" { continue diff --git a/pkg/types/trade.go b/pkg/types/trade.go index ca465656a..3e9a6c520 100644 --- a/pkg/types/trade.go +++ b/pkg/types/trade.go @@ -96,7 +96,7 @@ type Trade struct { // PnL is the profit and loss value of the executed trade PnL sql.NullFloat64 `json:"pnl" db:"pnl"` - InsertedAt Time `json:"insertedAt" db:"inserted_at"` + InsertedAt *Time `json:"insertedAt" db:"inserted_at"` } func (trade Trade) CsvHeader() []string { From 82501ff57c7eb3962c1478967278b03b870f6d2f Mon Sep 17 00:00:00 2001 From: c9s Date: Wed, 19 Jun 2024 16:07:39 +0800 Subject: [PATCH 3/4] fix reflection --- migrations/mysql/20240531163411_trades_created.sql | 2 +- pkg/service/reflect.go | 14 ++++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/migrations/mysql/20240531163411_trades_created.sql b/migrations/mysql/20240531163411_trades_created.sql index 001b267c9..1b2323796 100644 --- a/migrations/mysql/20240531163411_trades_created.sql +++ b/migrations/mysql/20240531163411_trades_created.sql @@ -1,6 +1,6 @@ -- +up -- +begin -ALTER TABLE `trades` ADD COLUMN `inserted_at` DATETIME(3) DEFAULT CURRENT_TIMESTAMP NOT NULL AFTER `traded_at`; +ALTER TABLE `trades` ADD COLUMN `inserted_at` DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL AFTER `traded_at`; -- +end -- +begin diff --git a/pkg/service/reflect.go b/pkg/service/reflect.go index bcf76b08b..c2acc65aa 100644 --- a/pkg/service/reflect.go +++ b/pkg/service/reflect.go @@ -27,13 +27,16 @@ func tableNameOf(record interface{}) string { } func placeholdersOf(record interface{}) []string { - vt := reflect.ValueOf(record) rt := reflect.TypeOf(record) - if rt.Kind() == reflect.Ptr { rt = rt.Elem() } + vt := reflect.ValueOf(record) + if vt.Kind() == reflect.Ptr { + vt = vt.Elem() + } + if rt.Kind() != reflect.Struct { return nil } @@ -60,13 +63,16 @@ func placeholdersOf(record interface{}) []string { } func fieldsNamesOf(record interface{}) []string { - vt := reflect.ValueOf(record) rt := reflect.TypeOf(record) - if rt.Kind() == reflect.Ptr { rt = rt.Elem() } + vt := reflect.ValueOf(record) + if vt.Kind() == reflect.Ptr { + vt = vt.Elem() + } + if rt.Kind() != reflect.Struct { return nil } From 6cdf991877a4b7af5e2774a548860b9a85f4a32c Mon Sep 17 00:00:00 2001 From: c9s Date: Wed, 19 Jun 2024 15:59:33 +0800 Subject: [PATCH 4/4] compile and update migration package --- pkg/migrations/mysql/main_20240531163411_trades_created.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/migrations/mysql/main_20240531163411_trades_created.go b/pkg/migrations/mysql/main_20240531163411_trades_created.go index 121f56024..f76f9f065 100644 --- a/pkg/migrations/mysql/main_20240531163411_trades_created.go +++ b/pkg/migrations/mysql/main_20240531163411_trades_created.go @@ -16,7 +16,7 @@ func up_main_tradesCreated(ctx context.Context, tx rockhopper.SQLExecutor) (err if err != nil { return err } - _, err = tx.ExecContext(ctx, "UPDATE `trades` SET `inserted_at`=`traded_at`;") + _, err = tx.ExecContext(ctx, "UPDATE `trades` SET `inserted_at` = `traded_at`;") if err != nil { return err }