Skip to content

Commit cd7bc12

Browse files
committed
Stream based writer
1 parent c8118b2 commit cd7bc12

File tree

1 file changed

+76
-32
lines changed

1 file changed

+76
-32
lines changed

dump.go

Lines changed: 76 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,17 @@ type table struct {
2020
type dump struct {
2121
DumpVersion string
2222
ServerVersion string
23-
Tables []*table
2423
CompleteTime string
24+
HeaderTmpl *template.Template
25+
TableTmpl *template.Template
26+
FooterTmpl *template.Template
27+
Connection *sql.DB
28+
Out io.Writer
2529
}
2630

27-
const version = "0.2.2"
31+
const version = "0.3.1"
2832

29-
const tmpl = `-- Go SQL Dump {{ .DumpVersion }}
33+
const headerTmpl = `-- Go SQL Dump {{ .DumpVersion }}
3034
--
3135
-- ------------------------------------------------------
3236
-- Server version {{ .ServerVersion }}
@@ -41,9 +45,9 @@ const tmpl = `-- Go SQL Dump {{ .DumpVersion }}
4145
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
4246
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
4347
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
48+
`
4449

45-
46-
{{range .Tables}}
50+
const tableTmpl = `
4751
--
4852
-- Table structure for table {{ .Name }}
4953
--
@@ -64,10 +68,72 @@ INSERT INTO {{ .Name }} VALUES {{ .Values }};
6468
{{ end }}
6569
/*!40000 ALTER TABLE {{ .Name }} ENABLE KEYS */;
6670
UNLOCK TABLES;
67-
{{ end }}
71+
`
72+
73+
const footerTmpl = `
6874
-- Dump completed on {{ .CompleteTime }}
6975
`
7076

77+
func (data *dump) getTemplates() (err error) {
78+
// Write dump to file
79+
data.HeaderTmpl, err = template.New("mysqldumpHeader").Parse(headerTmpl)
80+
if err != nil {
81+
return
82+
}
83+
84+
data.TableTmpl, err = template.New("mysqldumpTable").Parse(tableTmpl)
85+
if err != nil {
86+
return
87+
}
88+
89+
data.FooterTmpl, err = template.New("mysqldumpTable").Parse(footerTmpl)
90+
if err != nil {
91+
return
92+
}
93+
return
94+
}
95+
96+
func (data *dump) dump() error {
97+
if err := data.HeaderTmpl.Execute(data.Out, data); err != nil {
98+
return err
99+
}
100+
101+
// Get tables
102+
tables, err := getTables(data.Connection)
103+
if err != nil {
104+
return err
105+
}
106+
107+
// Get sql for each table
108+
for _, name := range tables {
109+
if err := data.dumpTable(name); err != nil {
110+
return err
111+
}
112+
}
113+
114+
// Set complete time
115+
data.CompleteTime = time.Now().String()
116+
117+
if err = data.FooterTmpl.Execute(data.Out, data); err != nil {
118+
return err
119+
}
120+
121+
return nil
122+
}
123+
124+
func (data *dump) dumpTable(name string) error {
125+
table, err := createTable(data.Connection, name)
126+
if err != nil {
127+
return err
128+
}
129+
130+
if err = data.TableTmpl.Execute(data.Out, table); err != nil {
131+
return err
132+
}
133+
134+
return nil
135+
}
136+
71137
// Dump creates a MySQL dump based on the options supplied through the dumper.
72138
func (d *Dumper) Dump() (string, error) {
73139
name := time.Now().Format(d.format)
@@ -95,42 +161,20 @@ func Dump(db *sql.DB, out io.Writer) error {
95161
var err error
96162
data := dump{
97163
DumpVersion: version,
98-
Tables: make([]*table, 0),
164+
Connection: db,
165+
Out: out,
99166
}
100167

101168
// Get server version
102169
if data.ServerVersion, err = getServerVersion(db); err != nil {
103170
return err
104171
}
105172

106-
// Get tables
107-
tables, err := getTables(db)
108-
if err != nil {
109-
return err
110-
}
111-
112-
// Get sql for each table
113-
for _, name := range tables {
114-
if t, err := createTable(db, name); err == nil {
115-
data.Tables = append(data.Tables, t)
116-
} else {
117-
return err
118-
}
119-
}
120-
121-
// Set complete time
122-
data.CompleteTime = time.Now().String()
123-
124-
// Write dump to file
125-
t, err := template.New("mysqldump").Parse(tmpl)
126-
if err != nil {
127-
return err
128-
}
129-
if err = t.Execute(out, data); err != nil {
173+
if err := data.getTemplates(); err != nil {
130174
return err
131175
}
132176

133-
return nil
177+
return data.dump()
134178
}
135179

136180
func getTables(db *sql.DB) ([]string, error) {

0 commit comments

Comments
 (0)