98 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			98 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Python
		
	
	
# -*- coding: utf-8 -*-
 | 
						|
# Copyright 2014 matrix.org
 | 
						|
#
 | 
						|
# Licensed under the Apache License, Version 2.0 (the "License");
 | 
						|
# you may not use this file except in compliance with the License.
 | 
						|
# You may obtain a copy of the License at
 | 
						|
#
 | 
						|
#     http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
#
 | 
						|
# Unless required by applicable law or agreed to in writing, software
 | 
						|
# distributed under the License is distributed on an "AS IS" BASIS,
 | 
						|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
# See the License for the specific language governing permissions and
 | 
						|
# limitations under the License.
 | 
						|
 | 
						|
from synapse.api.errors import SynapseError
 | 
						|
 | 
						|
 | 
						|
class PaginationConfig(object):
 | 
						|
 | 
						|
    """A configuration object which stores pagination parameters."""
 | 
						|
 | 
						|
    def __init__(self, from_tok=None, to_tok=None, limit=0):
 | 
						|
        self.from_tok = from_tok
 | 
						|
        self.to_tok = to_tok
 | 
						|
        self.limit = limit
 | 
						|
 | 
						|
    @classmethod
 | 
						|
    def from_request(cls, request, raise_invalid_params=True):
 | 
						|
        params = {
 | 
						|
            "from_tok": PaginationStream.TOK_START,
 | 
						|
            "to_tok": PaginationStream.TOK_END,
 | 
						|
            "limit": 0
 | 
						|
        }
 | 
						|
 | 
						|
        query_param_mappings = [  # 3-tuple of qp_key, attribute, rules
 | 
						|
            ("from", "from_tok", lambda x: type(x) == str),
 | 
						|
            ("to", "to_tok", lambda x: type(x) == str),
 | 
						|
            ("limit", "limit", lambda x: x.isdigit())
 | 
						|
        ]
 | 
						|
 | 
						|
        for qp, attr, is_valid in query_param_mappings:
 | 
						|
            if qp in request.args:
 | 
						|
                if is_valid(request.args[qp][0]):
 | 
						|
                    params[attr] = request.args[qp][0]
 | 
						|
                elif raise_invalid_params:
 | 
						|
                    raise SynapseError(400, "%s parameter is invalid." % qp)
 | 
						|
 | 
						|
        return PaginationConfig(**params)
 | 
						|
 | 
						|
 | 
						|
class PaginationStream(object):
 | 
						|
 | 
						|
    """ An interface for streaming data as chunks. """
 | 
						|
 | 
						|
    TOK_START = "START"
 | 
						|
    TOK_END = "END"
 | 
						|
 | 
						|
    def get_chunk(self, config=None):
 | 
						|
        """ Return the next chunk in the stream.
 | 
						|
 | 
						|
        Args:
 | 
						|
            config (PaginationConfig): The config to aid which chunk to get.
 | 
						|
        Returns:
 | 
						|
            A dict containing the new start token "start", the new end token
 | 
						|
            "end" and the data "chunk" as a list.
 | 
						|
        """
 | 
						|
        raise NotImplementedError()
 | 
						|
 | 
						|
 | 
						|
class StreamData(object):
 | 
						|
 | 
						|
    """ An interface for obtaining streaming data from a table. """
 | 
						|
 | 
						|
    def __init__(self, hs):
 | 
						|
        self.hs = hs
 | 
						|
        self.store = hs.get_datastore()
 | 
						|
 | 
						|
    def get_rows(self, user_id, from_pkey, to_pkey, limit):
 | 
						|
        """ Get event stream data between the specified pkeys.
 | 
						|
 | 
						|
        Args:
 | 
						|
            user_id : The user's ID
 | 
						|
            from_pkey : The starting pkey.
 | 
						|
            to_pkey : The end pkey. May be -1 to mean "latest".
 | 
						|
            limit: The max number of results to return.
 | 
						|
        Returns:
 | 
						|
            A tuple containing the list of event stream data and the last pkey.
 | 
						|
        """
 | 
						|
        raise NotImplementedError()
 | 
						|
 | 
						|
    def max_token(self):
 | 
						|
        """ Get the latest currently-valid token.
 | 
						|
 | 
						|
        Returns:
 | 
						|
            The latest token."""
 | 
						|
        raise NotImplementedError()
 |