diff --git a/protocols/protocol_regex.go b/protocols/protocol_regex.go index 6e788da..49524fd 100644 --- a/protocols/protocol_regex.go +++ b/protocols/protocol_regex.go @@ -77,12 +77,18 @@ func Match(scope types.Scope, pattern string, target string) bool { re_any, pres := scope.GetContext(key) if pres { re, _ = re_any.(*regexp.Regexp) + if re == nil { + return false + } } else { var err error re, err = regexp.Compile("(?i)" + pattern) if err != nil { scope.Log("Compile regexp: %v", err) + // Cache the error to avoid logging again + scope.SetContext(key, nil) + return false } diff --git a/stored.go b/stored.go index d461d10..e8cac20 100644 --- a/stored.go +++ b/stored.go @@ -22,6 +22,7 @@ package vfilter import ( "context" + "fmt" "github.com/Velocidex/ordereddict" "www.velocidex.com/golang/vfilter/types" @@ -45,6 +46,12 @@ func NewStoredQuery(query *_Select, name string) *_StoredQuery { } } +func (self *_StoredQuery) GoString() string { + scope := NewScope() + return fmt.Sprintf("StoredQuery{name: %v, query: {%v}, parameters: %v}", + self.name, FormatToString(scope, self.query), self.parameters) +} + func (self *_StoredQuery) Eval(ctx context.Context, scope types.Scope) <-chan Row { output_chan := make(chan Row) diff --git a/types/frozen.go b/types/frozen.go new file mode 100644 index 0000000..96660d1 --- /dev/null +++ b/types/frozen.go @@ -0,0 +1,26 @@ +package types + +import ( + "context" +) + +// A FrozenStoredQuery is a stored query which will be evaluated +// inside the defined scope instead of the calling scope. +type FrozenStoredQuery struct { + query StoredQuery + defined_scope Scope +} + +func (self FrozenStoredQuery) Query() StoredQuery { + return self.query +} + +func (self FrozenStoredQuery) Eval( + ctx context.Context, scope Scope) <-chan Row { + return self.query.Eval(ctx, self.defined_scope) +} + +func NewFrozenStoredQuery( + query StoredQuery, scope Scope) StoredQuery { + return &FrozenStoredQuery{query: query, defined_scope: scope} +} diff --git a/vfilter.go b/vfilter.go index 5ddd2a4..678ae2e 100644 --- a/vfilter.go +++ b/vfilter.go @@ -466,6 +466,11 @@ type _Select struct { Limit *int64 `[ LIMIT @Number ]` } +func (self *_Select) GoString() string { + scope := NewScope() + return FormatToString(scope, self) +} + func (self *_Select) Eval(ctx context.Context, scope types.Scope) <-chan Row { // If the EXPLAIN keyword was used, enabled explaining for this // scope and its children. diff --git a/visitor.go b/visitor.go index d00a0cb..89f3b78 100644 --- a/visitor.go +++ b/visitor.go @@ -184,6 +184,9 @@ func (self *Visitor) Visit(node interface{}) { self.line_break() } + case *types.FrozenStoredQuery: + self.Visit(t.Query()) + case *_StoredQuery: self.Visit(t.query)