diff --git a/docs/changelog/7.x.x.txt b/docs/changelog/7.x.x.txt index e09906bd0..4c9aec23f 100644 --- a/docs/changelog/7.x.x.txt +++ b/docs/changelog/7.x.x.txt @@ -1,4 +1,5 @@ 7.5.1 + - improve rebuildLineage.pl behavior. protect against assets that are too deep and don't destroy search index. - fix: CalendarUpdateFeeds workflow causes errors in log - rfe: maintenance - turn on/off maintenance mode from the command line - Slight performance increase in asset queries. diff --git a/sbin/rebuildLineage.pl b/sbin/rebuildLineage.pl index 6dc176194..91540f264 100644 --- a/sbin/rebuildLineage.pl +++ b/sbin/rebuildLineage.pl @@ -89,9 +89,8 @@ if ($orphansFound) { } else { print "No orphans found.\n" unless ($quiet); } -print "\nRewriting existing lineage...\n" unless ($quiet); -$session->db->write("update asset set lineage=concat('old___',lineage)"); -my ($lineage) = $session->db->quickArray("select lineage from asset where assetId='PBasset000000000000001'"); +print "\nDisabling constraints on lineage...\n" unless ($quiet); +$session->db->write("drop index `lineage` on `asset`"); print "Rebuilding lineage...\n" unless ($quiet); my ($oldRootLineage) = $session->db->quickArray("select lineage from asset where assetId='PBasset000000000000001'"); @@ -99,6 +98,10 @@ printChange("Asset ID","Old Lineage","New Lineage"); printChange('PBasset000000000000001',$oldRootLineage,'000001'); $session->db->write("update asset set lineage='000001' where assetId='PBasset000000000000001'"); recurseAndFixTree("PBasset000000000000001","000001"); +print "\nRe-enabling constraints on lineage...\n" unless ($quiet); +$session->db->write("create unique index `lineage` on `asset` (`lineage`)"); +print "\nRepairing search index...\n" unless ($quiet); +$session->db->write("update assetIndex inner join asset on asset.assetId=assetIndex.assetId set assetIndex.lineage=asset.lineage"); print "Cleaning up..." unless ($quiet); $session->var->end; @@ -110,15 +113,20 @@ print "\nDon't forget to clear your cache.\n" unless ($quiet); sub getDescendants { my $parentId = shift; - if (isIn($parentId, @found)) { + my $depth = shift || 0; + if (isIn($parentId, @found)) { print "\nFound circular relationships involving $parentId. This requires manual intervention.\n" unless ($quiet); exit; } + if (++$depth > 42) { + print "\nFound asset greater than 42 levels deep: $parentId. This requires manual intervention.\n" unless ($quiet); + exit; + } push(@found, $parentId); my $getChildren = $session->db->prepare("select assetId, lineage from asset where parentId=? order by lineage"); $getChildren->execute([$parentId]); while (my ($assetId) = $getChildren->array) { - getDescendants($assetId); + getDescendants($assetId, $depth); } } @@ -142,6 +150,6 @@ sub printChange { my $assetId = shift; my $oldLineage = shift; my $newLineage = shift; - print sprintf("%-25s",$assetId).sprintf("%-51s",$oldLineage).sprintf("%-51s",$newLineage)."\n" unless ($quiet); + print sprintf("%-25s",$assetId).sprintf("%-51s",$oldLineage).$newLineage."\n" unless ($quiet); }