Index: paginate.py =================================================================== --- paginate.py (revision 3580) +++ paginate.py (working copy) @@ -31,6 +31,14 @@ log = logging.getLogger("turbogears.paginate") +# lists of databases that lack support for OFFSET +# this will need to be updated periodically as modules change +_so_no_offset = 'mssql maxdb sybase'.split() +_sa_no_offset = 'mssql maxdb access'.split() + +# this is a global that is set the first time paginate() is called +_simulate_offset = None + def paginate(var_name, default_order='', default_reversed=False, limit=10, allow_limit_override=False, max_pages=5, dynamic_limit=None): ''' @@ -200,8 +208,31 @@ # we replace the var with the sliced one endpoint = offset + limit_ log.debug("slicing data between %d and %d", offset, endpoint) - output[var_name] = var_data[offset:endpoint] + global _simulate_offset + get = turbogears.config.get + if _simulate_offset is None: + _simulate_offset = get('paginate.simulate_offset', None) + if _simulate_offset is None: + _simulate_offset = False + so_db = get('sqlobject.dburi', 'NOMATCH:').split(':', 1)[0] + sa_db = get('sqlalchemy.dburi', 'NOMATCH:').split(':', 1)[0] + if so_db in _so_no_offset or sa_db in _sa_no_offset: + _simulate_offset = True + log.warning("simulating OFFSET, paginate may be slow") + log.warning("to turn off, set " + "paginate.simulate_offset=False") + + if _simulate_offset: + var_data_iter = iter(var_data[:endpoint]) + # skip over the number of records specified by offset + for i in range(offset): + var_data_iter.next() + # return the records that remain + output[var_name] = list(var_data_iter) + else: + output[var_name] = var_data[offset:endpoint] + return output return decorated return weak_signature_decorator(entangle)