@@ -128,6 +128,15 @@ type Client struct {
128128 Device * Device
129129}
130130
131+ type parserConfig struct {
132+ Mode int
133+ UseSort bool
134+ DebugMode bool
135+ CacheSize int
136+ MissesThreshold uint64
137+ MatchIdxNotOk int
138+ }
139+
131140type Parser struct {
132141 /* atomic operation are done on the following unit64.
133142 * These must be 64bit aligned. On 32bit architectures
@@ -136,12 +145,10 @@ type Parser struct {
136145 OsMisses uint64
137146 DeviceMisses uint64
138147
148+ config * parserConfig
139149 cache * cache
140150
141151 RegexesDefinitions
142- Mode int
143- UseSort bool
144- debugMode bool
145152}
146153
147154const (
@@ -152,11 +159,8 @@ const (
152159 cDefaultMissesTreshold = 500000
153160 cDefaultMatchIdxNotOk = 20
154161 cDefaultSortOption = false
155- )
156-
157- var (
158- missesTreshold = uint64 (500000 )
159- matchIdxNotOk = 20
162+ cDefaultDebugMode = false
163+ cDefaultCacheSize = 1024
160164)
161165
162166func (parser * Parser ) mustCompile () { // until we can use yaml.UnmarshalYAML with embedded pointer struct
@@ -174,24 +178,46 @@ func (parser *Parser) mustCompile() { // until we can use yaml.UnmarshalYAML wit
174178 }
175179}
176180
177- func NewWithOptions (regexFile string , mode , treshold , topCnt int , useSort , debugMode bool ) (* Parser , error ) {
181+ func defaultParserConfig () * parserConfig {
182+ return & parserConfig {
183+ Mode : EOsLookUpMode | EUserAgentLookUpMode | EDeviceLookUpMode ,
184+ UseSort : cDefaultSortOption ,
185+ DebugMode : cDefaultDebugMode ,
186+ CacheSize : cDefaultCacheSize ,
187+ MissesThreshold : cMinMissesTreshold ,
188+ MatchIdxNotOk : cDefaultMatchIdxNotOk ,
189+ }
190+ }
191+
192+ func NewWithOptions (regexFile string , mode , treshold , topCnt int , useSort , debugMode bool , cacheSize int ) (* Parser , error ) {
178193 data , err := ioutil .ReadFile (regexFile )
179194 if nil != err {
180195 return nil , err
181196 }
197+
198+ cfg := & parserConfig {
199+ Mode : mode ,
200+ UseSort : useSort ,
201+ DebugMode : debugMode ,
202+ MatchIdxNotOk : cDefaultMatchIdxNotOk ,
203+ MissesThreshold : cDefaultMissesTreshold ,
204+ CacheSize : cDefaultCacheSize ,
205+ }
206+
182207 if topCnt >= 0 {
183- matchIdxNotOk = topCnt
208+ cfg . MatchIdxNotOk = topCnt
184209 }
185210 if treshold > cMinMissesTreshold {
186- missesTreshold = uint64 (treshold )
211+ cfg . MissesThreshold = uint64 (treshold )
187212 }
188- parser , err := NewFromBytes (data )
213+ if cacheSize > 0 {
214+ cfg .CacheSize = cacheSize
215+ }
216+
217+ parser , err := newFromBytes (data , cfg )
189218 if err != nil {
190219 return nil , err
191220 }
192- parser .Mode = mode
193- parser .UseSort = useSort
194- parser .debugMode = debugMode
195221 return parser , nil
196222}
197223
@@ -200,17 +226,15 @@ func New(regexFile string) (*Parser, error) {
200226 if nil != err {
201227 return nil , err
202228 }
203- matchIdxNotOk = cDefaultMatchIdxNotOk
204- missesTreshold = cDefaultMissesTreshold
205- parser , err := NewFromBytes (data )
229+ parser , err := newFromBytes (data , defaultParserConfig ())
206230 if err != nil {
207231 return nil , err
208232 }
209233 return parser , nil
210234}
211235
212236func NewFromSaved () * Parser {
213- parser , err := NewFromBytes (DefinitionYaml )
237+ parser , err := newFromBytes (DefinitionYaml , defaultParserConfig () )
214238 if err != nil {
215239 // if the YAML is malformed, it's a programmatic error inside what
216240 // we've statically-compiled in our binary. Panic!
@@ -220,9 +244,13 @@ func NewFromSaved() *Parser {
220244}
221245
222246func NewFromBytes (data []byte ) (* Parser , error ) {
247+ return newFromBytes (data , defaultParserConfig ())
248+ }
249+
250+ func newFromBytes (data []byte , config * parserConfig ) (* Parser , error ) {
223251 parser := & Parser {
224- Mode : EOsLookUpMode | EUserAgentLookUpMode | EDeviceLookUpMode ,
225- cache : newCache (),
252+ config : config ,
253+ cache : newCache (config . CacheSize ),
226254 }
227255 if err := yaml .Unmarshal (data , & parser .RegexesDefinitions ); err != nil {
228256 return nil , err
@@ -236,7 +264,7 @@ func NewFromBytes(data []byte) (*Parser, error) {
236264func (parser * Parser ) Parse (line string ) * Client {
237265 cli := new (Client )
238266 var wg sync.WaitGroup
239- if EUserAgentLookUpMode & parser .Mode == EUserAgentLookUpMode {
267+ if EUserAgentLookUpMode & parser .config . Mode == EUserAgentLookUpMode {
240268 wg .Add (1 )
241269 go func () {
242270 defer wg .Done ()
@@ -245,7 +273,7 @@ func (parser *Parser) Parse(line string) *Client {
245273 parser .RUnlock ()
246274 }()
247275 }
248- if EOsLookUpMode & parser .Mode == EOsLookUpMode {
276+ if EOsLookUpMode & parser .config . Mode == EOsLookUpMode {
249277 wg .Add (1 )
250278 go func () {
251279 defer wg .Done ()
@@ -254,7 +282,7 @@ func (parser *Parser) Parse(line string) *Client {
254282 parser .RUnlock ()
255283 }()
256284 }
257- if EDeviceLookUpMode & parser .Mode == EDeviceLookUpMode {
285+ if EDeviceLookUpMode & parser .config . Mode == EDeviceLookUpMode {
258286 wg .Add (1 )
259287 go func () {
260288 defer wg .Done ()
@@ -264,7 +292,7 @@ func (parser *Parser) Parse(line string) *Client {
264292 }()
265293 }
266294 wg .Wait ()
267- if parser .UseSort == true {
295+ if parser .config . UseSort == true {
268296 checkAndSort (parser )
269297 }
270298 return cli
@@ -290,7 +318,7 @@ func (parser *Parser) ParseUserAgent(line string) *UserAgent {
290318 if ! found {
291319 ua .Family = "Other"
292320 }
293- if foundIdx > matchIdxNotOk {
321+ if foundIdx > parser . config . MatchIdxNotOk {
294322 atomic .AddUint64 (& parser .UserAgentMisses , 1 )
295323 }
296324 parser .cache .userAgent .Add (line , ua )
@@ -318,7 +346,7 @@ func (parser *Parser) ParseOs(line string) *Os {
318346 if ! found {
319347 os .Family = "Other"
320348 }
321- if foundIdx > matchIdxNotOk {
349+ if foundIdx > parser . config . MatchIdxNotOk {
322350 atomic .AddUint64 (& parser .OsMisses , 1 )
323351 }
324352
@@ -347,7 +375,7 @@ func (parser *Parser) ParseDevice(line string) *Device {
347375 if ! found {
348376 dvc .Family = "Other"
349377 }
350- if foundIdx > matchIdxNotOk {
378+ if foundIdx > parser . config . MatchIdxNotOk {
351379 atomic .AddUint64 (& parser .DeviceMisses , 1 )
352380 }
353381
@@ -357,26 +385,26 @@ func (parser *Parser) ParseDevice(line string) *Device {
357385
358386func checkAndSort (parser * Parser ) {
359387 parser .Lock ()
360- if atomic .LoadUint64 (& parser .UserAgentMisses ) >= missesTreshold {
361- if parser .debugMode {
388+ if atomic .LoadUint64 (& parser .UserAgentMisses ) >= parser . config . MissesThreshold {
389+ if parser .config . DebugMode {
362390 fmt .Printf ("%s\t Sorting UserAgents slice\n " , time .Now ())
363391 }
364392 parser .UserAgentMisses = 0
365393 sort .Sort (UserAgentSorter (parser .UA ))
366394 }
367395 parser .Unlock ()
368396 parser .Lock ()
369- if atomic .LoadUint64 (& parser .OsMisses ) >= missesTreshold {
370- if parser .debugMode {
397+ if atomic .LoadUint64 (& parser .OsMisses ) >= parser . config . MissesThreshold {
398+ if parser .config . DebugMode {
371399 fmt .Printf ("%s\t Sorting OS slice\n " , time .Now ())
372400 }
373401 parser .OsMisses = 0
374402 sort .Sort (OsSorter (parser .OS ))
375403 }
376404 parser .Unlock ()
377405 parser .Lock ()
378- if atomic .LoadUint64 (& parser .DeviceMisses ) >= missesTreshold {
379- if parser .debugMode {
406+ if atomic .LoadUint64 (& parser .DeviceMisses ) >= parser . config . MissesThreshold {
407+ if parser .config . DebugMode {
380408 fmt .Printf ("%s\t Sorting Device slice\n " , time .Now ())
381409 }
382410 parser .DeviceMisses = 0
0 commit comments