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
|
|
6
|
use DiaColloDB::Upgrade::Base; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
25
|
|
9
|
1
|
|
|
1
|
|
369
|
use DiaColloDB::Compat::v0_08; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
24
|
|
10
|
1
|
|
|
1
|
|
5
|
use strict; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
450
|
|
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 |