X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=osm_common%2Fdbmongo.py;h=6eb5ef50d8e11df539c42445cf3b6788fefaa88e;hb=refs%2Fchanges%2F80%2F8380%2F3;hp=5334ef91ecbcadc00dc3930cdc32c421a21ee905;hpb=d63ea273e23c9e1350ed300872f703faf4ddc3c7;p=osm%2Fcommon.git diff --git a/osm_common/dbmongo.py b/osm_common/dbmongo.py index 5334ef9..6eb5ef5 100644 --- a/osm_common/dbmongo.py +++ b/osm_common/dbmongo.py @@ -66,6 +66,22 @@ class DbMongo(DbBase): super().__init__(logger_name, lock) self.client = None self.db = None + self.database_key = None + self.secret_obtained = False + # ^ This is used to know if database serial has been got. Database is inited by NBI, who generates the serial + # In case it is not ready when connected, it should be got later on before any decrypt operation + + def get_secret_key(self): + if self.secret_obtained: + return + + self.secret_key = None + if self.database_key: + self.set_secret_key(self.database_key) + version_data = self.get_one("admin", {"_id": "version"}, fail_on_empty=False, fail_on_more=True) + if version_data and version_data.get("serial"): + self.set_secret_key(b64decode(version_data["serial"])) + self.secret_obtained = True def db_connect(self, config, target_version=None): """ @@ -79,6 +95,7 @@ class DbMongo(DbBase): self.logger = logging.getLogger(config["logger_name"]) master_key = config.get("commonkey") or config.get("masterpassword") if master_key: + self.database_key = master_key self.set_secret_key(master_key) if config.get("uri"): self.client = MongoClient(config["uri"]) @@ -104,6 +121,7 @@ class DbMongo(DbBase): raise DbException("Invalid database version {}. Expected {}".format(db_version, target_version)) # get serial if version_data and version_data.get("serial"): + self.secret_obtained = True self.set_secret_key(b64decode(version_data["serial"])) self.logger.info("Connected to database {} version {}".format(config["name"], db_version)) return @@ -221,6 +239,25 @@ class DbMongo(DbBase): except Exception as e: # TODO refine raise DbException(e) + def count(self, table, q_filter=None): + """ + Count the number of entries matching q_filter + :param table: collection or table + :param q_filter: Filter + :return: number of entries found (can be zero) + :raise: DbException on error + """ + try: + with self.lock: + collection = self.db[table] + db_filter = self._format_filter(q_filter) + count = collection.count(db_filter) + return count + except DbException: + raise + except Exception as e: # TODO refine + raise DbException(e) + def get_one(self, table, q_filter=None, fail_on_empty=True, fail_on_more=True): """ Obtain one entry matching q_filter