[svn:p5ee] r6846 - p5ee/trunk/App-Repository/bin

[email protected]
Newsgroups perl.cvs.p5ee
Message-ID <[email protected]>
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);
+
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.