diff --git a/cmd/coronafana/coronafana.go b/cmd/coronafana/coronafana.go index bb75c74..5a1cb11 100644 --- a/cmd/coronafana/coronafana.go +++ b/cmd/coronafana/coronafana.go @@ -30,16 +30,23 @@ func main() { log.Fatalln(err) } + // Processes data for 'Global' _, err = db.Exec(cfg.DbSchemaGlobal) if err != nil { log.Fatalln(err) } - _, err = db.Exec(cfg.DbSchemaPays) + + err = cr.InsertGlobalData(cfg, *db) if err != nil { log.Fatalln(err) } - err = cr.InsertData(cfg, *db) + // Processes data for 'Pays' + _, err = db.Exec(cfg.DbSchemaPays) + if err != nil { + log.Fatalln(err) + } + err = cr.InsertPaysData(cfg, *db) if err != nil { log.Fatalln(err) } diff --git a/src/config/main.go b/src/config/main.go index 3344831..2a22c09 100644 --- a/src/config/main.go +++ b/src/config/main.go @@ -32,11 +32,11 @@ func (config *Config) GetConfig() (err error) { config.DbSchemaGlobal = "CREATE TABLE IF NOT EXISTS coronaglobaldata (`id` int(8) NOT NULL AUTO_INCREMENT, `date` datetime NOT NULL, `infection` int(8) DEFAULT NULL, `deces` int(8) DEFAULT NULL, `guerisons` varchar(50) DEFAULT NULL, `tauxdeces` float(10) DEFAULT NULL, `tauxguerison` float(10) DEFAULT NULL, `tauxinfection` float(10) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `date` (`date`) USING BTREE) ENGINE=InnoDB DEFAULT CHARSET=utf8;" - config.DbInsertGlobal = "INSERT IGNORE INTO coronaglobaldata (date, infection, deces, guerisons, tauxdeces, tauxguerison, tauxinfection) VALUES ('%s', %d, %d , %d, %g, %g, %g);" + config.DbInsertGlobal = "INSERT INTO coronaglobaldata (date, infection, deces, guerisons, tauxdeces, tauxguerison, tauxinfection) VALUES (:date, :infection, :deces, :guerisons, :tauxdeces, :tauxguerison, :tauxinfection) ON DUPLICATE KEY UPDATE date=:date,infection=:infection, deces=:deces, guerisons=:guerisons, tauxdeces=:tauxdeces, tauxguerison=:tauxguerison, tauxinfection=:tauxinfection;" config.DbSchemaPays = "CREATE TABLE IF NOT EXISTS coronapaysdata (`id` int(8) NOT NULL AUTO_INCREMENT, `date` datetime NOT NULL, `pays` varchar(50) NOT NULL, `infection` int(8) DEFAULT NULL, `deces` int(8) DEFAULT NULL, `guerisons` varchar(50) DEFAULT NULL, `tauxdeces` float(10) DEFAULT NULL, `tauxguerison` float(10) DEFAULT NULL, `tauxinfection` float(10) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `date` (`date`,`pays`) USING BTREE) ENGINE=InnoDB DEFAULT CHARSET=utf8;" - config.DbInsertPays = "INSERT IGNORE INTO coronapaysdata (date, pays, infection, deces, guerisons, tauxdeces, tauxguerison, tauxinfection) VALUES ('%s', '%s', %d, %d , %d, %g, %g, %g);" + config.DbInsertPays = "INSERT INTO coronapaysdata (date, pays, infection, deces, guerisons, tauxdeces, tauxguerison, tauxinfection) VALUES (:date, :pays, :infection, :deces, :guerisons, :tauxdeces, :tauxguerison, :tauxinfection) ON DUPLICATE KEY UPDATE date=:date, pays=:pays,infection=:infection, deces=:deces, guerisons=:guerisons, tauxdeces=:tauxdeces, tauxguerison=:tauxguerison, tauxinfection=:tauxinfection;" return } diff --git a/src/coronafana/main.go b/src/coronafana/main.go index 8efb97a..64a7997 100644 --- a/src/coronafana/main.go +++ b/src/coronafana/main.go @@ -2,7 +2,6 @@ package coronafana import ( "encoding/json" - "fmt" "io/ioutil" "net/http" "strings" @@ -34,48 +33,75 @@ func GetData(cfg config.Config) (cr Coronafana, err error) { return } -// InsertData insert data to MySQL / MariaDB -func (cr Coronafana) InsertData(cfg config.Config, db sqlx.DB) (err error) { - tx := db.MustBegin() +// InsertGlobalData insert data to MySQL / MariaDB +func (cr Coronafana) InsertGlobalData(cfg config.Config, db sqlx.DB) (err error) { + var tx *sqlx.Tx + tx = db.MustBegin() + txStmtglobal, err := tx.PrepareNamed(cfg.DbInsertGlobal) for _, dt := range cr.GlobalData { - query := fmt.Sprintf(cfg.DbInsertGlobal, dt.Date, dt.Infection, dt.Deces, dt.Guerisons, dt.TauxDeces, dt.TauxGuerison, dt.TauxInfection) - tx.MustExec(query) - } + _, err = txStmtglobal.Exec(&dt) + if err != nil { + return + } - for _, dt := range cr.PaysData { - query := fmt.Sprintf(cfg.DbInsertPays, dt.Date, strings.Replace(dt.Pays, `'`, `\'`, -1), dt.Infection, dt.Deces, dt.Guerisons, dt.TauxDeces, dt.TauxGuerison, dt.TauxInfection) - tx.MustExec(query) } - err = tx.Commit() if err != nil { - return err + return + } + + return +} + +// InsertPaysData insert data to MySQL / MariaDB +func (cr Coronafana) InsertPaysData(cfg config.Config, db sqlx.DB) (err error) { + var tx *sqlx.Tx + tx = db.MustBegin() + cr.ReplacePaysQuotes() + txStmtpays, err := tx.PrepareNamed(cfg.DbInsertPays) + for _, dt := range cr.PaysData { + _, err = txStmtpays.Exec(&dt) + if err != nil { + return + } + } + err = tx.Commit() + if err != nil { + return } return } +// ReplacePaysQuotes escapes quotes in Pays names +func (cr Coronafana) ReplacePaysQuotes() (err error) { + for _, pad := range cr.PaysData { + pad.Pays = strings.Replace(pad.Pays, `'`, `\'`, -1) + } + return err +} + // Coronafana is the main struct type Coronafana struct { Source string `json:"Source"` Information string `json:"Information"` Utilisation string `json:"Utilisation"` GlobalData []struct { - Date string `json:"Date" gorm:"primary_key"` - Infection int `json:"Infection"` - Deces int `json:"Deces"` - Guerisons int `json:"Guerisons"` - TauxDeces float64 `json:"TauxDeces"` - TauxGuerison float64 `json:"TauxGuerison"` - TauxInfection float64 `json:"TauxInfection"` + Date string `json:"Date" gorm:"primary_key" db:"date"` + Infection int `json:"Infection" db:"infection"` + Deces int `json:"Deces" db:"deces"` + Guerisons int `json:"Guerisons" db:"guerisons"` + TauxDeces float64 `json:"TauxDeces" db:"tauxdeces"` + TauxGuerison float64 `json:"TauxGuerison" db:"tauxguerison"` + TauxInfection float64 `json:"TauxInfection" db:"tauxinfection"` } `json:"GlobalData"` PaysData []struct { - Date string `json:"Date" gorm:"primary_key"` - Pays string `json:"Pays"` - Infection int `json:"Infection"` - Deces int `json:"Deces"` - Guerisons int `json:"Guerisons"` - TauxDeces float64 `json:"TauxDeces"` - TauxGuerison float64 `json:"TauxGuerison"` - TauxInfection float64 `json:"TauxInfection"` + Date string `json:"Date" gorm:"primary_key" db:"date"` + Pays string `json:"Pays" db:"pays"` + Infection int `json:"Infection" db:"infection"` + Deces int `json:"Deces" db:"deces"` + Guerisons int `json:"Guerisons" db:"guerisons"` + TauxDeces float64 `json:"TauxDeces" db:"tauxdeces"` + TauxGuerison float64 `json:"TauxGuerison" db:"tauxguerison"` + TauxInfection float64 `json:"TauxInfection" db:"tauxinfection"` } `json:"PaysData"` }