Files
godump/backup/discover.go
T
jamie 9a417155fc
Build and Push / build (godump, amd64, linux) (push) Successful in 18s
feat: add include and exclude filtering options for database discovery
2026-06-04 18:45:41 +00:00

78 lines
1.3 KiB
Go

package backup
import (
"database/sql"
"fmt"
"godump/config"
_ "github.com/go-sql-driver/mysql"
)
func discoverDatabases(cfg config.InstanceConfig) ([]string, error) {
dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/?parseTime=true", cfg.User, cfg.Password, cfg.Host, cfg.Port)
db, err := sql.Open("mysql", dsn)
if err != nil {
return nil, err
}
defer db.Close()
// Ensure the connection is actually valid
if err := db.Ping(); err != nil {
return nil, err
}
query := `
SELECT SCHEMA_NAME
FROM INFORMATION_SCHEMA.SCHEMATA
WHERE SCHEMA_NAME NOT IN ('information_schema', 'performance_schema', 'mysql', 'sys')
`
rows, err := db.Query(query)
if err != nil {
return nil, err
}
defer rows.Close()
var databases []string
for rows.Next() {
var name string
if err := rows.Scan(&name); err != nil {
return nil, err
}
if len(cfg.Include) > 0 {
included := false
for _, inc := range cfg.Include {
if name == inc {
included = true
break
}
}
if !included {
continue
}
}
if len(cfg.Exclude) > 0 {
excluded := false
for _, exc := range cfg.Exclude {
if name == exc {
excluded = true
break
}
}
if excluded {
continue
}
}
databases = append(databases, name)
}
if err := rows.Err(); err != nil {
return nil, err
}
return databases, nil
}