#! /usr/bin/perl # # install.pl # # This script will create database tables as necessary. # # It is part of the NewsStats package. # # Copyright (c) 2010-2013 Thomas Hochstein # # It can be redistributed and/or modified under the same terms under # which Perl itself is published. BEGIN { our $VERSION = "0.02"; use File::Basename; # we're in .../install, so our module is in ../lib push(@INC, dirname($0).'/../lib'); } use strict; use warnings; use NewsStats qw(:DEFAULT); use DBI; use Getopt::Long qw(GetOptions); Getopt::Long::config ('bundling'); ################################# Main program ################################# ### read commandline options my ($OptUpdate,$OptConfFile); GetOptions ('u|update=s' => \$OptUpdate, 'conffile=s' => \$OptConfFile, 'h|help' => \&ShowPOD, 'V|version' => \&ShowVersion) or exit 1; ### read configuration print("Reading configuration.\n"); my %Conf = %{ReadConfig($OptConfFile)}; ##### -------------------------------------------------------------------------- ##### Database table definitions ##### -------------------------------------------------------------------------- my $DBCreate = < < < < INSTALL my $Upgrade =''; if ($OptUpdate) { $Upgrade = <connect(sprintf('DBI:%s:host=%s',$Conf{'DBDriver'}, $Conf{'DBHost'}), $Conf{'DBUser'}, $Conf{'DBPw'}, { PrintError => 0 }); my $DBQuery = $DBHandle->prepare($DBCreate); $DBQuery->execute() or &Bleat(2, sprintf("Can't create database %s: %s%\n", $Conf{'DBDatabase'}, $DBI::errstr)); printf("Database table %s created succesfully.\n",$Conf{'DBDatabase'}); $DBHandle->disconnect; }; ### 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 (!$OptUpdate) { ##### installation mode # 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"; $PackageVersion = '0.03'; if ($OptUpdate < $PackageVersion) { if ($OptUpdate < 0.02) { # 0.01 -> 0.02 # &DoMySQL('...;'); # print "v0.02: Database upgrades ...\n"; # &PrintInstructions('0.02',<<" INSTRUCTIONS"); # INSTRUCTIONS }; }; # Display general 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 &Bleat(2, sprintf("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 &Bleat(1, sprintf("Database error: %s\n",$DBI::errstr)); return; }; sub PrintInstructions { my ($UpVersion,$Instructions) = @_; print "v$UpVersion: Upgrade Instructions >>>>>\n"; my $Padding = ' ' x (length($UpVersion) + 3); $Instructions =~ s/^ /$Padding/mg; print $Instructions; print "<" x (length($UpVersion) + 29) . "\n"; }; __END__ ################################ Documentation ################################# =head1 NAME install - installation script =head1 SYNOPSIS B [B<-Vh> [--update I] [B<--conffile> I] =head1 REQUIREMENTS See L. =head1 DESCRIPTION This script will create database tables as necessary and configured. =head2 Configuration B will read its configuration from F which should be present in etc/ via Config::Auto or from a configuration file submitted by the B<--conffile> option. See L for an overview of possible configuration options. =head1 OPTIONS =over 3 =item B<-V>, B<--version> Print out version and copyright information and exit. =item B<-h>, B<--help> Print this man page and exit. =item B<-u>, B<--update> I Don't do a fresh install, but update from I. =item B<--conffile> I Load configuration from I instead of F. =back =head1 FILES =over 4 =item F The script itself. =item F Library functions for the NewsStats package. =item F Runtime configuration file. =back =head1 BUGS Please report any bugs or feature requests to the author or use the bug tracker at L! =head1 SEE ALSO =over 2 =item - L =item - L =back This script is part of the B package. =head1 AUTHOR Thomas Hochstein =head1 COPYRIGHT AND LICENSE Copyright (c) 2010-2013 Thomas Hochstein This program is free software; you may redistribute it and/or modify it under the same terms as Perl itself. =cut