Class-DBI-Frozen-301
view release on metacpan or search on metacpan
lib/Class/DBI/Frozen/301.pm view on Meta::CPAN
sub meta_info {
my ($class, $type, $subtype) = @_;
my $meta = $class->__meta_info;
return $meta unless $type;
return $meta->{$type} unless $subtype;
return $meta->{$type}->{$subtype};
}
sub _simple_bless {
my ($class, $pri) = @_;
return $class->_init({ $class->primary_column => $pri });
}
sub _deflated_column {
my ($self, $col, $val) = @_;
$val ||= $self->_attrs($col) if ref $self;
return $val unless ref $val;
my $meta = $self->meta_info(has_a => $col) or return $val;
my ($a_class, %meths) = ($meta->foreign_class, %{ $meta->args });
if (my $deflate = $meths{'deflate'}) {
$val = $val->$deflate(ref $deflate eq 'CODE' ? $self : ());
return $val unless ref $val;
}
return $self->_croak("Can't deflate $col: $val is not a $a_class")
unless UNIVERSAL::isa($val, $a_class);
return $val->id if UNIVERSAL::isa($val => 'Class::DBI');
return "$val";
}
#----------------------------------------------------------------------
# SEARCH
#----------------------------------------------------------------------
sub retrieve_all { shift->sth_to_objects('RetrieveAll') }
sub retrieve_from_sql {
my ($class, $sql, @vals) = @_;
$sql =~ s/^\s*(WHERE)\s*//i;
return $class->sth_to_objects($class->sql_Retrieve($sql), \@vals);
}
sub search_like { shift->_do_search(LIKE => @_) }
sub search { shift->_do_search("=" => @_) }
sub _do_search {
my ($proto, $search_type, @args) = @_;
my $class = ref $proto || $proto;
@args = %{ $args[0] } if ref $args[0] eq "HASH";
my (@cols, @vals);
my $search_opts = @args % 2 ? pop @args : {};
while (my ($col, $val) = splice @args, 0, 2) {
my $column = $class->find_column($col)
|| (List::Util::first { $_->accessor eq $col } $class->columns)
|| $class->_croak("$col is not a column of $class");
push @cols, $column;
push @vals, $class->_deflated_column($column, $val);
}
my $frag = join " AND ",
map defined($vals[$_]) ? "$cols[$_] $search_type ?" : "$cols[$_] IS NULL",
0 .. $#cols;
$frag .= " ORDER BY $search_opts->{order_by}"
if $search_opts->{order_by};
return $class->sth_to_objects($class->sql_Retrieve($frag),
[ grep defined, @vals ]);
}
#----------------------------------------------------------------------
# CONSTRUCTORS
#----------------------------------------------------------------------
sub add_constructor {
my ($class, $method, $fragment) = @_;
return $class->_croak("constructors needs a name") unless $method;
no strict 'refs';
my $meth = "$class\::$method";
return $class->_carp("$method already exists in $class")
if *$meth{CODE};
*$meth = sub {
my $self = shift;
$self->sth_to_objects($self->sql_Retrieve($fragment), \@_);
};
}
sub sth_to_objects {
my ($class, $sth, $args) = @_;
$class->_croak("sth_to_objects needs a statement handle") unless $sth;
unless (UNIVERSAL::isa($sth => "DBI::st")) {
my $meth = "sql_$sth";
$sth = $class->$meth();
}
my (%data, @rows);
eval {
$sth->execute(@$args) unless $sth->{Active};
$sth->bind_columns(\(@data{ @{ $sth->{NAME_lc} } }));
push @rows, {%data} while $sth->fetch;
};
return $class->_croak("$class can't $sth->{Statement}: $@", err => $@)
if $@;
return $class->_ids_to_objects(\@rows);
}
*_sth_to_objects = \&sth_to_objects;
sub _my_iterator {
my $self = shift;
my $class = $self->iterator_class;
$self->_require_class($class);
return $class;
}
sub _ids_to_objects {
my ($class, $data) = @_;
return $#$data + 1 unless defined wantarray;
return map $class->construct($_), @$data if wantarray;
return $class->_my_iterator->new($class => $data);
}
#----------------------------------------------------------------------
# SINGLE VALUE SELECTS
#----------------------------------------------------------------------
sub _single_row_select {
my ($self, $sth, @args) = @_;
Carp::confess("_single_row_select is deprecated in favour of select_row");
return $sth->select_row(@args);
}
sub _single_value_select {
my ($self, $sth, @args) = @_;
$self->_carp("_single_value_select is deprecated in favour of select_val");
return $sth->select_val(@args);
}
sub count_all { shift->sql_single("COUNT(*)")->select_val }
sub maximum_value_of {
my ($class, $col) = @_;
$class->sql_single("MAX($col)")->select_val;
}
sub minimum_value_of {
( run in 0.874 second using v1.01-cache-2.11-cpan-364913b4093 )