X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=osm_common%2Fdbmongo.py;h=56f387b5b8ad5931617064bbc68b097ef4da5391;hb=277c931191194490c5595307c22b721d94294254;hp=16da6e7762bef2ff6d9c0ef763af19ee84ceccfe;hpb=f71fcff0e66c178f6edcaf7c6f35b15eafe9f3ba;p=osm%2Fcommon.git diff --git a/osm_common/dbmongo.py b/osm_common/dbmongo.py index 16da6e7..56f387b 100644 --- a/osm_common/dbmongo.py +++ b/osm_common/dbmongo.py @@ -23,6 +23,7 @@ from http import HTTPStatus from time import time, sleep from copy import deepcopy from base64 import b64decode +from uuid import uuid4 __author__ = "Alfonso Tierno " @@ -98,9 +99,9 @@ class DbMongo(DbBase): self.database_key = master_key self.set_secret_key(master_key) if config.get("uri"): - self.client = MongoClient(config["uri"]) + self.client = MongoClient(config["uri"], replicaSet=config.get("replicaset", None)) else: - self.client = MongoClient(config["host"], config["port"]) + self.client = MongoClient(config["host"], config["port"], replicaSet=config.get("replicaset", None)) # TODO add as parameters also username=config.get("user"), password=config.get("password")) # when all modules are ready self.db = self.client[config["name"]] @@ -343,7 +344,26 @@ class DbMongo(DbBase): except Exception as e: # TODO refine raise DbException(e) - def set_one(self, table, q_filter, update_dict, fail_on_empty=True, unset=None, pull=None, push=None): + def create_list(self, table, indata_list): + """ + Add several entries at once + :param table: collection or table + :param indata_list: content list to be added. + :return: the list of inserted '_id's. Exception on error + """ + try: + for item in indata_list: + if item.get("_id") is None: + item["_id"] = str(uuid4()) + with self.lock: + collection = self.db[table] + data = collection.insert_many(indata_list) + return data.inserted_ids + except Exception as e: # TODO refine + raise DbException(e) + + def set_one(self, table, q_filter, update_dict, fail_on_empty=True, unset=None, pull=None, push=None, + push_list=None, pull_list=None): """ Modifies an entry at database :param table: collection or table @@ -355,8 +375,11 @@ class DbMongo(DbBase): ignored. If not exist, it is ignored :param pull: Plain dictionary with the content to be removed from an array. It is a dot separated keys and value if exist in the array is removed. If not exist, it is ignored + :param pull_list: Same as pull but values are arrays where each item is removed from the array :param push: Plain dictionary with the content to be appended to an array. It is a dot separated keys and value is appended to the end of the array + :param push_list: Same as push but values are arrays where each item is and appended instead of appending the + whole array :return: Dict with the number of entries modified. None if no matching is found. """ try: @@ -365,10 +388,14 @@ class DbMongo(DbBase): db_oper["$set"] = update_dict if unset: db_oper["$unset"] = unset - if pull: - db_oper["$pull"] = pull - if push: - db_oper["$push"] = push + if pull or pull_list: + db_oper["$pull"] = pull or {} + if pull_list: + db_oper["$pull"].update({k: {"$in": v} for k, v in pull_list.items()}) + if push or push_list: + db_oper["$push"] = push or {} + if push_list: + db_oper["$push"].update({k: {"$each": v} for k, v in push_list.items()}) with self.lock: collection = self.db[table] @@ -382,7 +409,7 @@ class DbMongo(DbBase): except Exception as e: # TODO refine raise DbException(e) - def set_list(self, table, q_filter, update_dict, unset=None, pull=None, push=None): + def set_list(self, table, q_filter, update_dict, unset=None, pull=None, push=None, push_list=None, pull_list=None): """ Modifies al matching entries at database :param table: collection or table @@ -392,8 +419,11 @@ class DbMongo(DbBase): ignored. If not exist, it is ignored :param pull: Plain dictionary with the content to be removed from an array. It is a dot separated keys and value if exist in the array is removed. If not exist, it is ignored - :param push: Plain dictionary with the content to be appended to an array. It is a dot separated keys and value - is appended to the end of the array + :param push: Plain dictionary with the content to be appended to an array. It is a dot separated keys, the + single value is appended to the end of the array + :param pull_list: Same as pull but values are arrays where each item is removed from the array + :param push_list: Same as push but values are arrays where each item is and appended instead of appending the + whole array :return: Dict with the number of entries modified """ try: @@ -402,10 +432,14 @@ class DbMongo(DbBase): db_oper["$set"] = update_dict if unset: db_oper["$unset"] = unset - if pull: - db_oper["$pull"] = pull - if push: - db_oper["$push"] = push + if pull or pull_list: + db_oper["$pull"] = pull or {} + if pull_list: + db_oper["$pull"].update({k: {"$in": v} for k, v in pull_list.items()}) + if push or push_list: + db_oper["$push"] = push or {} + if push_list: + db_oper["$push"].update({k: {"$each": v} for k, v in push_list.items()}) with self.lock: collection = self.db[table] rows = collection.update_many(self._format_filter(q_filter), db_oper)