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()
 |