Source code for txmongo.database

# Copyright 2009-2015 The TxMongo Developers.  All rights reserved.
# Use of this source code is governed by the Apache License that can be
# found in the LICENSE file.

from bson.son import SON
from twisted.internet import defer
from txmongo.collection import Collection


[docs]class Database(object): __factory = None def __init__(self, factory, database_name): self.__factory = factory self._database_name = unicode(database_name) def __str__(self): return self._database_name def __repr__(self): return "Database(%r, %r)" % (self.__factory, self._database_name,) def __call__(self, database_name): return Database(self._factory, database_name) def __getitem__(self, collection_name): return Collection(self, collection_name) def __getattr__(self, collection_name): return self[collection_name] @property def name(self): return self._database_name @property def connection(self): return self.__factory
[docs] def create_collection(self, name, options=None): def wrapper(result, deferred, collection): if result.get("ok", 0.0): deferred.callback(collection) else: deferred.errback(RuntimeError(result.get("errmsg", "unknown error"))) deferred = defer.Deferred() collection = Collection(self, name) if options: if "size" in options: options["size"] = float(options["size"]) command = SON({"create": name}) command.update(options) d = self["$cmd"].find_one(command) d.addCallback(wrapper, deferred, collection) else: deferred.callback(collection) return deferred
[docs] def drop_collection(self, name_or_collection): if isinstance(name_or_collection, Collection): name = name_or_collection._collection_name elif isinstance(name_or_collection, basestring): name = name_or_collection else: raise TypeError("name must be an instance of basestring or txmongo.Collection") return self["$cmd"].find_one({"drop": unicode(name)})
[docs] def collection_names(self): def wrapper(results): names = [r["name"] for r in results] names = [n[len(str(self)) + 1:] for n in names if n.startswith(str(self) + ".")] names = [n for n in names if "$" not in n] return names d = self["system.namespaces"].find() d.addCallback(wrapper) return d
@defer.inlineCallbacks
[docs] def authenticate(self, name, password): """ Send an authentication command for this database. mostly stolen from pymongo """ if not isinstance(name, basestring): raise TypeError("name must be an instance of basestring") if not isinstance(password, basestring): raise TypeError("password must be an instance of basestring") """ Authenticating """ yield self.connection.authenticate(self, name, password)