forked from plainblack/webgui
/
rebuildLineage.pl
147 lines (118 loc) · 4.72 KB
/
rebuildLineage.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#-------------------------------------------------------------------
# WebGUI is Copyright 2001-2007 Plain Black Corporation.
#-------------------------------------------------------------------
# Please read the legal notices (docs/legal.txt) and the license
# (docs/license.txt) that came with this distribution before using
# this software.
#-------------------------------------------------------------------
# http://www.plainblack.com info@plainblack.com
#-------------------------------------------------------------------
our ($webguiRoot);
BEGIN {
$webguiRoot = "..";
unshift (@INC, $webguiRoot."/lib");
}
$| = 1;
use Getopt::Long;
use strict;
use WebGUI::Session;
use WebGUI::Utility;
my $configFile;
my $help;
my $quiet;
GetOptions(
'configFile=s'=>\$configFile,
'help'=>\$help,
'quiet'=>\$quiet,
);
if ($help || $configFile eq ""){
print <<STOP;
Usage: perl $0 --configfile=<webguiConfig>
This utility will rebuild your WebGUI Lineage Tree. The lineage tree is an
index that is used to make WebGUI run faster. It will also detect and fix
orphan data, and detect cirular relationships in your tree.
WARNING: Use this tool only if you know what you're doing. It should only
be used if somehow your lineage tree has become corrupt (very rare) or if
you have done some massive reorganization of your asset tree and you want
to fill in the gaps between the ranks of your assets. A side effect of
using this utility can be that your assets may no longer be in the same rank
as they once were, which means that they may appear out of order in your
navigation.
--configFile WebGUI config file.
Options:
--help Display this help message and exit.
--quiet Disable output unless there's an error.
STOP
exit;
}
print "Starting..." unless ($quiet);
my $session = WebGUI::Session->open($webguiRoot,$configFile);
print "OK\n" unless ($quiet);
print "Looking for descendant replationships...\n" unless ($quiet);
my @found = (); #descendants found
getDescendants("PBasset000000000000001");
print "Got the relationships.\n" unless ($quiet);
print "\nLooking for orphans...\n" unless ($quiet);
my $orphansFound = 0;
my $rs = $session->db->read("select assetId from asset order by lineage");
while (my ($id) = $rs->array) {
unless (isIn($id, @found)) {
print "\tFound an orphan with an assetId of $id. Moving it to the import node.\n";
$session->db->write("update asset set parentId='PBasset000000000000002' where assetId=?",[$id]);
getDescendants($id);
$orphansFound++;
}
}
if ($orphansFound) {
print "Found and fixed $orphansFound orphan(s).\n" unless ($quiet);
} 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 "Rebuilding lineage...\n" unless ($quiet);
my ($oldRootLineage) = $session->db->quickArray("select lineage from asset where assetId='PBasset000000000000001'");
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 "Cleaning up..." unless ($quiet);
$session->var->end;
$session->close;
print "OK\n" unless ($quiet);
print "\nDon't forget to clear your cache.\n" unless ($quiet);
sub getDescendants {
my $parentId = shift;
if (isIn($parentId, @found)) {
print "\nFound circular relationships involving $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);
}
}
sub recurseAndFixTree {
my $parentId = shift;
my $parentLineage = shift;
my $rank = 0;
my $getChildren = $session->db->prepare("select assetId, lineage from asset where parentId=? order by lineage");
$getChildren->execute([$parentId]);
while (my ($assetId, $oldLineage) = $getChildren->array) {
$rank++;
my $newLineage = $parentLineage.sprintf("%06d",$rank);
printChange($assetId,$oldLineage,$newLineage);
my $setLineage = $session->db->prepare("update asset set lineage=? where assetId=?");
$setLineage->execute([$newLineage,$assetId]);
recurseAndFixTree($assetId,$newLineage);
}
}
sub printChange {
my $assetId = shift;
my $oldLineage = shift;
my $newLineage = shift;
print sprintf("%-25s",$assetId).sprintf("%-51s",$oldLineage).sprintf("%-51s",$newLineage)."\n" unless ($quiet);
}