| // Copyright 2024 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package database |
| |
| import ( |
| "archive/zip" |
| "encoding/json" |
| "io" |
| "os" |
| "path/filepath" |
| ) |
| |
| // WriteZip writes the database to filename as a zip file. |
| func (db *Database) WriteZip(filename string) error { |
| if err := os.MkdirAll(filepath.Dir(filename), 0755); err != nil { |
| return err |
| } |
| |
| f, err := os.Create(filename) |
| if err != nil { |
| return err |
| } |
| defer f.Close() |
| |
| zw := zip.NewWriter(f) |
| defer zw.Close() |
| |
| for endpoint, v := range map[string]any{dbEndpoint: db.DB, modulesEndpoint: db.Modules, vulnsEndpoint: db.Vulns} { |
| if err := writeZip(zw, filepath.Join(indexDir, endpoint), v); err != nil { |
| return err |
| } |
| } |
| |
| for _, entry := range db.Entries { |
| if err := writeZip(zw, filepath.Join(idDir, entry.ID+".json"), entry); err != nil { |
| return err |
| } |
| } |
| |
| return nil |
| } |
| |
| // Unzip unzips the zip file in src and writes it to the directory dst. |
| func Unzip(src, dst string) error { |
| zr, err := zip.OpenReader(src) |
| if err != nil { |
| return err |
| } |
| defer zr.Close() |
| |
| for _, f := range zr.File { |
| fpath := filepath.Join(dst, f.Name) |
| |
| if f.FileInfo().IsDir() { |
| if err := os.MkdirAll(fpath, os.ModePerm); err != nil { |
| return err |
| } |
| continue |
| } |
| |
| src, err := f.Open() |
| if err != nil { |
| return err |
| } |
| defer src.Close() |
| |
| if err := os.MkdirAll(filepath.Dir(fpath), os.ModePerm); err != nil { |
| return err |
| } |
| dst, err := os.Create(fpath) |
| if err != nil { |
| return err |
| } |
| defer dst.Close() |
| |
| if _, err := io.Copy(dst, src); err != nil { |
| return err |
| } |
| } |
| return nil |
| } |
| |
| func writeZip(zw *zip.Writer, filename string, v any) error { |
| b, err := json.Marshal(v) |
| if err != nil { |
| return err |
| } |
| |
| w, err := zw.Create(filename) |
| if err != nil { |
| return err |
| } |
| if _, err := w.Write(b); err != nil { |
| return err |
| } |
| |
| return nil |
| } |