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 }