sql_db: Avoid using inspect.stack(), use failsafe alternative.

Inspecting the full stack just to learn the file:line info for debugging
purposes is both expensive and error-prone. Write an alternative function
in tools/func.py that will just go N frames back and try to get the info.

bzr revid: p_christ@hol.gr-20101123135742-2jp75f3uxyg3a6b6
This commit is contained in:
P. Christeas 2010-11-23 15:57:42 +02:00
parent 962a4cce70
commit 6cd5fec0e2
2 changed files with 24 additions and 3 deletions

View File

@ -51,11 +51,11 @@ psycopg2.extensions.register_type(psycopg2.extensions.new_type((700, 701, 1700,)
import tools
from tools.func import wraps
from tools.func import wraps, frame_codeinfo
from datetime import datetime as mdt
from datetime import timedelta
import threading
from inspect import stack
from inspect import currentframe
import re
re_from = re.compile('.* from "?([a-zA-Z_0-9]+)"? .*$');
@ -93,7 +93,7 @@ class Cursor(object):
self._obj = self._cnx.cursor(cursor_factory=psycopg1cursor)
self.__closed = False # real initialisation value
self.autocommit(False)
self.__caller = tuple(stack()[2][1:3])
self.__caller = frame_codeinfo(currentframe(),2)
def __del__(self):
if not self.__closed:

View File

@ -93,3 +93,24 @@ def synchronized(lock_attr='_lock'):
return decorator
from inspect import getsourcefile
def frame_codeinfo(fframe, back=0):
""" Return a (filename, line) pair for a previous frame .
@return (filename, lineno) where lineno is either int or string==''
"""
try:
if not fframe:
return ("<unknown>", '')
for i in range(back):
fframe = fframe.f_back
try:
fname = getsourcefile(fframe)
except TypeError:
fname = '<builtin>'
lineno = fframe.f_lineno or ''
return (fname, lineno)
except Exception:
return ("<unknown>", '')