From 8ef5165b5accaffa59a51a2316ed3304680da224 Mon Sep 17 00:00:00 2001 From: Alexandru DAMIAN Date: Tue, 23 Jun 2015 10:44:42 +0100 Subject: bitbake: toaster: delete multiple builds This patch fixes the build deletion on unmigrated databases, and enhances it to delete multiple builds in a single run. [YOCTO #7726] (Bitbake rev: d5468d84c1ef83c780de5974c8e3a11eab762489) Signed-off-by: Alexandru DAMIAN Signed-off-by: Richard Purdie --- .../toastermain/management/commands/builddelete.py | 56 ++++++++++++++-------- 1 file changed, 36 insertions(+), 20 deletions(-) (limited to 'bitbake/lib/toaster/toastermain') diff --git a/bitbake/lib/toaster/toastermain/management/commands/builddelete.py b/bitbake/lib/toaster/toastermain/management/commands/builddelete.py index 5cec436714..343d3114c0 100644 --- a/bitbake/lib/toaster/toastermain/management/commands/builddelete.py +++ b/bitbake/lib/toaster/toastermain/management/commands/builddelete.py @@ -1,33 +1,49 @@ from django.core.management.base import BaseCommand, CommandError from orm.models import Build +from django.db import OperationalError import os class Command(BaseCommand): args = "buildId" - help = "Deletes selected build" + help = "Deletes selected build(s)" def handle(self, buildId, *args, **options): - b = Build.objects.get(pk = buildId) - # theoretically, just b.delete() would suffice - # however SQLite runs into problems when you try to - # delete too many rows at once, so we delete some direct - # relationships from Build manually. + for bid in buildId.split(","): + b = Build.objects.get(pk = bid) + # theoretically, just b.delete() would suffice + # however SQLite runs into problems when you try to + # delete too many rows at once, so we delete some direct + # relationships from Build manually. + for t in b.target_set.all(): + t.delete() + for t in b.task_build.all(): + t.delete() + for p in b.package_set.all(): + p.delete() + for lv in b.layer_version_build.all(): + lv.delete() + for v in b.variable_build.all(): + v.delete() + for l in b.logmessage_set.all(): + l.delete() - for t in b.target_set.all(): - t.delete() - for t in b.task_build.all(): - t.delete() - for p in b.package_set.all(): - p.delete() - for lv in b.layer_version_build.all(): - lv.delete() - for v in b.variable_build.all(): - v.delete() - for l in b.logmessage_set.all(): - l.delete() + # delete the build; some databases might have had problem with migration of the bldcontrol app + retry_count = 0 + need_bldcontrol_migration = False + while True: + if retry_count >= 5: + break + retry_count += 1 + if need_bldcontrol_migration: + from django.core import management + management.call_command('migrate', 'bldcontrol', interactive=False) - # this should take care of the rest - b.delete() + try: + b.delete() + break + except OperationalError as e: + # execute migrations + need_bldcontrol_migration = True -- cgit v1.2.3-54-g00ecf