func (ms *MongoStorage) GetAlias(key string, skipCache bool, transactionID string) (al *Alias, err error) { origKey := key key = utils.ALIASES_PREFIX + key if !skipCache { if x, ok := cache.Get(key); ok { if x != nil { al = &Alias{Values: x.(AliasValues)} al.SetId(origKey) return al, nil } return nil, utils.ErrNotFound } } var kv struct { Key string Value AliasValues } session, col := ms.conn(colAls) defer session.Close() cCommit := cacheCommit(transactionID) if err = col.Find(bson.M{"key": origKey}).One(&kv); err == nil { al = &Alias{Values: kv.Value} al.SetId(origKey) if err == nil { cache.Set(key, al.Values, cCommit, transactionID) } } else { cache.Set(key, nil, cCommit, transactionID) return nil, utils.ErrNotFound } return }
func (rs *RedisStorage) GetReverseAlias(reverseID string, skipCache bool, transactionID string) (ids []string, err error) { key := utils.REVERSE_ALIASES_PREFIX + reverseID if !skipCache { if x, ok := cache.Get(key); ok { if x == nil { return nil, utils.ErrNotFound } return x.([]string), nil } } if ids, err = rs.Cmd("SMEMBERS", key).List(); err != nil { if err.Error() == "wrong type" { // did not find the destination cache.Set(key, nil, cacheCommit(transactionID), transactionID) err = utils.ErrNotFound } return } if len(ids) == 0 { cache.Set(key, nil, cacheCommit(transactionID), transactionID) err = utils.ErrNotFound return } cache.Set(key, ids, cacheCommit(transactionID), transactionID) return }
func (rs *RedisStorage) GetAlias(key string, skipCache bool, transactionID string) (al *Alias, err error) { cacheKey := utils.ALIASES_PREFIX + key cCommit := cacheCommit(transactionID) if !skipCache { if x, ok := cache.Get(cacheKey); ok { if x == nil { return nil, utils.ErrNotFound } al = x.(*Alias) return } } var values []byte if values, err = rs.Cmd("GET", cacheKey).Bytes(); err != nil { if err.Error() == "wrong type" { // did not find the destination cache.Set(key, nil, cCommit, transactionID) err = utils.ErrNotFound } return } al = &Alias{Values: make(AliasValues, 0)} al.SetId(key) if err = rs.ms.Unmarshal(values, &al.Values); err != nil { return } cache.Set(cacheKey, al, cCommit, transactionID) return }
func (rs *RedisStorage) GetActions(key string, skipCache bool, transactionID string) (as Actions, err error) { key = utils.ACTION_PREFIX + key if !skipCache { if x, err := cache.GetCloned(key); err != nil { if err.Error() != utils.ItemNotFound { return nil, err } } else if x == nil { return nil, utils.ErrNotFound } else { return x.(Actions), nil } } var values []byte if values, err = rs.Cmd("GET", key).Bytes(); err != nil { if err.Error() == "wrong type" { // did not find the destination cache.Set(key, nil, cacheCommit(transactionID), transactionID) err = utils.ErrNotFound } return } if err = rs.ms.Unmarshal(values, &as); err != nil { return } cache.Set(key, as, cacheCommit(transactionID), transactionID) return }
func (ms *MongoStorage) GetReverseAlias(reverseID string, skipCache bool, transactionID string) (ids []string, err error) { if !skipCache { if x, ok := cache.Get(utils.REVERSE_ALIASES_PREFIX + reverseID); ok { if x != nil { return x.([]string), nil } return nil, utils.ErrNotFound } } var result struct { Key string Value []string } session, col := ms.conn(colRls) defer session.Close() if err = col.Find(bson.M{"key": reverseID}).One(&result); err == nil { ids = result.Value cache.Set(utils.REVERSE_ALIASES_PREFIX+reverseID, ids, cacheCommit(transactionID), transactionID) } else { cache.Set(utils.REVERSE_ALIASES_PREFIX+reverseID, nil, cacheCommit(transactionID), transactionID) return nil, utils.ErrNotFound } return }
func (ms *MongoStorage) GetLCR(key string, skipCache bool, transactionID string) (lcr *LCR, err error) { if !skipCache { if x, ok := cache.Get(utils.LCR_PREFIX + key); ok { if x != nil { return x.(*LCR), nil } return nil, utils.ErrNotFound } } var result struct { Key string Value *LCR } session, col := ms.conn(colLcr) defer session.Close() cCommit := cacheCommit(transactionID) if err = col.Find(bson.M{"key": key}).One(&result); err == nil { lcr = result.Value } else { cache.Set(utils.LCR_PREFIX+key, nil, cCommit, transactionID) return nil, utils.ErrNotFound } cache.Set(utils.LCR_PREFIX+key, lcr, cCommit, transactionID) return }
func (ms *MapStorage) GetAlias(key string, skipCache bool, transactionID string) (al *Alias, err error) { ms.mu.RLock() defer ms.mu.RUnlock() origKey := key key = utils.ALIASES_PREFIX + key if !skipCache { if x, ok := cache.Get(key); ok { if x != nil { al = &Alias{Values: x.(AliasValues)} al.SetId(origKey) return al, nil } return nil, utils.ErrNotFound } } cCommit := cacheCommit(transactionID) if values, ok := ms.dict[key]; ok { al = &Alias{Values: make(AliasValues, 0)} al.SetId(key[len(utils.ALIASES_PREFIX):]) err = ms.ms.Unmarshal(values, &al.Values) if err == nil { cache.Set(key, al.Values, cCommit, transactionID) } } else { cache.Set(key, nil, cCommit, transactionID) return nil, utils.ErrNotFound } return al, nil }
func (ms *MongoStorage) MatchReqFilterIndex(dbKey, fieldValKey string) (itemIDs utils.StringMap, err error) { fldValSplt := strings.Split(fieldValKey, utils.CONCATENATED_KEY_SEP) if len(fldValSplt) != 2 { return nil, fmt.Errorf("malformed key in query: %s", fldValSplt) } if x, ok := cache.Get(dbKey + fieldValKey); ok { // Attempt to find in cache first if x != nil { return x.(utils.StringMap), nil } return nil, utils.ErrNotFound } session, col := ms.conn(colRFI) defer session.Close() var result struct { Key string Value map[string]map[string]utils.StringMap } fldKey := fmt.Sprintf("value.%s.%s", fldValSplt[0], fldValSplt[1]) if err = col.Find( bson.M{"key": dbKey, fldKey: bson.M{"$exists": true}}).Select( bson.M{fldKey: true}).One(&result); err != nil { if err == mgo.ErrNotFound { err = utils.ErrNotFound cache.Set(dbKey+fieldValKey, nil, true, utils.NonTransactional) } return nil, err } itemIDs = result.Value[fldValSplt[0]][fldValSplt[1]] cache.Set(dbKey+fieldValKey, itemIDs, true, utils.NonTransactional) return }
func (ms *MongoStorage) GetDerivedChargers(key string, skipCache bool, transactionID string) (dcs *utils.DerivedChargers, err error) { if !skipCache { if x, ok := cache.Get(utils.DERIVEDCHARGERS_PREFIX + key); ok { if x != nil { return x.(*utils.DerivedChargers), nil } return nil, utils.ErrNotFound } } var kv struct { Key string Value *utils.DerivedChargers } session, col := ms.conn(colDcs) defer session.Close() err = col.Find(bson.M{"key": key}).One(&kv) cCommit := cacheCommit(transactionID) if err == nil { dcs = kv.Value } else { cache.Set(utils.DERIVEDCHARGERS_PREFIX+key, nil, cCommit, transactionID) return nil, utils.ErrNotFound } cache.Set(utils.DERIVEDCHARGERS_PREFIX+key, dcs, cCommit, transactionID) return }
func (rs *RedisStorage) GetDestination(key string, skipCache bool, transactionID string) (dest *Destination, err error) { key = utils.DESTINATION_PREFIX + key if !skipCache { if x, ok := cache.Get(key); ok { if x != nil { return x.(*Destination), nil } return nil, utils.ErrNotFound } } var values []byte if values, err = rs.Cmd("GET", key).Bytes(); len(values) > 0 && err == nil { b := bytes.NewBuffer(values) r, err := zlib.NewReader(b) if err != nil { return nil, err } out, err := ioutil.ReadAll(r) if err != nil { return nil, err } r.Close() dest = new(Destination) err = rs.ms.Unmarshal(out, dest) if err != nil { cache.Set(key, dest, cacheCommit(transactionID), transactionID) } } else { cache.Set(key, nil, cacheCommit(transactionID), transactionID) return nil, err } return }
func (rs *RedisStorage) GetResourceLimit(id string, skipCache bool, transactionID string) (rl *ResourceLimit, err error) { key := utils.ResourceLimitsPrefix + id if !skipCache { if x, ok := cache.Get(key); ok { if x == nil { return nil, utils.ErrNotFound } return x.(*ResourceLimit), nil } } var values []byte if values, err = rs.Cmd("GET", key).Bytes(); err != nil { if err.Error() == "wrong type" { // did not find the destination cache.Set(key, nil, cacheCommit(transactionID), transactionID) err = utils.ErrNotFound } return } if err = rs.ms.Unmarshal(values, &rl); err != nil { return } for _, fltr := range rl.Filters { if err = fltr.CompileValues(); err != nil { return } } cache.Set(key, rl, cacheCommit(transactionID), transactionID) return }
func (ms *MapStorage) MatchReqFilterIndex(dbKey, fieldValKey string) (itemIDs utils.StringMap, err error) { ms.mu.RLock() defer ms.mu.RUnlock() if x, ok := cache.Get(dbKey + fieldValKey); ok { // Attempt to find in cache first if x != nil { return x.(utils.StringMap), nil } return nil, utils.ErrNotFound } // Not found in cache, check in DB values, ok := ms.dict[dbKey] if !ok { cache.Set(dbKey+fieldValKey, nil, true, utils.NonTransactional) return nil, utils.ErrNotFound } var indexes map[string]map[string]utils.StringMap if err = ms.ms.Unmarshal(values, &indexes); err != nil { return nil, err } keySplt := strings.Split(fieldValKey, ":") if _, hasIt := indexes[keySplt[0]]; hasIt { itemIDs = indexes[keySplt[0]][keySplt[1]] } cache.Set(dbKey+fieldValKey, itemIDs, true, utils.NonTransactional) return }
func (ms *MapStorage) GetRatingPlan(key string, skipCache bool, transactionID string) (rp *RatingPlan, err error) { ms.mu.RLock() defer ms.mu.RUnlock() key = utils.RATING_PLAN_PREFIX + key if !skipCache { if x, ok := cache.Get(key); ok { if x != nil { return x.(*RatingPlan), nil } return nil, utils.ErrNotFound } } cCommit := cacheCommit(transactionID) if values, ok := ms.dict[key]; ok { b := bytes.NewBuffer(values) r, err := zlib.NewReader(b) if err != nil { return nil, err } out, err := ioutil.ReadAll(r) if err != nil { return nil, err } r.Close() rp = new(RatingPlan) err = ms.ms.Unmarshal(out, rp) } else { cache.Set(key, nil, cCommit, transactionID) return nil, utils.ErrNotFound } cache.Set(key, rp, cCommit, transactionID) return }
// GetDestination retrieves a destination with id from tp_db func (rs *RedisStorage) GetDestination(key string, skipCache bool, transactionID string) (dest *Destination, err error) { key = utils.DESTINATION_PREFIX + key if !skipCache { if x, ok := cache.Get(key); ok { if x == nil { return nil, utils.ErrNotFound } return x.(*Destination), nil } } var values []byte if values, err = rs.Cmd("GET", key).Bytes(); err != nil { if err.Error() == "wrong type" { // did not find the destination cache.Set(key, nil, cacheCommit(transactionID), transactionID) err = utils.ErrNotFound } return } b := bytes.NewBuffer(values) r, err := zlib.NewReader(b) if err != nil { return nil, err } out, err := ioutil.ReadAll(r) if err != nil { return nil, err } r.Close() err = rs.ms.Unmarshal(out, &dest) if err != nil { return nil, err } cache.Set(key, dest, cacheCommit(transactionID), transactionID) return }
func (ms *MapStorage) GetResourceLimit(id string, skipCache bool, transactionID string) (rl *ResourceLimit, err error) { ms.mu.RLock() defer ms.mu.RUnlock() key := utils.ResourceLimitsPrefix + id if !skipCache { if x, ok := cache.Get(key); ok { if x != nil { return x.(*ResourceLimit), nil } return nil, utils.ErrNotFound } } values, ok := ms.dict[key] if !ok { cache.Set(key, nil, cacheCommit(transactionID), transactionID) return nil, utils.ErrNotFound } err = ms.ms.Unmarshal(values, &rl) if err != nil { return nil, err } for _, fltr := range rl.Filters { if err := fltr.CompileValues(); err != nil { return nil, err } } cache.Set(key, rl, cacheCommit(transactionID), transactionID) return }
func (rs *RedisStorage) GetAlias(key string, skipCache bool, transactionID string) (al *Alias, err error) { origKey := key key = utils.ALIASES_PREFIX + key if !skipCache { if x, ok := cache.Get(key); ok { if x != nil { al = &Alias{Values: x.(AliasValues)} al.SetId(origKey) return al, nil } return nil, utils.ErrNotFound } } var values []byte if values, err = rs.Cmd("GET", key).Bytes(); err == nil { al = &Alias{Values: make(AliasValues, 0)} al.SetId(origKey) err = rs.ms.Unmarshal(values, &al.Values) } else { cache.Set(key, nil, cacheCommit(transactionID), transactionID) return nil, utils.ErrNotFound } cache.Set(key, al.Values, cacheCommit(transactionID), transactionID) return }
func (ms *MapStorage) GetActions(key string, skipCache bool, transactionID string) (as Actions, err error) { ms.mu.RLock() defer ms.mu.RUnlock() cCommit := cacheCommit(transactionID) key = utils.ACTION_PREFIX + key if !skipCache { if x, err := cache.GetCloned(key); err != nil { if err.Error() != utils.ItemNotFound { return nil, err } } else if x == nil { return nil, utils.ErrNotFound } else { return x.(Actions), nil } } if values, ok := ms.dict[key]; ok { err = ms.ms.Unmarshal(values, &as) } else { cache.Set(key, nil, cCommit, transactionID) return nil, utils.ErrNotFound } cache.Set(key, as, cCommit, transactionID) return }
func (ms *MapStorage) GetDestination(key string, skipCache bool, transactionID string) (dest *Destination, err error) { ms.mu.RLock() defer ms.mu.RUnlock() cCommit := cacheCommit(transactionID) key = utils.DESTINATION_PREFIX + key if !skipCache { if x, ok := cache.Get(key); ok { if x != nil { return x.(*Destination), nil } return nil, utils.ErrNotFound } } if values, ok := ms.dict[key]; ok { b := bytes.NewBuffer(values) r, err := zlib.NewReader(b) if err != nil { return nil, err } out, err := ioutil.ReadAll(r) if err != nil { return nil, err } r.Close() dest = new(Destination) err = ms.ms.Unmarshal(out, dest) if err != nil { cache.Set(key, dest, cCommit, transactionID) } } else { cache.Set(key, nil, cCommit, transactionID) return nil, utils.ErrNotFound } return }
// Limit will only retrieve the last n items out of history, newest first func (ms *MongoStorage) GetLoadHistory(limit int, skipCache bool, transactionID string) (loadInsts []*utils.LoadInstance, err error) { if limit == 0 { return nil, nil } if !skipCache { if x, ok := cache.Get(utils.LOADINST_KEY); ok { if x != nil { items := x.([]*utils.LoadInstance) if len(items) < limit || limit == -1 { return items, nil } return items[:limit], nil } return nil, utils.ErrNotFound } } var kv struct { Key string Value []*utils.LoadInstance } session, col := ms.conn(colLht) defer session.Close() err = col.Find(bson.M{"key": utils.LOADINST_KEY}).One(&kv) cCommit := cacheCommit(transactionID) if err == nil { loadInsts = kv.Value cache.RemKey(utils.LOADINST_KEY, cCommit, transactionID) cache.Set(utils.LOADINST_KEY, loadInsts, cCommit, transactionID) } if len(loadInsts) < limit || limit == -1 { return loadInsts, nil } return loadInsts[:limit], nil }
func (rs *RedisStorage) GetActionPlan(key string, skipCache bool, transactionID string) (ats *ActionPlan, err error) { key = utils.ACTION_PLAN_PREFIX + key if !skipCache { if x, ok := cache.Get(key); ok { if x != nil { return x.(*ActionPlan), nil } return nil, utils.ErrNotFound } } var values []byte if values, err = rs.Cmd("GET", key).Bytes(); err == nil { b := bytes.NewBuffer(values) r, err := zlib.NewReader(b) if err != nil { return nil, err } out, err := ioutil.ReadAll(r) if err != nil { return nil, err } r.Close() ats = &ActionPlan{} err = rs.ms.Unmarshal(out, &ats) } cache.Set(key, ats, cacheCommit(transactionID), transactionID) return }
func (ms *MongoStorage) GetActionPlan(key string, skipCache bool, transactionID string) (ats *ActionPlan, err error) { if !skipCache { if x, ok := cache.Get(utils.ACTION_PLAN_PREFIX + key); ok { if x != nil { return x.(*ActionPlan), nil } return nil, utils.ErrNotFound } } var kv struct { Key string Value []byte } session, col := ms.conn(colApl) defer session.Close() err = col.Find(bson.M{"key": key}).One(&kv) if err == nil { b := bytes.NewBuffer(kv.Value) r, err := zlib.NewReader(b) if err != nil { return nil, err } out, err := ioutil.ReadAll(r) if err != nil { return nil, err } r.Close() err = ms.ms.Unmarshal(out, &ats) if err != nil { return nil, err } } cache.Set(utils.ACTION_PLAN_PREFIX+key, ats, cacheCommit(transactionID), transactionID) return }
func (rs *RedisStorage) GetReverseAlias(reverseID string, skipCache bool, transactionID string) (ids []string, err error) { key := utils.REVERSE_ALIASES_PREFIX + reverseID if !skipCache { if x, ok := cache.Get(key); ok { if x != nil { return x.([]string), nil } return nil, utils.ErrNotFound } } if ids, err = rs.Cmd("SMEMBERS", key).List(); len(ids) == 0 || err != nil { cache.Set(key, nil, cacheCommit(transactionID), transactionID) return nil, utils.ErrNotFound } cache.Set(key, ids, cacheCommit(transactionID), transactionID) return }
// Limit will only retrieve the last n items out of history, newest first func (rs *RedisStorage) GetLoadHistory(limit int, skipCache bool, transactionID string) ([]*utils.LoadInstance, error) { if limit == 0 { return nil, nil } if !skipCache { if x, ok := cache.Get(utils.LOADINST_KEY); ok { if x != nil { items := x.([]*utils.LoadInstance) if len(items) < limit || limit == -1 { return items, nil } return items[:limit], nil } return nil, utils.ErrNotFound } } if limit != -1 { limit -= -1 // Decrease limit to match redis approach on lrange } marshaleds, err := rs.Cmd("LRANGE", utils.LOADINST_KEY, 0, limit).ListBytes() cCommit := cacheCommit(transactionID) if err != nil { cache.Set(utils.LOADINST_KEY, nil, cCommit, transactionID) return nil, err } loadInsts := make([]*utils.LoadInstance, len(marshaleds)) for idx, marshaled := range marshaleds { var lInst utils.LoadInstance err = rs.ms.Unmarshal(marshaled, &lInst) if err != nil { return nil, err } loadInsts[idx] = &lInst } cache.RemKey(utils.LOADINST_KEY, cCommit, transactionID) cache.Set(utils.LOADINST_KEY, loadInsts, cCommit, transactionID) if len(loadInsts) < limit || limit == -1 { return loadInsts, nil } return loadInsts[:limit], nil }
func (rs *RedisStorage) GetDerivedChargers(key string, skipCache bool, transactionID string) (dcs *utils.DerivedChargers, err error) { key = utils.DERIVEDCHARGERS_PREFIX + key if !skipCache { if x, ok := cache.Get(key); ok { if x != nil { return x.(*utils.DerivedChargers), nil } return nil, utils.ErrNotFound } } var values []byte if values, err = rs.Cmd("GET", key).Bytes(); err == nil { err = rs.ms.Unmarshal(values, &dcs) } else { cache.Set(key, nil, cacheCommit(transactionID), transactionID) return nil, utils.ErrNotFound } cache.Set(key, dcs, cacheCommit(transactionID), transactionID) return }
func (ms *MongoStorage) GetRatingProfile(key string, skipCache bool, transactionID string) (rp *RatingProfile, err error) { if !skipCache { if x, ok := cache.Get(utils.RATING_PROFILE_PREFIX + key); ok { if x != nil { return x.(*RatingProfile), nil } return nil, utils.ErrNotFound } } rp = new(RatingProfile) session, col := ms.conn(colRpf) defer session.Close() err = col.Find(bson.M{"id": key}).One(rp) if err == nil { cache.Set(utils.RATING_PROFILE_PREFIX+key, rp, cacheCommit(transactionID), transactionID) } else { cache.Set(utils.RATING_PROFILE_PREFIX+key, nil, cacheCommit(transactionID), transactionID) } return }
func (ms *MongoStorage) GetSharedGroup(key string, skipCache bool, transactionID string) (sg *SharedGroup, err error) { if !skipCache { if x, ok := cache.Get(utils.SHARED_GROUP_PREFIX + key); ok { if x != nil { return x.(*SharedGroup), nil } return nil, utils.ErrNotFound } } session, col := ms.conn(colShg) defer session.Close() sg = &SharedGroup{} err = col.Find(bson.M{"id": key}).One(sg) if err == nil { cache.Set(utils.SHARED_GROUP_PREFIX+key, sg, cacheCommit(transactionID), transactionID) } else { cache.Set(utils.SHARED_GROUP_PREFIX+key, nil, cacheCommit(transactionID), transactionID) } return }
func (ms *MapStorage) GetReverseDestination(prefix string, skipCache bool, transactionID string) (ids []string, err error) { ms.mu.Lock() defer ms.mu.Unlock() prefix = utils.REVERSE_DESTINATION_PREFIX + prefix if !skipCache { if x, ok := cache.Get(prefix); ok { if x != nil { return x.([]string), nil } return nil, utils.ErrNotFound } } if idMap, ok := ms.dict.smembers(prefix, ms.ms); ok { ids = idMap.Slice() } else { cache.Set(prefix, nil, cacheCommit(transactionID), transactionID) return nil, utils.ErrNotFound } cache.Set(prefix, ids, cacheCommit(transactionID), transactionID) return }
func (ms *MapStorage) GetActionPlan(key string, skipCache bool, transactionID string) (ats *ActionPlan, err error) { ms.mu.RLock() defer ms.mu.RUnlock() key = utils.ACTION_PLAN_PREFIX + key if !skipCache { if x, ok := cache.Get(key); ok { if x != nil { return x.(*ActionPlan), nil } return nil, utils.ErrNotFound } } if values, ok := ms.dict[key]; ok { err = ms.ms.Unmarshal(values, &ats) } else { cache.Set(key, nil, cacheCommit(transactionID), transactionID) return nil, utils.ErrNotFound } cache.Set(key, ats, cacheCommit(transactionID), transactionID) return }
func (rs *RedisStorage) GetLCR(key string, skipCache bool, transactionID string) (lcr *LCR, err error) { key = utils.LCR_PREFIX + key if !skipCache { if x, ok := cache.Get(key); ok { if x != nil { return x.(*LCR), nil } return nil, utils.ErrNotFound } } var values []byte if values, err = rs.Cmd("GET", key).Bytes(); err == nil { err = rs.ms.Unmarshal(values, &lcr) } else { cache.Set(key, nil, cacheCommit(transactionID), transactionID) return nil, utils.ErrNotFound } cache.Set(key, lcr, cacheCommit(transactionID), transactionID) return }
func (ms *MapStorage) GetLCR(key string, skipCache bool, transactionID string) (lcr *LCR, err error) { ms.mu.RLock() defer ms.mu.RUnlock() key = utils.LCR_PREFIX + key if !skipCache { if x, ok := cache.Get(key); ok { if x != nil { return x.(*LCR), nil } return nil, utils.ErrNotFound } } cCommit := cacheCommit(transactionID) if values, ok := ms.dict[key]; ok { err = ms.ms.Unmarshal(values, &lcr) } else { cache.Set(key, nil, cCommit, transactionID) return nil, utils.ErrNotFound } cache.Set(key, lcr, cCommit, transactionID) return }