From f02a349d4a07332ec77683a7c897b2cfa2dd2e1e Mon Sep 17 00:00:00 2001 From: huangzhiran <30522704+huangzhiran@users.noreply.github.com> Date: Tue, 14 Jan 2025 11:09:52 +0800 Subject: [PATCH] support query device data from old db (#64) --- cmd/server/config/config.go | 1 + cmd/server/main.go | 2 +- db/device_record.go | 20 +++++++++++++++++--- db/postgres.go | 16 +++++++++++++--- 4 files changed, 32 insertions(+), 7 deletions(-) diff --git a/cmd/server/config/config.go b/cmd/server/config/config.go index b6ef883..d50079f 100644 --- a/cmd/server/config/config.go +++ b/cmd/server/config/config.go @@ -16,6 +16,7 @@ type Config struct { ServiceEndpoint string `env:"HTTP_SERVICE_ENDPOINT"` PrvKey string `env:"PRIVATE_KEY,optional"` DatabaseDSN string `env:"DATABASE_DSN"` + OldDatabaseDSN string `env:"OLD_DATABASE_DSN"` ChainEndpoint string `env:"CHAIN_ENDPOINT,optional"` BeginningBlockNumber uint64 `env:"BEGINNING_BLOCK_NUMBER,optional"` IoIDProjectID uint64 `env:"IOID_PROJECT_ID,optional"` diff --git a/cmd/server/main.go b/cmd/server/main.go index a0d4bfd..a1a49fa 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -31,7 +31,7 @@ func main() { log.Fatal(errors.Wrap(err, "failed to parse private key")) } - db, err := db.New(cfg.DatabaseDSN) + db, err := db.New(cfg.DatabaseDSN, cfg.OldDatabaseDSN) if err != nil { log.Fatal(errors.Wrap(err, "failed to new db")) } diff --git a/db/device_record.go b/db/device_record.go index e126d3a..25d723d 100644 --- a/db/device_record.go +++ b/db/device_record.go @@ -43,15 +43,29 @@ func (d *DB) QueryDeviceRecord(latitude, longitude string) (*DeviceRecord, error if err := d.db.Raw(fmt.Sprintf(sql, longitude, latitude)).Scan(&ids).Error; err != nil { return nil, errors.Wrap(err, "failed to query device record geo data") } - if len(ids) == 0 { + if len(ids) != 0 { + t := &DeviceRecord{} + if err := d.db.Where("id IN ?", ids).Order("timestamp DESC").First(&t).Error; err != nil { + if err == gorm.ErrRecordNotFound { + return nil, nil + } + return nil, errors.Wrap(err, "failed to query device record") + } + return t, nil + } + oldIDs := []string{} + if err := d.oldDB.Raw(fmt.Sprintf(sql, longitude, latitude)).Scan(&ids).Error; err != nil { + return nil, errors.Wrap(err, "failed to query device record geo data from old db") + } + if len(oldIDs) == 0 { return nil, nil } t := &DeviceRecord{} - if err := d.db.Where("id IN ?", ids).Order("timestamp DESC").First(&t).Error; err != nil { + if err := d.oldDB.Where("id IN ?", oldIDs).Order("timestamp DESC").First(&t).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, nil } - return nil, errors.Wrap(err, "failed to query device record") + return nil, errors.Wrap(err, "failed to query device record from old db") } return t, nil } diff --git a/db/postgres.go b/db/postgres.go index 6d1cdc5..deab10f 100644 --- a/db/postgres.go +++ b/db/postgres.go @@ -8,10 +8,11 @@ import ( ) type DB struct { - db *gorm.DB + db *gorm.DB + oldDB *gorm.DB } -func New(dsn string) (*DB, error) { +func New(dsn, oldDSN string) (*DB, error) { db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{ Logger: logger.Default.LogMode(logger.Silent), }) @@ -32,5 +33,14 @@ func New(dsn string) (*DB, error) { ); err != nil { return nil, errors.Wrap(err, "failed to migrate model") } - return &DB{db}, nil + oldDB, err := gorm.Open(postgres.Open(oldDSN), &gorm.Config{ + Logger: logger.Default.LogMode(logger.Silent), + }) + if err != nil { + return nil, errors.Wrap(err, "failed to connect old postgres") + } + return &DB{ + db: db, + oldDB: oldDB, + }, nil }