| 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 |