]> wagnertech.de Git - mfinanz.git/blobdiff - scripts/dbupgrade2_tool.pl
Parser für besondere Zeichen in special_chars umgeschrieben.
[mfinanz.git] / scripts / dbupgrade2_tool.pl
index 23e41233954977a4dbb974361d1b39a09f6e0eea..e688867b1fefa1ed176f3c09a742425aa513170e 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,9 +32,9 @@ 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);
 
-our (%myconfig, $form, $user);
+our (%myconfig, $form, $user, $auth);
 
 sub show_help {
   my $help_text = <<'END_HELP'
@@ -60,6 +61,8 @@ dbupgrade2_tool.pl [options]
     --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:
@@ -163,6 +166,7 @@ sub dump_graphviz {
 
   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 +260,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;
@@ -294,6 +352,7 @@ GetOptions("list"       => \$opt_list,
            "graphviz:s" => \$opt_graphviz,
            "user=s"     => \$opt_user,
            "apply=s"    => \$opt_apply,
+           "applied"    => \$opt_applied,
            "help"       => \$opt_help,
   );
 
@@ -308,16 +367,31 @@ dump_graphviz($opt_graphviz) 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();
+}