data validation, needs more frendly format help messages

This commit is contained in:
Radu Ioan Fericean
2012-08-14 15:17:20 +03:00
parent a246aa8c8f
commit ab909d11a2
2 changed files with 53 additions and 8 deletions

View File

@@ -23,6 +23,7 @@ import (
"github.com/cgrates/cgrates/timespans"
"log"
"path"
"regexp"
)
var (
@@ -44,8 +45,32 @@ var (
sep rune
)
type validator struct {
fn string
re *regexp.Regexp
message string
}
func main() {
flag.Parse()
dataFilesValidators := []*validator{
&validator{destinationsFn, regexp.MustCompile(`(?:\w+\s*,\s*){1}(?:\d+.?\d*){1}$`), "Tag[0-9A-Za-z_),Prefix[0-9]"},
&validator{ratesFn, regexp.MustCompile(`(?:\w+\s*,\s*){2}(?:\d+.?\d*){4}$`), "Tag[0-9A-Za-z_],DestinationsTag[0-9A-Za-z_],ConnectFee,Price,PricedUnits,RateIncrement"},
&validator{timingsFn, regexp.MustCompile(`(?:\w+\s*,\s*){1}(?:\*all\s*,\s*|(?:\d{1,4};?)+\s*,\s*|\s*,\s*){4}(?:\d{2}:\d{2}:\d{2}|\*asap){1}$`), "Tag,Years,Months,MonthDays,WeekDays,Time"},
&validator{ratetimingsFn, regexp.MustCompile(`(?:\w+\s*,\s*){3}(?:\d+.?\d*){1}$`), "Tag,RatesTag,TimingProfile,Weight"},
&validator{ratingprofilesFn, regexp.MustCompile(`(?:\w+\s*,\s*){1}(?:\d+\s*,\s*){1}(?:OUT\s*,\s*|IN\s*,\s*){1}(?:\*all\s*,\s*|[\w:\.]+\s*,\s*){1}(?:\w*\s*,\s*){1}(?:\w+\s*,\s*){1}(?:\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z){1}$`), "Tenant,TOR,Direction,Subject,RatesFallbackSubject,RatesTimingTag,ActivationTime"},
&validator{actionsFn, regexp.MustCompile(`(?:\w+\s*,\s*){3}(?:OUT\s*,\s*|IN\s*,\s*){1}(?:\d+\s*,\s*){1}(?:\w+\s*,\s*|\*all\s*,\s*){1}(?:ABSOLUTE\s*,\s*|PERCENT\s*,\s*|\s*,\s*){1}(?:\d*\.?\d*\s*,?\s*){3}$`), "Tag,Action,BalanceTag,Direction,Units,DestinationTag,PriceType,PriceValue,MinutesWeight,Weight"},
&validator{actiontimingsFn, regexp.MustCompile(`(?:\w+\s*,\s*){3}(?:\d+\.?\d*){1}`), "Tag,ActionsTag,TimingTag, Weight"},
&validator{actiontriggersFn, regexp.MustCompile(`(?:\w+\s*,\s*){2}(?:OUT\s*,\s*|IN\s*,\s*){1}(?:\d+\.?\d*\s*,\s*){1}(?:\w+\s*,\s*|\*all\s*,\s*){1}(?:\w+\s*,\s*){1}(?:\d+\.?\d*){1}$`), "Tag,BalanceTag,ThresholdValue,Direction,DestinationTag,ActionsTag,Weight"},
&validator{accountactionsFn, regexp.MustCompile(`(?:OUT\s*,\s*|IN\s*,\s*){1}`), "Tenant,Account,Direction,ActionTimingsTag,ActionTriggersTag"},
}
for _, v := range dataFilesValidators {
err := timespans.ValidateCSVData(v.fn, v.re)
if err != nil {
log.Fatal(err, "\n\t", v.message)
}
}
sep = []rune(*separator)[0]
csvr := timespans.NewFileCSVReader()
err := csvr.LoadDestinations(path.Join(*dataPath, destinationsFn), sep)

View File

@@ -19,7 +19,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
package timespans
import (
"bufio"
"errors"
"fmt"
"log"
"os"
"regexp"
"strconv"
)
@@ -124,14 +129,29 @@ func (cds CallDescriptors) getKey(key string) *CallDescriptor {
return nil
}
/*func (cds CallDescriptors) setIntervalEndTime() {
for _, cd := range cds {
for _, ap := range cd.ActivationPeriods {
for x, i := range ap.Intervals {
if x < len(ap.Intervals)-1 {
i.EndTime = ap.Intervals[x+1].StartTime
}
func ValidateCSVData(fn string, re *regexp.Regexp) (err error) {
fin, err := os.Open(fn)
if err != nil {
return
}
defer fin.Close()
r := bufio.NewReader(fin)
line_number := 1
for {
line, truncated, err := r.ReadLine()
if err != nil {
break
}
if truncated {
return errors.New("line too long")
}
// skip the header line
if line_number > 1 {
if !re.Match(line) {
return errors.New(fmt.Sprintf("%s: error on line %d: %s", fn, line_number, line))
}
}
line_number++
}
}*/
return
}