X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=osm_nbi%2Fdbmongo.py;fp=osm_nbi%2Fdbmongo.py;h=0000000000000000000000000000000000000000;hb=a8d63635eecb1c8debab5f674931a453ea39e78d;hp=a8ea1cab0edfd318d2550fe4d55a73ee1ffef834;hpb=0ffaa99c277d76ca49fdbe4d4b6b9df4d7484857;p=osm%2FNBI.git diff --git a/osm_nbi/dbmongo.py b/osm_nbi/dbmongo.py deleted file mode 100644 index a8ea1ca..0000000 --- a/osm_nbi/dbmongo.py +++ /dev/null @@ -1,190 +0,0 @@ -#import pymongo -import logging -from pymongo import MongoClient, errors -from dbbase import DbException, DbBase -from http import HTTPStatus -from time import time, sleep - -__author__ = "Alfonso Tierno " - -# TODO consider use this decorator for database access retries -# @retry_mongocall -# def retry_mongocall(call): -# def _retry_mongocall(*args, **kwargs): -# retry = 1 -# while True: -# try: -# return call(*args, **kwargs) -# except pymongo.AutoReconnect as e: -# if retry == 4: -# raise DbException(str(e)) -# sleep(retry) -# return _retry_mongocall - - -class DbMongo(DbBase): - conn_initial_timout = 120 - conn_timout = 10 - - def __init__(self, logger_name='db'): - self.logger = logging.getLogger(logger_name) - - def db_connect(self, config): - try: - if "logger_name" in config: - self.logger = logging.getLogger(config["logger_name"]) - self.client = MongoClient(config["host"], config["port"]) - self.db = self.client[config["name"]] - if "loglevel" in config: - self.logger.setLevel(getattr(logging, config['loglevel'])) - # get data to try a connection - now = time() - while True: - try: - self.db.users.find_one({"username": "admin"}) - return - except errors.ConnectionFailure as e: - if time() - now >= self.conn_initial_timout: - raise - self.logger.info("Waiting to database up {}".format(e)) - sleep(2) - except errors.PyMongoError as e: - raise DbException(str(e)) - - def db_disconnect(self): - pass # TODO - - @staticmethod - def _format_filter(filter): - try: - db_filter = {} - for query_k, query_v in filter.items(): - dot_index = query_k.rfind(".") - if dot_index > 1 and query_k[dot_index+1:] in ("eq", "ne", "gt", "gte", "lt", "lte", "cont", - "ncont", "neq"): - operator = "$" + query_k[dot_index+1:] - if operator == "$neq": - operator = "$ne" - k = query_k[:dot_index] - else: - operator = "$eq" - k = query_k - - v = query_v - if isinstance(v, list): - if operator in ("$eq", "$cont"): - operator = "$in" - v = query_v - elif operator in ("$ne", "$ncont"): - operator = "$nin" - v = query_v - else: - v = query_v.join(",") - - if operator in ("$eq", "$cont"): - # v cannot be a comma separated list, because operator would have been changed to $in - db_filter[k] = v - elif operator == "$ncount": - # v cannot be a comma separated list, because operator would have been changed to $nin - db_filter[k] = {"$ne": v} - else: - # maybe db_filter[k] exist. e.g. in the query string for values between 5 and 8: "a.gt=5&a.lt=8" - if k not in db_filter: - db_filter[k] = {} - db_filter[k][operator] = v - - return db_filter - except Exception as e: - raise DbException("Invalid query string filter at {}:{}. Error: {}".format(query_k, v, e), - http_code=HTTPStatus.BAD_REQUEST) - - def get_list(self, table, filter={}): - try: - l = [] - collection = self.db[table] - rows = collection.find(self._format_filter(filter)) - for row in rows: - l.append(row) - return l - except DbException: - raise - except Exception as e: # TODO refine - raise DbException(str(e)) - - def get_one(self, table, filter={}, fail_on_empty=True, fail_on_more=True): - try: - if filter: - filter = self._format_filter(filter) - collection = self.db[table] - if not (fail_on_empty and fail_on_more): - return collection.find_one(filter) - rows = collection.find(filter) - if rows.count() == 0: - if fail_on_empty: - raise DbException("Not found any {} with filter='{}'".format(table[:-1], filter), - HTTPStatus.NOT_FOUND) - return None - elif rows.count() > 1: - if fail_on_more: - raise DbException("Found more than one {} with filter='{}'".format(table[:-1], filter), - HTTPStatus.CONFLICT) - return rows[0] - except Exception as e: # TODO refine - raise DbException(str(e)) - - def del_list(self, table, filter={}): - try: - collection = self.db[table] - rows = collection.delete_many(self._format_filter(filter)) - return {"deleted": rows.deleted_count} - except DbException: - raise - except Exception as e: # TODO refine - raise DbException(str(e)) - - def del_one(self, table, filter={}, fail_on_empty=True): - try: - collection = self.db[table] - rows = collection.delete_one(self._format_filter(filter)) - if rows.deleted_count == 0: - if fail_on_empty: - raise DbException("Not found any {} with filter='{}'".format(table[:-1], filter), - HTTPStatus.NOT_FOUND) - return None - return {"deleted": rows.deleted_count} - except Exception as e: # TODO refine - raise DbException(str(e)) - - def create(self, table, indata): - try: - collection = self.db[table] - data = collection.insert_one(indata) - return data.inserted_id - except Exception as e: # TODO refine - raise DbException(str(e)) - - def set_one(self, table, filter, update_dict, fail_on_empty=True): - try: - collection = self.db[table] - rows = collection.update_one(self._format_filter(filter), {"$set": update_dict}) - if rows.updated_count == 0: - if fail_on_empty: - raise DbException("Not found any {} with filter='{}'".format(table[:-1], filter), - HTTPStatus.NOT_FOUND) - return None - return {"deleted": rows.deleted_count} - except Exception as e: # TODO refine - raise DbException(str(e)) - - def replace(self, table, id, indata, fail_on_empty=True): - try: - collection = self.db[table] - rows = collection.replace_one({"_id": id}, indata) - if rows.modified_count == 0: - if fail_on_empty: - raise DbException("Not found any {} with filter='{}'".format(table[:-1], filter), - HTTPStatus.NOT_FOUND) - return None - return {"replace": rows.modified_count} - except Exception as e: # TODO refine - raise DbException(str(e))