]> wagnertech.de Git - kivitendo-erp.git/blobdiff - scripts/dbupgrade2_tool.pl
1. Salesman-Daten wurden nicht in $form eingetragen, weil die User-Klasse nur noch...
[kivitendo-erp.git] / scripts / dbupgrade2_tool.pl
index 23e41233954977a4dbb974361d1b39a09f6e0eea..e290adefac30d67a6e76f07a4d576aec2c1aa48c 100755 (executable)
@@ -20,6 +20,7 @@ use SL::LXDebug;
 
 $lxdebug = LXDebug->new();
 
+use SL::Auth;
 use SL::Form;
 use SL::User;
 use SL::Locale;
@@ -31,20 +32,20 @@ use SL::DBUtils;
 #######
 
 my ($opt_list, $opt_tree, $opt_rtree, $opt_nodeps, $opt_graphviz, $opt_help);
-my ($opt_user, $opt_apply);
+my ($opt_user, $opt_apply, $opt_applied, $opt_format);
 
-our (%myconfig, $form, $user);
+our (%myconfig, $form, $user, $auth);
 
 sub show_help {
-  my $help_text = <<'END_HELP'
+  my $help_text = <<"END_HELP"
 dbupgrade2_tool.pl [options]
 
   A validation and information tool for the database upgrade scripts
-  in 'sql/Pg-upgrade2'.
+  in \'sql/Pg-upgrade2\'.
 
   At startup dbupgrade2_tool.pl will always check the consistency
   of all database upgrade scripts (e.g. circular references, invalid
-  formats, missing meta information). You can but don't have to specifiy
+  formats, missing meta information). You can but don\'t have to specifiy
   additional actions.
 
   Actions:
@@ -54,21 +55,24 @@ dbupgrade2_tool.pl [options]
     --graphviz[=file]    Create a Postscript document showing a tree of
                          all database upgrades and their dependencies.
                          If no file name is given then the output is
-                         written to 'db_dependencies.ps'.
+                         written to \'db_dependencies.png\'.
+    --format=...         Format for the graphviz output. Defaults to
+                         \'png\'. All values that the command \'dot\' accepts
+                         for it\'s option \'-T\' are acceptable.
     --nodeps             List all database upgrades that no other upgrade
                          depends on
-    --apply=tag          Applies the database upgrades 'tag' and all
-                         upgrades it depends on. If '--apply' is used
-                         then the option '--user' must be used as well.
+    --apply=tag          Applies the database upgrades \'tag\' and all
+                         upgrades it depends on. If \'--apply\' is used
+                         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.
     --help               Show this help and exit.
 
   Options:
     --user=name          The name of the user configuration to use for
                          database connectivity.
 END_HELP
-    ;
-
-  # Syntax-Highlighting-Fix für Emacs: '
+;
 
   print $help_text;
 
@@ -151,18 +155,22 @@ sub dump_tree_reverse {
 }
 
 sub dump_graphviz {
-  my $file_name = shift || "db_dependencies.ps";
+  my %params    = @_;
+
+  my $format    = $params{format}    || "png";
+  my $file_name = $params{file_name} || "db_dependencies.${format}";
 
-  print "GRAPHVIZ POSTCRIPT\n\n";
+  print "GRAPHVIZ OUTPUT -- format: ${format}\n\n";
   print "Output will be written to '${file_name}'\n";
 
   calc_rev_depends();
 
-  $dot = "|dot -Tps ";
+  $dot = "|dot -T${format} ";
   open OUT, "${dot}> \"${file_name}\"" || die;
 
   print OUT
     "digraph db_dependencies {\n" .
+    "graph [size=\"16.53,11.69!\"];\n" .
     "node [shape=box style=filled fillcolor=white];\n";
 
   my %ranks;
@@ -256,6 +264,60 @@ sub apply_upgrade {
   $dbh->disconnect();
 }
 
+sub dump_sql_result {
+  my ($results, $column_order) = @_;
+
+  my %column_lengths = map { $_, length $_ } keys %{ $results->[0] };
+
+  foreach my $row (@{ $results }) {
+    map { $column_lengths{$_} = length $row->{$_} if (length $row->{$_} > $column_lengths{$_}) } keys %{ $row };
+  }
+
+  my @sorted_names;
+  if ($column_order && scalar @{ $column_order }) {
+    @sorted_names = @{ $column_order };
+  } else {
+    @sorted_names = sort keys %column_lengths;
+  }
+
+  my $format       = join('|', map { '%-' . $column_lengths{$_} . 's' } @sorted_names) . "\n";
+
+  printf $format, @sorted_names;
+  print  join('+', map { '-' x $column_lengths{$_} } @sorted_names) . "\n";
+
+  foreach my $row (@{ $results }) {
+    printf $format, map { $row->{$_} } @sorted_names;
+  }
+  printf "(\%d row\%s)\n", scalar @{ $results }, scalar @{ $results } > 1 ? 's' : '';
+}
+
+sub dump_applied {
+  my @results;
+
+  my $dbh = $form->dbconnect_noauto(\%myconfig);
+
+  $dbh->{PrintWarn}  = 0;
+  $dbh->{PrintError} = 0;
+
+  $user->create_schema_info_table($form, $dbh);
+
+  my $query = qq|SELECT tag, login, itime FROM schema_info ORDER BY itime|;
+  $sth = $dbh->prepare($query);
+  $sth->execute() || $form->dberror($query);
+  while (my $ref = $sth->fetchrow_hashref()) {
+    push @results, $ref;
+  }
+  $sth->finish();
+
+  $dbh->disconnect();
+
+  if (!scalar @results) {
+    print "No database upgrades have been applied yet.\n";
+  } else {
+    dump_sql_result(\@results, [qw(tag login itime)]);
+  }
+}
+
 sub build_upgrade_order {
   my $name  = shift;
   my $order = shift;
@@ -292,8 +354,10 @@ GetOptions("list"       => \$opt_list,
            "rtree"      => \$opt_rtree,
            "nodeps"     => \$opt_nodeps,
            "graphviz:s" => \$opt_graphviz,
+           "format:s"   => \$opt_format,
            "user=s"     => \$opt_user,
            "apply=s"    => \$opt_apply,
+           "applied"    => \$opt_applied,
            "help"       => \$opt_help,
   );
 
@@ -301,23 +365,39 @@ show_help() if ($opt_help);
 
 $controls = parse_dbupdate_controls($form, "Pg");
 
-dump_list()                  if ($opt_list);
-dump_tree()                  if ($opt_tree);
-dump_tree_reverse()          if ($opt_rtree);
-dump_graphviz($opt_graphviz) if (defined $opt_graphviz);
-dump_nodeps()                if ($opt_nodeps);
+dump_list()                                 if ($opt_list);
+dump_tree()                                 if ($opt_tree);
+dump_tree_reverse()                         if ($opt_rtree);
+dump_graphviz('file_name' => $opt_graphviz,
+              'format'    => $opt_format)   if (defined $opt_graphviz);
+dump_nodeps()                               if ($opt_nodeps);
 
 if ($opt_user) {
-  my $file_name = "users/${opt_user}.conf";
+  $auth = SL::Auth->new();
+  if (!$auth->session_tables_present()) {
+    $form->error("The session and user management tables are not present in the " .
+                 "authentication database. Please use the administration web interface " .
+                 "and to create them.");
+  }
+
+  %myconfig = $auth->read_user($opt_user);
+
+  if (!$myconfig{login}) {
+    $form->error($form->format_string("The user '#1' does not exist.", $opt_user));
+  }
 
-  eval { require($file_name); };
-  $form->error("File '$file_name' was not found") if $@;
   $locale = new Locale($myconfig{countrycode}, "all");
-  $user = new User("users/members", $opt_user);
+  $user   = new User($opt_user);
+
   map { $form->{$_} = $myconfig{$_} } keys %myconfig;
 }
 
 if ($opt_apply) {
-  $form->error("--apply used but no configuration file given with --user.") if (!$user);
+  $form->error("--apply used but no user name given with --user.") if (!$user);
   apply_upgrade($opt_apply);
 }
+
+if ($opt_applied) {
+  $form->error("--applied used but no user name given with --user.") if (!$user);
+  dump_applied();
+}