script to split versions table.

This commit is contained in:
hjp 2008-04-13 10:37:20 +00:00
parent 066869e9c2
commit d0911e115e
1 changed files with 119 additions and 0 deletions

119
scripts/convert_db_to_v2 Normal file
View File

@ -0,0 +1,119 @@
#!/usr/bin/perl
=head1 NAME
convert_db_to_v2 - convert simba metadata database to v2 layout
=head1 DESCRIPTION
This script converts the simba metadata database from v1 (up to r62)
to v2 (somewhere after r63) layout, by splitting the versions table into
two new tables versions2 and instances.
=cut
use warnings;
use strict;
use Simba::CA;
my $ca = Simba::CA->new({
dbi_file => $ENV{SIMBA_DB_CONN} || "$ENV{HOME}/.dbi/simba",
});
my $dbh = $ca->{dbh};
$dbh->{mysql_use_result} = 1; # fetch row by row, not all at once
$dbh->do(q{
create table versions2 (
`id` int(11) NOT NULL auto_increment,
`file_type` char(1) default NULL,
`file_size` bigint(20) default NULL,
`file_mtime` int(11) default NULL,
`file_owner` varchar(255) default NULL,
`file_group` varchar(255) default NULL,
`file_acl` varchar(255) default NULL,
`file_unix_bits` set('setuid','setgid','sticky') default NULL,
`file_rdev` int(11) default NULL,
`checksum` varchar(255) default NULL,
`file_linktarget` text,
PRIMARY KEY (`id`),
KEY `versions2_content_idx` (`checksum`, file_mtime)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
});
$dbh->do(q{
create table instances (
`id` int(11) NOT NULL auto_increment,
`file` int(11) default NULL,
`file_id` varchar(255) default NULL,
`date` int(11) default NULL,
`online` tinyint(1) default NULL,
`session` int(11) default NULL,
version int not null,
PRIMARY KEY (`id`),
KEY `instances_session_file_idx` (`session`,`file`),
KEY `instances_file_session_idx` (file, `session`),
KEY instances_version_idx (version)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
});
my $sth_select = $dbh->prepare("select * from versions");
my @version2_fields = qw(
file_type
file_size
file_mtime
file_owner
file_group
file_acl
file_unix_bits
file_rdev
checksum
file_linktarget
);
my $sth_ins_versions2
= $dbh->prepare(
'insert into versions2( ' .
join (",", @version2_fields) .
") values (" .
join(",", ("?") x @version2_fields) .
")"
);
my $sth_ins_instances
= $dbh->prepare(
q{
insert into instances(
id,
file,
file_id,
date,
online,
session,
version
)
values(?, ?, ?, ?, ?, ?)
}
);
$sth_select->execute();
my %versions2;
while(my $r = $sth_select->fetchrow_hashref) {
my $key = join($;, map((defined $_ ? $_ : ''),
@{$r}{@version2_fields}
)
);
my $version2_id;
if ($versions2{$key}) {
$version2_id = $versions2{$key};
} else {
$sth_ins_versions2->execute(@{$r}{@version2_fields});
$version2_id = $sth_ins_versions2->{mysql_insertid};
$versions2{$key} = $version2_id;
}
$sth_ins_instances->execute(@{$r}{qw(id file file_id date online session)}, $version2_id);
}