blob: fe36396b3bf3413dbb5976b9c1fa6a8af75707de [file] [log] [blame]
// Copyright 2023 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 (
"encoding/json"
"fmt"
"os"
"path/filepath"
)
func (db *Database) Write(dir string) error {
gzip := true
if err := db.writeIndex(filepath.Join(dir, indexDir), gzip); err != nil {
return err
}
return db.writeEntries(filepath.Join(dir, idDir), gzip)
}
func (db *Database) writeIndex(dir string, gzip bool) error {
if err := os.MkdirAll(dir, 0755); err != nil {
return fmt.Errorf("failed to create directory %q: %s", dir, err)
}
if err := write(filepath.Join(dir, dbEndpoint), db.DB, gzip); err != nil {
return err
}
if err := write(filepath.Join(dir, modulesEndpoint), db.Modules, gzip); err != nil {
return err
}
return write(filepath.Join(dir, vulnsEndpoint), db.Vulns, gzip)
}
func (db *Database) writeEntries(dir string, gzip bool) error {
if err := os.MkdirAll(dir, 0755); err != nil {
return fmt.Errorf("failed to create directory %q: %s", dir, err)
}
for _, entry := range db.Entries {
if err := write(filepath.Join(dir, entry.ID+".json"), entry, gzip); err != nil {
return err
}
}
return nil
}
func write(filename string, v any, gzip bool) error {
b, err := json.Marshal(v)
if err != nil {
return err
}
// Write standard.
if err := os.WriteFile(filename, b, 0644); err != nil {
return err
}
if gzip {
return writeGzipped(filename+".gz", b)
}
return nil
}