1*9f91b7e3SAndre Fischer#************************************************************** 2*9f91b7e3SAndre Fischer# 3*9f91b7e3SAndre Fischer# Licensed to the Apache Software Foundation (ASF) under one 4*9f91b7e3SAndre Fischer# or more contributor license agreements. See the NOTICE file 5*9f91b7e3SAndre Fischer# distributed with this work for additional information 6*9f91b7e3SAndre Fischer# regarding copyright ownership. The ASF licenses this file 7*9f91b7e3SAndre Fischer# to you under the Apache License, Version 2.0 (the 8*9f91b7e3SAndre Fischer# "License"); you may not use this file except in compliance 9*9f91b7e3SAndre Fischer# with the License. You may obtain a copy of the License at 10*9f91b7e3SAndre Fischer# 11*9f91b7e3SAndre Fischer# http://www.apache.org/licenses/LICENSE-2.0 12*9f91b7e3SAndre Fischer# 13*9f91b7e3SAndre Fischer# Unless required by applicable law or agreed to in writing, 14*9f91b7e3SAndre Fischer# software distributed under the License is distributed on an 15*9f91b7e3SAndre Fischer# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*9f91b7e3SAndre Fischer# KIND, either express or implied. See the License for the 17*9f91b7e3SAndre Fischer# specific language governing permissions and limitations 18*9f91b7e3SAndre Fischer# under the License. 19*9f91b7e3SAndre Fischer# 20*9f91b7e3SAndre Fischer#************************************************************** 21*9f91b7e3SAndre Fischer 22*9f91b7e3SAndre Fischerpackage installer::patch::FileSequenceList; 23*9f91b7e3SAndre Fischer 24*9f91b7e3SAndre Fischeruse strict; 25*9f91b7e3SAndre Fischer 26*9f91b7e3SAndre Fischer=head1 NAME 27*9f91b7e3SAndre Fischer 28*9f91b7e3SAndre Fischer FileSequenceList.pm - Class for retrieving and processing the 'Sequence' values of the MSI 'File' table. 29*9f91b7e3SAndre Fischer 30*9f91b7e3SAndre Fischer=cut 31*9f91b7e3SAndre Fischer 32*9f91b7e3SAndre Fischer=head2 new($class) 33*9f91b7e3SAndre Fischer 34*9f91b7e3SAndre Fischer Create a new FileSequenceList object. 35*9f91b7e3SAndre Fischer 36*9f91b7e3SAndre Fischer=cut 37*9f91b7e3SAndre Fischersub new ($) 38*9f91b7e3SAndre Fischer{ 39*9f91b7e3SAndre Fischer my ($class) = @_; 40*9f91b7e3SAndre Fischer 41*9f91b7e3SAndre Fischer my $self = { 42*9f91b7e3SAndre Fischer 'data' => undef 43*9f91b7e3SAndre Fischer }; 44*9f91b7e3SAndre Fischer bless($self, $class); 45*9f91b7e3SAndre Fischer 46*9f91b7e3SAndre Fischer return $self; 47*9f91b7e3SAndre Fischer} 48*9f91b7e3SAndre Fischer 49*9f91b7e3SAndre Fischer 50*9f91b7e3SAndre Fischer 51*9f91b7e3SAndre Fischer 52*9f91b7e3SAndre Fischersub SetFromMap ($$) 53*9f91b7e3SAndre Fischer{ 54*9f91b7e3SAndre Fischer my ($self, $map) = @_; 55*9f91b7e3SAndre Fischer 56*9f91b7e3SAndre Fischer $self->{'data'} = $map; 57*9f91b7e3SAndre Fischer} 58*9f91b7e3SAndre Fischer 59*9f91b7e3SAndre Fischer 60*9f91b7e3SAndre Fischer 61*9f91b7e3SAndre 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 104*9f91b7e3SAndre Fischersub GetFileCount ($) 105*9f91b7e3SAndre Fischer{ 106*9f91b7e3SAndre Fischer my ($self) = @_; 107*9f91b7e3SAndre Fischer 108*9f91b7e3SAndre Fischer return scalar keys %{$self->{'data'}}; 109*9f91b7e3SAndre Fischer} 110*9f91b7e3SAndre Fischer 111*9f91b7e3SAndre Fischer 112*9f91b7e3SAndre Fischer 113*9f91b7e3SAndre Fischer 114*9f91b7e3SAndre Fischersub get_removed_files ($@) 115*9f91b7e3SAndre 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'}}; 119*9f91b7e3SAndre Fischer 120*9f91b7e3SAndre Fischer # Check if files have been removed. 121*9f91b7e3SAndre Fischer my @missing = (); 122*9f91b7e3SAndre Fischer foreach my $item (values %{$self->{'data'}}) 123*9f91b7e3SAndre Fischer { 124*9f91b7e3SAndre Fischer my ($uniquename, $row) = ($item->{'uniquename'}, $item->{'row'}); 125*9f91b7e3SAndre Fischer if ( ! defined $target_unique_names->{$uniquename}) 126*9f91b7e3SAndre Fischer { 127*9f91b7e3SAndre Fischer # $name is defined in source but not in target => it has been removed. 128*9f91b7e3SAndre Fischer push @missing, $row; 129*9f91b7e3SAndre Fischer } 130*9f91b7e3SAndre Fischer } 131*9f91b7e3SAndre Fischer return @missing; 132*9f91b7e3SAndre Fischer} 133*9f91b7e3SAndre Fischer 134*9f91b7e3SAndre Fischer 135*9f91b7e3SAndre Fischer 136*9f91b7e3SAndre Fischer 137*9f91b7e3SAndre Fischersub get_sequence_and_unique_name($$) 138*9f91b7e3SAndre Fischer{ 139*9f91b7e3SAndre Fischer my ($self, $source_path) = @_; 140*9f91b7e3SAndre Fischer 141*9f91b7e3SAndre Fischer my $sequence_and_unique_name = $self->{'data'}->{$source_path}; 142*9f91b7e3SAndre Fischer if ( ! defined $sequence_and_unique_name) 143*9f91b7e3SAndre 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); 146*9f91b7e3SAndre Fischer } 147*9f91b7e3SAndre Fischer else 148*9f91b7e3SAndre Fischer { 149*9f91b7e3SAndre Fischer return ( 150*9f91b7e3SAndre Fischer $sequence_and_unique_name->{'sequence'}, 151*9f91b7e3SAndre Fischer $sequence_and_unique_name->{'uniquename'}); 152*9f91b7e3SAndre Fischer } 153*9f91b7e3SAndre Fischer} 154*9f91b7e3SAndre Fischer 155*9f91b7e3SAndre Fischer 156*9f91b7e3SAndre Fischer1; 157