From 3f12b093f977ea21ea828b581bfa2d6028daaf6a Mon Sep 17 00:00:00 2001 From: "David J. Allen" Date: Thu, 19 Sep 2024 11:21:08 -0600 Subject: [PATCH] Fixed removing from cache with --with-* flags --- cmd/cache.go | 23 ++++++++++++++++++++--- internal/cache/sqlite/sqlite.go | 25 ++++++++++++++++++++----- 2 files changed, 40 insertions(+), 8 deletions(-) diff --git a/cmd/cache.go b/cmd/cache.go index aefd15b..ef605a9 100644 --- a/cmd/cache.go +++ b/cmd/cache.go @@ -62,11 +62,28 @@ var cacheRemoveCmd = &cobra.Command{ assets = append(assets, asset) } - // add all assets with specified hosts (same host different different ports) + // Add all assets with specified hosts (same host different different ports) + // This should produce the following SQL: + // DELETE FROM magellan_scanned_assets WHERE host=:host for _, host := range withHosts { - + assets = append(assets, magellan.RemoteAsset{ + Host: host, + Port: -1, + }) + } + // Add all assets with specified ports (same port different hosts) + // This should produce the following SQL: + // DELETE FROM magellan_scanned_assets WHERE port=:port + for _, port := range withPorts { + assets = append(assets, magellan.RemoteAsset{ + Host: "", + Port: port, + }) + } + if len(assets) <= 0 { + log.Error().Msg("nothing to do") + os.Exit(1) } - // add all assets with specified ports (same port different hosts) sqlite.DeleteScannedAssets(cachePath, assets...) }, } diff --git a/internal/cache/sqlite/sqlite.go b/internal/cache/sqlite/sqlite.go index 691b658..3e72676 100644 --- a/internal/cache/sqlite/sqlite.go +++ b/internal/cache/sqlite/sqlite.go @@ -2,6 +2,7 @@ package sqlite import ( "fmt" + "strings" magellan "github.com/OpenCHAMI/magellan/internal" "github.com/OpenCHAMI/magellan/internal/util" @@ -60,22 +61,36 @@ func InsertScannedAssets(path string, assets ...magellan.RemoteAsset) error { } func DeleteScannedAssets(path string, assets ...magellan.RemoteAsset) error { + var ( + db *sqlx.DB + tx *sqlx.Tx + err error + ) if assets == nil { return fmt.Errorf("no assets found") } - db, err := sqlx.Open("sqlite3", path) + db, err = sqlx.Open("sqlite3", path) if err != nil { return fmt.Errorf("failed to open database: %v", err) } - tx := db.MustBegin() + tx = db.MustBegin() for _, asset := range assets { + // skip if neither host nor port are specified if asset.Host == "" && asset.Port <= 0 { continue } - sql := fmt.Sprintf(`DELETE FROM %s WHERE port=:port;`, TABLE_NAME) - if asset.Host != "" { - sql += "AND host=:host" + sql := fmt.Sprintf(`DELETE FROM %s`, TABLE_NAME) + where := []string{} + if asset.Port > 0 { + where = append(where, "port=:port") } + if asset.Host != "" { + where = append(where, "host=:host") + } + if len(where) <= 0 { + continue + } + sql += fmt.Sprintf(" WHERE %s;", strings.Join(where, " AND ")) _, err := tx.NamedExec(sql, &asset) if err != nil { fmt.Printf("failed to execute DELETE transaction: %v\n", err)