Initial commit
This commit is contained in:
commit
f523c6eaf0
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
pgsplit
|
||||
*.sql
|
42
flag.go
Normal file
42
flag.go
Normal file
@ -0,0 +1,42 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
// Stnadard
|
||||
"flag"
|
||||
"fmt"
|
||||
"os"
|
||||
)
|
||||
|
||||
type arrayFlags []string
|
||||
|
||||
func (i *arrayFlags) String() string {
|
||||
return ""
|
||||
}
|
||||
|
||||
func (i *arrayFlags) Set(value string) error {
|
||||
*i = append(*i, value)
|
||||
return nil
|
||||
}
|
||||
|
||||
var (
|
||||
flagIncludeAll bool
|
||||
flagExcludeAll bool
|
||||
flagExcept arrayFlags
|
||||
)
|
||||
|
||||
func init() {
|
||||
flag.BoolVar(&flagIncludeAll, "include-all", false, "Split out all databases, with provided exceptions.")
|
||||
flag.BoolVar(&flagExcludeAll, "exclude-all", false, "Split out no databases, with provided exceptions.")
|
||||
flag.Var(&flagExcept, "except", "Exception to rule, can be used multiple times")
|
||||
flag.Parse()
|
||||
|
||||
if flagIncludeAll && flagExcludeAll {
|
||||
fmt.Println("-include-all and -exclude-all are mutually exclusive")
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
if flagExcludeAll && len(flagExcept) == 0 {
|
||||
fmt.Println("All databases are excluded and pgsplit is pointless.")
|
||||
os.Exit(1)
|
||||
}
|
||||
}
|
93
main.go
Normal file
93
main.go
Normal file
@ -0,0 +1,93 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
// Standard
|
||||
"bufio"
|
||||
"fmt"
|
||||
"os"
|
||||
"regexp"
|
||||
"slices"
|
||||
)
|
||||
|
||||
const VERSION = "v1"
|
||||
const MAXLINE = 1048576
|
||||
|
||||
type Db struct {
|
||||
Name string
|
||||
Completed bool
|
||||
file *os.File
|
||||
}
|
||||
|
||||
func NewDb(name string) (db Db, err error) {
|
||||
db.Name = name
|
||||
fmt.Printf("Database %s\n", db.Name)
|
||||
|
||||
db.file, err = os.OpenFile(
|
||||
db.Name+".sql",
|
||||
os.O_CREATE|os.O_WRONLY|os.O_TRUNC,
|
||||
0600,
|
||||
)
|
||||
return
|
||||
}
|
||||
|
||||
func (db *Db) Close() {
|
||||
if db.IsOpen() {
|
||||
db.file.Close()
|
||||
db.file = nil
|
||||
}
|
||||
}
|
||||
|
||||
func (db *Db) Write(s string) (err error) {
|
||||
_, err = db.file.WriteString(s + "\n")
|
||||
return
|
||||
}
|
||||
|
||||
func (db *Db) IsOpen() bool {
|
||||
return db.file != nil
|
||||
}
|
||||
|
||||
func main() {
|
||||
var prevDb Db
|
||||
var db Db
|
||||
var err error
|
||||
|
||||
dbStart := regexp.MustCompile(`^-- Database "([^"]+)" dump$`)
|
||||
dbDone := regexp.MustCompile(`^-- PostgreSQL database dump complete$`)
|
||||
|
||||
scanner := bufio.NewScanner(os.Stdin)
|
||||
buf := make([]byte, MAXLINE)
|
||||
scanner.Buffer(buf, MAXLINE)
|
||||
for scanner.Scan() {
|
||||
line := scanner.Text()
|
||||
|
||||
if dbMatch := dbStart.FindStringSubmatch(line); len(dbMatch) > 1 {
|
||||
prevDb.Close()
|
||||
|
||||
dbName := dbMatch[1]
|
||||
if (flagIncludeAll && slices.Contains(flagExcept, dbName)) || (flagExcludeAll && !slices.Contains(flagExcept, dbName)) {
|
||||
fmt.Printf("Skipping %s\n", dbName)
|
||||
continue
|
||||
}
|
||||
|
||||
if db, err = NewDb(dbName); err != nil {
|
||||
fmt.Printf("%s: %s\n", dbName, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
if db.IsOpen() {
|
||||
db.Write(line)
|
||||
}
|
||||
|
||||
if dbDone.MatchString(line) {
|
||||
db.Completed = true
|
||||
db.Close()
|
||||
prevDb = db
|
||||
}
|
||||
}
|
||||
|
||||
if db.Name != "" && !db.Completed {
|
||||
fmt.Printf("\n!!! Dump for '%s' is not complete !!!\n", db.Name)
|
||||
}
|
||||
db.Close()
|
||||
}
|
Loading…
Reference in New Issue
Block a user