diff --git a/cdrc/fwv.go b/cdrc/fwv.go index 8ec7c2c31..5f97d106f 100644 --- a/cdrc/fwv.go +++ b/cdrc/fwv.go @@ -115,13 +115,12 @@ func (self *FwvRecordsProcessor) ProcessNextRecord() ([]*engine.StoredCdr, error engine.Logger.Err(fmt.Sprintf(" Could not read complete line, have instead: %s", string(buf))) return nil, io.EOF } + record := string(buf) for cfgKey := range self.cdrcCfgs { - filterBreak := false - // ToDo: Field filters - if filterBreak { // Stop importing cdrc fields profile due to non matching filter + if passes := self.recordPassesCfgFilter(record, cfgKey); !passes { continue } - if storedCdr, err := self.recordToStoredCdr(string(buf), cfgKey); err != nil { + if storedCdr, err := self.recordToStoredCdr(record, cfgKey); err != nil { return nil, fmt.Errorf("Failed converting to StoredCdr, error: %s", err.Error()) } else { recordCdrs = append(recordCdrs, storedCdr) @@ -130,6 +129,24 @@ func (self *FwvRecordsProcessor) ProcessNextRecord() ([]*engine.StoredCdr, error return recordCdrs, nil } +func (self *FwvRecordsProcessor) recordPassesCfgFilter(record, configKey string) bool { + filterPasses := true + for _, rsrFilter := range self.cdrcCfgs[configKey].CdrFilter { + if rsrFilter == nil { // Nil filter does not need to match anything + continue + } + if cfgFieldIdx, _ := strconv.Atoi(rsrFilter.Id); len(record) <= cfgFieldIdx { + fmt.Errorf("Ignoring record: %v - cannot compile filter %+v", record, rsrFilter) + return false + } else if !rsrFilter.FilterPasses(record[cfgFieldIdx:]) { + fmt.Printf("Record content to test: %s\n", record[cfgFieldIdx:]) + filterPasses = false + break + } + } + return filterPasses +} + // Converts a record (header or normal) to StoredCdr func (self *FwvRecordsProcessor) recordToStoredCdr(record string, cfgKey string) (*engine.StoredCdr, error) { var err error diff --git a/cdrc/fwv_test.go b/cdrc/fwv_test.go index 3d4d9cd16..39f7c6a9c 100644 --- a/cdrc/fwv_test.go +++ b/cdrc/fwv_test.go @@ -19,6 +19,8 @@ along with this program. If not, see package cdrc import ( + "github.com/cgrates/cgrates/config" + "github.com/cgrates/cgrates/utils" "testing" ) @@ -39,3 +41,15 @@ func TestFwvValue(t *testing.T) { } } + +func TestFwvRecordPassesCfgFilter(t *testing.T) { + //record, configKey string) bool { + cgrConfig, _ := config.NewDefaultCGRConfig() + cdrcConfig := cgrConfig.CdrcProfiles["/var/log/cgrates/cdrc/in"][utils.META_DEFAULT] // We don't really care that is for .csv since all we want to test are the filters + cdrcConfig.CdrFilter = utils.ParseRSRFieldsMustCompile(`~52:s/^0(\d{9})/+49${1}/(+49123123120)`, utils.INFIELD_SEP) + fwvRp := &FwvRecordsProcessor{cdrcCfgs: cgrConfig.CdrcProfiles["/var/log/cgrates/cdrc/in"]} + cdrLine := "CDR0000010 0 20120708181506000123451234 0040123123120 004 000018009980010001ISDN ABC 10Buiten uw regio EHV 00000009190000000009" + if passesFilter := fwvRp.recordPassesCfgFilter(cdrLine, utils.META_DEFAULT); !passesFilter { + t.Error("Not passes filter") + } +}