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  }