diff options
Diffstat (limited to 'dbstore/dbstore.go')
-rw-r--r-- | dbstore/dbstore.go | 49 |
1 files changed, 48 insertions, 1 deletions
diff --git a/dbstore/dbstore.go b/dbstore/dbstore.go index 98f3b61..d1e44ba 100644 --- a/dbstore/dbstore.go +++ b/dbstore/dbstore.go @@ -4,6 +4,7 @@ package dbstore import ( "context" db_sql "database/sql" + "encoding/json" "fmt" _ "github.com/mattn/go-sqlite3" "github.com/pablotron/cvez/cpedict" @@ -157,6 +158,23 @@ func (me DbStore) Query( return nil } +// Execute query and invoke callback with each row of result. +func (me DbStore) QueryRow( + ctx context.Context, + queryId string, + args []interface{}, + fn func (*db_sql.Row) error, +) error { + // get query + sql, err := getQuery(queryId) + if err != nil { + return err + } + + // exec query, invoke callback, return result + return fn(me.db.QueryRowContext(ctx, sql, args...)) +} + // import CPE dictionary func (me DbStore) AddCpeDictionary(ctx context.Context, dict cpedict.Dictionary) error { // lazy-init db @@ -685,7 +703,7 @@ var addCveFeedQueryIds = []string { "feed/insert-item-cvss-v3", } -// Add CVE feed. +// Import CVE feed. func (me DbStore) AddCveFeed(ctx context.Context, feed nvd_feed.Feed) (int64, error) { // feed ID var feedId int64 @@ -709,3 +727,32 @@ func (me DbStore) AddCveFeed(ctx context.Context, feed nvd_feed.Feed) (int64, er // return result return feedId, err } + +// search CVEs +func (me DbStore) CveSearch( + ctx context.Context, + s string, +) ([]CveSearchRow, error) { + var r []CveSearchRow + + // lazy-init db + if err := me.Init(ctx); err != nil { + return r, err + } + + // get/exec search query + err := me.QueryRow(ctx, "feed/search", []interface{} { + db_sql.Named("q", s), + }, func(row *db_sql.Row) error { + var s string + if err := row.Scan(&s); err != nil { + return err + } + + return json.Unmarshal([]byte(s), &r) + }) + + // return results + return r, err +} + |