From: Michael Tremer Date: Sun, 18 Nov 2012 19:11:47 +0000 (+0100) Subject: Reduce number of required database queries. X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9fa1787c199b30b1a6afbca5117b9def6edab621;p=pbs.git Reduce number of required database queries. --- diff --git a/backend/builders.py b/backend/builders.py index 41595f72..6ce1365e 100644 --- a/backend/builders.py +++ b/backend/builders.py @@ -38,9 +38,9 @@ class Builders(base.Object): return builder def get_all(self): - builders = self.db.query("SELECT id FROM builders WHERE NOT status = 'deleted' ORDER BY name") + builders = self.db.query("SELECT * FROM builders WHERE NOT status = 'deleted' ORDER BY name") - return [Builder(self.pakfire, b.id) for b in builders] + return [Builder(self.pakfire, b.id, b) for b in builders] def get_by_id(self, id): if not id: @@ -49,10 +49,10 @@ class Builders(base.Object): return Builder(self.pakfire, id) def get_by_name(self, name): - builder = self.db.get("SELECT id FROM builders WHERE name = %s LIMIT 1", name) + builder = self.db.get("SELECT * FROM builders WHERE name = %s LIMIT 1", name) if builder: - return Builder(self.pakfire, builder.id) + return Builder(self.pakfire, builder.id, builder) def get_all_arches(self): arches = set() @@ -117,13 +117,13 @@ class Builders(base.Object): class Builder(base.Object): - def __init__(self, pakfire, id): + def __init__(self, pakfire, id, data=None): base.Object.__init__(self, pakfire) self.id = id # Cache. - self._data = None + self._data = data self._active_jobs = None self._arches = None self._disabled_arches = None diff --git a/backend/builds.py b/backend/builds.py index a9f4e407..2d67da9a 100644 --- a/backend/builds.py +++ b/backend/builds.py @@ -634,6 +634,9 @@ class Build(base.Object): def state(self): return self.data.state + def is_broken(self): + return self.state == "broken" + def obsolete_others(self): if not self.type == "release": return @@ -1218,7 +1221,7 @@ class Jobs(base.Object): """ Get all jobs in the specifies build. """ - query = "SELECT id FROM jobs WHERE build_id = %s" + query = "SELECT * FROM jobs WHERE build_id = %s" args = [build_id,] if type: @@ -1228,7 +1231,7 @@ class Jobs(base.Object): # Get IDs of all builds in this group. jobs = [] for job in self.db.query(query, *args): - job = Job(self.pakfire, job.id) + job = Job(self.pakfire, job.id, job) # If the Build object was set, we set it so it won't be retrieved # from the database again. @@ -1246,7 +1249,7 @@ class Jobs(base.Object): if uploads: running_states.append("uploading") - query = "SELECT id FROM jobs WHERE (%s)" % \ + query = "SELECT * FROM jobs WHERE (%s)" % \ " OR ".join(["state = '%s'" % s for s in running_states]) if host_id: @@ -1254,7 +1257,7 @@ class Jobs(base.Object): query += " ORDER BY time_started DESC" - return [Job(self.pakfire, j.id) for j in self.db.query(query)] + return [Job(self.pakfire, j.id, j) for j in self.db.query(query)] def get_next_iter(self, arches=None, limit=None, offset=None, type=None, states=["pending", "new"], max_tries=None): args = [] @@ -1279,7 +1282,7 @@ class Jobs(base.Object): conditions.append("jobs.tries <= %s") args.append(max_tries) - query = "SELECT jobs.id AS id FROM jobs \ + query = "SELECT jobs.* FROM jobs \ JOIN builds ON jobs.build_id = builds.id" if conditions: @@ -1303,7 +1306,7 @@ class Jobs(base.Object): args += [limit] for job in self.db.query(query, *args): - yield Job(self.pakfire, job.id) + yield Job(self.pakfire, job.id, job) def get_next(self, *args, **kwargs): jobs = [] @@ -1315,7 +1318,7 @@ class Jobs(base.Object): return jobs def get_latest(self, builder=None, limit=10): - query = "SELECT id FROM jobs" + query = "SELECT * FROM jobs" #where = ["time_finished IS NOT NULL",] where = ["(state = 'finished' OR state = 'failed')"] @@ -1327,7 +1330,7 @@ class Jobs(base.Object): query += " ORDER BY time_finished DESC LIMIT %s" - return [Job(self.pakfire, j.id) for j in self.db.query(query, limit)] + return [Job(self.pakfire, j.id, j) for j in self.db.query(query, limit)] def get_average_build_time(self): """ @@ -1370,14 +1373,14 @@ class Jobs(base.Object): class Job(base.Object): - def __init__(self, pakfire, id): + def __init__(self, pakfire, id, data=None): base.Object.__init__(self, pakfire) # The ID of this Job object. self.id = id # Cache the data of this object. - self._data = None + self._data = data self._build = None self._builder = None self._packages = None diff --git a/backend/distribution.py b/backend/distribution.py index b7d0c2e6..27f52d96 100644 --- a/backend/distribution.py +++ b/backend/distribution.py @@ -13,21 +13,21 @@ from repository import Repository, RepositoryAux class Distributions(base.Object): def get_all(self): - distros = self.db.query("SELECT id FROM distributions ORDER BY name") + distros = self.db.query("SELECT * FROM distributions ORDER BY name") - return [Distribution(self.pakfire, d.id) for d in distros] + return [Distribution(self.pakfire, d.id, d) for d in distros] def get_by_id(self, id): - distro = self.db.get("SELECT id FROM distributions WHERE id = %s LIMIT 1", id) + distro = self.db.get("SELECT * FROM distributions WHERE id = %s LIMIT 1", id) if distro: - return Distribution(self.pakfire, distro.id) + return Distribution(self.pakfire, distro.id, distro) def get_by_name(self, name): - distro = self.db.get("SELECT id FROM distributions WHERE sname = %s LIMIT 1", name) + distro = self.db.get("SELECT * FROM distributions WHERE sname = %s LIMIT 1", name) if distro: - return Distribution(self.pakfire, distro.id) + return Distribution(self.pakfire, distro.id, distro) def get_by_ident(self, ident): return self.get_by_name(ident) @@ -38,11 +38,11 @@ class Distributions(base.Object): class Distribution(base.Object): - def __init__(self, pakfire, id): + def __init__(self, pakfire, id, data=None): base.Object.__init__(self, pakfire) self.id = id - self._data = None + self._data = data self._arches = None self._sources = None diff --git a/backend/repository.py b/backend/repository.py index dd95586e..a9c1ddf9 100644 --- a/backend/repository.py +++ b/backend/repository.py @@ -9,15 +9,15 @@ import packages class Repositories(base.Object): def get_all(self): - repos = self.db.query("SELECT id FROM repositories") + repos = self.db.query("SELECT * FROM repositories") - return [Repository(self.pakfire, r.id) for r in repos] + return [Repository(self.pakfire, r.id, r) for r in repos] def get_by_id(self, repo_id): - repo = self.db.get("SELECT id FROM repositories WHERE id = %s", repo_id) + repo = self.db.get("SELECT * FROM repositories WHERE id = %s", repo_id) if repo: - return Repository(self.pakfire, repo.id) + return Repository(self.pakfire, repo.id, repo) def get_needs_update(self, limit=None): query = "SELECT id FROM repositories WHERE needs_update = 'Y'" @@ -54,12 +54,12 @@ class Repositories(base.Object): class Repository(base.Object): - def __init__(self, pakfire, id): + def __init__(self, pakfire, id, data=None): base.Object.__init__(self, pakfire) self.id = id # Cache. - self._data = None + self._data = data self._next = None self._prev = None self._key = None @@ -68,8 +68,7 @@ class Repository(base.Object): @property def data(self): if self._data is None: - self._data = \ - self.db.get("SELECT * FROM repositories WHERE id = %s", self.id) + self._data = self.db.get("SELECT * FROM repositories WHERE id = %s", self.id) return self._data