From 3c5014e90b9fa919cef1b747c85d0d959a4ab9bc Mon Sep 17 00:00:00 2001 From: Aaron Guise Date: Mon, 2 Sep 2024 22:37:38 +1200 Subject: [PATCH] =?UTF-8?q?feat:=20Added=20initial=20support=20for=20.zip?= =?UTF-8?q?=20=E2=9C=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/dump.go | 5 ++++ internal/dump/dump.go | 53 ++++++++++++++++++++++++++++++++++++++---- internal/util/files.go | 11 +++++++++ 3 files changed, 65 insertions(+), 4 deletions(-) diff --git a/cmd/dump.go b/cmd/dump.go index e6c5f03..ecd228f 100644 --- a/cmd/dump.go +++ b/cmd/dump.go @@ -68,6 +68,11 @@ to quickly create a Cobra application.`, "%s Completer combining dump files\n\r", style.Success(icon.Check), ) + fmt.Printf( + "%s Zipping file\n\r", + style.Success(icon.Info), + ) + filename, _ = dump.ZipFile(filename) timeElapsed := time.Since(start) fmt.Printf( "%s Dump file available at %s\r\nTook %s\n\r", diff --git a/internal/dump/dump.go b/internal/dump/dump.go index f700ec2..614ed08 100644 --- a/internal/dump/dump.go +++ b/internal/dump/dump.go @@ -1,6 +1,7 @@ package dump import ( + "archive/zip" "fmt" "github.com/charmbracelet/lipgloss" "github.com/charmbracelet/log" @@ -102,7 +103,7 @@ func (c *Client) Dump() error { lipgloss.NewStyle().Foreground(color.Yellow).Render(fmt.Sprint(c.databaseName)), ) - _ = exec.Command(c.executable, + response, err := exec.Command(c.executable, "--host="+c.hostname, "--port="+strconv.Itoa(c.port), "--user="+c.username, @@ -111,8 +112,15 @@ func (c *Client) Dump() error { "--no-data", "--skip-triggers", "--result-file", filepath.Join(c.storagePath, c.databaseName+"-schema.sql"), - c.databaseName).Run() - + c.databaseName).CombinedOutput() + if err != nil { + fmt.Printf( + "%s mysqldump error: %s\n\r", + style.Failure(icon.Cross), + lipgloss.NewStyle().Foreground(color.Purple).Render(string(response)), + ) + return err + } removeDefiners(filepath.Join(c.storagePath, c.databaseName+"-schema.sql")) fmt.Printf( @@ -197,7 +205,8 @@ func removeDefiners(filename string) { outputFile, err := os.OpenFile(filename+".new", os.O_WRONLY|os.O_CREATE, 0666) _, _ = io.Copy(outputFile, engine.Wrap(inputFile)) - + _ = inputFile.Close() + _ = outputFile.Close() err = util.MoveFile(filename+".new", filename) if err != nil { fmt.Printf( @@ -237,3 +246,39 @@ func (c *Client) Combine() (string, error) { } return filepath.Join(c.storagePath, c.databaseName+"-backup.sql"), nil } + +func ZipFile(filename string) (string, error) { + fmt.Println("creating zip archive") + //Create a new zip archive and named archive.zip + archive, err := os.Create(util.FileNameWithoutExt(filename) + ".zip") + if err != nil { + panic(err) + // this is to catch errors if any + } + defer archive.Close() + fmt.Println("archive file created successfully....") + + //Create a new zip writer + zipWriter := zip.NewWriter(archive) + fmt.Println("opening .sql file") + + f1, err := os.Open(filename) + if err != nil { + panic(err) + } + defer f1.Close() + fmt.Println("adding file to archive..") + w1, err := zipWriter.Create(filename) + if err != nil { + panic(err) + } + if _, err := io.Copy(w1, f1); err != nil { + panic(err) + } + fmt.Println("closing archive") + zipWriter.Close() + f1.Close() + _ = os.Remove(filename) + + return util.FileNameWithoutExt(filename) + ".zip", nil +} diff --git a/internal/util/files.go b/internal/util/files.go index 3fa069a..4396f1c 100644 --- a/internal/util/files.go +++ b/internal/util/files.go @@ -4,6 +4,8 @@ import ( "fmt" "io" "os" + "path/filepath" + "strings" ) func MoveFile(src, dst string) error { @@ -39,9 +41,18 @@ func MoveFile(src, dst string) error { return fmt.Errorf("chmod error: %s", err) } + //err = in.Close() + //if err != nil { + // return fmt.Errorf("closing file failed: %s", err) + //} + //time.Sleep(time.Second * 10) err = os.Remove(src) if err != nil { return fmt.Errorf("failed removing original file: %s", err) } return nil } + +func FileNameWithoutExt(fileName string) string { + return strings.TrimSuffix(fileName, filepath.Ext(fileName)) +}