aboutsummaryrefslogtreecommitdiffstats
path: root/lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/db/buildrequests.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/db/buildrequests.py')
-rw-r--r--lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/db/buildrequests.py284
1 files changed, 0 insertions, 284 deletions
diff --git a/lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/db/buildrequests.py b/lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/db/buildrequests.py
deleted file mode 100644
index 33091c90..00000000
--- a/lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/db/buildrequests.py
+++ /dev/null
@@ -1,284 +0,0 @@
-# This file is part of Buildbot. Buildbot is free software: you can
-# redistribute it and/or modify it under the terms of the GNU General Public
-# License as published by the Free Software Foundation, version 2.
-#
-# This program is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
-# details.
-#
-# You should have received a copy of the GNU General Public License along with
-# this program; if not, write to the Free Software Foundation, Inc., 51
-# Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Copyright Buildbot Team Members
-
-import itertools
-import sqlalchemy as sa
-from twisted.internet import reactor
-from twisted.python import log
-from buildbot.db import base
-from buildbot.util import epoch2datetime, datetime2epoch
-
-class AlreadyClaimedError(Exception):
- pass
-
-class NotClaimedError(Exception):
- pass
-
-class BrDict(dict):
- pass
-
-# private decorator to add a _master_objectid keyword argument, querying from
-# the master
-def with_master_objectid(fn):
- def wrap(self, *args, **kwargs):
- d = self.db.master.getObjectId()
- d.addCallback(lambda master_objectid :
- fn(self, _master_objectid=master_objectid, *args, **kwargs))
- return d
- wrap.__name__ = fn.__name__
- wrap.__doc__ = fn.__doc__
- return wrap
-
-class BuildRequestsConnectorComponent(base.DBConnectorComponent):
- # Documentation is in developer/database.rst
-
- @with_master_objectid
- def getBuildRequest(self, brid, _master_objectid=None):
- def thd(conn):
- reqs_tbl = self.db.model.buildrequests
- claims_tbl = self.db.model.buildrequest_claims
- res = conn.execute(sa.select([
- reqs_tbl.outerjoin(claims_tbl,
- (reqs_tbl.c.id == claims_tbl.c.brid)) ],
- whereclause=(reqs_tbl.c.id == brid)), use_labels=True)
- row = res.fetchone()
-
- rv = None
- if row:
- rv = self._brdictFromRow(row, _master_objectid)
- res.close()
- return rv
- return self.db.pool.do(thd)
-
- @with_master_objectid
- def getBuildRequests(self, buildername=None, complete=None, claimed=None,
- bsid=None, _master_objectid=None, branch=None, repository=None):
- def thd(conn):
- reqs_tbl = self.db.model.buildrequests
- claims_tbl = self.db.model.buildrequest_claims
- bsets_tbl = self.db.model.buildsets
- sstamps_tbls = self.db.model.sourcestamps
-
- from_clause = reqs_tbl.outerjoin(claims_tbl,
- reqs_tbl.c.id == claims_tbl.c.brid)
-
- if branch or repository:
- from_clause = from_clause.join(bsets_tbl,
- reqs_tbl.c.buildsetid ==
- bsets_tbl.c.id)
- from_clause = from_clause.join(sstamps_tbls,
- bsets_tbl.c.sourcestampsetid ==
- sstamps_tbls.c.sourcestampsetid)
-
- q = sa.select([ reqs_tbl, claims_tbl ]).select_from(from_clause)
- if claimed is not None:
- if not claimed:
- q = q.where(
- (claims_tbl.c.claimed_at == None) &
- (reqs_tbl.c.complete == 0))
- elif claimed == "mine":
- q = q.where(
- (claims_tbl.c.objectid == _master_objectid))
- else:
- q = q.where(
- (claims_tbl.c.claimed_at != None))
- if buildername is not None:
- q = q.where(reqs_tbl.c.buildername == buildername)
- if complete is not None:
- if complete:
- q = q.where(reqs_tbl.c.complete != 0)
- else:
- q = q.where(reqs_tbl.c.complete == 0)
- if bsid is not None:
- q = q.where(reqs_tbl.c.buildsetid == bsid)
-
- if branch is not None:
- q = q.where(sstamps_tbls.c.branch == branch)
- if repository is not None:
- q = q.where(sstamps_tbls.c.repository == repository)
-
- res = conn.execute(q)
-
- return [ self._brdictFromRow(row, _master_objectid)
- for row in res.fetchall() ]
- return self.db.pool.do(thd)
-
- @with_master_objectid
- def claimBuildRequests(self, brids, claimed_at=None, _reactor=reactor,
- _master_objectid=None):
- if claimed_at is not None:
- claimed_at = datetime2epoch(claimed_at)
- else:
- claimed_at = _reactor.seconds()
-
- def thd(conn):
- transaction = conn.begin()
- tbl = self.db.model.buildrequest_claims
-
- try:
- q = tbl.insert()
- conn.execute(q, [ dict(brid=id, objectid=_master_objectid,
- claimed_at=claimed_at)
- for id in brids ])
- except (sa.exc.IntegrityError, sa.exc.ProgrammingError):
- transaction.rollback()
- raise AlreadyClaimedError
-
- transaction.commit()
-
- return self.db.pool.do(thd)
-
- @with_master_objectid
- def reclaimBuildRequests(self, brids, _reactor=reactor,
- _master_objectid=None):
- def thd(conn):
- transaction = conn.begin()
- tbl = self.db.model.buildrequest_claims
- claimed_at = _reactor.seconds()
-
- # we'll need to batch the brids into groups of 100, so that the
- # parameter lists supported by the DBAPI aren't exhausted
- iterator = iter(brids)
-
- while 1:
- batch = list(itertools.islice(iterator, 100))
- if not batch:
- break # success!
-
- q = tbl.update(tbl.c.brid.in_(batch)
- & (tbl.c.objectid==_master_objectid))
- res = conn.execute(q, claimed_at=claimed_at)
-
- # if fewer rows were updated than expected, then something
- # went wrong
- if res.rowcount != len(batch):
- transaction.rollback()
- raise AlreadyClaimedError
-
- transaction.commit()
- return self.db.pool.do(thd)
-
- @with_master_objectid
- def unclaimBuildRequests(self, brids, _master_objectid=None):
- def thd(conn):
- transaction = conn.begin()
- claims_tbl = self.db.model.buildrequest_claims
-
- # we'll need to batch the brids into groups of 100, so that the
- # parameter lists supported by the DBAPI aren't exhausted
- iterator = iter(brids)
-
- while 1:
- batch = list(itertools.islice(iterator, 100))
- if not batch:
- break # success!
-
- try:
- q = claims_tbl.delete(
- (claims_tbl.c.brid.in_(batch))
- & (claims_tbl.c.objectid == _master_objectid))
- conn.execute(q)
- except:
- transaction.rollback()
- raise
-
- transaction.commit()
- return self.db.pool.do(thd)
-
- @with_master_objectid
- def completeBuildRequests(self, brids, results, complete_at=None,
- _reactor=reactor, _master_objectid=None):
- if complete_at is not None:
- complete_at = datetime2epoch(complete_at)
- else:
- complete_at = _reactor.seconds()
-
- def thd(conn):
- transaction = conn.begin()
-
- # the update here is simple, but a number of conditions are
- # attached to ensure that we do not update a row inappropriately,
- # Note that checking that the request is mine would require a
- # subquery, so for efficiency that is not checed.
-
- reqs_tbl = self.db.model.buildrequests
-
- # we'll need to batch the brids into groups of 100, so that the
- # parameter lists supported by the DBAPI aren't exhausted
- iterator = iter(brids)
-
- while 1:
- batch = list(itertools.islice(iterator, 100))
- if not batch:
- break # success!
-
- q = reqs_tbl.update()
- q = q.where(reqs_tbl.c.id.in_(batch))
- q = q.where(reqs_tbl.c.complete != 1)
- res = conn.execute(q,
- complete=1,
- results=results,
- complete_at=complete_at)
-
- # if an incorrect number of rows were updated, then we failed.
- if res.rowcount != len(batch):
- log.msg("tried to complete %d buildreqests, "
- "but only completed %d" % (len(batch), res.rowcount))
- transaction.rollback()
- raise NotClaimedError
- transaction.commit()
- return self.db.pool.do(thd)
-
- def unclaimExpiredRequests(self, old, _reactor=reactor):
- def thd(conn):
- reqs_tbl = self.db.model.buildrequests
- claims_tbl = self.db.model.buildrequest_claims
- old_epoch = _reactor.seconds() - old
-
- # select any expired requests, and delete each one individually
- expired_brids = sa.select([ reqs_tbl.c.id ],
- whereclause=(reqs_tbl.c.complete != 1))
- res = conn.execute(claims_tbl.delete(
- (claims_tbl.c.claimed_at < old_epoch) &
- claims_tbl.c.brid.in_(expired_brids)))
- return res.rowcount
- d = self.db.pool.do(thd)
- def log_nonzero_count(count):
- if count != 0:
- log.msg("unclaimed %d expired buildrequests (over %d seconds "
- "old)" % (count, old))
- d.addCallback(log_nonzero_count)
- return d
-
- def _brdictFromRow(self, row, master_objectid):
- claimed = mine = False
- claimed_at = None
- if row.claimed_at is not None:
- claimed_at = row.claimed_at
- claimed = True
- mine = row.objectid == master_objectid
-
- def mkdt(epoch):
- if epoch:
- return epoch2datetime(epoch)
- submitted_at = mkdt(row.submitted_at)
- complete_at = mkdt(row.complete_at)
- claimed_at = mkdt(row.claimed_at)
-
- return BrDict(brid=row.id, buildsetid=row.buildsetid,
- buildername=row.buildername, priority=row.priority,
- claimed=claimed, claimed_at=claimed_at, mine=mine,
- complete=bool(row.complete), results=row.results,
- submitted_at=submitted_at, complete_at=complete_at)