Wersja inicjalna
This commit is contained in:
117
mgr/mgr.go
Normal file
117
mgr/mgr.go
Normal file
@ -0,0 +1,117 @@
|
||||
package mgr
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"multisql/cfg"
|
||||
"multisql/psql"
|
||||
"os"
|
||||
"path"
|
||||
"sync"
|
||||
"time"
|
||||
)
|
||||
|
||||
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 {
|
||||
fmt.Fprintf(os.Stderr, "Skrypt zostanie pominięty z powodu błedu: %v\n", err)
|
||||
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 {
|
||||
fmt.Fprintf(os.Stderr, "Problem z utworzeniem katalogu wynikow dla połaczenie: %v", dbDir)
|
||||
fmt.Fprintf(os.Stderr, "Pomijam połaczenie")
|
||||
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,
|
||||
)
|
||||
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)
|
||||
fmt.Fprintf(os.Stderr, "%s:%d:%s:%s Skrypt: %s Błąd: %v\n", con.Host, con.Port, con.DbName, con.User, scr, event.Err)
|
||||
} else if self.verbose {
|
||||
scr := path.Base(event.Script)
|
||||
fmt.Fprintf(os.Stderr, "%s:%d:%s:%s Skrypt %s zakończony poprawnie\n", con.Host, con.Port, con.DbName, con.User, scr)
|
||||
}
|
||||
}
|
||||
group.Done()
|
||||
}
|
Reference in New Issue
Block a user