diff --git a/app/db.go b/app/db.go index dd2188c..19deeb4 100644 --- a/app/db.go +++ b/app/db.go @@ -13,19 +13,12 @@ import ( _ "modernc.org/sqlite" ) -// CloseMode determines whether or not the in-memory DB should be saved to disk -// before closing the connection. -type CloseMode int - -const ( - ReadOnly CloseMode = iota - Write -) - type Db struct { db *sql.DB cfg Config features *AvailableFeatures + // If true, the database will be saved to disk before closing + changed bool } func Open() (*Db, error) { @@ -37,7 +30,7 @@ func Open() (*Db, error) { if _, err := os.Stat("/home/spencer/.envr/data.age"); err != nil { // Create a new DB db, err := newDb() - return &Db{db, *cfg, nil}, err + return &Db{db, *cfg, nil, true}, err } else { // Open the existing DB tmpFile, err := os.CreateTemp("", "envr-*.db") @@ -59,7 +52,7 @@ func Open() (*Db, error) { restoreDB(tmpFile.Name(), memDb) - return &Db{memDb, *cfg, nil}, nil + return &Db{memDb, *cfg, nil, false}, nil } } @@ -181,10 +174,10 @@ func (db *Db) List() (results []EnvFile, err error) { return results, nil } -func (db *Db) Close(mode CloseMode) error { +func (db *Db) Close() error { defer db.db.Close() - if mode == Write { + if db.changed { // Create tmp file tmpFile, err := os.CreateTemp("", "envr-*.db") if err != nil { @@ -200,6 +193,8 @@ func (db *Db) Close(mode CloseMode) error { if err := encryptDb(tmpFile.Name(), db.cfg.Keys); err != nil { return err } + + db.changed = false } return nil @@ -289,6 +284,8 @@ func (db *Db) Insert(file EnvFile) error { return fmt.Errorf("failed to insert env file: %w", err) } + db.changed = true + return nil } @@ -328,6 +325,8 @@ func (db *Db) Delete(path string) error { return fmt.Errorf("no file found with path: %s", path) } + db.changed = true + return nil } diff --git a/cmd/backup.go b/cmd/backup.go index 0882e31..8dbe157 100644 --- a/cmd/backup.go +++ b/cmd/backup.go @@ -27,7 +27,7 @@ var backupCmd = &cobra.Command{ if err != nil { return err } else { - defer db.Close(app.Write) + defer db.Close() record := app.NewEnvFile(path) if err := db.Insert(record); err != nil { diff --git a/cmd/check.go b/cmd/check.go index 4f258b8..73e6c40 100644 --- a/cmd/check.go +++ b/cmd/check.go @@ -38,7 +38,7 @@ var checkCmd = &cobra.Command{ if err != nil { return fmt.Errorf("failed to open database: %w", err) } - defer db.Close(app.ReadOnly) + defer db.Close() // Check if the path is a file or directory info, err := os.Stat(absPath) diff --git a/cmd/deps.go b/cmd/deps.go index 5a65c1d..d73dbbe 100644 --- a/cmd/deps.go +++ b/cmd/deps.go @@ -19,7 +19,7 @@ The check command reports on which binaries are available and which are not.`, if err != nil { return err } else { - defer db.Close(app.ReadOnly) + defer db.Close() features := db.Features() table := tablewriter.NewWriter(os.Stdout) diff --git a/cmd/list.go b/cmd/list.go index cfe2e43..8b10281 100644 --- a/cmd/list.go +++ b/cmd/list.go @@ -24,7 +24,7 @@ var listCmd = &cobra.Command{ if err != nil { return err } - defer db.Close(app.ReadOnly) + defer db.Close() rows, err := db.List() if err != nil { diff --git a/cmd/remove.go b/cmd/remove.go index cec035d..117db21 100644 --- a/cmd/remove.go +++ b/cmd/remove.go @@ -25,7 +25,7 @@ var removeCmd = &cobra.Command{ if err != nil { return err } else { - defer db.Close(app.Write) + defer db.Close() if err := db.Delete(path); err != nil { return err } else { diff --git a/cmd/restore.go b/cmd/restore.go index 3effac4..e973bb6 100644 --- a/cmd/restore.go +++ b/cmd/restore.go @@ -27,7 +27,7 @@ var restoreCmd = &cobra.Command{ if err != nil { return err } else { - defer db.Close(app.ReadOnly) + defer db.Close() record, err := db.Fetch(path) if err != nil { diff --git a/cmd/scan.go b/cmd/scan.go index a079dae..69ebfdc 100644 --- a/cmd/scan.go +++ b/cmd/scan.go @@ -57,7 +57,7 @@ var scanCmd = &cobra.Command{ // Close database with write mode to persist changes if addedCount > 0 { - err = db.Close(app.Write) + err = db.Close() if err != nil { return fmt.Errorf("Error saving changes: %v\n", err) } else { @@ -65,7 +65,7 @@ var scanCmd = &cobra.Command{ return nil } } else { - err = db.Close(app.ReadOnly) + err = db.Close() if err != nil { return fmt.Errorf("Error closing database: %v\n", err) } diff --git a/cmd/sync.go b/cmd/sync.go index dfaba32..8fed0e8 100644 --- a/cmd/sync.go +++ b/cmd/sync.go @@ -19,7 +19,7 @@ var syncCmd = &cobra.Command{ if err != nil { return err } else { - defer db.Close(app.Write) + defer db.Close() files, err := db.List() if err != nil {