started reverse recording

This commit is contained in:
Radu Ioan Fericean
2016-07-27 12:48:28 +03:00
parent dbceab4157
commit 2120ce9c86
9 changed files with 262 additions and 348 deletions

View File

@@ -54,7 +54,7 @@ func (ub *Account) getCreditForPrefix(cd *CallDescriptor) (duration time.Duratio
for _, cb := range creditBalances {
if len(cb.SharedGroups) > 0 {
for sg := range cb.SharedGroups {
if sharedGroup, _ := ratingStorage.GetSharedGroup(sg, false); sharedGroup != nil {
if sharedGroup, _ := ratingStorage.GetSharedGroup(sg); sharedGroup != nil {
sgb := sharedGroup.GetBalances(cd.Destination, cd.Category, cd.Direction, utils.MONETARY, ub)
sgb = sharedGroup.SortBalancesByStrategy(cb, sgb)
extendedCreditBalances = append(extendedCreditBalances, sgb...)
@@ -68,7 +68,7 @@ func (ub *Account) getCreditForPrefix(cd *CallDescriptor) (duration time.Duratio
for _, mb := range unitBalances {
if len(mb.SharedGroups) > 0 {
for sg := range mb.SharedGroups {
if sharedGroup, _ := ratingStorage.GetSharedGroup(sg, false); sharedGroup != nil {
if sharedGroup, _ := ratingStorage.GetSharedGroup(sg); sharedGroup != nil {
sgb := sharedGroup.GetBalances(cd.Destination, cd.Category, cd.Direction, cd.TOR, ub)
sgb = sharedGroup.SortBalancesByStrategy(mb, sgb)
extendedMinuteBalances = append(extendedMinuteBalances, sgb...)
@@ -136,7 +136,7 @@ func (acc *Account) setBalanceAction(a *Action) error {
_, err := Guardian.Guard(func() (interface{}, error) {
for sgID := range balance.SharedGroups {
// add shared group member
sg, err := ratingStorage.GetSharedGroup(sgID, false)
sg, err := ratingStorage.GetSharedGroup(sgID)
if err != nil || sg == nil {
//than is problem
utils.Logger.Warning(fmt.Sprintf("Could not get shared group: %v", sgID))
@@ -224,7 +224,7 @@ func (ub *Account) debitBalanceAction(a *Action, reset bool) error {
_, err := Guardian.Guard(func() (interface{}, error) {
for sgId := range bClone.SharedGroups {
// add shared group member
sg, err := ratingStorage.GetSharedGroup(sgId, false)
sg, err := ratingStorage.GetSharedGroup(sgId)
if err != nil || sg == nil {
//than is problem
utils.Logger.Warning(fmt.Sprintf("Could not get shared group: %v", sgId))
@@ -355,8 +355,8 @@ func (account *Account) getAlldBalancesForPrefix(destination, category, directio
for _, b := range balances {
if len(b.SharedGroups) > 0 {
for sgId := range b.SharedGroups {
sharedGroup, err := ratingStorage.GetSharedGroup(sgId, false)
if err != nil {
sharedGroup, err := ratingStorage.GetSharedGroup(sgId)
if err != nil || sharedGroup == nil {
utils.Logger.Warning(fmt.Sprintf("Could not get shared group: %v", sgId))
continue
}
@@ -766,7 +766,7 @@ func (account *Account) GetUniqueSharedGroupMembers(cd *CallDescriptor) (utils.S
}
memberIds := make(utils.StringMap)
for _, sgID := range sharedGroupIds {
sharedGroup, err := ratingStorage.GetSharedGroup(sgID, false)
sharedGroup, err := ratingStorage.GetSharedGroup(sgID)
if err != nil {
utils.Logger.Warning(fmt.Sprintf("Could not get shared group: %v", sgID))
return nil, err

View File

@@ -268,7 +268,7 @@ func (at *ActionTiming) GetActionPlanID() string {
func (at *ActionTiming) getActions() (as []*Action, err error) {
if at.actions == nil {
at.actions, err = ratingStorage.GetActions(at.ActionsID, false)
at.actions, err = ratingStorage.GetActions(at.ActionsID)
}
at.actions.Sort()
return at.actions, err

View File

@@ -57,12 +57,12 @@ func (at *ActionTrigger) Execute(ub *Account, sq *StatsQueueTriggered) (err erro
}
// does NOT need to Lock() because it is triggered from a method that took the Lock
var aac Actions
aac, err = ratingStorage.GetActions(at.ActionsID, false)
aac.Sort()
aac, err = ratingStorage.GetActions(at.ActionsID)
if err != nil {
utils.Logger.Err(fmt.Sprintf("Failed to get actions: %v", err))
return
}
aac.Sort()
at.Executed = true
transactionFailed := false
removeAccountActionFound := false

View File

@@ -188,7 +188,7 @@ func (am *AliasHandler) SetAlias(attr *AttrAddAlias, reply *string) error {
var oldAlias *Alias
if !attr.Overwrite { // get previous value
oldAlias, _ = am.accountingDb.GetAlias(attr.Alias.GetId(), false)
oldAlias, _ = am.accountingDb.GetAlias(attr.Alias.GetId())
}
if attr.Overwrite || oldAlias == nil {

View File

@@ -6,9 +6,7 @@ import "sync"
const (
PREFIX_LEN = 4
KIND_ADD = "ADD"
KIND_ADP = "ADP"
KIND_REM = "REM"
KIND_POP = "POP"
KIND_PRF = "PRF"
DOUBLE_CACHE = true
)
@@ -70,10 +68,6 @@ func CacheCommitTransaction() {
CacheRemPrefixKey(item.key)
case KIND_ADD:
CacheSet(item.key, item.value)
case KIND_ADP:
CachePush(item.key, item.value.([]string)...)
case KIND_POP:
CachePop(item.key, item.value.([]string)...)
}
}
mux.Unlock()

View File

@@ -16,8 +16,6 @@ import (
type cacheStore interface {
Put(string, interface{})
Get(string) (interface{}, bool)
Append(string, ...string)
Pop(string, ...string)
Delete(string)
DeletePrefix(string)
CountEntriesForPrefix(string) int
@@ -56,35 +54,6 @@ func (cs cacheDoubleStore) Get(key string) (interface{}, bool) {
return nil, false
}
func (cs cacheDoubleStore) Append(key string, values ...string) {
var elements map[string]struct{} // using map for faster check if element is present
if v, ok := cs.Get(key); ok {
elements = v.(map[string]struct{})
} else {
elements = make(map[string]struct{})
}
for _, value := range values {
elements[value] = struct{}{}
}
cache.Put(key, elements)
}
func (cs cacheDoubleStore) Pop(key string, values ...string) {
if v, ok := cs.Get(key); ok {
elements, ok := v.(map[string]struct{})
if ok {
for _, value := range values {
delete(elements, value)
}
if len(elements) > 0 {
cache.Put(key, elements)
} else {
cache.Delete(key)
}
}
}
}
func (cs cacheDoubleStore) Delete(key string) {
prefix, key := key[:PREFIX_LEN], key[PREFIX_LEN:]
if keyMap, ok := cs[prefix]; ok {
@@ -203,35 +172,6 @@ func (cs cacheLRUTTL) Get(key string) (interface{}, bool) {
return nil, false
}
func (cs cacheLRUTTL) Append(key string, values ...string) {
var elements map[string]struct{} // using map for faster check if element is present
if v, ok := cs.Get(key); ok {
elements = v.(map[string]struct{})
} else {
elements = make(map[string]struct{})
}
for _, value := range values {
elements[value] = struct{}{}
}
cache.Put(key, elements)
}
func (cs cacheLRUTTL) Pop(key string, values ...string) {
if v, ok := cs.Get(key); ok {
elements, ok := v.(map[string]struct{})
if ok {
for _, value := range values {
delete(elements, value)
}
if len(elements) > 0 {
cache.Put(key, elements)
} else {
cache.Delete(key)
}
}
}
}
func (cs cacheLRUTTL) Delete(key string) {
prefix, key := key[:PREFIX_LEN], key[PREFIX_LEN:]
if keyMap, ok := cs[prefix]; ok {
@@ -283,19 +223,6 @@ func (cs cacheSimpleStore) Put(key string, value interface{}) {
cs.cache[key] = value
}
func (cs cacheSimpleStore) Append(key string, values ...string) {
var elements map[string]struct{}
if v, ok := cs.Get(key); ok {
elements = v.(map[string]struct{})
} else {
elements = make(map[string]struct{})
}
for _, value := range values {
elements[value] = struct{}{}
}
cache.Put(key, elements)
}
func (cs cacheSimpleStore) Get(key string) (interface{}, bool) {
if value, exists := cs.cache[key]; exists {
return value, true
@@ -303,22 +230,6 @@ func (cs cacheSimpleStore) Get(key string) (interface{}, bool) {
return nil, false
}
func (cs cacheSimpleStore) Pop(key string, values ...string) {
if v, ok := cs.Get(key); ok {
elements, ok := v.(map[string]struct{})
if ok {
for _, value := range values {
delete(elements, value)
}
if len(elements) > 0 {
cache.Put(key, elements)
} else {
cache.Delete(key)
}
}
}
}
func (cs cacheSimpleStore) Delete(key string) {
if _, ok := cs.cache[key]; ok {
delete(cs.cache, key)

View File

@@ -290,28 +290,33 @@ func (rs *RedisStorage) SetDestination(dest *Destination, cache bool) (err error
return
}
func (rs *RedisStorage) GetDestinationIDs(prefix string) (ids []string, err error) {
prefix = utils.DESTINATION_PREFIX + prefix
var values []string
if values, err = rs.db.Cmd("SMEMBERS", prefix).List(); len(values) > 0 && err == nil {
CachePush(utils.DESTINATION_PREFIX+prefix, values...)
} else {
func (rs *RedisStorage) GetReverseDestination(prefix string) (ids []string, err error) {
prefix = utils.REVERSE_DESTINATION_PREFIX + prefix
if x, ok := CacheGet(prefix); ok {
if x != nil {
return x.([]string), nil
}
return nil, utils.ErrNotFound
}
var values []string
if values, err = rs.db.Cmd("SMEMBERS", prefix).List(); len(values) > 0 && err == nil {
} else {
return nil, utils.ErrNotFound
}
CacheSet(prefix, values)
return
}
func (rs *RedisStorage) SetDestinationIDs(dest *Destination) (err error) {
func (rs *RedisStorage) SetReverseDestination(dest *Destination, cache bool) (err error) {
for _, p := range dest.Prefixes {
err = rs.db.Cmd("SADD", utils.DESTINATION_PREFIX+p, dest.Id).Err
err = rs.db.Cmd("SADD", utils.REVERSE_DESTINATION_PREFIX+p, dest.Id).Err
if err != nil {
break
}
}
if err == nil && historyScribe != nil {
response := 0
go historyScribe.Call("HistoryV1.Record", dest.GetHistoryRecord(false), &response)
if cache && err == nil {
CacheSet(utils.REVERSE_DESTINATION_PREFIX+dest.Id, dest)
}
return
}

View File

@@ -1642,6 +1642,8 @@ func (tpr *TpReader) WriteToDatabase(flush, verbose bool) (err error) {
if err != nil {
return err
}
// write reverse destination
if verbose {
log.Print("\t", d.Id, " : ", d.Prefixes)
}

View File

@@ -39,236 +39,238 @@ var (
)
const (
VERSION = "0.9.1~rc8"
DIAMETER_FIRMWARE_REVISION = 918
REDIS_MAX_CONNS = 10
POSTGRES = "postgres"
MYSQL = "mysql"
MONGO = "mongo"
REDIS = "redis"
LOCALHOST = "127.0.0.1"
FSCDR_FILE_CSV = "freeswitch_file_csv"
FSCDR_HTTP_JSON = "freeswitch_http_json"
NOT_IMPLEMENTED = "not implemented"
PREPAID = "prepaid"
META_PREPAID = "*prepaid"
POSTPAID = "postpaid"
META_POSTPAID = "*postpaid"
PSEUDOPREPAID = "pseudoprepaid"
META_PSEUDOPREPAID = "*pseudoprepaid"
META_RATED = "*rated"
META_NONE = "*none"
META_NOW = "*now"
TBL_TP_TIMINGS = "tp_timings"
TBL_TP_DESTINATIONS = "tp_destinations"
TBL_TP_RATES = "tp_rates"
TBL_TP_DESTINATION_RATES = "tp_destination_rates"
TBL_TP_RATING_PLANS = "tp_rating_plans"
TBL_TP_RATE_PROFILES = "tp_rating_profiles"
TBL_TP_SHARED_GROUPS = "tp_shared_groups"
TBL_TP_CDR_STATS = "tp_cdr_stats"
TBL_TP_LCRS = "tp_lcr_rules"
TBL_TP_ACTIONS = "tp_actions"
TBL_TP_ACTION_PLANS = "tp_action_plans"
TBL_TP_ACTION_TRIGGERS = "tp_action_triggers"
TBL_TP_ACCOUNT_ACTIONS = "tp_account_actions"
TBL_TP_DERIVED_CHARGERS = "tp_derived_chargers"
TBL_TP_USERS = "tp_users"
TBL_TP_ALIASES = "tp_aliases"
TBLSMCosts = "sm_costs"
TBLTPResourceLimits = "tp_resource_limits"
TBL_CDRS = "cdrs"
TIMINGS_CSV = "Timings.csv"
DESTINATIONS_CSV = "Destinations.csv"
RATES_CSV = "Rates.csv"
DESTINATION_RATES_CSV = "DestinationRates.csv"
RATING_PLANS_CSV = "RatingPlans.csv"
RATING_PROFILES_CSV = "RatingProfiles.csv"
SHARED_GROUPS_CSV = "SharedGroups.csv"
LCRS_CSV = "LcrRules.csv"
ACTIONS_CSV = "Actions.csv"
ACTION_PLANS_CSV = "ActionPlans.csv"
ACTION_TRIGGERS_CSV = "ActionTriggers.csv"
ACCOUNT_ACTIONS_CSV = "AccountActions.csv"
DERIVED_CHARGERS_CSV = "DerivedChargers.csv"
CDR_STATS_CSV = "CdrStats.csv"
USERS_CSV = "Users.csv"
ALIASES_CSV = "Aliases.csv"
ROUNDING_UP = "*up"
ROUNDING_MIDDLE = "*middle"
ROUNDING_DOWN = "*down"
ANY = "*any"
UNLIMITED = "*unlimited"
ZERO = "*zero"
ASAP = "*asap"
USERS = "*users"
COMMENT_CHAR = '#'
CSV_SEP = ','
FALLBACK_SEP = ';'
INFIELD_SEP = ";"
FIELDS_SEP = ","
InInFieldSep = ":"
STATIC_HDRVAL_SEP = "::"
REGEXP_PREFIX = "~"
FILTER_VAL_START = "("
FILTER_VAL_END = ")"
JSON = "json"
GOB = "gob"
MSGPACK = "msgpack"
CSV_LOAD = "CSVLOAD"
CGRID = "CGRID"
TOR = "ToR"
ORDERID = "OrderID"
ACCID = "OriginID"
InitialOriginID = "InitialOriginID"
OriginIDPrefix = "OriginIDPrefix"
CDRSOURCE = "Source"
CDRHOST = "OriginHost"
REQTYPE = "RequestType"
DIRECTION = "Direction"
TENANT = "Tenant"
CATEGORY = "Category"
ACCOUNT = "Account"
SUBJECT = "Subject"
DESTINATION = "Destination"
SETUP_TIME = "SetupTime"
ANSWER_TIME = "AnswerTime"
USAGE = "Usage"
LastUsed = "LastUsed"
PDD = "PDD"
SUPPLIER = "Supplier"
MEDI_RUNID = "RunID"
COST = "Cost"
COST_DETAILS = "CostDetails"
RATED = "rated"
RATED_FLD = "Rated"
PartialField = "Partial"
DEFAULT_RUNID = "*default"
META_DEFAULT = "*default"
STATIC_VALUE_PREFIX = "^"
CSV = "csv"
FWV = "fwv"
DRYRUN = "dry_run"
META_COMBIMED = "*combimed"
MetaInternal = "*internal"
ZERO_RATING_SUBJECT_PREFIX = "*zero"
OK = "OK"
CDRE_FIXED_WIDTH = "fwv"
XML_PROFILE_PREFIX = "*xml:"
CDRE = "cdre"
CDRC = "cdrc"
MASK_CHAR = "*"
CONCATENATED_KEY_SEP = ":"
FORKED_CDR = "forked_cdr"
UNIT_TEST = "UNIT_TEST"
HDR_VAL_SEP = "/"
MONETARY = "*monetary"
SMS = "*sms"
MMS = "*mms"
GENERIC = "*generic"
DATA = "*data"
VOICE = "*voice"
MAX_COST_FREE = "*free"
MAX_COST_DISCONNECT = "*disconnect"
HOURS = "hours"
MINUTES = "minutes"
NANOSECONDS = "nanoseconds"
SECONDS = "seconds"
OUT = "*out"
IN = "*in"
META_OUT = "*out"
META_ANY = "*any"
CDR_IMPORT = "cdr_import"
CDR_EXPORT = "cdr_export"
ASR = "ASR"
ACD = "ACD"
FILTER_REGEXP_TPL = "$1$2$3$4$5"
TASKS_KEY = "tasks"
ACTION_PLAN_PREFIX = "apl_"
ACTION_TRIGGER_PREFIX = "atr_"
RATING_PLAN_PREFIX = "rpl_"
RATING_PROFILE_PREFIX = "rpf_"
ACTION_PREFIX = "act_"
SHARED_GROUP_PREFIX = "shg_"
ACCOUNT_PREFIX = "acc_"
GENERIC_PREFIX = "gen_"
DESTINATION_PREFIX = "dst_"
LCR_PREFIX = "lcr_"
DERIVEDCHARGERS_PREFIX = "dcs_"
CDR_STATS_QUEUE_PREFIX = "csq_"
PUBSUB_SUBSCRIBERS_PREFIX = "pss_"
USERS_PREFIX = "usr_"
ALIASES_PREFIX = "als_"
REVERSE_ALIASES_PREFIX = "rls_"
CDR_STATS_PREFIX = "cst_"
TEMP_DESTINATION_PREFIX = "tmp_"
LOG_CALL_COST_PREFIX = "cco_"
LOG_ACTION_TIMMING_PREFIX = "ltm_"
LOG_ACTION_TRIGGER_PREFIX = "ltr_"
VERSION_PREFIX = "ver_"
LOG_ERR = "ler_"
LOG_CDR = "cdr_"
LOG_MEDIATED_CDR = "mcd_"
LOADINST_KEY = "load_history"
SESSION_MANAGER_SOURCE = "SMR"
MEDIATOR_SOURCE = "MED"
CDRS_SOURCE = "CDRS"
SCHED_SOURCE = "SCH"
RATER_SOURCE = "RAT"
CREATE_CDRS_TABLES_SQL = "create_cdrs_tables.sql"
CREATE_TARIFFPLAN_TABLES_SQL = "create_tariffplan_tables.sql"
TEST_SQL = "TEST_SQL"
DESTINATIONS_LOAD_THRESHOLD = 0.1
META_CONSTANT = "*constant"
META_FILLER = "*filler"
META_HANDLER = "*handler"
META_HTTP_POST = "*http_post"
META_HTTP_JSON = "*http_json"
META_HTTP_JSONRPC = "*http_jsonrpc"
NANO_MULTIPLIER = 1000000000
CGR_AUTHORIZE = "CGR_AUTHORIZE"
CONFIG_DIR = "/etc/cgrates/"
CGR_ACCOUNT = "cgr_account"
CGR_SUPPLIER = "cgr_supplier"
CGR_DESTINATION = "cgr_destination"
CGR_SUBJECT = "cgr_subject"
CGR_CATEGORY = "cgr_category"
CGR_REQTYPE = "cgr_reqtype"
CGR_TENANT = "cgr_tenant"
CGR_TOR = "cgr_tor"
CGR_ACCID = "cgr_accid"
CGR_HOST = "cgr_host"
CGR_PDD = "cgr_pdd"
DISCONNECT_CAUSE = "DisconnectCause"
CGR_DISCONNECT_CAUSE = "cgr_disconnectcause"
CGR_COMPUTELCR = "cgr_computelcr"
CGR_SUPPLIERS = "cgr_suppliers"
CGRFlags = "cgr_flags"
KAM_FLATSTORE = "kamailio_flatstore"
OSIPS_FLATSTORE = "opensips_flatstore"
MAX_DEBIT_CACHE_PREFIX = "MAX_DEBIT_"
REFUND_INCR_CACHE_PREFIX = "REFUND_INCR_"
REFUND_ROUND_CACHE_PREFIX = "REFUND_ROUND_"
GET_SESS_RUNS_CACHE_PREFIX = "GET_SESS_RUNS_"
GET_DERIV_MAX_SESS_TIME = "GET_DERIV_MAX_SESS_TIME_"
LOG_CALL_COST_CACHE_PREFIX = "LOG_CALL_COSTS_"
LCRCachePrefix = "LCR_"
ALIAS_CONTEXT_RATING = "*rating"
NOT_AVAILABLE = "N/A"
CALL = "call"
EXTRA_FIELDS = "ExtraFields"
META_SURETAX = "*sure_tax"
SURETAX = "suretax"
DIAMETER_AGENT = "diameter_agent"
COUNTER_EVENT = "*event"
COUNTER_BALANCE = "*balance"
EVENT_NAME = "EventName"
COMPUTE_LCR = "ComputeLcr"
CGR_AUTHORIZATION = "CgrAuthorization"
CGR_SESSION_START = "CgrSessionStart"
CGR_SESSION_UPDATE = "CgrSessionUpdate"
CGR_SESSION_END = "CgrSessionEnd"
CGR_LCR_REQUEST = "CgrLcrRequest"
VERSION = "0.9.1~rc8"
DIAMETER_FIRMWARE_REVISION = 918
REDIS_MAX_CONNS = 10
POSTGRES = "postgres"
MYSQL = "mysql"
MONGO = "mongo"
REDIS = "redis"
LOCALHOST = "127.0.0.1"
FSCDR_FILE_CSV = "freeswitch_file_csv"
FSCDR_HTTP_JSON = "freeswitch_http_json"
NOT_IMPLEMENTED = "not implemented"
PREPAID = "prepaid"
META_PREPAID = "*prepaid"
POSTPAID = "postpaid"
META_POSTPAID = "*postpaid"
PSEUDOPREPAID = "pseudoprepaid"
META_PSEUDOPREPAID = "*pseudoprepaid"
META_RATED = "*rated"
META_NONE = "*none"
META_NOW = "*now"
TBL_TP_TIMINGS = "tp_timings"
TBL_TP_DESTINATIONS = "tp_destinations"
TBL_TP_RATES = "tp_rates"
TBL_TP_DESTINATION_RATES = "tp_destination_rates"
TBL_TP_RATING_PLANS = "tp_rating_plans"
TBL_TP_RATE_PROFILES = "tp_rating_profiles"
TBL_TP_SHARED_GROUPS = "tp_shared_groups"
TBL_TP_CDR_STATS = "tp_cdr_stats"
TBL_TP_LCRS = "tp_lcr_rules"
TBL_TP_ACTIONS = "tp_actions"
TBL_TP_ACTION_PLANS = "tp_action_plans"
TBL_TP_ACTION_TRIGGERS = "tp_action_triggers"
TBL_TP_ACCOUNT_ACTIONS = "tp_account_actions"
TBL_TP_DERIVED_CHARGERS = "tp_derived_chargers"
TBL_TP_USERS = "tp_users"
TBL_TP_ALIASES = "tp_aliases"
TBLSMCosts = "sm_costs"
TBLTPResourceLimits = "tp_resource_limits"
TBL_CDRS = "cdrs"
TIMINGS_CSV = "Timings.csv"
DESTINATIONS_CSV = "Destinations.csv"
RATES_CSV = "Rates.csv"
DESTINATION_RATES_CSV = "DestinationRates.csv"
RATING_PLANS_CSV = "RatingPlans.csv"
RATING_PROFILES_CSV = "RatingProfiles.csv"
SHARED_GROUPS_CSV = "SharedGroups.csv"
LCRS_CSV = "LcrRules.csv"
ACTIONS_CSV = "Actions.csv"
ACTION_PLANS_CSV = "ActionPlans.csv"
ACTION_TRIGGERS_CSV = "ActionTriggers.csv"
ACCOUNT_ACTIONS_CSV = "AccountActions.csv"
DERIVED_CHARGERS_CSV = "DerivedChargers.csv"
CDR_STATS_CSV = "CdrStats.csv"
USERS_CSV = "Users.csv"
ALIASES_CSV = "Aliases.csv"
ROUNDING_UP = "*up"
ROUNDING_MIDDLE = "*middle"
ROUNDING_DOWN = "*down"
ANY = "*any"
UNLIMITED = "*unlimited"
ZERO = "*zero"
ASAP = "*asap"
USERS = "*users"
COMMENT_CHAR = '#'
CSV_SEP = ','
FALLBACK_SEP = ';'
INFIELD_SEP = ";"
FIELDS_SEP = ","
InInFieldSep = ":"
STATIC_HDRVAL_SEP = "::"
REGEXP_PREFIX = "~"
FILTER_VAL_START = "("
FILTER_VAL_END = ")"
JSON = "json"
GOB = "gob"
MSGPACK = "msgpack"
CSV_LOAD = "CSVLOAD"
CGRID = "CGRID"
TOR = "ToR"
ORDERID = "OrderID"
ACCID = "OriginID"
InitialOriginID = "InitialOriginID"
OriginIDPrefix = "OriginIDPrefix"
CDRSOURCE = "Source"
CDRHOST = "OriginHost"
REQTYPE = "RequestType"
DIRECTION = "Direction"
TENANT = "Tenant"
CATEGORY = "Category"
ACCOUNT = "Account"
SUBJECT = "Subject"
DESTINATION = "Destination"
SETUP_TIME = "SetupTime"
ANSWER_TIME = "AnswerTime"
USAGE = "Usage"
LastUsed = "LastUsed"
PDD = "PDD"
SUPPLIER = "Supplier"
MEDI_RUNID = "RunID"
COST = "Cost"
COST_DETAILS = "CostDetails"
RATED = "rated"
RATED_FLD = "Rated"
PartialField = "Partial"
DEFAULT_RUNID = "*default"
META_DEFAULT = "*default"
STATIC_VALUE_PREFIX = "^"
CSV = "csv"
FWV = "fwv"
DRYRUN = "dry_run"
META_COMBIMED = "*combimed"
MetaInternal = "*internal"
ZERO_RATING_SUBJECT_PREFIX = "*zero"
OK = "OK"
CDRE_FIXED_WIDTH = "fwv"
XML_PROFILE_PREFIX = "*xml:"
CDRE = "cdre"
CDRC = "cdrc"
MASK_CHAR = "*"
CONCATENATED_KEY_SEP = ":"
FORKED_CDR = "forked_cdr"
UNIT_TEST = "UNIT_TEST"
HDR_VAL_SEP = "/"
MONETARY = "*monetary"
SMS = "*sms"
MMS = "*mms"
GENERIC = "*generic"
DATA = "*data"
VOICE = "*voice"
MAX_COST_FREE = "*free"
MAX_COST_DISCONNECT = "*disconnect"
HOURS = "hours"
MINUTES = "minutes"
NANOSECONDS = "nanoseconds"
SECONDS = "seconds"
OUT = "*out"
IN = "*in"
META_OUT = "*out"
META_ANY = "*any"
CDR_IMPORT = "cdr_import"
CDR_EXPORT = "cdr_export"
ASR = "ASR"
ACD = "ACD"
FILTER_REGEXP_TPL = "$1$2$3$4$5"
TASKS_KEY = "tasks"
ACTION_PLAN_PREFIX = "apl_"
ACTION_TRIGGER_PREFIX = "atr_"
REVERSE_ACTION_TRIGGER_PREFIX = "rtr_"
RATING_PLAN_PREFIX = "rpl_"
RATING_PROFILE_PREFIX = "rpf_"
ACTION_PREFIX = "act_"
SHARED_GROUP_PREFIX = "shg_"
ACCOUNT_PREFIX = "acc_"
GENERIC_PREFIX = "gen_"
DESTINATION_PREFIX = "dst_"
REVERSE_DESTINATION_PREFIX = "rdt_"
LCR_PREFIX = "lcr_"
DERIVEDCHARGERS_PREFIX = "dcs_"
CDR_STATS_QUEUE_PREFIX = "csq_"
PUBSUB_SUBSCRIBERS_PREFIX = "pss_"
USERS_PREFIX = "usr_"
ALIASES_PREFIX = "als_"
REVERSE_ALIASES_PREFIX = "rls_"
CDR_STATS_PREFIX = "cst_"
TEMP_DESTINATION_PREFIX = "tmp_"
LOG_CALL_COST_PREFIX = "cco_"
LOG_ACTION_TIMMING_PREFIX = "ltm_"
LOG_ACTION_TRIGGER_PREFIX = "ltr_"
VERSION_PREFIX = "ver_"
LOG_ERR = "ler_"
LOG_CDR = "cdr_"
LOG_MEDIATED_CDR = "mcd_"
LOADINST_KEY = "load_history"
SESSION_MANAGER_SOURCE = "SMR"
MEDIATOR_SOURCE = "MED"
CDRS_SOURCE = "CDRS"
SCHED_SOURCE = "SCH"
RATER_SOURCE = "RAT"
CREATE_CDRS_TABLES_SQL = "create_cdrs_tables.sql"
CREATE_TARIFFPLAN_TABLES_SQL = "create_tariffplan_tables.sql"
TEST_SQL = "TEST_SQL"
DESTINATIONS_LOAD_THRESHOLD = 0.1
META_CONSTANT = "*constant"
META_FILLER = "*filler"
META_HANDLER = "*handler"
META_HTTP_POST = "*http_post"
META_HTTP_JSON = "*http_json"
META_HTTP_JSONRPC = "*http_jsonrpc"
NANO_MULTIPLIER = 1000000000
CGR_AUTHORIZE = "CGR_AUTHORIZE"
CONFIG_DIR = "/etc/cgrates/"
CGR_ACCOUNT = "cgr_account"
CGR_SUPPLIER = "cgr_supplier"
CGR_DESTINATION = "cgr_destination"
CGR_SUBJECT = "cgr_subject"
CGR_CATEGORY = "cgr_category"
CGR_REQTYPE = "cgr_reqtype"
CGR_TENANT = "cgr_tenant"
CGR_TOR = "cgr_tor"
CGR_ACCID = "cgr_accid"
CGR_HOST = "cgr_host"
CGR_PDD = "cgr_pdd"
DISCONNECT_CAUSE = "DisconnectCause"
CGR_DISCONNECT_CAUSE = "cgr_disconnectcause"
CGR_COMPUTELCR = "cgr_computelcr"
CGR_SUPPLIERS = "cgr_suppliers"
CGRFlags = "cgr_flags"
KAM_FLATSTORE = "kamailio_flatstore"
OSIPS_FLATSTORE = "opensips_flatstore"
MAX_DEBIT_CACHE_PREFIX = "MAX_DEBIT_"
REFUND_INCR_CACHE_PREFIX = "REFUND_INCR_"
REFUND_ROUND_CACHE_PREFIX = "REFUND_ROUND_"
GET_SESS_RUNS_CACHE_PREFIX = "GET_SESS_RUNS_"
GET_DERIV_MAX_SESS_TIME = "GET_DERIV_MAX_SESS_TIME_"
LOG_CALL_COST_CACHE_PREFIX = "LOG_CALL_COSTS_"
LCRCachePrefix = "LCR_"
ALIAS_CONTEXT_RATING = "*rating"
NOT_AVAILABLE = "N/A"
CALL = "call"
EXTRA_FIELDS = "ExtraFields"
META_SURETAX = "*sure_tax"
SURETAX = "suretax"
DIAMETER_AGENT = "diameter_agent"
COUNTER_EVENT = "*event"
COUNTER_BALANCE = "*balance"
EVENT_NAME = "EventName"
COMPUTE_LCR = "ComputeLcr"
CGR_AUTHORIZATION = "CgrAuthorization"
CGR_SESSION_START = "CgrSessionStart"
CGR_SESSION_UPDATE = "CgrSessionUpdate"
CGR_SESSION_END = "CgrSessionEnd"
CGR_LCR_REQUEST = "CgrLcrRequest"
// action trigger threshold types
TRIGGER_MIN_EVENT_COUNTER = "*min_event_counter"
TRIGGER_MIN_BALANCE_COUNTER = "*min_balance_counter"