
    def execute(self, req, db=None, cached_ids=None):
        if not db:
            db = self.env.get_db_cnx()
        cursor = db.cursor()

        sql, args = self.get_sql(req, cached_ids)

        self.env.log.debug("Query SQL: " + sql % tuple([repr(a) for a in args])) 
        try:
            cursor.execute(sql, args)
        except:
            db.rollback()
            raise
        columns = get_column_names(cursor)
        fields = []
        for column in columns:
            fields += [f for f in self.fields if f['name'] == column] or [None]
        results = []

        column_indices = range(len(columns))
        restrict_ids = []
        for row in cursor:
            result = {}
            for i in column_indices:
                name, field, val = columns[i], fields[i], row[i]
                if name == self.group:
                    val = val or 'None'
                elif name == 'reporter':
                    val = val or 'anonymous'
                elif name == 'id':
                    val = int(val)
                    result['href'] = req.href.ticket(val)
                elif val is None:
                    val = '--'
                elif name in ('changetime', 'time'):
                    val = datetime.fromtimestamp(int(val or 0), utc)
                elif field and field['type'] == 'checkbox':
                    try:
                        val = bool(int(val))
                    except (TypeError, ValueError):
                        val = False
                result[name] = val
            if 'TICKET_VIEW' in req.perm('ticket', result['id']):
                restrict_ids.append(result['id'])
                results.append(result)
        if len(restrict_ids) > 0:
            self.constraints['id'] = []
            self.constraints['id'].append ("%s" % (','.join([str(id) for id in restrict_ids])))
        cursor.close()

        self.num_items = len(results)

        if self.num_items <= self.max:
            self.has_more_pages = False

        if self.has_more_pages:
            max = self.max
            if self.group:
                max += 1
            if (self.page > int(ceil(float(self.num_items) / self.max)) and
                self.num_items != 0):
                raise TracError(_('Page %(page)s is beyond the number of '
                                  'pages in the query', page=self.page))
            # re-query
            sql, args = self.get_sql(req, cached_ids)
            sql = sql + " LIMIT %d OFFSET %d" % (max, self.offset)
            self.env.log.debug("Query SQL: " + sql % tuple([repr(a) for a in args]))

            cursor = db.cursor()

            try:
                cursor.execute(sql, args)
            except:
                db.rollback()
                raise

            results = []
            for row in cursor:
                result = {}
                for i in column_indices:
                    name, field, val = columns[i], fields[i], row[i]
                    if name == self.group:
                        val = val or 'None'
                    elif name == 'reporter':
                        val = val or 'anonymous'
                    elif name == 'id':
                        val = int(val)
                        result['href'] = req.href.ticket(val)
                    elif val is None:
                        val = '--'
                    elif name in ('changetime', 'time'):
                        val = datetime.fromtimestamp(int(val or 0), utc)
                    elif field and field['type'] == 'checkbox':
                        try:
                            val = bool(int(val))
                        except (TypeError, ValueError):
                            val = False
                    result[name] = val
                if 'TICKET_VIEW' in req.perm('ticket', result['id']):
                    results.append(result)
            cursor.close()

        return results


