github.com/khulnasoft-lab/tunnel-db@v0.0.0-20231117205118-74e1113bd007/pkg/metadata/metadata.go (about) 1 package metadata 2 3 import ( 4 "encoding/json" 5 "os" 6 "path/filepath" 7 "time" 8 9 "golang.org/x/xerrors" 10 11 "github.com/khulnasoft-lab/tunnel-db/pkg/db" 12 ) 13 14 const metadataFile = "metadata.json" 15 16 type Metadata struct { 17 Version int `json:",omitempty"` 18 NextUpdate time.Time 19 UpdatedAt time.Time 20 DownloadedAt time.Time // This field will be filled after downloading. 21 } 22 23 // Client defines the file meta 24 type Client struct { 25 filePath string 26 } 27 28 // NewClient is the factory method for the metadata Client 29 func NewClient(cacheDir string) Client { 30 filePath := Path(cacheDir) 31 return Client{ 32 filePath: filePath, 33 } 34 } 35 36 // Path returns the metaData file path 37 func Path(cacheDir string) string { 38 dbDir := db.Dir(cacheDir) 39 return filepath.Join(dbDir, metadataFile) 40 } 41 42 // Get returns the file metadata 43 func (c Client) Get() (Metadata, error) { 44 f, err := os.Open(c.filePath) 45 if err != nil { 46 return Metadata{}, xerrors.Errorf("unable to open a file: %w", err) 47 } 48 defer f.Close() 49 50 var metadata Metadata 51 if err = json.NewDecoder(f).Decode(&metadata); err != nil { 52 return Metadata{}, xerrors.Errorf("unable to decode metadata: %w", err) 53 } 54 return metadata, nil 55 } 56 57 func (c Client) Update(meta Metadata) error { 58 if err := os.MkdirAll(filepath.Dir(c.filePath), 0744); err != nil { 59 return xerrors.Errorf("mkdir error: %w", err) 60 } 61 62 f, err := os.Create(c.filePath) 63 if err != nil { 64 return xerrors.Errorf("unable to open a file: %w", err) 65 } 66 defer f.Close() 67 68 if err = json.NewEncoder(f).Encode(&meta); err != nil { 69 return xerrors.Errorf("unable to decode metadata: %w", err) 70 } 71 return nil 72 } 73 74 // Delete deletes the file of database metadata 75 func (c Client) Delete() error { 76 if err := os.Remove(c.filePath); err != nil { 77 return xerrors.Errorf("unable to remove the metadata file: %w", err) 78 } 79 return nil 80 }