pgsplit/main.go

101 lines
1.7 KiB
Go
Raw Permalink Normal View History

2024-04-23 20:17:43 +02:00
package main
import (
// Standard
"bufio"
"fmt"
"os"
"regexp"
"slices"
)
2024-04-24 16:32:51 +02:00
const VERSION = "v5"
2024-04-23 20:17:43 +02:00
const MAXLINE = 1048576
type Db struct {
Name string
Completed bool
file *os.File
}
2024-04-23 20:41:39 +02:00
func NewDb(name string) (db Db) {
2024-04-23 20:17:43 +02:00
db.Name = name
2024-04-23 20:41:39 +02:00
return
}
2024-04-23 20:17:43 +02:00
2024-04-23 20:41:39 +02:00
func (db *Db) Open() (err error) {
2024-04-23 20:17:43 +02:00
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]
2024-04-23 20:41:39 +02:00
db = NewDb(dbName)
2024-04-23 20:17:43 +02:00
if (flagIncludeAll && slices.Contains(flagExcept, dbName)) || (flagExcludeAll && !slices.Contains(flagExcept, dbName)) {
2024-04-24 16:32:41 +02:00
fmt.Printf("Skipping %s\n", dbName)
2024-04-23 20:17:43 +02:00
continue
}
2024-04-24 16:32:41 +02:00
fmt.Printf("Extracting %s\n", db.Name)
2024-04-23 20:41:39 +02:00
if flagList {
continue
}
if err = db.Open(); err != nil {
2024-04-23 20:17:43 +02:00
fmt.Printf("%s: %s\n", dbName, err)
os.Exit(1)
}
}
2024-04-23 20:24:40 +02:00
if !flagList && db.IsOpen() {
2024-04-23 20:17:43 +02:00
db.Write(line)
}
2024-04-23 20:41:39 +02:00
if dbDone.MatchString(line) {
2024-04-23 20:17:43 +02:00
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()
}