App-Repository
view release on metacpan or search on metacpan
lib/App/Repository.pm view on Meta::CPAN
Sample Usage:
$tablelabels = $rep->get_table_labels();
foreach (sort keys %$tablelabels) {
print "$_ => $tablelabels->{$_}\n";
}
Returns a hash of all of the tables and the labels
which should be used when displaying them to the user through
the user interface.
=cut
sub get_table_labels {
my ($self) = @_;
$self->{table_labels};
}
#############################################################################
# get_table_def()
#############################################################################
=head2 get_table_def()
* Signature: $table_def = $rep->get_table_def($tablename);
* Param: $tablename string
* Return: $table_def {}
* Throws: App::Exception::Repository
* Since: 0.01
Sample Usage:
$table_def = $rep->get_table_def($tablename);
print "$table_def->{name} $table_def->{label}\n";
Gets a reference to a "table definition", which allows you to access all
of the attributes of the requested table.
By default, this is only "name" and "label".
However, for various types of repositories, there may be additional
attributes for a table.
=cut
sub get_table_def {
&App::sub_entry if ($App::trace);
my ($self, $table, $options) = @_;
my $repname = $self->{table}{$table}{repository};
my $realtable = $self->{table}{$table}{table} || $table;
my ($table_def);
if (defined $repname && $repname ne $self->{name}) {
my $rep = $self->{context}->repository($repname);
$table_def = $rep->get_table_def($realtable, $options);
}
elsif (defined $realtable && $realtable ne $table) {
$table_def = $self->get_table_def($realtable, $options);
}
else {
$self->_load_table_metadata($table) if (! defined $self->{table}{$table}{loaded});
if ($options->{table_def}) {
$table_def = $options->{table_def};
App::Reference->overlay($table_def, $self->{table}{$table});
}
else {
$table_def = $self->{table}{$table};
}
}
&App::sub_exit($table_def) if ($App::trace);
return($table_def);
}
#############################################################################
# get_column_names()
#############################################################################
=head2 get_column_names()
* Signature: $columnnames = $rep->get_column_names($tablename);
* Param: $tablename string
* Return: $columnnames []
* Throws: App::Exception::Repository
* Since: 0.01
Sample Usage:
$columnnames = $rep->get_column_names($tablename);
print join(",", @$columnnames), "\n";
Returns the set of column names for the requested table in a repository.
=cut
sub get_column_names {
my ($self, $table) = @_;
my $table_def = $self->get_table_def($table);
my $columns = $table_def->{columns};
return($columns);
}
sub get_phys_column_names {
my ($self, $table) = @_;
my $table_def = $self->get_table_def($table);
my $columns = $table_def->{phys_columns};
return($columns);
}
#############################################################################
# get_column_labels()
#############################################################################
=head2 get_column_labels()
* Signature: $columnlabels = $rep->get_column_labels($tablename);
* Param: $tablename string
* Return: $columnlabels {}
* Throws: App::Exception::Repository
* Since: 0.01
Sample Usage:
$columnlabels = $rep->get_column_labels($tablename);
foreach (sort keys %$columnlabels) {
lib/App/Repository.pm view on Meta::CPAN
The default implementation does nothing.
It is intended to be overridden in the subclass
(if the repository has any sort of metadata).
=cut
sub _load_rep_metadata_from_source {
my ($self) = @_;
}
#############################################################################
# _load_table_metadata()
#############################################################################
=head2 _load_table_metadata()
* Signature: $self->_load_table_metadata();
* Param: void
* Return: void
* Throws: App::Exception::Repository
* Since: 0.01
Sample Usage:
$self->_load_table_metadata();
First it calls _load_table_metadata_from_source() in order for the repository
itself to be consulted for any metadata information for the about the
table.
Then it initializes
the repository metadata information for that table from the config
information.
* List of columns (+ displayable labels, types)
* List of column types (+ displayable labels)
Then it determines the set of required columns whenever selecting
data from the table and clears the cache of selected rows
for the table.
=cut
sub _load_table_metadata {
&App::sub_entry if ($App::trace);
my ($self, $table) = @_;
# if it's already been loaded, don't do it again
return if (defined $self->{table}{$table}{loaded});
my ($table_def, $columns, $column, $column_def, $idx, $native_column);
$table_def = $self->{table}{$table};
if (!$table_def) {
my $options = $self->{options};
my $prefix = $options->{prefix};
my $conf_type = $options->{conf_type} || "pl";
my $table_file = "$prefix/etc/app/Repository/$self->{name}/$table.$conf_type";
if (-r $table_file) {
$table_def = App::Conf::File->create({ conf_file => $table_file });
if ($table_def->{overlay}) {
delete $table_def->{overlay};
App::Reference->overlay($self->{context}{conf}, $table_def); # Caution. Use with care.
}
else {
$self->{table}{$table} = $table_def;
}
}
}
$self->{table}{$table}{loaded} = 1; # mark it as having been loaded
return if (!defined $table_def);
# load up all additional information from the native metadata
$self->_load_table_metadata_from_source($table);
$columns = $table_def->{columns};
if (! defined $columns) {
$columns = [];
$table_def->{columns} = $columns;
}
my $column_defs = $table_def->{column};
# for each column named in the configuration, give it a number up front
for ($idx = 0; $idx <= $#$columns; $idx++) {
$column = $columns->[$idx];
$column_defs->{$column}{idx} = $idx;
}
# for each column in the hash (random order), add them to the end
my ($label);
foreach $column (keys %$column_defs) {
$column_def = $column_defs->{$column};
$column_def->{name} = $column;
if (! $column_def->{label}) {
$label = $column;
if ($self->{auto_label}) {
$label = lc($label);
$label =~ s/^([a-z])/uc($1)/e;
$label =~ s/(_[a-z])/uc($1)/eg;
$label =~ s/_+/ /g;
}
$column_def->{label} = $label;
}
# column has not been added to the list and it's not explicitly "hidden", so add it
if (!defined $column_def->{idx} && ! $column_def->{hide}) {
push(@$columns, $column);
$idx = $#$columns;
$column_def->{idx} = $idx;
$column_def->{alias} = "c$idx" if (!defined $column_def->{alias});
# we're not hiding physical columns and a native table was defined, so make an entry
if (! $self->{hide_physical}) {
$native_column = $column_def->{native_column};
if (defined $native_column &&
$native_column ne $column &&
!defined $table_def->{column}{$native_column}) {
$table_def->{column}{$native_column} = $table_def->{column}{$column};
}
}
( run in 0.656 second using v1.01-cache-2.11-cpan-df04353d9ac )