github.com/turbot/steampipe@v1.7.0-rc.0.0.20240517123944-7cef272d4458/pkg/ociinstaller/versionfile/db_version_file.go (about)

     1  package versionfile
     2  
     3  import (
     4  	"encoding/json"
     5  	"log"
     6  	"os"
     7  	"time"
     8  
     9  	filehelpers "github.com/turbot/go-kit/files"
    10  	"github.com/turbot/steampipe/pkg/filepaths"
    11  )
    12  
    13  const DatabaseStructVersion = 20220411
    14  
    15  type DatabaseVersionFile struct {
    16  	FdwExtension  InstalledVersion `json:"fdw_extension"`
    17  	EmbeddedDB    InstalledVersion `json:"embedded_db"`
    18  	StructVersion int64            `json:"struct_version"`
    19  }
    20  
    21  func NewDBVersionFile() *DatabaseVersionFile {
    22  	return &DatabaseVersionFile{
    23  		FdwExtension:  InstalledVersion{},
    24  		EmbeddedDB:    InstalledVersion{},
    25  		StructVersion: DatabaseStructVersion,
    26  	}
    27  }
    28  
    29  // IsValid checks whether the struct was correctly deserialized,
    30  // by checking if the StructVersion is populated
    31  func (s DatabaseVersionFile) IsValid() bool {
    32  	return s.StructVersion > 0
    33  }
    34  
    35  // LoadDatabaseVersionFile migrates from the old version file format if necessary and loads the database version data
    36  func LoadDatabaseVersionFile() (*DatabaseVersionFile, error) {
    37  	versionFilePath := filepaths.DatabaseVersionFilePath()
    38  	if filehelpers.FileExists(versionFilePath) {
    39  		return readDatabaseVersionFile(versionFilePath)
    40  	}
    41  	return NewDBVersionFile(), nil
    42  }
    43  
    44  func readDatabaseVersionFile(path string) (*DatabaseVersionFile, error) {
    45  	file, _ := os.ReadFile(path)
    46  	var data DatabaseVersionFile
    47  	if err := json.Unmarshal(file, &data); err != nil {
    48  		log.Println("[ERROR]", "Error while reading DB version file", err)
    49  		return nil, err
    50  	}
    51  	if data.FdwExtension == (InstalledVersion{}) {
    52  		data.FdwExtension = InstalledVersion{}
    53  	}
    54  
    55  	if data.EmbeddedDB == (InstalledVersion{}) {
    56  		data.EmbeddedDB = InstalledVersion{}
    57  	}
    58  
    59  	return &data, nil
    60  }
    61  
    62  // Save writes the config
    63  func (f *DatabaseVersionFile) Save() error {
    64  	// set the struct version
    65  	f.StructVersion = DatabaseStructVersion
    66  
    67  	versionFilePath := filepaths.DatabaseVersionFilePath()
    68  	return f.write(versionFilePath)
    69  }
    70  
    71  func (f *DatabaseVersionFile) write(path string) error {
    72  	versionFileJSON, err := json.MarshalIndent(f, "", "  ")
    73  	if err != nil {
    74  		log.Println("[ERROR]", "Error while writing version file", err)
    75  		return err
    76  	}
    77  	return os.WriteFile(path, versionFileJSON, 0644)
    78  }
    79  
    80  // FormatTime :: format time as RFC3339 in UTC
    81  func FormatTime(localTime time.Time) string {
    82  	loc, _ := time.LoadLocation("UTC")
    83  	utcTime := localTime.In(loc)
    84  	return (utcTime.Format(time.RFC3339))
    85  }