Putting 4.2.0 on top of 4.0.17
[usit-rt.git] / etc / upgrade / 4.1.23 / indexes
1 use strict;
2 use 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
38 my $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
155 foreach 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
169 1;