diff options
author | Paul Duncan <pabs@pablotron.org> | 2022-02-19 22:54:09 -0500 |
---|---|---|
committer | Paul Duncan <pabs@pablotron.org> | 2022-02-19 22:54:09 -0500 |
commit | c1a3a44dc43d9cbfe074cb5d8fd09e36112f67a0 (patch) | |
tree | f1cef914d51b85f0f7f99bb332eacca505088cd8 /dbstore/dbstore.go | |
parent | a84fa75165f0ec80a3bf604939ca55f9076c1282 (diff) | |
download | cvez-c1a3a44dc43d9cbfe074cb5d8fd09e36112f67a0.tar.bz2 cvez-c1a3a44dc43d9cbfe074cb5d8fd09e36112f67a0.zip |
dbstore: add CveSearch() and test (but not test data)
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 +} + |