Merge branch 'master', remote branch 'origin'
[kivitendo-erp.git] / scripts / dbupgrade2_tool.pl
index fec77ab..ba13e3f 100755 (executable)
@@ -17,13 +17,16 @@ use warnings;
 use utf8;
 use English '-no_match_vars';
 
+use Config::Std;
 use DBI;
 use Data::Dumper;
 use Getopt::Long;
 use Text::Iconv;
 
 use SL::LXDebug;
+use SL::LxOfficeConf;
 
+SL::LxOfficeConf->read;
 our $lxdebug = LXDebug->new();
 
 use SL::Auth;
@@ -39,8 +42,9 @@ use SL::Dispatcher;
 #######
 
 my ($opt_list, $opt_tree, $opt_rtree, $opt_nodeps, $opt_graphviz, $opt_help);
-my ($opt_user, $opt_apply, $opt_applied, $opt_format, $opt_test_utf8);
-my ($opt_dbhost, $opt_dbport, $opt_dbname, $opt_dbuser, $opt_dbpassword);
+my ($opt_user, $opt_apply, $opt_applied, $opt_unapplied, $opt_format, $opt_test_utf8);
+my ($opt_dbhost, $opt_dbport, $opt_dbname, $opt_dbuser, $opt_dbpassword, $opt_create, $opt_type);
+my ($opt_description, $opt_encoding, @opt_depends);
 
 our (%myconfig, $form, $user, $auth, $locale, $controls, $dbupgrader);
 
@@ -74,6 +78,9 @@ dbupgrade2_tool.pl [options]
                          then the option \'--user\' must be used as well.
     --applied            List the applied database upgrades for the
                          database that the user given with \'--user\' uses.
+    --unapplied          List the database upgrades that haven\'t been applied
+                         yet to the database that the user given with
+                         \'--user\' uses.
     --test-utf8          Tests a PostgreSQL cluster for proper UTF-8 support.
                          You have to specify the database to test with the
                          parameters --dbname, --dbhost, --dbport, --dbuser
@@ -225,6 +232,48 @@ sub dump_nodeps {
     "\n\n";
 }
 
+sub create_upgrade {
+  my (%params) = @_;
+
+  my $filename    = $params{filename};
+  my $dbupgrader  = $params{dbupgrader};
+  my $type        = $params{type}        || '';
+  my $description = $params{description} || '';
+  my $encoding    = $params{encoding}    || 'utf-8';
+  my @depends     = @{ $params{depends} };
+
+  if (!@depends) {
+    my @releases = grep { /^release_/ } keys %$controls;
+    @depends = ((sort @releases)[-1]);
+  }
+
+  my $comment;
+  if ($type eq 'sql') {
+    $comment = '--';
+  } elsif ($type eq 'pl') {
+    $comment = '#';
+  } elsif (!$type) {
+    die 'Error: No --type was given but is required for --create.';
+  } else {
+    die 'Error: Unknown --type. Try "sql" or "pl".';
+  }
+
+  my $full_filename = $dbupgrader->path . '/' . $filename . '.' . $type;
+
+  die "file '$full_filename' already exists, aborting" if -f $full_filename;
+
+
+  open my $fh, ">:encoding($encoding)", $full_filename or die "can't open $full_filename";
+  print $fh "$comment \@tag: $filename\n";
+  print $fh "$comment \@description: $description\n";
+  print $fh "$comment \@depends: @depends\n";
+  print $fh "$comment \@encoding: $encoding\n";
+  close $fh;
+
+  system("\$EDITOR $full_filename");
+  exit 0;
+}
+
 sub apply_upgrade {
   my $name = shift;
 
@@ -337,6 +386,25 @@ sub dump_applied {
   }
 }
 
+sub dump_unapplied {
+  my @results;
+
+  my $dbh = $form->dbconnect_noauto(\%myconfig);
+
+  $dbh->{PrintWarn}  = 0;
+  $dbh->{PrintError} = 0;
+
+  my @unapplied = $dbupgrader->unapplied_upgrade_scripts($dbh);
+
+  $dbh->disconnect;
+
+  if (!scalar @unapplied) {
+    print "All database upgrades have been applied.\n";
+  } else {
+    print map { $_->{tag} . "\n" } @unapplied;
+  }
+}
+
 sub build_upgrade_order {
   my $name  = shift;
   my $order = shift;
@@ -358,11 +426,8 @@ sub build_upgrade_order {
 #######
 #######
 
-eval { require "config/lx-erp.conf"; };
-eval { require "config/lx-erp-local.conf"; } if (-f "config/lx-erp-local.conf");
-
-$locale = Locale->new($::language);
-$form = Form->new();
+$locale = Locale->new;
+$form   = Form->new;
 
 #######
 #######
@@ -377,6 +442,12 @@ GetOptions("list"         => \$opt_list,
            "user=s"       => \$opt_user,
            "apply=s"      => \$opt_apply,
            "applied"      => \$opt_applied,
+           "create=s"     => \$opt_create,
+           "type=s"       => \$opt_type,
+           "encoding=s"   => \$opt_encoding,
+           "description=s" => \$opt_description,
+           "depends=s"    => \@opt_depends,
+           "unapplied"    => \$opt_unapplied,
            "test-utf8"    => \$opt_test_utf8,
            "dbhost:s"     => \$opt_dbhost,
            "dbport:s"     => \$opt_dbport,
@@ -397,6 +468,12 @@ dump_tree_reverse()                         if ($opt_rtree);
 dump_graphviz('file_name' => $opt_graphviz,
               'format'    => $opt_format)   if (defined $opt_graphviz);
 dump_nodeps()                               if ($opt_nodeps);
+create_upgrade(filename   => $opt_create,
+               dbupgrader  => $dbupgrader,
+               type        => $opt_type,
+               description => $opt_description,
+               encoding    => $opt_encoding,
+               depends     => \@opt_depends) if ($opt_create);
 
 if ($opt_user) {
   $auth = SL::Auth->new();
@@ -406,14 +483,14 @@ if ($opt_user) {
                  "and to create them.");
   }
 
-  %myconfig = $auth->read_user($opt_user);
+  %myconfig = $auth->read_user(login => $opt_user);
 
   if (!$myconfig{login}) {
     $form->error($form->format_string("The user '#1' does not exist.", $opt_user));
   }
 
   $locale = new Locale($myconfig{countrycode}, "all");
-  $user   = new User($opt_user);
+  $user   = new User(login => $opt_user);
 
   map { $form->{$_} = $myconfig{$_} } keys %myconfig;
 }
@@ -428,6 +505,12 @@ if ($opt_applied) {
   dump_applied();
 }
 
+if ($opt_unapplied) {
+  $form->error("--unapplied used but no user name given with --user.") if (!$user);
+  dump_unapplied();
+}
+
+
 if ($opt_test_utf8) {
   $form->error("--test-utf8 used but no database name given with --dbname.") if (!$opt_dbname);