DBIx-Class
view release on metacpan or search on metacpan
lib/DBIx/Class/Manual/Cookbook.pod view on Meta::CPAN
L<prefetch|DBIx::Class::ResultSet/prefetch> relationships, where possible. See
L</Using joins and prefetch>.
=item *
Use L<populate|DBIx::Class::ResultSet/populate> in void context to insert data
when you don't need the resulting L<result|DBIx::Class::Manual::ResultClass> objects,
if possible, but see the caveats.
When inserting many rows, for best results, populate a large number of rows at a
time, but not so large that the table is locked for an unacceptably long time.
If using L<create|DBIx::Class::ResultSet/create> instead, use a transaction and
commit every C<X> rows; where C<X> gives you the best performance without
locking the table for too long.
=item *
When selecting many rows, if you don't need full-blown L<DBIx::Class::Row>
objects, consider using L<DBIx::Class::ResultClass::HashRefInflator>.
lib/DBIx/Class/ResultSet.pm view on Meta::CPAN
$ci->{$_} = { %{$ci->{$_}}, is_nullable => 0 }
for grep { ! $colinfo->{$_}{seen_null} } keys %$ci;
unless( $rsrc->_identifying_column_set($ci) ) {
carp_unique("Fast-path populate() of non-uniquely identifiable rows with related data is not possible - falling back to regular create()");
return my $throwaway = $self->populate(@_);
}
}
### inherit the data locked in the conditions of the resultset
my ($rs_data) = $self->_merge_with_rscond({});
delete @{$rs_data}{@$colnames}; # passed-in stuff takes precedence
# if anything left - decompose rs_data
my $rs_data_vals;
if (keys %$rs_data) {
push @$rs_data_vals, $rs_data->{$_}
for sort keys %$rs_data;
}
lib/DBIx/Class/ResultSet.pm view on Meta::CPAN
sub as_subselect_rs {
my $self = shift;
my $attrs = $self->_resolved_attrs;
my $fresh_rs = (ref $self)->new (
$self->result_source,
{},
);
# these pieces will be locked in the subquery
delete $fresh_rs->{cond};
delete @{$fresh_rs->{attrs}}{qw/where bind/};
return $fresh_rs->search( {}, {
from => [{
$attrs->{alias} => $self->as_query,
-alias => $attrs->{alias},
-rsrc => $self->result_source,
}],
alias => $attrs->{alias},
lib/DBIx/Class/SQLMaker/LimitDialects.pm view on Meta::CPAN
=head1 NAME
DBIx::Class::SQLMaker::LimitDialects - SQL::Abstract::Limit-like functionality in DBIx::Class::SQLMaker
=head1 DESCRIPTION
DBIC's SQLMaker stack replicates and surpasses all of the functionality
originally found in L<SQL::Abstract::Limit>. While simple limits would
work as-is, the more complex dialects that require e.g. subqueries could
not be reliably implemented without taking full advantage of the metadata
locked within L<DBIx::Class::ResultSource> classes. After reimplementation
of close to 80% of the L<SQL::Abstract::Limit> functionality it was deemed
more practical to simply make an independent DBIx::Class-specific
limit-dialect provider.
=head1 SQL LIMIT DIALECTS
Note that the actual implementations listed below never use C<*> literally.
Instead proper re-aliasing of selectors and order criteria is done, so that
the limit dialect are safe to use on joined resultsets with clashing column
names.
t/52leaks.t view on Meta::CPAN
pager => $pager,
);
}
# FIXME - ideally this kind of collector ought to be global, but attempts
# with an invasive debugger-based tracer did not quite work out... yet
# Manually scan the innards of everything we have in the base collection
# we assembled so far (skip the DT madness below) *recursively*
#
# Only do this when we do have the bits to look inside CVs properly,
# without it we are liable to pick up object defaults that are locked
# in method closures
#
# Some elaborate SQLAC-replacements leak, do not worry about it for now
if (
DBICTest::Util::LeakTracer::CV_TRACING
and
! $ENV{DBICTEST_SWAPOUT_SQLAC_WITH}
) {
visit_refs(
refs => [ $base_collection ],
t/61findnot.t view on Meta::CPAN
ok(!defined($next), 'Nothing next in ResultSet');
$cd = $schema->resultset("CD")->search({title => 'Call of the West'});
@cd = $cd->single;
cmp_ok(@cd, '==', 1, 'Return something even in array context');
ok(@cd && !defined($cd[0]), 'Array contains an undef as only element');
$cd = $schema->resultset("CD")->first;
my $artist_rs = $schema->resultset("Artist")->search({ artistid => $cd->artist->artistid });
for my $key ('', 'primary') {
my $art = $artist_rs->find({ name => 'some other name' }, { $key ? (key => $key) : () });
is($art->artistid, $cd->get_column('artist'), "Artist found through @{[ $key ? 'explicit' : 'implicit' ]} key locked in the resultset");
}
# collapsing and non-collapsing are separate codepaths, thus the separate tests
$artist_rs = $schema->resultset("Artist");
warnings_exist {
$artist_rs->find({})
} qr/\QQuery returned more than one row. SQL that returns multiple rows is DEPRECATED for ->find and ->single/
t/storage/quote_names.t view on Meta::CPAN
DB2 => 'DBIx::Class::Storage::DBI::DB2',
SYBASE => 'DBIx::Class::Storage::DBI::Sybase::ASE',
SQLANYWHERE => 'DBIx::Class::Storage::DBI::SQLAnywhere',
SQLANYWHERE_ODBC => 'DBIx::Class::Storage::DBI::SQLAnywhere',
FIREBIRD => 'DBIx::Class::Storage::DBI::InterBase',
FIREBIRD_ODBC => 'DBIx::Class::Storage::DBI::InterBase',
INFORMIX => 'DBIx::Class::Storage::DBI::Informix',
MSSQL_ODBC => 'DBIx::Class::Storage::DBI::MSSQL',
);
# lie that we already locked stuff - the tests below do not touch anything
# unless we are under travis, where the OOM killers reign and things are rough
$ENV{DBICTEST_LOCK_HOLDER} = -1
unless DBICTest::RunMode->is_ci;
# Make sure oracle is tried last - some clients (e.g. 10.2) have symbol
# clashes with libssl, and will segfault everything coming after them
for my $db (sort {
$a eq 'ORA' ? 1
: $b eq 'ORA' ? -1
: $a cmp $b
( run in 1.221 second using v1.01-cache-2.11-cpan-49f99fa48dc )