# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+from buildfarm.build import BuildStatus
from buildfarm.sqldb import distinct_builds, Cast, StormBuild, setup_schema, StormHostDatabase
from buildfarm.tree import Tree
from storm.database import create_database
result = self._get_store().find(StormBuild)
return distinct_builds(result.order_by(Desc(StormBuild.upload_time)))
+ def get_summary_builds(self, min_age=0):
+ """Return last build age, status for each tree/host/compiler.
+
+ :param min_age: Minimum timestamp of builds to report
+ :return: iterator over tree, status
+ """
+ store = self._get_store()
+ return ((tree, BuildStatus.__deserialize__(status_str))
+ for (tree, status_str) in store.execute("""
+SELECT obd.tree, obd.status AS status_str
+FROM build obd
+INNER JOIN(
+ SELECT MAX(age) age, tree, host, compiler
+ FROM build
+ WHERE age > ?
+ GROUP BY tree, host, compiler
+) ibd ON obd.age = ibd.age AND
+ obd.tree = ibd.tree AND
+ obd.host = ibd.host AND
+ obd.compiler = ibd.compiler;
+""", (min_age, )))
+
def get_tree_builds(self, tree):
result = self._get_store().find(StormBuild,
Cast(StormBuild.tree, "TEXT") == Cast(tree, "TEXT"))
if self.store is not None:
return self.store
db_dir_path = os.path.join(self.path, "db")
- os.mkdir(db_dir_path)
+ if not os.path.isdir(db_dir_path):
+ os.mkdir(db_dir_path)
db_path = os.path.join(db_dir_path, "hostdb.sqlite")
db = create_database("sqlite:%s?timeout=%f" % (db_path, self.timeout))
self.store = Store(db)