示例#1
0
    def get_elements(protocol, data_type, data_scope, _id=None, **kwargs):
        storage = Middleware.get_middleware(
            protocol, data_type, data_scope,
            **kwargs
        )
        storage.connect()

        return storage.get_elements(ids=_id) or []
示例#2
0
    def remove_elements(
        protocol, data_type, data_scope,
        _id=None, _filter=None,
        **kwargs
    ):
        storage = Middleware.get_middleware(
            protocol, data_type, data_scope,
            **kwargs
        )
        storage.connect()

        storage.remove_elements(ids=_id, _filter=_filter)
示例#3
0
    def put_element(
        protocol, data_type, data_scope,
        _id=None, element=None,
        **kwargs
    ):
        storage = Middleware.get_middleware(
            protocol, data_type, data_scope,
            **kwargs
        )
        storage.connect()

        if not storage.put_element(element, _id=_id):
            return HTTPError(500, 'Impossible to put element in storage')
示例#4
0
    def test_get_middleware(self):

        protocol = TestUnregisteredMiddleware.__protocol__
        self.assertRaises(
            Middleware.Error, Middleware.get_middleware, protocol=protocol)

        protocol = TestRegisteredMiddleware.__protocol__
        middleware = Middleware.get_middleware(protocol=protocol)
        self.assertEqual(type(middleware), TestRegisteredMiddleware)
        self.assertEqual(middleware.data_scope, DEFAULT_DATA_SCOPE)

        data_type = None
        middleware = Middleware.get_middleware(
            protocol=protocol, data_type=data_type)
        self.assertEqual(type(middleware), TestRegisteredMiddleware)
        self.assertEqual(middleware.data_scope, DEFAULT_DATA_SCOPE)

        data_scope = 'test'
        data_type = TestRegisteredWithDataTypeMiddleware.__datatype__
        middleware = Middleware.get_middleware(
            protocol=protocol, data_type=data_type, data_scope=data_scope)
        self.assertEqual(middleware.data_scope, data_scope)
        self.assertEqual(
            type(middleware), TestRegisteredWithDataTypeMiddleware)
示例#5
0
    def find_elements(
        protocol, data_type, data_scope,
        query=None, projection=None,
        limit=0, skip=0, sort=None,
        with_count=False,
        **kwargs
    ):
        storage = Middleware.get_middleware(
            protocol, data_type, data_scope,
            **kwargs
        )
        storage.connect()

        total = storage.count_elements(query=query)
        result = storage.find_elements(
            query=query, projection=projection,
            limit=limit, skip=skip, sort=sort,
            with_count=with_count
        )

        return result, total
示例#6
0
    def get_middleware(
        self,
        protocol,
        data_type=None,
        data_scope=None,
        auto_connect=None,
        shared=None,
        sharing_scope=None,
        *args,
        **kwargs
    ):
        """
        Load a middleware related to input uri.

        If shared, the result instance is shared among sharing_scope, protocol,
        data_type and data_scope.

        :param protocol: protocol to use
        :type protocol: str

        :param data_type: data type to use
        :type data_type: str

        :param data_scope: data scope to use
        :type data_scope: str

        :param auto_connect: middleware auto_connect parameter
        :type auto_connect: bool

        :param shared: if True, the result is a shared middleware instance
            among managers of the same class. If None, use self.shared.
        :type shared: bool

        :param sharing_scope: scope sharing
        :type sharing_scope: bool

        :return: middleware instance corresponding to input uri and data_scope.
        :rtype: Middleware
        """

        # force data_scope to be self.data_scope if not None
        if self.data_scope is not None:
            data_scope = self.data_scope

        if auto_connect is None:
            auto_connect = self.auto_connect

        if shared is None:
            shared = self.shared

        if sharing_scope is None:
            sharing_scope = self.sharing_scope

        if shared:

            protocols = MiddlewareRegistry.__MIDDLEWARES__.setdefault(sharing_scope, {})

            data_types = protocols.setdefault(protocol, {})

            data_scopes = data_types.setdefault(data_type, {})

            try:
                result = data_scopes.setdefault(
                    data_scope,
                    Middleware.get_middleware(
                        protocol=protocol,
                        data_type=data_type,
                        data_scope=data_scope,
                        auto_connect=auto_connect,
                        *args,
                        **kwargs
                    ),
                )

            except Exception:
                # clean memory in case of error
                if not data_scopes:
                    del data_types[data_type]

                if not data_types:
                    del protocols[protocol]

                if not protocols:
                    del MiddlewareRegistry.__MIDDLEWARES__[sharing_scope]

                # and raise back exception
                raise

        else:
            # get a new middleware instance
            result = Middleware.get_middleware(
                protocol=protocol,
                data_type=data_type,
                data_scope=data_scope,
                auto_connect=auto_connect,
                *args,
                **kwargs
            )

        if hasattr(result, MiddlewareRegistry.DB) and self.db is not None:
            result.db = self.db

        return result