2022-11-08 11:16:29 +01:00
|
|
|
package mgr
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
2022-11-08 11:36:07 +01:00
|
|
|
"log"
|
2022-11-08 11:16:29 +01:00
|
|
|
"os"
|
|
|
|
"path"
|
|
|
|
"sync"
|
|
|
|
"time"
|
2022-11-08 11:45:01 +01:00
|
|
|
|
|
|
|
"gitlab161.poland.asseco.corp/cyfrowagranica/tools/multisql/cfg"
|
|
|
|
"gitlab161.poland.asseco.corp/cyfrowagranica/tools/multisql/psql"
|
2022-11-08 11:16:29 +01:00
|
|
|
)
|
|
|
|
|
|
|
|
type Manager struct {
|
|
|
|
config cfg.Config
|
|
|
|
runDir string
|
|
|
|
verbose bool
|
|
|
|
}
|
|
|
|
|
|
|
|
func Create(verbose bool, outdir string, config cfg.Config) (Manager, error) {
|
|
|
|
runDir := createRunDir(outdir)
|
|
|
|
|
|
|
|
manager := Manager{
|
|
|
|
config: config,
|
|
|
|
runDir: runDir,
|
|
|
|
verbose: verbose,
|
|
|
|
}
|
|
|
|
|
|
|
|
return manager, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func createRunDir(out string) string {
|
|
|
|
t := time.Now()
|
|
|
|
dataPart := t.Format("2006-01-02T15_04_05")
|
|
|
|
newDir := fmt.Sprintf("%s-%d", dataPart, os.Getpid())
|
|
|
|
dir := path.Join(out, newDir)
|
|
|
|
return dir
|
|
|
|
}
|
|
|
|
|
|
|
|
func (self Manager) GetScripts() ([]string, error) {
|
|
|
|
entries, err := os.ReadDir(self.config.SqlDir)
|
|
|
|
if err != nil {
|
|
|
|
return nil, fmt.Errorf("błąd wczytywania skryptów: %w", err)
|
|
|
|
}
|
|
|
|
scripts := make([]string, 0, len(entries))
|
|
|
|
for _, e := range entries {
|
|
|
|
if e.IsDir() {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
scrpt := path.Join(self.config.SqlDir, e.Name())
|
|
|
|
_, err := os.Stat(scrpt)
|
|
|
|
if err != nil {
|
2022-11-08 11:36:07 +01:00
|
|
|
log.Printf("Skrypt zostanie pominięty z powodu błedu: %v\n", err)
|
2022-11-08 11:16:29 +01:00
|
|
|
continue
|
|
|
|
}
|
|
|
|
scripts = append(scripts, scrpt)
|
|
|
|
}
|
|
|
|
return scripts, err
|
|
|
|
}
|
|
|
|
|
|
|
|
func (self Manager) Run() error {
|
|
|
|
err := os.Mkdir(self.runDir, 0o755)
|
|
|
|
if err != nil {
|
|
|
|
return fmt.Errorf("błąd tworzenia katalogu z wynikami: %w", err)
|
|
|
|
}
|
|
|
|
scripts, err := self.GetScripts()
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
var group sync.WaitGroup
|
|
|
|
|
|
|
|
for _, con := range self.config.Connections {
|
|
|
|
dbDir, err := self.createDirPerCon(con)
|
|
|
|
if err != nil {
|
2022-11-08 11:36:07 +01:00
|
|
|
log.Printf("Problem z utworzeniem katalogu wynikow dla połaczenie: %v", dbDir)
|
|
|
|
log.Printf("Pomijam połaczenie")
|
2022-11-08 11:16:29 +01:00
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
|
|
|
group.Add(1)
|
|
|
|
stream := make(chan psql.Result)
|
|
|
|
go self.Logger(&group, stream, con)
|
|
|
|
|
|
|
|
sql := psql.Create(
|
|
|
|
self.config.PassFile,
|
|
|
|
dbDir,
|
|
|
|
scripts,
|
|
|
|
con,
|
|
|
|
self.config.PsqlExec,
|
2022-11-08 11:36:07 +01:00
|
|
|
self.verbose,
|
2022-11-08 11:16:29 +01:00
|
|
|
)
|
|
|
|
go sql.Exec(stream)
|
|
|
|
}
|
|
|
|
|
|
|
|
group.Wait()
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (self Manager) createDirPerCon(con cfg.Connection) (string, error) {
|
|
|
|
dbDir := fmt.Sprintf("%s_%d_%s_%s", con.Host, con.Port, con.DbName, con.User)
|
|
|
|
dir := path.Join(self.runDir, dbDir)
|
|
|
|
err := os.Mkdir(dir, 0o755)
|
|
|
|
return dir, err
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func (self Manager) Logger(group *sync.WaitGroup, stream <-chan psql.Result, con cfg.Connection) {
|
|
|
|
for event := range stream {
|
|
|
|
if event.Err != nil {
|
|
|
|
scr := path.Base(event.Script)
|
2022-11-08 11:36:07 +01:00
|
|
|
log.Printf("%s:%d:%s:%s Skrypt: %s Błąd: %v\n", con.Host, con.Port, con.DbName, con.User, scr, event.Err)
|
2022-11-08 11:16:29 +01:00
|
|
|
} else if self.verbose {
|
|
|
|
scr := path.Base(event.Script)
|
2022-11-08 11:36:07 +01:00
|
|
|
log.Printf("%s:%d:%s:%s Skrypt %s zakończony poprawnie\n", con.Host, con.Port, con.DbName, con.User, scr)
|
2022-11-08 11:16:29 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
group.Done()
|
|
|
|
}
|