File Coverage

blib/lib/DiaColloDB/Upgrade/v0_09_multimap.pm
Criterion Covered Total %
statement 9 46 19.5
branch 0 18 0.0
condition n/a
subroutine 3 8 37.5
pod 5 5 100.0
total 17 77 22.0


line stmt bran cond sub pod time code
1             ## -*- Mode: CPerl -*-
2             ##
3             ## File: DiaColloDB::Upgrade::v0_09_multimap.pm
4             ## Author: Bryan Jurish <moocow@cpan.org>
5             ## Description: DiaColloDB utilities: auto-magic upgrade: v0.08.x -> v0.09.x: MultiMapFile format
6              
7             package DiaColloDB::Upgrade::v0_09_multimap;
8 1     1   8 use DiaColloDB::Upgrade::Base;
  1         2  
  1         33  
9 1     1   437 use DiaColloDB::Compat::v0_08;
  1         4  
  1         33  
10 1     1   7 use strict;
  1         3  
  1         651  
11             our @ISA = qw(DiaColloDB::Upgrade::Base);
12              
13             ##==============================================================================
14             ## API
15             ## + Upgrade: v0_09_multimap: v0.08.x -> v0.09.x : MultiMapFile format change
16              
17             ## $version = $up->toversion()
18             ## + returns default target version; default just returns $DiaColloDB::VERSION
19             sub toversion {
20 0     0 1   return '0.09.000';
21             }
22              
23             ## $bool = $up->upgrade()
24             ## + performs upgrade
25             sub upgrade {
26 0     0 1   my $up = shift;
27              
28             ##-- backup
29 0 0         $up->backup() or $up->logconfess("backup failed");
30              
31             ##-- open header
32 0           my $dbdir = $up->{dbdir};
33 0           my $hdr = $up->dbheader;
34              
35             ##-- convert by attribute
36 0           foreach my $attr (@{$hdr->{attrs}}) {
  0            
37 0           my $base = "$dbdir/${attr}_2x";
38 0 0         my $mmf = $DiaColloDB::MMCLASS->new(base=>$base, logCompat=>'off')
39             or $up->logconfess("failed to open attribute multimap $base.*");
40              
41             ##-- sanity check(s)
42 0           $up->info("upgrading $base.*");
43 0 0         $up->warn("multimap data in $base.* doesn't seem to be v0.08 format; trying to upgrade anyways")
44             if (!$mmf->isa('DiaColloDB::Compat::v0_08::MultiMapFile'));
45              
46             ##-- convert
47             my $tmp = $DiaColloDB::MMCLASS->new(flags=>'rw', pack_i=>$mmf->{pack_i})
48 0 0         or $up->logconfess("upgrade(): failed to create new DiaColloDB::MultiMapFile object for $base.*");
49 0 0         $tmp->fromArray($mmf->toArray)
50             or $up->logconfess("upgrade(): failed to convert data for $base.*");
51 0           $mmf->close();
52 0 0         $tmp->save($base)
53             or $up->logconfess("upgrade(): failed to save new data for $base.*");
54             }
55              
56             ##-- update header
57 0           return $up->updateHeader();
58             }
59              
60             ##==============================================================================
61             ## Backup & Revert
62              
63             ## $bool = $up->backup()
64             ## + perform backup any files we expect to change to $up->backupdir()
65             ## + call this from $up->upgrade()
66             sub backup {
67 0     0 1   my $up = shift;
68 0 0         $up->SUPER::backup() or return undef;
69 0 0         return 1 if (!$up->{backup});
70              
71 0           my $dbdir = $up->{dbdir};
72 0           my $hdr = $up->dbheader;
73 0           my $backd = $up->backupdir;
74              
75             ##-- backup: by attribute
76 0           foreach my $base (map {"$dbdir/${_}_2x"} @{$hdr->{attrs}}) {
  0            
  0            
77 0           $up->info("backing up $base.*");
78 0 0         DiaColloDB::Utils::copyto_a([glob "$base.*"], $backd)
79             or $up->logconfess("backup failed for $base.*: $!");
80             }
81 0           return 1;
82             }
83              
84             ## @files = $up->revert_created()
85             ## + returns list of files created by this upgrade, for use with default rollback() implementation
86             sub revert_created {
87 0     0 1   return qw();
88             }
89              
90             ## @files = $up->revert_updated()
91             ## + returns list of files updated by this upgrade, for use with default rollback() implementation
92             sub revert_updated {
93 0     0 1   my $up = shift;
94 0           my $hdr = $up->dbheader;
95              
96             my @mmfiles = map {
97 0           my $base="${_}_2x";
98 0           map {"$base.$_"} qw(hdr ma mb)
  0            
99 0           } @{$hdr->{attrs}};
  0            
100              
101 0           return (@mmfiles, 'header.json');
102             }
103              
104              
105             ##==============================================================================
106             ## Footer
107             1; ##-- be happy