xref: /AOO41X/main/solenv/bin/modules/installer/patch/FileSequenceList.pm (revision 9f91b7e30577a5efd4c1ce7f0c95f4b60745abda)
1c9b362f6SAndre Fischer#**************************************************************
2c9b362f6SAndre Fischer#
3c9b362f6SAndre Fischer#  Licensed to the Apache Software Foundation (ASF) under one
4c9b362f6SAndre Fischer#  or more contributor license agreements.  See the NOTICE file
5c9b362f6SAndre Fischer#  distributed with this work for additional information
6c9b362f6SAndre Fischer#  regarding copyright ownership.  The ASF licenses this file
7c9b362f6SAndre Fischer#  to you under the Apache License, Version 2.0 (the
8c9b362f6SAndre Fischer#  "License"); you may not use this file except in compliance
9c9b362f6SAndre Fischer#  with the License.  You may obtain a copy of the License at
10c9b362f6SAndre Fischer#
11c9b362f6SAndre Fischer#    http://www.apache.org/licenses/LICENSE-2.0
12c9b362f6SAndre Fischer#
13c9b362f6SAndre Fischer#  Unless required by applicable law or agreed to in writing,
14c9b362f6SAndre Fischer#  software distributed under the License is distributed on an
15c9b362f6SAndre Fischer#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16c9b362f6SAndre Fischer#  KIND, either express or implied.  See the License for the
17c9b362f6SAndre Fischer#  specific language governing permissions and limitations
18c9b362f6SAndre Fischer#  under the License.
19c9b362f6SAndre Fischer#
20c9b362f6SAndre Fischer#**************************************************************
21c9b362f6SAndre Fischer
22c9b362f6SAndre Fischerpackage installer::patch::FileSequenceList;
23c9b362f6SAndre Fischer
24c9b362f6SAndre Fischeruse strict;
25c9b362f6SAndre Fischer
26c9b362f6SAndre Fischer=head1 NAME
27c9b362f6SAndre Fischer
28c9b362f6SAndre Fischer    FileSequenceList.pm - Class for retrieving and processing the 'Sequence' values of the MSI 'File' table.
29c9b362f6SAndre Fischer
30c9b362f6SAndre Fischer=cut
31c9b362f6SAndre Fischer
32c9b362f6SAndre Fischer=head2 new($class)
33c9b362f6SAndre Fischer
34c9b362f6SAndre Fischer    Create a new FileSequenceList object.
35c9b362f6SAndre Fischer
36c9b362f6SAndre Fischer=cut
37c9b362f6SAndre Fischersub new ($)
38c9b362f6SAndre Fischer{
39c9b362f6SAndre Fischer    my ($class) = @_;
40c9b362f6SAndre Fischer
41c9b362f6SAndre Fischer    my $self = {
42c9b362f6SAndre Fischer        'data' => undef
43c9b362f6SAndre Fischer    };
44c9b362f6SAndre Fischer    bless($self, $class);
45c9b362f6SAndre Fischer
46c9b362f6SAndre Fischer    return $self;
47c9b362f6SAndre Fischer}
48c9b362f6SAndre Fischer
49c9b362f6SAndre Fischer
50c9b362f6SAndre Fischer
51c9b362f6SAndre Fischer
52c9b362f6SAndre Fischersub SetFromMap ($$)
53c9b362f6SAndre Fischer{
54c9b362f6SAndre Fischer    my ($self, $map) = @_;
55c9b362f6SAndre Fischer
56c9b362f6SAndre Fischer    $self->{'data'} = $map;
57c9b362f6SAndre Fischer}
58c9b362f6SAndre Fischer
59c9b362f6SAndre Fischer
60c9b362f6SAndre Fischer
61c9b362f6SAndre Fischer
62*9f91b7e3SAndre Fischersub SetFromMsi ($$)
63*9f91b7e3SAndre Fischer{
64*9f91b7e3SAndre Fischer    my ($self, $msi) = @_;
65*9f91b7e3SAndre Fischer
66*9f91b7e3SAndre Fischer    my $file_table = $msi->GetTable("File");
67*9f91b7e3SAndre Fischer    my $file_map = $msi->GetFileMap();
68*9f91b7e3SAndre Fischer
69*9f91b7e3SAndre Fischer    my $file_column_index = $file_table->GetColumnIndex("File");
70*9f91b7e3SAndre Fischer    my $filename_column_index = $file_table->GetColumnIndex("FileName");
71*9f91b7e3SAndre Fischer    my $sequence_column_index = $file_table->GetColumnIndex("Sequence");
72*9f91b7e3SAndre Fischer
73*9f91b7e3SAndre Fischer    my %sequence_data = ();
74*9f91b7e3SAndre Fischer
75*9f91b7e3SAndre Fischer    printf("extracting columns %d and %d from %d rows\n",
76*9f91b7e3SAndre Fischer        $file_column_index,
77*9f91b7e3SAndre Fischer        $sequence_column_index,
78*9f91b7e3SAndre Fischer        $file_table->GetRowCount());
79*9f91b7e3SAndre Fischer
80*9f91b7e3SAndre Fischer    foreach my $row (@{$file_table->GetAllRows()})
81*9f91b7e3SAndre Fischer    {
82*9f91b7e3SAndre Fischer        my $unique_name = $row->GetValue($file_column_index);
83*9f91b7e3SAndre Fischer        my $filename = $row->GetValue($filename_column_index);
84*9f91b7e3SAndre Fischer        my ($long_filename,$short_filename) = installer::patch::Msi::SplitLongShortName($filename);
85*9f91b7e3SAndre Fischer        my $sequence = $row->GetValue($sequence_column_index);
86*9f91b7e3SAndre Fischer        my $directory_item = $file_map->{$unique_name}->{'directory'};
87*9f91b7e3SAndre Fischer        my $source_path = $directory_item->{'full_source_long_name'};
88*9f91b7e3SAndre Fischer        my $target_path = $directory_item->{'full_target_long_name'};
89*9f91b7e3SAndre Fischer        my $key = $source_path ne ""
90*9f91b7e3SAndre Fischer            ? $source_path."/".$long_filename
91*9f91b7e3SAndre Fischer            : $long_filename;
92*9f91b7e3SAndre Fischer        $sequence_data{$key} = {
93*9f91b7e3SAndre Fischer            'sequence' => $sequence,
94*9f91b7e3SAndre Fischer            'uniquename' => $unique_name,
95*9f91b7e3SAndre Fischer            'row' => $row
96*9f91b7e3SAndre Fischer        };
97*9f91b7e3SAndre Fischer    }
98*9f91b7e3SAndre Fischer    $self->{'data'} = \%sequence_data;
99*9f91b7e3SAndre Fischer}
100*9f91b7e3SAndre Fischer
101*9f91b7e3SAndre Fischer
102*9f91b7e3SAndre Fischer
103*9f91b7e3SAndre Fischer
104c9b362f6SAndre Fischersub GetFileCount ($)
105c9b362f6SAndre Fischer{
106c9b362f6SAndre Fischer    my ($self) = @_;
107c9b362f6SAndre Fischer
108c9b362f6SAndre Fischer    return scalar keys %{$self->{'data'}};
109c9b362f6SAndre Fischer}
110c9b362f6SAndre Fischer
111c9b362f6SAndre Fischer
112c9b362f6SAndre Fischer
113c9b362f6SAndre Fischer
114*9f91b7e3SAndre Fischersub get_removed_files ($@)
115c9b362f6SAndre Fischer{
116*9f91b7e3SAndre Fischer    my ($self, $target_unique_names) = @_;
117*9f91b7e3SAndre Fischer
118*9f91b7e3SAndre Fischer    my %uniquename_to_row_map = map{$_->{'uniquename'} => $_->{'row'}} values %{$self->{'data'}};
119c9b362f6SAndre Fischer
120c9b362f6SAndre Fischer    # Check if files have been removed.
121c9b362f6SAndre Fischer    my @missing = ();
122*9f91b7e3SAndre Fischer    foreach my $item (values %{$self->{'data'}})
123c9b362f6SAndre Fischer    {
124*9f91b7e3SAndre Fischer        my ($uniquename, $row) = ($item->{'uniquename'}, $item->{'row'});
125*9f91b7e3SAndre Fischer        if ( ! defined $target_unique_names->{$uniquename})
126c9b362f6SAndre Fischer        {
127*9f91b7e3SAndre Fischer            # $name is defined in source but not in target => it has been removed.
128*9f91b7e3SAndre Fischer            push @missing, $row;
129c9b362f6SAndre Fischer        }
130c9b362f6SAndre Fischer    }
131c9b362f6SAndre Fischer    return @missing;
132c9b362f6SAndre Fischer}
133c9b362f6SAndre Fischer
134*9f91b7e3SAndre Fischer
135*9f91b7e3SAndre Fischer
136*9f91b7e3SAndre Fischer
137*9f91b7e3SAndre Fischersub get_sequence_and_unique_name($$)
138c9b362f6SAndre Fischer{
139*9f91b7e3SAndre Fischer    my ($self, $source_path) = @_;
140c9b362f6SAndre Fischer
141*9f91b7e3SAndre Fischer    my $sequence_and_unique_name = $self->{'data'}->{$source_path};
142*9f91b7e3SAndre Fischer    if ( ! defined $sequence_and_unique_name)
143c9b362f6SAndre Fischer    {
144*9f91b7e3SAndre Fischer        $installer::logger::Lang->printf("can not find entry for source path '%s'\n", $source_path);
145*9f91b7e3SAndre Fischer        return (undef,undef);
146c9b362f6SAndre Fischer    }
147c9b362f6SAndre Fischer    else
148c9b362f6SAndre Fischer    {
149*9f91b7e3SAndre Fischer        return (
150*9f91b7e3SAndre Fischer            $sequence_and_unique_name->{'sequence'},
151*9f91b7e3SAndre Fischer            $sequence_and_unique_name->{'uniquename'});
152c9b362f6SAndre Fischer    }
153c9b362f6SAndre Fischer}
154c9b362f6SAndre Fischer
155c9b362f6SAndre Fischer
156c9b362f6SAndre Fischer1;
157