Merge branch 'master' into newcache

This commit is contained in:
Radu Ioan Fericean
2016-07-22 18:02:04 +03:00
5 changed files with 33 additions and 19 deletions

View File

@@ -26,7 +26,7 @@ COPY mongod.conf /etc/mongod.conf
RUN useradd -c CGRateS -d /var/run/cgrates -s /bin/false -r cgrates
# install golang
RUN wget -qO- https://storage.googleapis.com/golang/go1.6.2.linux-amd64.tar.gz | tar xzf - -C /root/
RUN wget -qO- https://storage.googleapis.com/golang/go1.6.3.linux-amd64.tar.gz | tar xzf - -C /root/
#install glide
RUN GOROOT=/root/go GOPATH=/root/code /root/go/bin/go get github.com/Masterminds/glide

View File

@@ -755,10 +755,10 @@ TBD
::
"" - csv
"" - stor_db
"ResourceLimits.csv" - csv
"tp_resource_limits" - stor_db
.. csv-table::
:file:
:file: ../data/tariffplans/tutorial/ResourceLimits.csv
:header-rows: 1

View File

@@ -41,9 +41,9 @@ func (cs cacheDoubleStore) Put(key string, value interface{}) {
cs[prefix] = mp
}
mp[key] = value
if err := dumper.put(prefix, key, value); err != nil {
/*if err := dumper.put(prefix, key, value); err != nil {
utils.Logger.Info("<cache dumper> put error: " + err.Error())
}
}*/
}
func (cs cacheDoubleStore) Get(key string) (interface{}, bool) {
@@ -89,18 +89,18 @@ func (cs cacheDoubleStore) Delete(key string) {
prefix, key := key[:PREFIX_LEN], key[PREFIX_LEN:]
if keyMap, ok := cs[prefix]; ok {
delete(keyMap, key)
if err := dumper.delete(prefix, key); err != nil {
/*if err := dumper.delete(prefix, key); err != nil {
utils.Logger.Info("<cache dumper> delete error: " + err.Error())
}
}*/
}
}
func (cs cacheDoubleStore) DeletePrefix(prefix string) {
delete(cs, prefix)
if err := dumper.deleteAll(prefix); err != nil {
/*if err := dumper.deleteAll(prefix); err != nil {
utils.Logger.Info("<cache dumper> delete all error: " + err.Error())
}
}*/
}
func (cs cacheDoubleStore) CountEntriesForPrefix(prefix string) int {

View File

@@ -37,20 +37,28 @@ func NewCDRFromExternalCDR(extCdr *ExternalCDR, timezone string) (*CDR, error) {
Source: extCdr.Source, RequestType: extCdr.RequestType, Direction: extCdr.Direction, Tenant: extCdr.Tenant, Category: extCdr.Category,
Account: extCdr.Account, Subject: extCdr.Subject, Destination: extCdr.Destination, Supplier: extCdr.Supplier,
DisconnectCause: extCdr.DisconnectCause, CostSource: extCdr.CostSource, Cost: extCdr.Cost, Rated: extCdr.Rated}
if cdr.SetupTime, err = utils.ParseTimeDetectLayout(extCdr.SetupTime, timezone); err != nil {
return nil, err
if extCdr.SetupTime != "" {
if cdr.SetupTime, err = utils.ParseTimeDetectLayout(extCdr.SetupTime, timezone); err != nil {
return nil, err
}
}
if len(cdr.CGRID) == 0 { // Populate CGRID if not present
cdr.CGRID = utils.Sha1(cdr.OriginID, cdr.SetupTime.UTC().String())
}
if cdr.AnswerTime, err = utils.ParseTimeDetectLayout(extCdr.AnswerTime, timezone); err != nil {
return nil, err
if extCdr.AnswerTime != "" {
if cdr.AnswerTime, err = utils.ParseTimeDetectLayout(extCdr.AnswerTime, timezone); err != nil {
return nil, err
}
}
if cdr.Usage, err = utils.ParseDurationWithSecs(extCdr.Usage); err != nil {
return nil, err
if extCdr.Usage != "" {
if cdr.Usage, err = utils.ParseDurationWithSecs(extCdr.Usage); err != nil {
return nil, err
}
}
if cdr.PDD, err = utils.ParseDurationWithSecs(extCdr.PDD); err != nil {
return nil, err
if extCdr.PDD != "" {
if cdr.PDD, err = utils.ParseDurationWithSecs(extCdr.PDD); err != nil {
return nil, err
}
}
if len(extCdr.CostDetails) != 0 {
if err = json.Unmarshal([]byte(extCdr.CostDetails), cdr.CostDetails); err != nil {
@@ -98,6 +106,7 @@ type CDR struct {
CostDetails *CallCost // Attach the cost details to CDR when possible
ExtraInfo string // Container for extra information related to this CDR, eg: populated with error reason in case of error on calculation
Rated bool // Mark the CDR as rated so we do not process it during rating
Partial bool // Used for partial record processing by CDRC
}
func (cdr *CDR) CostDetailsJson() string {
@@ -187,6 +196,8 @@ func (cdr *CDR) FieldAsString(rsrFld *utils.RSRField) string {
return rsrFld.ParseValue(strconv.FormatFloat(cdr.Cost, 'f', -1, 64)) // Recommended to use FormatCost
case utils.COST_DETAILS:
return rsrFld.ParseValue(cdr.CostDetailsJson())
case utils.PartialField:
return rsrFld.ParseValue(strconv.FormatBool(cdr.Partial))
default:
return rsrFld.ParseValue(cdr.ExtraFields[rsrFld.Id])
}
@@ -240,6 +251,8 @@ func (cdr *CDR) ParseFieldValue(fieldId, fieldVal, timezone string) error {
if cdr.Cost, err = strconv.ParseFloat(fieldVal, 64); err != nil {
return fmt.Errorf("Cannot parse cost field with value: %s, err: %s", fieldVal, err.Error())
}
case utils.PartialField:
cdr.Partial, _ = strconv.ParseBool(fieldVal)
default: // Extra fields will not match predefined so they all show up here
cdr.ExtraFields[fieldId] += fieldVal
}

View File

@@ -35,7 +35,7 @@ var (
CdreCdrFormats = []string{CSV, DRYRUN, CDRE_FIXED_WIDTH}
PrimaryCdrFields = []string{CGRID, CDRSOURCE, CDRHOST, ACCID, TOR, REQTYPE, DIRECTION, TENANT, CATEGORY, ACCOUNT, SUBJECT, DESTINATION, SETUP_TIME, PDD, ANSWER_TIME, USAGE,
SUPPLIER, DISCONNECT_CAUSE, COST, RATED}
SUPPLIER, DISCONNECT_CAUSE, COST, RATED, PartialField}
)
const (
@@ -142,6 +142,7 @@ const (
COST_DETAILS = "CostDetails"
RATED = "rated"
RATED_FLD = "Rated"
PartialField = "Partial"
DEFAULT_RUNID = "*default"
META_DEFAULT = "*default"
STATIC_VALUE_PREFIX = "^"