Add upgrade path.

NewsStats.pm: Add $PackageVersion.

install.pl: Modularise program flow to subroutines.
            Add framework for database upgrade and
            upgrade instructions.

Signed-off-by: Thomas Hochstein <thh@inter.net>
This commit is contained in:
Thomas Hochstein 2010-09-18 19:02:46 +02:00
parent 2832c235b2
commit f6d15ca78e
2 changed files with 106 additions and 31 deletions

View file

@ -18,6 +18,7 @@ require Exporter;
@EXPORT = qw( @EXPORT = qw(
$MySelf $MySelf
$MyVersion $MyVersion
$PackageVersion
ReadOptions ReadOptions
ReadConfig ReadConfig
OverrideConfig OverrideConfig
@ -40,6 +41,7 @@ require Exporter;
Output => [qw(OutputData FormatOutput)], Output => [qw(OutputData FormatOutput)],
SQLHelper => [qw(SQLHierarchies SQLGroupList GetMaxLenght)]); SQLHelper => [qw(SQLHierarchies SQLGroupList GetMaxLenght)]);
$VERSION = '0.1'; $VERSION = '0.1';
our $PackageVersion = '0.1';
use Data::Dumper; use Data::Dumper;
use File::Basename; use File::Basename;
@ -82,7 +84,7 @@ sub ReadOptions {
sub ShowVersion { sub ShowVersion {
################################################################################ ################################################################################
### display version and exit ### display version and exit
print "$MyVersion\nCopyright (c) 2010 Thomas Hochstein <thh\@inter.net>\n"; print "NewsStats v$PackageVersion\n$MyVersion\nCopyright (c) 2010 Thomas Hochstein <thh\@inter.net>\n";
print "This program is free software; you may redistribute it and/or modify it under the same terms as Perl itself.\n"; print "This program is free software; you may redistribute it and/or modify it under the same terms as Perl itself.\n";
exit(100); exit(100);
}; };

View file

@ -28,10 +28,11 @@ use DBI;
################################# Main program ################################# ################################# Main program #################################
### read commandline options ### read commandline options
my %Options = &ReadOptions(''); my %Options = &ReadOptions('u:');
### change working directory to .. (as we're in .../install) ### change working directory to .. (as we're in .../install)
chdir dirname($0).'/..'; chdir dirname($0).'/..';
my $Path = cwd();
### read configuration ### read configuration
print("Reading configuration.\n"); print("Reading configuration.\n");
@ -82,35 +83,12 @@ CREATE TABLE IF NOT EXISTS `$Conf{'DBTableGrps'}` (
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Postings per newsgroup'; ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Postings per newsgroup';
GRPS GRPS
##### --------------------------- End of definitions --------------------------- ##### --------------------------------------------------------------------------
##### Installation / upgrade instructions
##### --------------------------------------------------------------------------
### create database tables my $Install = <<INSTALL;
print "-----\nStarting database table generation.\n"; ----------
# DB init
my $DBHandle = InitDB(\%Conf,1);
# read tables
my %TablesInDB = %{$DBHandle->table_info('%', '%', '%', 'TABLE')->fetchall_hashref('TABLE_NAME')};
# check for tables and create them, if they don't exist yet
foreach my $Table (keys %DBCreate) {
if (defined($TablesInDB{$Conf{$Table}})) {
printf("Database table %s.%s already exists, skipping ....\n",$Conf{'DBDatabase'},$Conf{$Table});
next;
};
my $DBQuery = $DBHandle->prepare($DBCreate{$Table});
$DBQuery->execute() or die sprintf("$MySelf: E: Can't create table %s in database %s: %s%\n",$Table,$Conf{'DBDatabase'},$DBI::errstr);
printf("Database table %s.%s created succesfully.\n",$Conf{'DBDatabase'},$Conf{$Table});
};
# close handle
$DBHandle->disconnect;
print "Database table generation done.\n";
### output information on other necessary steps
my $Path = cwd();
print <<TODO;
-----
Things left to do: Things left to do:
1) Setup an INN feed to feedlog.pl 1) Setup an INN feed to feedlog.pl
@ -149,7 +127,102 @@ Things left to do:
Enjoy! Enjoy!
-thh <thh\@inter.net> -thh <thh\@inter.net>
TODO INSTALL
my $Upgrade = <<UPGRADE;
----------
Your installation was upgraded from $Options{'u'} to $PackageVersion.
Don't forget to restart your INN feed so that it can pick up the new version:
# ctlinnd begin 'newsstats!'
(or whatever you called your feed).
UPGRADE
##### --------------------------------------------------------------------------
##### Upgrading
##### --------------------------------------------------------------------------
my (%DBUpgrade,%Instructions);
# 0.01 -> 0.02
$DBUpgrade{'0.02'} = <<DB0point02;
SELECT 1;
DB0point02
$Instructions{'0.02'} = <<IN0point02;
Dummy Instructions.
IN0point02
##### --------------------------- End of definitions ---------------------------
### DB init, read list of tables
print "Reading database information.\n";
my $DBHandle = InitDB(\%Conf,1);
my %TablesInDB = %{$DBHandle->table_info('%', '%', '%', 'TABLE')->fetchall_hashref('TABLE_NAME')};
if (!$Options{'u'}) {
##### installation mode
print "----------\nStarting database table generation.\n";
# check for tables and create them, if they don't exist yet
foreach my $Table (keys %DBCreate) {
&CreateTable($Table);
};
print "Database table generation done.\n";
# Display install instructions
print $Install;
} else {
##### upgrade mode
print "----------\nStarting upgrade process.\n";
if ($Options{'u'} < $PackageVersion) {
# Database upgrades for each version
foreach my $UpVersion (sort keys %DBUpgrade) {
if ($UpVersion > $Options{'u'} and $UpVersion <= $PackageVersion) {
print "v$UpVersion: Executing database upgrade ...\n";
&DoMySQL($DBUpgrade{$UpVersion});
};
};
# Display upgrade instructions for each version
foreach my $UpVersion (sort keys %Instructions) {
if ($UpVersion > $Options{'u'} and $UpVersion <= $PackageVersion) {
print "v$UpVersion: Upgrade Instructions >>>>>\n";
my $Padding = ' ' x (length($UpVersion) + 3);
$Instructions{$UpVersion} =~ s/^/$Padding/;
print $Instructions{$UpVersion};
print "<" x (length($UpVersion) + 29) . "\n";
};
};
};
# Display upgrade instructions
print $Upgrade;
};
# close handle
$DBHandle->disconnect;
exit(0);
################################# Subroutines ##################################
sub CreateTable() {
my $Table = shift;
if (defined($TablesInDB{$Conf{$Table}})) {
printf("Database table %s.%s already exists, skipping ....\n",$Conf{'DBDatabase'},$Conf{$Table});
return;
};
my $DBQuery = $DBHandle->prepare($DBCreate{$Table});
$DBQuery->execute() or die sprintf("$MySelf: E: Can't create table %s in database %s: %s%\n",$Table,$Conf{'DBDatabase'},$DBI::errstr);
printf("Database table %s.%s created succesfully.\n",$Conf{'DBDatabase'},$Conf{$Table});
return;
};
sub DoMySQL() {
my $SQL = shift;
my $DBQuery = $DBHandle->prepare($SQL);
$DBQuery->execute() or warn sprintf("$MySelf: E: Database error: %s\n",$DBI::errstr);
return;
};
__END__ __END__