stacktracecursor.py 1.1 KB
"""Module for substitution database cursors.
"""

from django.db.backends.util import CursorWrapper
from django.utils.encoding import smart_unicode

from .stacktrace import get_stacktrace


class StacktraceCursorWrapper(CursorWrapper):
    """Wrapper for substitution the CursorWrapper.
    Added to SQl-query a comment with python stack trace.
    """

    def execute(self, sql, params=()):
        try:
            stacks = get_stacktrace()
            stacktrace = []
            for stack in stacks:
                stacktrace.append(
                    u"""File "{0}", line {1}, in {2}\n\t{3}""".format(
                        *[smart_unicode(stack_data) for stack_data in
                          stack]).replace("%", "%%"))
            stacktrace = "\n".join(stacktrace)
            stacktrace = stacktrace.replace('/*', '\/\*').replace('*/', '\*\/')
        except:
            stacktrace = u"WITHOUT STACKTRACE"
        sql = u"{sql} \n/* {stacktrace} \n*/".format(stacktrace=stacktrace,
                                                     sql=smart_unicode(sql))
        return self.cursor.execute(sql, params)