Author: spadkins
Date: Mon Sep 4 11:54:28 2006
New Revision: 6846
Added:
p5ee/trunk/App-Repository/bin/
p5ee/trunk/App-Repository/bin/dbget (contents, props changed)
Log:
new
Added: p5ee/trunk/App-Repository/bin/dbget
==============================================================================
--- (empty file)
+++ p5ee/trunk/App-Repository/bin/dbget Mon Sep 4 11:54:28 2006
@@ -0,0 +1,160 @@
+#!/usr/local/bin/perl -w
+
+use Date::Format;
+
+use App::Options (
+ options => [ qw(dbhost dbname dbuser dbpass repository table params
columns headings compact verbose) ],
+ option => {
+ repository => {
+ default => "default",
+ description => "Name of the repository to get the rows from",
+ },
+ table => {
+ required => 1,
+ description => "Table name (i.e. --table=customer)",
+ },
+ params => {
+ required => 1,
+ description => "List of params (var=value pairs) (i.e.
--params=\"last_name=Jones|first_name=Mike\")",
+ },
+ columns => {
+ description => "List of columns (comma-separated list) (i.e.
--columns=first_name,last_name)",
+ },
+ headings => {
+ description => "List of heading abbreviations (comma-separated)
(i.e. --headings=first,last)",
+ },
+ compact => {
+ description => "Trim titles to make compact table",
+ },
+ verbose => {
+ default => 1,
+ description => "Verbose level",
+ },
+ },
+);
+
+use App;
+use strict;
+
+$| = 1; # autoflush stdout
+
+{
+ my $context = App->context();
+ my $db = $context->repository($App::options{repository});
+ my $table = $App::options{table};
+ my ($columns);
+ if ($App::options{columns}) {
+ $columns = [ split(/,/, $App::options{columns}) ];
+ }
+ else {
+ $columns = $db->_get_default_columns($table);
+ }
+ my $params = { split(/[=>\|]+/, $App::options{params}) };
+ my $headings = $App::options{headings} ? [ split(/,/,
$App::options{headings}) ] : [];
+ my $verbose = $App::options{verbose};
+ my $rows = $db->get_rows($table, $params, $columns);
+ my $formats = [];
+ &print_table($rows, $columns, $formats, { compact =>
$App::options{compact}, headings => $headings });
+}
+
+sub print_table {
+ my ($rows, $columns, $formats, $options) = @_;
+ my ($row, $r, $c, $elem, $format, $len, $f, $heading);
+ my (@autoformat);
+ my $headings = $options->{headings};
+ my $max_columns = 0;
+ for ($r = 0; $r <= $#$rows; $r++) {
+ $row = $rows->[$r];
+ if ($max_columns < $#$row + 1) {
+ $max_columns = $#$row + 1;
+ }
+ }
+ for ($c = 0; $c < $max_columns; $c++) {
+ if (! defined $autoformat[$c]) {
+ $autoformat[$c] = {
+ max_length => 0,
+ type => 0, # 0=string, 1=integer, 2=float
+ min => undef,
+ max => undef,
+ };
+ }
+ $f = $autoformat[$c];
+ $heading = ($headings && $headings->[$c]) ? $headings->[$c] : "";
+ if ($heading) {
+ $len = length($heading);
+ if ($len > $f->{max_length}) {
+ $f->{max_length} = $len;
+ }
+ }
+ elsif (! $options->{compact}) {
+ $len = length($columns->[$c]);
+ if ($len > $f->{max_length}) {
+ $f->{max_length} = $len;
+ }
+ }
+ for ($r = 0; $r <= $#$rows; $r++) {
+ $row = $rows->[$r];
+ if ($c <= $#$row && defined $row->[$c]) {
+ $elem = $row->[$c];
+ $len = length($elem);
+ if ($elem =~ /^-?[0-9]*\.[0-9]+$/) {
+ $len = length(sprintf("%.2f",$elem));
+ $f->{type} = 2;
+ if (!defined $f->{min} || $elem < $f->{min}) {
+ $f->{min} = $elem;
+ }
+ if (!defined $f->{max} || $elem < $f->{max}) {
+ $f->{max} = $elem;
+ }
+ }
+ elsif ($elem =~ /^-?[0-9]+$/) {
+ $f->{type} = 1 if ($f->{type} < 1);
+ if (!defined $f->{min} || $elem < $f->{min}) {
+ $f->{min} = $elem;
+ }
+ if (!defined $f->{max} || $elem < $f->{max}) {
+ $f->{max} = $elem;
+ }
+ }
+ $f->{max_length} = $len if ($len > $f->{max_length});
+ }
+ }
+ &determine_sprintf_fmt($f);
+ }
+ for ($c = 0; $c <= $#$columns; $c++) {
+ $format = $autoformat[$c]->{title_fmt} || "%s";
+ print " " if ($c > 0);
+ $heading = ($headings && $headings->[$c]) ? $headings->[$c] :
$columns->[$c];
+ printf($format, $heading);
+ }
+ print "\n";
+ for ($r = 0; $r <= $#$rows; $r++) {
+ $row = $rows->[$r];
+ for ($c = 0; $c <= $#$row; $c++) {
+ $format = $autoformat[$c]->{fmt} || "%s";
+ print " " if ($c > 0);
+ printf($format, $row->[$c]);
+ }
+ print "\n";
+ }
+}
+
+sub determine_sprintf_fmt {
+ my ($f) = @_;
+ my ($width, $int_len, $fract_len);
+ if ($f->{type} == 2) { # float
+ $f->{title_fmt} = "%$f->{max_length}.$f->{max_length}s";
+ $f->{fmt} = "%$f->{max_length}.2f";
+ }
+ elsif ($f->{type} == 1) { # integer
+ $f->{title_fmt} = "%$f->{max_length}.$f->{max_length}s";
+ $f->{fmt} = "%$f->{max_length}d";
+ }
+ else { # string
+ $f->{title_fmt} = "%-$f->{max_length}.$f->{max_length}s";
+ $f->{fmt} = "%-$f->{max_length}s";
+ }
+}
+
+exit (0);
+