// deleteOldPlaceholderCharmsOps returns the txn ops required to delete all placeholder charm // records older than the specified charm URL. func deleteOldPlaceholderCharmsOps(st *State, charms mongo.Collection, curl *charm.URL) ([]txn.Op, error) { // Get a regex with the charm URL and no revision. noRevURL := curl.WithRevision(-1) curlRegex := "^" + regexp.QuoteMeta(st.docID(noRevURL.String())) var docs []charmDoc query := bson.D{{"_id", bson.D{{"$regex", curlRegex}}}, {"placeholder", true}} err := charms.Find(query).Select(bson.D{{"_id", 1}, {"url", 1}}).All(&docs) if err != nil { return nil, errors.Trace(err) } var ops []txn.Op for _, doc := range docs { if doc.URL.Revision >= curl.Revision { continue } ops = append(ops, txn.Op{ C: charmsC, Id: doc.DocID, Assert: stillPlaceholder, Remove: true, }) } return ops, nil }
// getEntitiesWithStatuses returns the ids for all entities that // have history entries func getEntitiesWithStatuses(coll mongo.Collection) ([]string, error) { var globalKeys []string err := coll.Find(nil).Distinct("globalkey", &globalKeys) if err != nil { return nil, errors.Trace(err) } return globalKeys, nil }
// getEntitiesWithStatuses returns the ids for all entities that // have history entries func getEntitiesWithStatuses(coll mongo.Collection) ([]string, error) { var entityKeys []string err := coll.Find(nil).Distinct("entityid", &entityKeys) if err != nil { return nil, errors.Trace(err) } return entityKeys, nil }
// getOldestTimeToKeep returns the create time for the oldest // status log to be kept. func getOldestTimeToKeep(coll mongo.Collection, globalKey string, size int) (int64, bool, error) { result := historicalStatusDoc{} err := coll.Find(bson.D{{"globalkey", globalKey}}).Sort("-updated").Skip(size - 1).One(&result) if err == mgo.ErrNotFound { return -1, false, nil } if err != nil { return -1, false, errors.Trace(err) } return result.Updated, true, nil }
// readEntries reads all lease data for the client's namespace. func (client *client) readEntries(collection mongo.Collection) (map[string]entry, error) { // Read all lease documents in the client's namespace. query := bson.M{ fieldType: typeLease, fieldNamespace: client.config.Namespace, } iter := collection.Find(query).Iter() // Extract valid entries for each one. entries := make(map[string]entry) var leaseDoc leaseDoc for iter.Next(&leaseDoc) { name, entry, err := leaseDoc.entry() if err != nil { return nil, errors.Annotatef(err, "corrupt lease document %q", leaseDoc.Id) } entries[name] = entry } if err := iter.Close(); err != nil { return nil, errors.Trace(err) } return entries, nil }
func isNotDeadWithSession(coll mongo.Collection, id interface{}) (bool, error) { n, err := coll.Find(bson.D{{"_id", id}, {"life", bson.D{{"$ne", Dead}}}}).Count() return n == 1, err }
func isAliveWithSession(coll mongo.Collection, id interface{}) (bool, error) { n, err := coll.Find(bson.D{{"_id", id}, {"life", Alive}}).Count() return n == 1, err }