Remove a memory leak.

This commit is contained in:
Friedrich Lindenberg 2013-02-27 23:10:05 +01:00
parent ad6bb4834a
commit 867008c016

View File

@ -12,9 +12,6 @@ from migrate.versioning.util import construct_engine
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
lock = RLock() lock = RLock()
TABLES = defaultdict(dict)
INDEXES = dict()
def connect(url): def connect(url):
""" Create an engine for the given database URL. """ """ Create an engine for the given database URL. """
kw = {} kw = {}
@ -27,6 +24,8 @@ def connect(url):
meta = MetaData() meta = MetaData()
meta.bind = engine meta.bind = engine
engine._metadata = meta engine._metadata = meta
engine._tables = dict()
engine._indexes = dict()
return engine return engine
def create_table(engine, table_name): def create_table(engine, table_name):
@ -36,14 +35,14 @@ def create_table(engine, table_name):
col = Column('id', Integer, primary_key=True) col = Column('id', Integer, primary_key=True)
table.append_column(col) table.append_column(col)
table.create(engine) table.create(engine)
TABLES[engine][table_name] = table engine._tables[table_name] = table
return table return table
def load_table(engine, table_name): def load_table(engine, table_name):
with lock: with lock:
log.debug("Loading table: %s on %r" % (table_name, engine)) log.debug("Loading table: %s on %r" % (table_name, engine))
table = Table(table_name, engine._metadata, autoload=True) table = Table(table_name, engine._metadata, autoload=True)
TABLES[engine][table_name] = table engine._tables[table_name] = table
return table return table
def get_table(engine, table_name): def get_table(engine, table_name):
@ -52,8 +51,8 @@ def get_table(engine, table_name):
engine = engine.engine engine = engine.engine
with lock: with lock:
if table_name in TABLES[engine]: if table_name in engine._tables:
return TABLES[engine][table_name] return engine._tables[table_name]
if engine.has_table(table_name): if engine.has_table(table_name):
return load_table(engine, table_name) return load_table(engine, table_name)
else: else:
@ -65,14 +64,14 @@ def drop_table(engine, table_name):
engine = engine.engine engine = engine.engine
with lock: with lock:
if table_name in TABLES[engine]: if table_name in engine._tables:
table = TABLES[engine][table_name] table = engine._tables[table_name]
elif engine.has_table(table_name): elif engine.has_table(table_name):
table = Table(table_name, engine._metadata) table = Table(table_name, engine._metadata)
else: else:
return return
table.drop(engine) table.drop(engine)
TABLES[engine].pop(table_name, None) engine._tables.pop(table_name, None)
def _guess_type(sample): def _guess_type(sample):
if isinstance(sample, bool): if isinstance(sample, bool):
@ -113,14 +112,14 @@ def create_index(engine, table, columns, name=None):
if not name: if not name:
sig = abs(hash('||'.join(columns))) sig = abs(hash('||'.join(columns)))
name = 'ix_%s_%s' % (table.name, sig) name = 'ix_%s_%s' % (table.name, sig)
if name in INDEXES: if name in engine._indexes:
return INDEXES[name] return engine._indexes[name]
try: try:
columns = [table.c[c] for c in columns] columns = [table.c[c] for c in columns]
idx = Index(name, *columns) idx = Index(name, *columns)
idx.create(engine) idx.create(engine)
except: except:
idx = None idx = None
INDEXES[name] = idx engine._indexes[name] = idx
return idx return idx