shell bypass 403
package SQL::Translator::Producer::POD;
=head1 NAME
SQL::Translator::Producer::POD - POD producer for SQL::Translator
=head1 SYNOPSIS
use SQL::Translator;
my $t = SQL::Translator->new( parser => '...', producer => 'POD', '...' );
print $t->translate;
=head1 DESCRIPTION
Creates a POD description of each table, field, index, and constraint.
A good starting point for text documentation of a schema. You can
easily convert the output to HTML or text using "perldoc" or other
interesting formats using Pod::POM or Template::Toolkit's POD plugin.
=cut
use strict;
use warnings;
our $VERSION = '1.61';
use SQL::Translator::Schema::Constants;
use SQL::Translator::Utils qw(header_comment);
sub produce {
my $t = shift;
my $schema = $t->schema;
my $schema_name = $schema->name || 'Schema';
my $args = $t->producer_args;
my $title = $args->{'title'} || $schema_name;
my $pod = "=pod\n\n=head1 DESCRIPTION\n\n$title\n\n=head1 TABLES\n\n";
for my $table ( $schema->get_tables ) {
my $table_name = $table->name or next;
my @fields = $table->get_fields or next;
$pod .= "=head2 $table_name\n\n=head3 FIELDS\n\n";
#
# Fields
#
for my $field ( @fields ) {
$pod .= "=head4 " . $field->name . "\n\n=over 4\n\n";
my $data_type = $field->data_type;
my $size = $field->size;
$data_type .= "($size)" if $size;
$pod .= "=item * $data_type\n\n";
$pod .= "=item * PRIMARY KEY\n\n" if $field->is_primary_key;
my $default = $field->default_value;
$pod .= "=item * Default '$default' \n\n" if defined $default;
$pod .= sprintf( "=item * Nullable '%s' \n\n",
$field->is_nullable ? 'Yes' : 'No' );
$pod .= "=back\n\n";
}
#
# Indices
#
if ( my @indices = $table->get_indices ) {
$pod .= "=head3 INDICES\n\n";
for my $index ( @indices ) {
$pod .= "=head4 " . $index->type . "\n\n=over 4\n\n";
$pod .= "=item * Fields = " .
join(', ', $index->fields ) . "\n\n";
$pod .= "=back\n\n";
}
}
#
# Constraints
#
if ( my @constraints = $table->get_constraints ) {
$pod .= "=head3 CONSTRAINTS\n\n";
for my $c ( @constraints ) {
$pod .= "=head4 " . $c->type . "\n\n=over 4\n\n";
if($c->type eq CHECK_C) {
$pod .= "=item * Expression = " . $c->expression . "\n\n";
} else {
$pod .= "=item * Fields = " .
join(', ', $c->fields ) . "\n\n";
if ( $c->type eq FOREIGN_KEY ) {
$pod .= "=item * Reference Table = L</" .
$c->reference_table . ">\n\n";
$pod .= "=item * Reference Fields = " .
join(', ', map {"L</$_>"} $c->reference_fields ) .
"\n\n";
}
if ( my $update = $c->on_update ) {
$pod .= "=item * On update = $update\n\n";
}
if ( my $delete = $c->on_delete ) {
$pod .= "=item * On delete = $delete\n\n";
}
}
$pod .= "=back\n\n";
}
}
}
my $header = ( map { $_ || () } split( /\n/, header_comment('', '') ) )[0];
$header =~ s/^Created by //;
$pod .= "=head1 PRODUCED BY\n\n$header\n\n=cut";
return $pod;
}
1;
# -------------------------------------------------------------------
# Expect poison from the standing water.
# William Blake
# -------------------------------------------------------------------
=pod
=head1 AUTHOR
Ken Youens-Clark E<lt>kclark@cpan.orgE<gt>.
=head2 CONTRIBUTORS
Jonathan Yu E<lt>frequency@cpan.orgE<gt>
=head1 SEE ALSO
perldoc, perlpod, Pod::POM, Template::Manual::Plugins.
=cut