diff --git a/engine/storage_mongo_datadb.go b/engine/storage_mongo_datadb.go index 6cb6aacc4..385ee50d7 100644 --- a/engine/storage_mongo_datadb.go +++ b/engine/storage_mongo_datadb.go @@ -1953,7 +1953,9 @@ func (ms *MongoStorage) SetFilterIndexesDrv(cacheID, itemIDPrefix string, bulk := col.Bulk() bulk.Unordered() bulk.Upsert(pairs...) - _, err = bulk.Run() + if _, err = bulk.Run(); err != nil { + return err + } } oldKey := "tmp_" + utils.ConcatenatedKey(originKey, transactionID) for _, character := range []string{".", "*"} { @@ -1976,7 +1978,9 @@ func (ms *MongoStorage) SetFilterIndexesDrv(cacheID, itemIDPrefix string, bulk := col.Bulk() bulk.Unordered() bulk.Upsert(pairs...) - _, err = bulk.Run() + if _, err = bulk.Run(); err != nil { + return err + } } } return diff --git a/engine/storage_mongo_datadb_new.go b/engine/storage_mongo_datadb_new.go index 7dcd42327..98c5ee655 100644 --- a/engine/storage_mongo_datadb_new.go +++ b/engine/storage_mongo_datadb_new.go @@ -36,6 +36,7 @@ import ( "github.com/mongodb/mongo-go-driver/bson/objectid" "github.com/mongodb/mongo-go-driver/mongo" "github.com/mongodb/mongo-go-driver/options" + "github.com/mongodb/mongo-go-driver/x/bsonx" ) // NewMongoStorageNew givese new mongo driver @@ -173,51 +174,51 @@ func (ms *MongoStorageNew) RebuildReverseForPrefix(prefix string) (err error) { col := ms.getCol(colName) if _, err := col.DeleteMany(sctx, bson.M{}); err != nil { return err - } /* - var keys []string - switch prefix { - case utils.REVERSE_DESTINATION_PREFIX: - if keys, err = ms.GetKeysForPrefix(utils.DESTINATION_PREFIX); err != nil { + } + var keys []string + switch prefix { + case utils.REVERSE_DESTINATION_PREFIX: + if keys, err = ms.GetKeysForPrefix(utils.DESTINATION_PREFIX); err != nil { + return err + } + for _, key := range keys { + dest, err := ms.GetDestination(key[len(utils.DESTINATION_PREFIX):], true, utils.NonTransactional) + if err != nil { return err } - for _, key := range keys { - dest, err := ms.GetDestination(key[len(utils.DESTINATION_PREFIX):], true, utils.NonTransactional) - if err != nil { - return err - } - if err = ms.SetReverseDestination(dest, utils.NonTransactional); err != nil { - return err - } - } - case utils.REVERSE_ALIASES_PREFIX: - if keys, err = ms.GetKeysForPrefix(utils.ALIASES_PREFIX); err != nil { + if err = ms.SetReverseDestination(dest, utils.NonTransactional); err != nil { return err } - for _, key := range keys { - al, err := ms.GetAlias(key[len(utils.ALIASES_PREFIX):], true, utils.NonTransactional) - if err != nil { - return err - } - if err = ms.SetReverseAlias(al, utils.NonTransactional); err != nil { - return err - } - } - case utils.AccountActionPlansPrefix: - if keys, err = ms.GetKeysForPrefix(utils.ACTION_PLAN_PREFIX); err != nil { + } + case utils.REVERSE_ALIASES_PREFIX: + if keys, err = ms.GetKeysForPrefix(utils.ALIASES_PREFIX); err != nil { + return err + } + for _, key := range keys { + al, err := ms.GetAlias(key[len(utils.ALIASES_PREFIX):], true, utils.NonTransactional) + if err != nil { return err } - for _, key := range keys { - apl, err := ms.GetActionPlan(key[len(utils.ACTION_PLAN_PREFIX):], true, utils.NonTransactional) - if err != nil { + if err = ms.SetReverseAlias(al, utils.NonTransactional); err != nil { + return err + } + } + case utils.AccountActionPlansPrefix: + if keys, err = ms.GetKeysForPrefix(utils.ACTION_PLAN_PREFIX); err != nil { + return err + } + for _, key := range keys { + apl, err := ms.GetActionPlan(key[len(utils.ACTION_PLAN_PREFIX):], true, utils.NonTransactional) + if err != nil { + return err + } + for acntID := range apl.AccountIDs { + if err = ms.SetAccountActionPlans(acntID, []string{apl.Id}, false); err != nil { return err } - for acntID := range apl.AccountIDs { - if err = ms.SetAccountActionPlans(acntID, []string{apl.Id}, false); err != nil { - return err - } - } } - }*/ + } + } return nil }) } @@ -241,51 +242,50 @@ func (ms *MongoStorageNew) RemoveReverseForPrefix(prefix string) (err error) { return utils.ErrNotFound } - /* - var keys []string - switch prefix { - case utils.REVERSE_DESTINATION_PREFIX: - if keys, err = ms.GetKeysForPrefix(utils.DESTINATION_PREFIX); err != nil { - return + var keys []string + switch prefix { + case utils.REVERSE_DESTINATION_PREFIX: + if keys, err = ms.GetKeysForPrefix(utils.DESTINATION_PREFIX); err != nil { + return err + } + for _, key := range keys { + dest, err := ms.GetDestination(key[len(utils.DESTINATION_PREFIX):], true, utils.NonTransactional) + if err != nil { + return err } - for _, key := range keys { - dest, err := ms.GetDestination(key[len(utils.DESTINATION_PREFIX):], true, utils.NonTransactional) - if err != nil { - return err - } - if err := ms.RemoveDestination(dest.Id, utils.NonTransactional); err != nil { + if err := ms.RemoveDestination(dest.Id, utils.NonTransactional); err != nil { + return err + } + } + case utils.REVERSE_ALIASES_PREFIX: + if keys, err = ms.GetKeysForPrefix(utils.ALIASES_PREFIX); err != nil { + return err + } + for _, key := range keys { + al, err := ms.GetAlias(key[len(utils.ALIASES_PREFIX):], true, utils.NonTransactional) + if err != nil { + return err + } + if err := ms.RemoveAlias(al.GetId(), utils.NonTransactional); err != nil { + return err + } + } + case utils.AccountActionPlansPrefix: + if keys, err = ms.GetKeysForPrefix(utils.ACTION_PLAN_PREFIX); err != nil { + return err + } + for _, key := range keys { + apl, err := ms.GetActionPlan(key[len(utils.ACTION_PLAN_PREFIX):], true, utils.NonTransactional) + if err != nil { + return err + } + for acntID := range apl.AccountIDs { + if err = ms.RemAccountActionPlans(acntID, []string{apl.Id}); err != nil { return err } } - case utils.REVERSE_ALIASES_PREFIX: - if keys, err = ms.GetKeysForPrefix(utils.ALIASES_PREFIX); err != nil { - return - } - for _, key := range keys { - al, err := ms.GetAlias(key[len(utils.ALIASES_PREFIX):], true, utils.NonTransactional) - if err != nil { - return err - } - if err := ms.RemoveAlias(al.GetId(), utils.NonTransactional); err != nil { - return err - } - } - case utils.AccountActionPlansPrefix: - if keys, err = ms.GetKeysForPrefix(utils.ACTION_PLAN_PREFIX); err != nil { - return - } - for _, key := range keys { - apl, err := ms.GetActionPlan(key[len(utils.ACTION_PLAN_PREFIX):], true, utils.NonTransactional) - if err != nil { - return err - } - for acntID := range apl.AccountIDs { - if err = ms.RemAccountActionPlans(acntID, []string{apl.Id}); err != nil { - return err - } - } - } - }*/ + } + } return nil }) } @@ -313,9 +313,9 @@ func (ms *MongoStorageNew) IsDBEmpty() (resp bool, err error) { func (ms *MongoStorageNew) getField(sctx mongo.SessionContext, col, prefix, subject, field string) (result []string, err error) { fieldResult := bson.D{} iter, err := ms.getCol(col).Find(sctx, - bson.NewDocument(bson.EC.Regex(field, subject, "")), + bson.M{field: bsonx.Regex(subject, "")}, options.Find().SetProjection( - bson.NewDocument(bson.EC.Int32(field, 1)), + bson.M{field: 1}, ), ) if err != nil { @@ -328,26 +328,19 @@ func (ms *MongoStorageNew) getField(sctx mongo.SessionContext, col, prefix, subj } result = append(result, prefix+fieldResult.Map()[field].(string)) } - iter.Close(sctx) - return + return result, iter.Close(sctx) } func (ms *MongoStorageNew) getField2(sctx mongo.SessionContext, col, prefix, subject string, tntID *utils.TenantID) (result []string, err error) { idResult := struct{ Tenant, Id string }{} - elem := []*bson.Element{} + elem := bson.M{} if tntID.Tenant != "" { - elem = append(elem, bson.EC.String("tenant", tntID.Tenant)) + elem["tenant"] = tntID.Tenant } if tntID.ID != "" { - elem = append(elem, bson.EC.Regex("id", subject, "")) + elem["id"] = bsonx.Regex(subject, "") } - iter, err := ms.getCol(col).Find(sctx, - bson.NewDocument(elem...), - options.Find().SetProjection( - bson.NewDocument( - bson.EC.Int32("tenant", 1), - bson.EC.Int32("id", 1), - ), - ), + iter, err := ms.getCol(col).Find(sctx, elem, + options.Find().SetProjection(bson.M{"tenant": 1, "id": 1}), ) if err != nil { return @@ -359,8 +352,7 @@ func (ms *MongoStorageNew) getField2(sctx mongo.SessionContext, col, prefix, sub } result = append(result, prefix+utils.ConcatenatedKey(idResult.Tenant, idResult.Id)) } - iter.Close(sctx) - return + return result, iter.Close(sctx) } // GetKeysForPrefix implementation @@ -526,7 +518,7 @@ func (ms *MongoStorageNew) SetRatingPlanDrv(rp *RatingPlan) error { Key string Value []byte }{Key: rp.Id, Value: b.Bytes()}}, - &options.UpdateOptions{Upsert: utils.BoolPointer(true)}, + options.Update().SetUpsert(true), ) return err }) @@ -561,7 +553,7 @@ func (ms *MongoStorageNew) SetRatingProfileDrv(rp *RatingProfile) (err error) { return ms.client.UseSession(ms.ctx, func(sctx mongo.SessionContext) (err error) { _, err = ms.getCol(colRpf).UpdateOne(sctx, bson.M{"id": rp.Id}, bson.M{"$set": rp}, - &options.UpdateOptions{Upsert: utils.BoolPointer(true)}, + options.Update().SetUpsert(true), ) return err }) @@ -602,7 +594,7 @@ func (ms *MongoStorageNew) SetLCRDrv(lcr *LCR) (err error) { Key string Value *LCR }{lcr.GetId(), lcr}}, - &options.UpdateOptions{Upsert: utils.BoolPointer(true)}, + options.Update().SetUpsert(true), ) return err }) @@ -681,7 +673,7 @@ func (ms *MongoStorageNew) SetDestination(dest *Destination, transactionID strin Key string Value []byte }{Key: dest.Id, Value: b.Bytes()}}, - &options.UpdateOptions{Upsert: utils.BoolPointer(true)}, + options.Update().SetUpsert(true), ) return err }) @@ -860,7 +852,7 @@ func (ms *MongoStorageNew) SetActionsDrv(key string, as Actions) error { Key string Value Actions }{Key: key, Value: as}}, - &options.UpdateOptions{Upsert: utils.BoolPointer(true)}, + options.Update().SetUpsert(true), ) return err }) @@ -895,7 +887,7 @@ func (ms *MongoStorageNew) SetSharedGroupDrv(sg *SharedGroup) (err error) { return ms.client.UseSession(ms.ctx, func(sctx mongo.SessionContext) (err error) { _, err = ms.getCol(colShg).UpdateOne(sctx, bson.M{"id": sg.Id}, bson.M{"$set": sg}, - &options.UpdateOptions{Upsert: utils.BoolPointer(true)}, + options.Update().SetUpsert(true), ) return err }) @@ -942,7 +934,7 @@ func (ms *MongoStorageNew) SetAccount(acc *Account) error { return ms.client.UseSession(ms.ctx, func(sctx mongo.SessionContext) (err error) { _, err = ms.getCol(colAcc).UpdateOne(sctx, bson.M{"id": acc.ID}, bson.M{"$set": acc}, - &options.UpdateOptions{Upsert: utils.BoolPointer(true)}, + options.Update().SetUpsert(true), ) return err }) @@ -985,7 +977,7 @@ func (ms *MongoStorageNew) SetCdrStatsQueueDrv(sq *CDRStatsQueue) (err error) { Key string Value *CDRStatsQueue }{Key: sq.GetId(), Value: sq}}, - &options.UpdateOptions{Upsert: utils.BoolPointer(true)}, + options.Update().SetUpsert(true), ) return err }) @@ -1019,8 +1011,7 @@ func (ms *MongoStorageNew) GetSubscribersDrv() (result map[string]*SubscriberDat } result[kv.Key] = kv.Value } - cur.Close(sctx) - return nil + return cur.Close(sctx) }); err != nil { return nil, err } @@ -1034,7 +1025,7 @@ func (ms *MongoStorageNew) SetSubscriberDrv(key string, sub *SubscriberData) (er Key string Value *SubscriberData }{Key: key, Value: sub}}, - &options.UpdateOptions{Upsert: utils.BoolPointer(true)}, + options.Update().SetUpsert(true), ) return err }) @@ -1077,7 +1068,7 @@ func (ms *MongoStorageNew) SetUserDrv(up *UserProfile) (err error) { Key string Value *UserProfile }{Key: up.GetId(), Value: up}}, - &options.UpdateOptions{Upsert: utils.BoolPointer(true)}, + options.Update().SetUpsert(true), ) return err }) @@ -1138,7 +1129,7 @@ func (ms *MongoStorageNew) SetAlias(al *Alias, transactionID string) (err error) Key string Value AliasValues }{Key: al.GetId(), Value: al.Values}}, - &options.UpdateOptions{Upsert: utils.BoolPointer(true)}, + options.Update().SetUpsert(true), ) return err }) @@ -1240,7 +1231,7 @@ func (ms *MongoStorageNew) SetReverseAlias(al *Alias, transactionID string) (err if err = ms.client.UseSession(ms.ctx, func(sctx mongo.SessionContext) (err error) { _, err = ms.getCol(colRCfgs).UpdateOne(sctx, bson.M{"key": rKey}, bson.M{"$addToSet": bson.M{"value": id}}, - &options.UpdateOptions{Upsert: utils.BoolPointer(true)}, + options.Update().SetUpsert(true), ) return err }); err != nil { @@ -1344,7 +1335,7 @@ func (ms *MongoStorageNew) AddLoadHistory(ldInst *utils.LoadInstance, Key string Value []*utils.LoadInstance }{Key: utils.LOADINST_KEY, Value: existingLoadHistory}}, - &options.UpdateOptions{Upsert: utils.BoolPointer(true)}, + options.Update().SetUpsert(true), ) return err }) @@ -1389,7 +1380,7 @@ func (ms *MongoStorageNew) SetActionTriggersDrv(key string, atrs ActionTriggers) Key string Value ActionTriggers }{Key: key, Value: atrs}}, - &options.UpdateOptions{Upsert: utils.BoolPointer(true)}, + options.Update().SetUpsert(true), ) return err }) @@ -1493,7 +1484,7 @@ func (ms *MongoStorageNew) SetActionPlan(key string, ats *ActionPlan, Key string Value []byte }{Key: key, Value: b.Bytes()}}, - &options.UpdateOptions{Upsert: utils.BoolPointer(true)}, + options.Update().SetUpsert(true), ) return err }) @@ -1577,7 +1568,7 @@ func (ms *MongoStorageNew) SetAccountActionPlans(acntID string, aPlIDs []string, Key string Value []string }{Key: acntID, Value: aPlIDs}}, - &options.UpdateOptions{Upsert: utils.BoolPointer(true)}, + options.Update().SetUpsert(true), ) return err }) @@ -1621,7 +1612,7 @@ func (ms *MongoStorageNew) RemAccountActionPlans(acntID string, aPlIDs []string) Key string Value []string }{Key: acntID, Value: oldAPlIDs}}, - &options.UpdateOptions{Upsert: utils.BoolPointer(true)}, + options.Update().SetUpsert(true), ) return err }) @@ -1633,3 +1624,715 @@ func (ms *MongoStorageNew) PushTask(t *Task) error { return err }) } + +func (ms *MongoStorageNew) PopTask() (t *Task, err error) { + v := struct { + ID objectid.ObjectID `bson:"_id"` + Task *Task + }{} + if err = ms.client.UseSession(ms.ctx, func(sctx mongo.SessionContext) (err error) { + cur := ms.getCol(colTsk).FindOneAndDelete(sctx, nil) + if err := cur.Decode(&v); err != nil { + if err == mongo.ErrNoDocuments { + return utils.ErrNotFound + } + return err + } + return nil + }); err != nil { + return nil, err + } + return v.Task, nil +} + +func (ms *MongoStorageNew) GetDerivedChargersDrv(key string) (dcs *utils.DerivedChargers, err error) { + var kv struct { + Key string + Value *utils.DerivedChargers + } + if err = ms.client.UseSession(ms.ctx, func(sctx mongo.SessionContext) (err error) { + cur := ms.getCol(colDcs).FindOne(sctx, bson.M{"key": key}) + if err := cur.Decode(&kv); err != nil { + if err == mongo.ErrNoDocuments { + return utils.ErrNotFound + } + return err + } + return nil + }); err != nil { + return nil, err + } + return kv.Value, nil +} + +func (ms *MongoStorageNew) SetDerivedChargers(key string, + dcs *utils.DerivedChargers, transactionID string) (err error) { + cCommit := cacheCommit(transactionID) + if dcs == nil || len(dcs.Chargers) == 0 { + if err = ms.client.UseSession(ms.ctx, func(sctx mongo.SessionContext) (err error) { + _, err = ms.getCol(colDcs).DeleteOne(sctx, bson.M{"key": key}) + return err + }); err != nil { + return err + } + Cache.Remove(utils.CacheDerivedChargers, key, cCommit, transactionID) + return nil + } + return ms.client.UseSession(ms.ctx, func(sctx mongo.SessionContext) (err error) { + _, err = ms.getCol(colDcs).UpdateOne(sctx, bson.M{"key": key}, + bson.M{"$set": struct { + Key string + Value *utils.DerivedChargers + }{Key: key, Value: dcs}}, + options.Update().SetUpsert(true), + ) + return err + }) +} + +func (ms *MongoStorageNew) RemoveDerivedChargersDrv(id, transactionID string) (err error) { + cCommit := cacheCommit(transactionID) + if err = ms.client.UseSession(ms.ctx, func(sctx mongo.SessionContext) (err error) { + _, err = ms.getCol(colDcs).DeleteOne(sctx, bson.M{"key": id}) + return err + }); err != nil { + return err + } + Cache.Remove(utils.CacheDerivedChargers, id, cCommit, transactionID) + return nil +} + +func (ms *MongoStorageNew) GetCdrStatsDrv(key string) (cs *CdrStats, err error) { + cs = new(CdrStats) + err = ms.client.UseSession(ms.ctx, func(sctx mongo.SessionContext) (err error) { + cur := ms.getCol(colCrs).FindOne(sctx, bson.M{"id": key}) + if err := cur.Decode(cs); err != nil { + if err == mongo.ErrNoDocuments { + return utils.ErrNotFound + } + return err + } + return nil + }) + return +} + +func (ms *MongoStorageNew) GetAllCdrStatsDrv() (css []*CdrStats, err error) { + err = ms.client.UseSession(ms.ctx, func(sctx mongo.SessionContext) (err error) { + cur, err := ms.getCol(colCrs).Find(sctx, nil) + if err != nil { + return err + } + for cur.Next(sctx) { + var cs CdrStats + err := cur.Decode(&cs) + if err != nil { + return err + } + clone := cs // avoid using the same pointer in append + css = append(css, &clone) + } + return cur.Close(sctx) + }) + return +} + +func (ms *MongoStorageNew) SetCdrStatsDrv(cs *CdrStats) error { + return ms.client.UseSession(ms.ctx, func(sctx mongo.SessionContext) (err error) { + _, err = ms.getCol(colCrs).UpdateOne(sctx, bson.M{"id": cs.Id}, + bson.M{"$set": cs}, + options.Update().SetUpsert(true), + ) + return err + }) +} + +func (ms *MongoStorageNew) GetResourceProfileDrv(tenant, id string) (rp *ResourceProfile, err error) { + rp = new(ResourceProfile) + err = ms.client.UseSession(ms.ctx, func(sctx mongo.SessionContext) (err error) { + cur := ms.getCol(colRsP).FindOne(sctx, bson.M{"tenant": tenant, "id": id}) + if err := cur.Decode(rp); err != nil { + if err == mongo.ErrNoDocuments { + return utils.ErrNotFound + } + return err + } + return nil + }) + return +} + +func (ms *MongoStorageNew) SetResourceProfileDrv(rp *ResourceProfile) (err error) { + return ms.client.UseSession(ms.ctx, func(sctx mongo.SessionContext) (err error) { + _, err = ms.getCol(colRsP).UpdateOne(sctx, bson.M{"tenant": rp.Tenant, "id": rp.ID}, + bson.M{"$set": rp}, + options.Update().SetUpsert(true), + ) + return err + }) +} + +func (ms *MongoStorageNew) RemoveResourceProfileDrv(tenant, id string) (err error) { + return ms.client.UseSession(ms.ctx, func(sctx mongo.SessionContext) (err error) { + dr, err := ms.getCol(colDcs).DeleteOne(sctx, bson.M{"tenant": tenant, "id": id}) + if dr.DeletedCount == 0 { + return utils.ErrNotFound + } + return err + }) +} + +func (ms *MongoStorageNew) GetResourceDrv(tenant, id string) (r *Resource, err error) { + r = new(Resource) + err = ms.client.UseSession(ms.ctx, func(sctx mongo.SessionContext) (err error) { + cur := ms.getCol(colRes).FindOne(sctx, bson.M{"tenant": tenant, "id": id}) + if err := cur.Decode(r); err != nil { + if err == mongo.ErrNoDocuments { + return utils.ErrNotFound + } + return err + } + return nil + }) + return +} + +func (ms *MongoStorageNew) SetResourceDrv(r *Resource) (err error) { + return ms.client.UseSession(ms.ctx, func(sctx mongo.SessionContext) (err error) { + _, err = ms.getCol(colRes).UpdateOne(sctx, bson.M{"tenant": r.Tenant, "id": r.ID}, + bson.M{"$set": r}, + options.Update().SetUpsert(true), + ) + return err + }) +} + +func (ms *MongoStorageNew) RemoveResourceDrv(tenant, id string) (err error) { + return ms.client.UseSession(ms.ctx, func(sctx mongo.SessionContext) (err error) { + dr, err := ms.getCol(colRes).DeleteOne(sctx, bson.M{"tenant": tenant, "id": id}) + if dr.DeletedCount == 0 { + return utils.ErrNotFound + } + return err + }) +} + +func (ms *MongoStorageNew) GetTimingDrv(id string) (t *utils.TPTiming, err error) { + t = new(utils.TPTiming) + err = ms.client.UseSession(ms.ctx, func(sctx mongo.SessionContext) (err error) { + cur := ms.getCol(colTmg).FindOne(sctx, bson.M{"id": id}) + if err := cur.Decode(t); err != nil { + if err == mongo.ErrNoDocuments { + return utils.ErrNotFound + } + return err + } + return nil + }) + return +} + +func (ms *MongoStorageNew) SetTimingDrv(t *utils.TPTiming) (err error) { + return ms.client.UseSession(ms.ctx, func(sctx mongo.SessionContext) (err error) { + _, err = ms.getCol(colTmg).UpdateOne(sctx, bson.M{"id": t.ID}, + bson.M{"$set": t}, + options.Update().SetUpsert(true), + ) + return err + }) +} + +func (ms *MongoStorageNew) RemoveTimingDrv(id string) (err error) { + return ms.client.UseSession(ms.ctx, func(sctx mongo.SessionContext) (err error) { + dr, err := ms.getCol(colTmg).DeleteOne(sctx, bson.M{"id": id}) + if dr.DeletedCount == 0 { + return utils.ErrNotFound + } + return err + }) +} + +// GetFilterIndexesDrv retrieves Indexes from dataDB +//filterType is used togheter with fieldName:Val +func (ms *MongoStorageNew) GetFilterIndexesDrv(cacheID, itemIDPrefix, filterType string, + fldNameVal map[string]string) (indexes map[string]utils.StringMap, err error) { + type result struct { + Key string + Value []string + } + var results []result + dbKey := utils.CacheInstanceToPrefix[cacheID] + itemIDPrefix + if len(fldNameVal) != 0 { + for fldName, fldValue := range fldNameVal { + if err = ms.client.UseSession(ms.ctx, func(sctx mongo.SessionContext) (err error) { + cur, err := ms.getCol(colRFI).Find(sctx, bson.M{"key": utils.ConcatenatedKey(dbKey, filterType, fldName, fldValue)}) + if err != nil { + return err + } + for cur.Next(sctx) { + var elem result + if err := cur.Decode(&elem); err != nil { + return err + } + results = append(results, elem) + } + return cur.Close(sctx) + }); err != nil { + return nil, err + } + if len(results) == 0 { + return nil, utils.ErrNotFound + } + } + } else { + for _, character := range []string{".", "*"} { + dbKey = strings.Replace(dbKey, character, `\`+character, strings.Count(dbKey, character)) + } + //inside bson.RegEx add carrot to match the prefix (optimization) + if err = ms.client.UseSession(ms.ctx, func(sctx mongo.SessionContext) (err error) { + cur, err := ms.getCol(colRFI).Find(sctx, bson.M{"key": bsonx.Regex("^"+dbKey, "")}) + if err != nil { + return err + } + for cur.Next(sctx) { + var elem result + if err := cur.Decode(&elem); err != nil { + return err + } + results = append(results, elem) + } + return cur.Close(sctx) + }); err != nil { + return nil, err + } + if len(results) == 0 { + return nil, utils.ErrNotFound + } + } + indexes = make(map[string]utils.StringMap) + for _, res := range results { + if len(res.Value) == 0 { + continue + } + keys := strings.Split(res.Key, ":") + indexKey := utils.ConcatenatedKey(keys[1], keys[2], keys[3]) + //check here if itemIDPrefix has context + if len(strings.Split(itemIDPrefix, ":")) == 2 { + indexKey = utils.ConcatenatedKey(keys[2], keys[3], keys[4]) + } + if _, hasIt := indexes[indexKey]; !hasIt { + indexes[indexKey] = make(utils.StringMap) + } + indexes[indexKey] = utils.StringMapFromSlice(res.Value) + } + if len(indexes) == 0 { + return nil, utils.ErrNotFound + } + + return indexes, nil +} + +// SetFilterIndexesDrv stores Indexes into DataDB +func (ms *MongoStorageNew) SetFilterIndexesDrv(cacheID, itemIDPrefix string, + indexes map[string]utils.StringMap, commit bool, transactionID string) (err error) { + originKey := utils.CacheInstanceToPrefix[cacheID] + itemIDPrefix + dbKey := originKey + if transactionID != "" { + dbKey = "tmp_" + utils.ConcatenatedKey(originKey, transactionID) + } + if commit && transactionID != "" { + regexKey := originKey + for _, character := range []string{".", "*"} { + regexKey = strings.Replace(regexKey, character, `\`+character, strings.Count(regexKey, character)) + } + //inside bson.RegEx add carrot to match the prefix (optimization) + if err = ms.client.UseSession(ms.ctx, func(sctx mongo.SessionContext) (err error) { + _, err = ms.getCol(colRFI).DeleteMany(sctx, bson.M{"key": bsonx.Regex("^"+regexKey, "")}) + return err + }); err != nil { + return err + } + var lastErr error + for key, itmMp := range indexes { + if err = ms.client.UseSession(ms.ctx, func(sctx mongo.SessionContext) (err error) { + _, err = ms.getCol(colRFI).UpdateOne(sctx, bson.M{"key": utils.ConcatenatedKey(originKey, key)}, + bson.M{"$set": bson.M{"key": utils.ConcatenatedKey(originKey, key), "value": itmMp.Slice()}}, + options.Update().SetUpsert(true), + ) + return err + }); err != nil { + lastErr = err + } + } + if lastErr != nil { + return lastErr + } + oldKey := "tmp_" + utils.ConcatenatedKey(originKey, transactionID) + for _, character := range []string{".", "*"} { + oldKey = strings.Replace(oldKey, character, `\`+character, strings.Count(oldKey, character)) + } + //inside bson.RegEx add carrot to match the prefix (optimization) + return ms.client.UseSession(ms.ctx, func(sctx mongo.SessionContext) (err error) { + _, err = ms.getCol(colRFI).DeleteMany(sctx, bson.M{"key": bsonx.Regex("^"+oldKey, "")}) + return err + }) + } else { + pairs := []interface{}{} + var lastErr error + for key, itmMp := range indexes { + pairs = append(pairs, bson.M{"key": utils.ConcatenatedKey(dbKey, key)}) + if len(itmMp) == 0 { + pairs = append(pairs, bson.M{"$unset": bson.M{"value": 1}}) + } else { + pairs = append(pairs, bson.M{"$set": bson.M{"key": utils.ConcatenatedKey(dbKey, key), "value": itmMp.Slice()}}) + } + + if err = ms.client.UseSession(ms.ctx, func(sctx mongo.SessionContext) (err error) { + var action bson.M + if len(itmMp) == 0 { + action = bson.M{"$unset": bson.M{"value": 1}} + } else { + action = bson.M{"$set": bson.M{"key": utils.ConcatenatedKey(dbKey, key), "value": itmMp.Slice()}} + } + _, err = ms.getCol(colRFI).UpdateOne(sctx, bson.M{"key": utils.ConcatenatedKey(dbKey, key)}, + action, options.Update().SetUpsert(true), + ) + return err + }); err != nil { + lastErr = err + } + + } + return lastErr + } +} + +func (ms *MongoStorageNew) RemoveFilterIndexesDrv(cacheID, itemIDPrefix string) (err error) { + regexKey := utils.CacheInstanceToPrefix[cacheID] + itemIDPrefix + for _, character := range []string{".", "*"} { + regexKey = strings.Replace(regexKey, character, `\`+character, strings.Count(regexKey, character)) + } + //inside bson.RegEx add carrot to match the prefix (optimization) + return ms.client.UseSession(ms.ctx, func(sctx mongo.SessionContext) (err error) { + _, err = ms.getCol(colRFI).DeleteMany(sctx, bson.M{"key": bsonx.Regex("^"+regexKey, "")}) + return err + }) +} + +func (ms *MongoStorageNew) MatchFilterIndexDrv(cacheID, itemIDPrefix, + filterType, fldName, fldVal string) (itemIDs utils.StringMap, err error) { + var result struct { + Key string + Value []string + } + dbKey := utils.CacheInstanceToPrefix[cacheID] + itemIDPrefix + if err = ms.client.UseSession(ms.ctx, func(sctx mongo.SessionContext) (err error) { + cur := ms.getCol(colRFI).FindOne(sctx, bson.M{"key": utils.ConcatenatedKey(dbKey, filterType, fldName, fldVal)}) + if err := cur.Decode(&result); err != nil { + if err == mongo.ErrNoDocuments { + return utils.ErrNotFound + } + return err + } + return nil + }); err != nil { + return nil, err + } + return utils.StringMapFromSlice(result.Value), nil +} + +// GetStatQueueProfileDrv retrieves a StatQueueProfile from dataDB +func (ms *MongoStorageNew) GetStatQueueProfileDrv(tenant string, id string) (sq *StatQueueProfile, err error) { + sq = new(StatQueueProfile) + err = ms.client.UseSession(ms.ctx, func(sctx mongo.SessionContext) (err error) { + cur := ms.getCol(colSqp).FindOne(sctx, bson.M{"tenant": tenant, "id": id}) + if err := cur.Decode(sq); err != nil { + if err == mongo.ErrNoDocuments { + return utils.ErrNotFound + } + return err + } + return nil + }) + return +} + +// SetStatQueueProfileDrv stores a StatsQueue into DataDB +func (ms *MongoStorageNew) SetStatQueueProfileDrv(sq *StatQueueProfile) (err error) { + return ms.client.UseSession(ms.ctx, func(sctx mongo.SessionContext) (err error) { + _, err = ms.getCol(colSqp).UpdateOne(sctx, bson.M{"tenant": sq.Tenant, "id": sq.ID}, + bson.M{"$set": sq}, + options.Update().SetUpsert(true), + ) + return err + }) +} + +// RemStatQueueProfileDrv removes a StatsQueue from dataDB +func (ms *MongoStorageNew) RemStatQueueProfileDrv(tenant, id string) (err error) { + return ms.client.UseSession(ms.ctx, func(sctx mongo.SessionContext) (err error) { + dr, err := ms.getCol(colSqp).DeleteOne(sctx, bson.M{"tenant": tenant, "id": id}) + if dr.DeletedCount == 0 { + return utils.ErrNotFound + } + return err + }) +} + +// GetStoredStatQueueDrv retrieves a StoredStatQueue +func (ms *MongoStorageNew) GetStoredStatQueueDrv(tenant, id string) (sq *StoredStatQueue, err error) { + sq = new(StoredStatQueue) + err = ms.client.UseSession(ms.ctx, func(sctx mongo.SessionContext) (err error) { + cur := ms.getCol(colSqs).FindOne(sctx, bson.M{"tenant": tenant, "id": id}) + if err := cur.Decode(sq); err != nil { + if err == mongo.ErrNoDocuments { + return utils.ErrNotFound + } + return err + } + return nil + }) + return +} + +// SetStoredStatQueueDrv stores the metrics for a StoredStatQueue +func (ms *MongoStorageNew) SetStoredStatQueueDrv(sq *StoredStatQueue) (err error) { + return ms.client.UseSession(ms.ctx, func(sctx mongo.SessionContext) (err error) { + _, err = ms.getCol(colSqs).UpdateOne(sctx, bson.M{"tenant": sq.Tenant, "id": sq.ID}, + bson.M{"$set": sq}, + options.Update().SetUpsert(true), + ) + return err + }) +} + +// RemStoredStatQueueDrv removes stored metrics for a StoredStatQueue +func (ms *MongoStorageNew) RemStoredStatQueueDrv(tenant, id string) (err error) { + return ms.client.UseSession(ms.ctx, func(sctx mongo.SessionContext) (err error) { + dr, err := ms.getCol(colSqs).DeleteOne(sctx, bson.M{"tenant": tenant, "id": id}) + if dr.DeletedCount == 0 { + return utils.ErrNotFound + } + return err + }) +} + +// GetThresholdProfileDrv retrieves a ThresholdProfile from dataDB +func (ms *MongoStorageNew) GetThresholdProfileDrv(tenant, ID string) (tp *ThresholdProfile, err error) { + tp = new(ThresholdProfile) + err = ms.client.UseSession(ms.ctx, func(sctx mongo.SessionContext) (err error) { + cur := ms.getCol(colTps).FindOne(sctx, bson.M{"tenant": tenant, "id": ID}) + if err := cur.Decode(tp); err != nil { + if err == mongo.ErrNoDocuments { + return utils.ErrNotFound + } + return err + } + return nil + }) + return +} + +// SetThresholdProfileDrv stores a ThresholdProfile into DataDB +func (ms *MongoStorageNew) SetThresholdProfileDrv(tp *ThresholdProfile) (err error) { + return ms.client.UseSession(ms.ctx, func(sctx mongo.SessionContext) (err error) { + _, err = ms.getCol(colTps).UpdateOne(sctx, bson.M{"tenant": tp.Tenant, "id": tp.ID}, + bson.M{"$set": tp}, + options.Update().SetUpsert(true), + ) + return err + }) +} + +// RemoveThresholdProfile removes a ThresholdProfile from dataDB/cache +func (ms *MongoStorageNew) RemThresholdProfileDrv(tenant, id string) (err error) { + return ms.client.UseSession(ms.ctx, func(sctx mongo.SessionContext) (err error) { + dr, err := ms.getCol(colTps).DeleteOne(sctx, bson.M{"tenant": tenant, "id": id}) + if dr.DeletedCount == 0 { + return utils.ErrNotFound + } + return err + }) +} + +func (ms *MongoStorageNew) GetThresholdDrv(tenant, id string) (r *Threshold, err error) { + r = new(Threshold) + err = ms.client.UseSession(ms.ctx, func(sctx mongo.SessionContext) (err error) { + cur := ms.getCol(colThs).FindOne(sctx, bson.M{"tenant": tenant, "id": id}) + if err := cur.Decode(r); err != nil { + if err == mongo.ErrNoDocuments { + return utils.ErrNotFound + } + return err + } + return nil + }) + return +} + +func (ms *MongoStorageNew) SetThresholdDrv(r *Threshold) (err error) { + return ms.client.UseSession(ms.ctx, func(sctx mongo.SessionContext) (err error) { + _, err = ms.getCol(colThs).UpdateOne(sctx, bson.M{"tenant": r.Tenant, "id": r.ID}, + bson.M{"$set": r}, + options.Update().SetUpsert(true), + ) + return err + }) +} + +func (ms *MongoStorageNew) RemoveThresholdDrv(tenant, id string) (err error) { + return ms.client.UseSession(ms.ctx, func(sctx mongo.SessionContext) (err error) { + dr, err := ms.getCol(colThs).DeleteOne(sctx, bson.M{"tenant": tenant, "id": id}) + if dr.DeletedCount == 0 { + return utils.ErrNotFound + } + return err + }) +} + +func (ms *MongoStorageNew) GetFilterDrv(tenant, id string) (r *Filter, err error) { + r = new(Filter) + if err = ms.client.UseSession(ms.ctx, func(sctx mongo.SessionContext) (err error) { + cur := ms.getCol(colFlt).FindOne(sctx, bson.M{"tenant": tenant, "id": id}) + if err := cur.Decode(r); err != nil { + if err == mongo.ErrNoDocuments { + return utils.ErrNotFound + } + return err + } + return nil + }); err != nil { + return nil, err + } + for _, fltr := range r.Rules { + if err = fltr.CompileValues(); err != nil { + return + } + } + return +} + +func (ms *MongoStorageNew) SetFilterDrv(r *Filter) (err error) { + return ms.client.UseSession(ms.ctx, func(sctx mongo.SessionContext) (err error) { + _, err = ms.getCol(colFlt).UpdateOne(sctx, bson.M{"tenant": r.Tenant, "id": r.ID}, + bson.M{"$set": r}, + options.Update().SetUpsert(true), + ) + return err + }) +} + +func (ms *MongoStorageNew) RemoveFilterDrv(tenant, id string) (err error) { + return ms.client.UseSession(ms.ctx, func(sctx mongo.SessionContext) (err error) { + dr, err := ms.getCol(colFlt).DeleteOne(sctx, bson.M{"tenant": tenant, "id": id}) + if dr.DeletedCount == 0 { + return utils.ErrNotFound + } + return err + }) +} + +func (ms *MongoStorageNew) GetSupplierProfileDrv(tenant, id string) (r *SupplierProfile, err error) { + r = new(SupplierProfile) + err = ms.client.UseSession(ms.ctx, func(sctx mongo.SessionContext) (err error) { + cur := ms.getCol(colSpp).FindOne(sctx, bson.M{"tenant": tenant, "id": id}) + if err := cur.Decode(r); err != nil { + if err == mongo.ErrNoDocuments { + return utils.ErrNotFound + } + return err + } + return nil + }) + return +} + +func (ms *MongoStorageNew) SetSupplierProfileDrv(r *SupplierProfile) (err error) { + return ms.client.UseSession(ms.ctx, func(sctx mongo.SessionContext) (err error) { + _, err = ms.getCol(colSpp).UpdateOne(sctx, bson.M{"tenant": r.Tenant, "id": r.ID}, + bson.M{"$set": r}, + options.Update().SetUpsert(true), + ) + return err + }) +} + +func (ms *MongoStorageNew) RemoveSupplierProfileDrv(tenant, id string) (err error) { + return ms.client.UseSession(ms.ctx, func(sctx mongo.SessionContext) (err error) { + dr, err := ms.getCol(colSpp).DeleteOne(sctx, bson.M{"tenant": tenant, "id": id}) + if dr.DeletedCount == 0 { + return utils.ErrNotFound + } + return err + }) +} + +func (ms *MongoStorageNew) GetAttributeProfileDrv(tenant, id string) (r *AttributeProfile, err error) { + r = new(AttributeProfile) + err = ms.client.UseSession(ms.ctx, func(sctx mongo.SessionContext) (err error) { + cur := ms.getCol(colAttr).FindOne(sctx, bson.M{"tenant": tenant, "id": id}) + if err := cur.Decode(r); err != nil { + if err == mongo.ErrNoDocuments { + return utils.ErrNotFound + } + return err + } + return nil + }) + return +} + +func (ms *MongoStorageNew) SetAttributeProfileDrv(r *AttributeProfile) (err error) { + return ms.client.UseSession(ms.ctx, func(sctx mongo.SessionContext) (err error) { + _, err = ms.getCol(colAttr).UpdateOne(sctx, bson.M{"tenant": r.Tenant, "id": r.ID}, + bson.M{"$set": r}, + options.Update().SetUpsert(true), + ) + return err + }) +} + +func (ms *MongoStorageNew) RemoveAttributeProfileDrv(tenant, id string) (err error) { + return ms.client.UseSession(ms.ctx, func(sctx mongo.SessionContext) (err error) { + dr, err := ms.getCol(colAttr).DeleteOne(sctx, bson.M{"tenant": tenant, "id": id}) + if dr.DeletedCount == 0 { + return utils.ErrNotFound + } + return err + }) +} + +func (ms *MongoStorageNew) GetChargerProfileDrv(tenant, id string) (r *ChargerProfile, err error) { + r = new(ChargerProfile) + err = ms.client.UseSession(ms.ctx, func(sctx mongo.SessionContext) (err error) { + cur := ms.getCol(colCpp).FindOne(sctx, bson.M{"tenant": tenant, "id": id}) + if err := cur.Decode(r); err != nil { + if err == mongo.ErrNoDocuments { + return utils.ErrNotFound + } + return err + } + return nil + }) + return +} + +func (ms *MongoStorageNew) SetChargerProfileDrv(r *ChargerProfile) (err error) { + return ms.client.UseSession(ms.ctx, func(sctx mongo.SessionContext) (err error) { + _, err = ms.getCol(colCpp).UpdateOne(sctx, bson.M{"tenant": r.Tenant, "id": r.ID}, + bson.M{"$set": r}, + options.Update().SetUpsert(true), + ) + return err + }) +} + +func (ms *MongoStorageNew) RemoveChargerProfileDrv(tenant, id string) (err error) { + return ms.client.UseSession(ms.ctx, func(sctx mongo.SessionContext) (err error) { + dr, err := ms.getCol(colCpp).DeleteOne(sctx, bson.M{"tenant": tenant, "id": id}) + if dr.DeletedCount == 0 { + return utils.ErrNotFound + } + return err + }) +} diff --git a/engine/storage_mongo_stordb.go b/engine/storage_mongo_stordb.go index 98d97eef6..997d9a310 100644 --- a/engine/storage_mongo_stordb.go +++ b/engine/storage_mongo_stordb.go @@ -80,7 +80,8 @@ func (ms *MongoStorage) GetTpTableIds(tpid, table string, distinct utils.TPDisti Pattern: ".*" + regexp.QuoteMeta(pag.SearchTerm) + ".*", Options: ""}}) } - findMap["$and"] = []bson.M{bson.M{"$or": searchItems}} + // findMap["$and"] = []bson.M{{"$or": searchItems}} //before + findMap["$or"] = searchItems // after } session, col := ms.conn(table) @@ -1005,7 +1006,7 @@ func (ms *MongoStorage) GetCDRs(qryFltr *utils.CDRsFilter, remove bool) ([]*CDR, filters[CostLow] = bson.M{"$gte": *qryFltr.MinCost} } else if *qryFltr.MinCost == 0.0 && *qryFltr.MaxCost == -1.0 { // Special case when we want to skip errors filters["$or"] = []bson.M{ - bson.M{CostLow: bson.M{"$gte": 0.0}}, + {CostLow: bson.M{"$gte": 0.0}}, } } else { filters[CostLow] = bson.M{"$gte": *qryFltr.MinCost, "$lt": *qryFltr.MaxCost} diff --git a/engine/storage_mongo_stordb_new.go b/engine/storage_mongo_stordb_new.go new file mode 100644 index 000000000..08112c1a1 --- /dev/null +++ b/engine/storage_mongo_stordb_new.go @@ -0,0 +1,158 @@ +/* +Real-time Online/Offline Charging System (OCS) for Telecom & ISP environments +Copyright (C) ITsysCOM GmbH + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see +*/ + +package engine + +import ( + // "fmt" + "context" + "regexp" + "strings" + // "time" + + "github.com/cgrates/cgrates/utils" + + "github.com/mongodb/mongo-go-driver/bson" + // "github.com/mongodb/mongo-go-driver/bson/objectid" + "github.com/mongodb/mongo-go-driver/mongo" + "github.com/mongodb/mongo-go-driver/options" + "github.com/mongodb/mongo-go-driver/x/bsonx" +) + +func (ms *MongoStorageNew) GetTpIds(colName string) (tpids []string, err error) { + getTpIDs := func(ctx context.Context, col string, tpMap map[string]struct{}) (map[string]struct{}, error) { + if strings.HasPrefix(col, "tp_") { + result, err := ms.getCol(col).Distinct(ctx, "tpid", nil) + if err != nil { + return tpMap, err + } + for _, tpid := range result { + tpMap[tpid.(string)] = struct{}{} + } + } + return tpMap, nil + } + tpidMap := make(map[string]struct{}) + + if colName == "" { + if err := ms.client.UseSession(ms.ctx, func(sctx mongo.SessionContext) error { + col, err := ms.DB().ListCollections(sctx, nil, options.ListCollections().SetNameOnly(true)) + if err != nil { + return err + } + for col.Next(sctx) { + var elem struct{ Name string } + if err := col.Decode(&elem); err != nil { + return err + } + if tpidMap, err = getTpIDs(sctx, elem.Name, tpidMap); err != nil { + return err + } + } + col.Close(sctx) + return nil + }); err != nil { + return nil, err + } + } else { + if err := ms.client.UseSession(ms.ctx, func(sctx mongo.SessionContext) error { + tpidMap, err = getTpIDs(sctx, colName, tpidMap) + return err + }); err != nil { + return nil, err + } + } + for tpid := range tpidMap { + tpids = append(tpids, tpid) + } + return tpids, nil +} + +func (ms *MongoStorageNew) GetTpTableIds(tpid, table string, distinct utils.TPDistinctIds, filter map[string]string, pag *utils.Paginator) ([]string, error) { + findMap := bson.M{} + if tpid != "" { + findMap["tpid"] = tpid + } + for k, v := range filter { + findMap[k] = v + } + for k, v := range distinct { //fix for MongoStorage on TPUsers + if v == "user_name" { + distinct[k] = "username" + } + } + if pag != nil && pag.SearchTerm != "" { + var searchItems []bson.M + for _, d := range distinct { + searchItems = append(searchItems, bson.M{d: bsonx.Regex(".*"+regexp.QuoteMeta(pag.SearchTerm)+".*", "")}) + } + // findMap["$and"] = []bson.M{{"$or": searchItems}} //before + findMap["$or"] = searchItems // after + } + + fop := options.Find() + if pag != nil { + if pag.Limit != nil { + fop = fop.SetLimit(int64(*pag.Limit)) + } + if pag.Offset != nil { + fop = fop.SetSkip(int64(*pag.Offset)) + } + } + + selectors := bson.M{"_id": 0} + for i, d := range distinct { + if d == "tag" { // convert the tag used in SQL into id used here + distinct[i] = "id" + } + selectors[distinct[i]] = 1 + } + fop.SetProjection(selectors) + + distinctIds := make(utils.StringMap) + if err := ms.client.UseSession(ms.ctx, func(sctx mongo.SessionContext) (err error) { + cur, err := ms.getCol(table).Find(sctx, findMap, fop) + if err != nil { + return err + } + for cur.Next(sctx) { + var elem bson.D + err := cur.Decode(&elem) + if err != nil { + return err + } + item := elem.Map() + + var id string + last := len(distinct) - 1 + for i, d := range distinct { + if distinctValue, ok := item[d]; ok { + id += distinctValue.(string) + } + if i < last { + id += utils.CONCATENATED_KEY_SEP + } + } + distinctIds[id] = true + } + return cur.Close(sctx) + }); err != nil { + return nil, err + } + return distinctIds.Slice(), nil +} diff --git a/glide.lock b/glide.lock index 495b25a58..2e7d527a3 100644 --- a/glide.lock +++ b/glide.lock @@ -1,6 +1,10 @@ -hash: 2daed4c5ed5052824ae5df18b0690a85226f9e3c61c336f83db7fccc6f4ecd51 -updated: 2017-04-21T14:51:07.386488974+02:00 +hash: 47448d94325e62dd3dcce88ebc5ad633efd329dea16f3f3a6f481cd4947eca89 +updated: 2018-11-19T14:47:52.199551832+02:00 imports: +- name: github.com/antchfx/xmlquery + version: 98cdbc3221ed492316cca5a4711e48ee0ca0dc9a +- name: github.com/antchfx/xpath + version: a762252498f5e50d8f368dd0a8748073e4b92f93 - name: github.com/cenkalti/hub version: 11382a9960d39b0ecda16fd01c424c11ff765a34 - name: github.com/cenkalti/rpc2 @@ -15,14 +19,23 @@ imports: version: 0e0d0379606fd8f12b53c6da6aeb28544f7bfa37 - name: github.com/cgrates/ltcache version: 92fb7fa77cca400b55d805e4a6d625443027c7f5 +- name: github.com/cgrates/mgo + version: 04b6cd516663d1f91d8f914e66ae743d3ab1685c + subpackages: + - bson + - internal/json + - internal/sasl + - internal/scram - name: github.com/cgrates/osipsdagram version: 3d6beed663452471dec3ca194137a30d379d9e8f - name: github.com/cgrates/radigo version: e5c8f3272cccf795f47b82e25a8f3408312c14e0 - name: github.com/cgrates/rpcclient version: 7316bff37a2b8692fbadd57f9c9cda070cc33081 +- name: github.com/dlintw/goconf + version: dcc070983490608a14480e3bf943bad464785df5 - name: github.com/fiorix/go-diameter - version: 16028e641c19a8dd67509053bc558d389258ff6d + version: abaf0a5b14a05f3a4a75b8fe23066ab1f898aeac subpackages: - diam - diam/avp @@ -31,27 +44,39 @@ imports: - diam/sm - diam/sm/smparser - diam/sm/smpeer -- name: github.com/ishidawataru/sctp - version: 6e2cb1366111dcf547c13531e3a263a067715847 +- name: github.com/fsnotify/fsnotify + version: ccc981bf80385c528a65fbfdd49bf2d8da22aa23 - name: github.com/go-sql-driver/mysql - version: 99ff426eb706cffe92ff3d058e168b278cabf7c7 + version: 6be42e0ff99645d7d9626d779001a46e39c5f280 +- name: github.com/go-stack/stack + version: 2fee6af1a9795aafbe0253a0cfbdf668e1fb8a9a +- name: github.com/golang/snappy + version: 2e65f85255dbc3072edf28d6b5b8efc472979f5a - name: github.com/gorhill/cronexpr version: 88b0669f7d75f171bd612b874e52b95c190218df +- name: github.com/ishidawataru/sctp + version: 6e2cb1366111dcf547c13531e3a263a067715847 - name: github.com/jinzhu/gorm - version: 5be9bd34135805e0332b993378864b159784d8a8 + version: 472c70caa40267cb89fd8facb07fe6454b578626 - name: github.com/jinzhu/inflection - version: 1c35d901db3da928c72a72d8458480cc9ade058f + version: 04140366298a54a039076d798123ffa108fff46c - name: github.com/kr/pty version: db8e3cd836b82e82e0a9c8edc6896967dd31374f - name: github.com/lib/pq - version: 4ded0e9383f75c197b3a2aaa6d590ac52df6fd79 + version: 9eb73efc1fcc404148b56765b0d3f61d9a5ef8ee subpackages: - oid +- name: github.com/Masterminds/semver + version: c7af12943936e8c39859482e61f0574c2fd7fc75 +- name: github.com/mattn/go-runewidth + version: c88d7e5f2e24de48a200a2655ac8a0910be9a0f7 - name: github.com/mediocregopher/radix.v2 - version: 94360be262532d465b7e4760c7a67195d3319a87 + version: b67df6e626f993b64b3ca9f4b8630900e61002e3 subpackages: - pool + - pubsub - redis + - sentinel - name: github.com/mitchellh/mapstructure version: fa473d140ef3c6adf42d6b391fe76707f1f243c8 - name: github.com/peterh/liner @@ -120,18 +145,15 @@ imports: - name: github.com/Masterminds/semver version: c7af12943936e8c39859482e61f0574c2fd7fc75 - name: github.com/mongodb/mongo-go-driver - version: 53671960ce090c91e7f647f04e09ed469ce22f09 + version: 03d16bbe636981a408ff359412697fa9ff16ec83 subpackages: - bson - bson/bsoncodec - - bson/bsoncore - bson/bsonrw - bson/bsontype - bson/decimal - - bson/elements - bson/objectid - - bson/parser - - bson/parser/ast + - bson/primitive - core/address - core/auth - core/auth/internal/gssapi @@ -142,8 +164,6 @@ imports: - core/description - core/dispatch - core/event - - core/readconcern - - core/readpref - core/result - core/session - core/tag @@ -151,20 +171,26 @@ imports: - core/uuid - core/version - core/wiremessage - - core/writeconcern - - examples/documentation_examples - internal - mongo + - mongo/readconcern + - mongo/readpref + - mongo/writeconcern - options -- name: github.com/pmezard/go-difflib - version: 792786c7400a136282c1664665ae0a8db921c6c2 - subpackages: - - difflib + - x/bsonx + - x/bsonx/bsoncore +- name: github.com/peterh/liner + version: 5a0dfa99e2aa1d433a9642e863da51402e609376 +- name: github.com/streadway/amqp + version: 27835f1a64e97101d95306211f03c0620ffa295d - name: github.com/stretchr/testify - version: f35b8ab0b5a2cef36673838d662e249dd9c94686 + version: 8019298d9fa5a04fc2ad10ae03349df3483096a6 subpackages: - - assert - require +- name: github.com/ugorji/go + version: ce1d12656603bc8fa8009023db97a0f0176ca4b9 + subpackages: + - codec - name: github.com/xdg/scram version: 7eeb5667e42c09cb51bf7b7c28aea8c56767da90 - name: github.com/xdg/stringprep @@ -173,13 +199,45 @@ imports: version: 3d3f9f413869b949e48070b5bc593aa22cc2b8f2 subpackages: - pbkdf2 +- name: golang.org/x/net + version: adae6a3d119ae4890b46832a2e88a95adc62b8e7 + subpackages: + - context + - html + - html/atom + - html/charset + - websocket - name: golang.org/x/sync version: 42b317875d0fa942474b76e1b46a6060d720ae6e subpackages: - semaphore -- name: golang.org/x/text - version: ceefd2213ed29504fff30155163c8f59827734f3 +- name: golang.org/x/sys + version: 93218def8b18e66adbdab3eca8ec334700329f1f subpackages: + - unix +- name: golang.org/x/text + version: 6f44c5a2ea40ee3593d98cdcc905cc1fdaa660e2 + subpackages: + - encoding + - encoding/charmap + - encoding/htmlindex + - encoding/internal + - encoding/internal/identifier + - encoding/japanese + - encoding/korean + - encoding/simplifiedchinese + - encoding/traditionalchinese + - encoding/unicode + - internal/language + - internal/language/compact + - internal/tag + - internal/utf8internal + - language + - runes - transform - unicode/norm +- name: google.golang.org/appengine + version: 4a4468ece617fc8205e99368fa2200e9d1fad421 + subpackages: + - cloudsql testImports: [] diff --git a/glide.yaml b/glide.yaml index 4cb26b8eb..18b363418 100644 --- a/glide.yaml +++ b/glide.yaml @@ -46,8 +46,36 @@ import: - package: github.com/mongodb/mongo-go-driver subpackages: - bson + - bson/bsoncodec + - bson/bsonrw + - bson/bsontype + - bson/decimal + - bson/objectid + - bson/primitive + - core/address + - core/auth + - core/auth/internal/gssapi + - core/command + - core/compressor + - core/connection + - core/connstring + - core/description + - core/dispatch + - core/event + - core/result + - core/session + - core/tag + - core/topology + - core/uuid + - core/version + - core/wiremessage + - internal - mongo + - mongo/readconcern + - mongo/readpref + - mongo/writeconcern - options + - x/bsonx - package: github.com/stretchr/testify subpackages: - require