Calculate dependencies with fewer sqlite queries.

This commit is contained in:
Avery Pennarun 2010-12-09 02:13:36 -08:00
commit fb79851530
2 changed files with 21 additions and 11 deletions

View file

@ -25,13 +25,12 @@ def dirty_deps(f, depth, max_changed):
debug('%s-- DIRTY (mtime)\n' % depth) debug('%s-- DIRTY (mtime)\n' % depth)
return True return True
for mode,name in f.deps(): for mode,f2 in f.deps():
if mode == 'c': if mode == 'c':
if os.path.exists(name): if os.path.exists(os.path.join(vars.BASE, f2.name)):
debug('%s-- DIRTY (created)\n' % depth) debug('%s-- DIRTY (created)\n' % depth)
return True return True
elif mode == 'm': elif mode == 'm':
f2 = state.File(name=os.path.join(vars.BASE, name))
if dirty_deps(f2, depth = depth + ' ', if dirty_deps(f2, depth = depth + ' ',
max_changed = f.changed_runid): max_changed = f.changed_runid):
debug('%s-- DIRTY (sub)\n' % depth) debug('%s-- DIRTY (sub)\n' % depth)

View file

@ -112,8 +112,15 @@ class File(object):
__slots__ = ['id', 'name', 'is_generated', __slots__ = ['id', 'name', 'is_generated',
'checked_runid', 'changed_runid', 'checked_runid', 'changed_runid',
'stamp', 'csum'] 'stamp', 'csum']
def _init_from_cols(self, cols):
(self.id, self.name, self.is_generated,
self.checked_runid, self.changed_runid,
self.stamp, self.csum) = cols
def __init__(self, id=None, name=None): def __init__(self, id=None, name=None, cols=None):
if cols:
return self._init_from_cols(cols)
q = ('select rowid, name, is_generated, checked_runid, changed_runid, ' q = ('select rowid, name, is_generated, checked_runid, changed_runid, '
' stamp, csum ' ' stamp, csum '
' from Files ') ' from Files ')
@ -136,9 +143,7 @@ class File(object):
d.commit() d.commit()
row = d.execute(q, l).fetchone() row = d.execute(q, l).fetchone()
assert(row) assert(row)
(self.id, self.name, self.is_generated, self._init_from_cols(row)
self.checked_runid, self.changed_runid,
self.stamp, self.csum) = row
def save(self): def save(self):
if not os.path.exists('%s/.redo' % vars.BASE): if not os.path.exists('%s/.redo' % vars.BASE):
@ -180,11 +185,17 @@ class File(object):
and self.changed_runid >= self.checked_runid)) and self.changed_runid >= self.checked_runid))
def deps(self): def deps(self):
q = "select mode, source from Deps where target=?" q = ('select Deps.mode, Deps.source, '
for mode,source_id in db().execute(q, [self.id]).fetchall(): ' name, is_generated, checked_runid, changed_runid, '
' stamp, csum '
' from Files '
' join Deps on Files.rowid = Deps.source '
' where target=?')
for row in db().execute(q, [self.id]).fetchall():
mode = row[0]
cols = row[1:]
assert(mode in ('c', 'm')) assert(mode in ('c', 'm'))
name = File(id=source_id).name yield mode,File(cols=cols)
yield mode,name
def zap_deps(self): def zap_deps(self):
debug2('zap-deps: %r\n' % self.name) debug2('zap-deps: %r\n' % self.name)