]> git.uio.no Git - usit-rt.git/blame - etc/upgrade/4.1.23/indexes
Putting 4.2.0 on top of 4.0.17
[usit-rt.git] / etc / upgrade / 4.1.23 / indexes
CommitLineData
af59614d
MKG
1use strict;
2use warnings;
3
4# groups table
5{
6 foreach my $name ( qw(Groups1 Groups2 Groups3) ) {
7 my ($status, $msg) = $RT::Handle->DropIndexIfExists(
8 Table => 'Groups', Name => $name,
9 );
10 my $method = $status ? 'debug' : 'warning';
11 RT->Logger->$method($msg);
12 }
13
14 my ($name, $msg) = $RT::Handle->CreateIndex(
15 Table => 'Groups',
16 Columns => [qw(Domain Type Instance)],
17 CaseInsensitive => { domain => 1, type => 1 },
18 );
19 my $method = $name ? 'debug' : 'warning';
20 RT->Logger->$method($msg);
21
22 ($name, $msg) = $RT::Handle->CreateIndex(
23 Table => 'Groups',
24 Columns => [qw(Domain Name Instance)],
25 CaseInsensitive => { domain => 1, name => 1 },
26 );
27 $method = $name ? 'debug' : 'warning';
28 RT->Logger->$method($msg);
29
30 ($name, $msg) = $RT::Handle->CreateIndex(
31 Table => 'Groups',
32 Columns => [qw(Instance)],
33 );
34 $method = $name ? 'debug' : 'warning';
35 RT->Logger->$method($msg);
36}
37
38my $dedup = sub {
39 my ($table, $column) = (@_);
40
41 my $collection_class = "RT::$table";
42 my $record_class = $collection_class;
43 $record_class =~ s/s$//;
44
45 my $sql;
46
47 my $cs = $RT::Handle->CaseSensitive;
48 if ($cs) {
49 $sql = "SELECT DISTINCT LOWER(t1.$column) FROM $table t1, $table t2"
50 ." WHERE LOWER(t1.$column) = LOWER(t2.$column)"
51 .' AND t1.id != t2.id';
52 } else {
53 $sql = "SELECT DISTINCT t1.$column FROM $table t1, $table t2"
54 ." WHERE t1.$column = t2.$column"
55 .' AND t1.id != t2.id';
56 }
57
58 my $dbh = $RT::Handle->dbh;
59 my $sth = $dbh->prepare($sql);
60 $sth->execute;
61
62 my $found = 0;
63 while ( my ($value) = $sth->fetchrow_array ) {
64 $found = 1;
65
66 my $ids = $dbh->selectcol_arrayref(
67 "SELECT id FROM $table WHERE ". ($cs? "LOWER($column)" : $column) ." = LOWER(?)",
68 undef,
69 $value
70 );
71
72 # skip first
73 shift @$ids;
74
75 foreach my $id ( @$ids ) {
76 RT->Logger->debug("Changing $column of $record_class #". $id );
77 $dbh->do("UPDATE $table SET $column = ? WHERE id = ?", undef, $value . '-dup-'.$id, $id);
78 }
79 }
80
81 if ( $found ) {
82 RT->Logger->warning(
83 "Records in $table table had non-unique values in $column column."
84 ." $column has been changed for such records, and now matches '%-dup-%'"
85 );
86 }
87};
88
89# a few case insensitive and unique indexes
90{
91 my @list = (
92 { Table => 'Queues', Column => 'Name' },
93 { Table => 'Users', Column => 'Name' },
94 );
95 foreach my $e (@list) {
96 RT->Logger->debug("Checking index on ". $e->{'Column'} ." in ". $e->{'Table'} );
97 my ($index) = $RT::Handle->IndexesThatBeginWith(
98 Table => $e->{'Table'}, Columns => [$e->{'Column'}]
99 );
100 $index = undef if $index && @{$index->{'Columns'}}>1;
101 if (
102 $index && $index->{'Unique'}
103 && ($RT::Handle->CaseSensitive? $index->{'CaseInsensitive'}{ lc $e->{'Column'} } : 1 )
104 ) {
105 RT->Logger->debug("Required index exists. Skipping.");
106 next;
107 }
108
109 $dedup->( $e->{'Table'}, $e->{'Column'} );
110
111 if ( $index ) {
112 my ($status, $msg) = $RT::Handle->DropIndex(
113 Table => $e->{'Table'}, Name => $index->{'Name'},
114 );
115 my $method = $status ? 'debug' : 'warning';
116 RT->Logger->$method($msg);
117 }
118
119 my ($status, $msg) = $RT::Handle->CreateIndex(
120 Table => $e->{'Table'}, Columns => [$e->{'Column'}],
121 Unique => 1, CaseInsensitive => { lc $e->{'Column'} => 1 },
122 );
123 my $method = $status ? 'debug' : 'warning';
124 RT->Logger->$method($msg);
125 }
126}
127
128# cached group members
129{
130 $RT::Handle->MakeSureIndexExists(
131 Table => 'CachedGroupMembers',
132 Columns => ['MemberId', 'ImmediateParentId'],
133 );
134 $RT::Handle->MakeSureIndexExists(
135 Table => 'CachedGroupMembers',
136 Columns => ['MemberId', 'GroupId'],
137 Optional => ['Disabled'],
138 );
139 $RT::Handle->DropIndexesThatArePrefix(
140 Table => 'CachedGroupMembers',
141 Columns => ['MemberId', 'GroupId', 'Disabled'],
142 );
143 $RT::Handle->MakeSureIndexExists(
144 Table => 'CachedGroupMembers',
145 Columns => ['GroupId', 'MemberId'],
146 Optional => ['Disabled'],
147 );
148 $RT::Handle->DropIndexesThatArePrefix(
149 Table => 'CachedGroupMembers',
150 Columns => ['GroupId', 'MemberId', 'Disabled'],
151 );
152}
153
154# drop indexes that start with 'id' column
155foreach my $table ('Users', 'Tickets') {
156 my @list = $RT::Handle->IndexesThatBeginWith(
157 Table => $table, Columns => ['id'],
158 );
159 @list = grep @{ $_->{'Columns'} } > 1, @list;
160
161 foreach my $index (@list) {
162 my ($status, $msg) = $RT::Handle->DropIndex(
163 Table => $table, Name => $index->{'Name'},
164 );
165 RT->Logger->info($msg);
166 }
167}
168
1691;