my ($dsn, $user, $pass) = @ENV{map { "DBICTEST_PG_${_}" } qw/DSN USER PASS/};
-plan skip_all => <<EOM unless $dsn && $user;
-Set \$ENV{DBICTEST_PG_DSN}, _USER and _PASS to run this test
+plan skip_all => <<'EOM' unless $dsn && $user;
+Set $ENV{DBICTEST_PG_DSN}, _USER and _PASS to run this test
( NOTE: This test drops and creates tables called 'artist', 'cd',
'timestamp_primary_key_test', 'track', 'casecheck', 'array_test' and
'sequence_test' as well as following sequences: 'pkid1_seq', 'pkid2_seq' and
-'nonpkid_seq''. as well as following schemas: 'dbic_t_schema',
+'nonpkid_seq'. as well as following schemas: 'dbic_t_schema',
'dbic_t_schema_2', 'dbic_t_schema_3', 'dbic_t_schema_4', and 'dbic_t_schema_5')
EOM
# Check that datetime_parser returns correctly before we explicitly connect.
SKIP: {
- eval { require DateTime::Format::Pg };
- skip "DateTime::Format::Pg required", 2 if $@;
+ skip (
+ "Pg parser detection test needs " . DBIx::Class::Optional::Dependencies->req_missing_for ('test_dt_pg'),
+ 2
+ ) unless DBIx::Class::Optional::Dependencies->req_ok_for ('test_dt_pg');
my $store = ref $s->storage;
is($store, 'DBIx::Class::Storage::DBI', 'Started with generic storage');
ok (!$s->storage->_dbh, 'still not connected');
}
+# test LIMIT support
+{
+ my $schema = DBICTest::Schema->connect($dsn, $user, $pass);
+ drop_test_schema($schema);
+ create_test_schema($schema);
+ for (1..6) {
+ $schema->resultset('Artist')->create({ name => 'Artist ' . $_ });
+ }
+ my $it = $schema->resultset('Artist')->search( {},
+ { rows => 3,
+ offset => 2,
+ order_by => 'artistid' }
+ );
+ is( $it->count, 3, "LIMIT count ok" ); # ask for 3 rows out of 6 artists
+ is( $it->next->name, "Artist 3", "iterator->next ok" );
+ $it->next;
+ $it->next;
+ $it->next;
+ is( $it->next, undef, "next past end of resultset ok" );
+
+ # Limit with select-lock
+ lives_ok {
+ $schema->txn_do (sub {
+ isa_ok (
+ $schema->resultset('Artist')->find({artistid => 1}, {for => 'update', rows => 1}),
+ 'DBICTest::Schema::Artist',
+ );
+ });
+ } 'Limited FOR UPDATE select works';
+}
+
# check if we indeed do support stuff
my $test_server_supports_insert_returning = do {
my $v = DBICTest::Schema->connect($dsn, $user, $pass)
use strict;
use warnings;
- use base 'DBIx::Class::Core';
+ use base 'DBICTest::BaseResult';
__PACKAGE__->table('dbic_t_schema.array_test');
__PACKAGE__->add_columns(qw/id arrayfield/);
SKIP: {
skip "Need DBD::Pg 2.9.2 or newer for array tests", 4 if $DBD::Pg::VERSION < 2.009002;
+ my $arr_rs = $schema->resultset('ArrayTest');
+
lives_ok {
- $schema->resultset('ArrayTest')->create({
+ $arr_rs->create({
arrayfield => [1, 2],
});
} 'inserting arrayref as pg array data';
lives_ok {
- $schema->resultset('ArrayTest')->update({
+ $arr_rs->update({
arrayfield => [3, 4],
});
} 'updating arrayref as pg array data';
- $schema->resultset('ArrayTest')->create({
+ $arr_rs->create({
arrayfield => [5, 6],
});
- my $count;
+ # Search using arrays
lives_ok {
- $count = $schema->resultset('ArrayTest')->search({
- arrayfield => \[ '= ?' => [arrayfield => [3, 4]] ], #Todo anything less ugly than this?
- })->count;
- } 'comparing arrayref to pg array data does not blow up';
- is($count, 1, 'comparing arrayref to pg array data gives correct result');
- }
+ is_deeply (
+ $arr_rs->search({ arrayfield => { -value => [3,4] } })->first->arrayfield,
+ [3,4],
+ 'Array value matches'
+ );
+ } 'searching by arrayref';
+ lives_ok {
+ is_deeply (
+ $arr_rs->search({ arrayfield => { '=' => { -value => [3,4] }} })->first->arrayfield,
+ [3,4],,
+ 'Array value matches explicit equal'
+ );
+ } 'searching by arrayref (explicit equal sign)';
+
+ lives_ok {
+ is_deeply (
+ $arr_rs->search({ arrayfield => { '>' => { -value => [3,1] }} })->first->arrayfield,
+ [3,4],
+ 'Array value matches greater than'
+ );
+ } 'searching by arrayref (greater than)';
+ lives_ok {
+ is (
+ $arr_rs->search({ arrayfield => { '>' => { -value => [3,7] }} })->count,
+ 1,
+ 'Greater than search found [5,6]',
+ );
+ } 'searching by arrayref (greater than)';
+
+ # Find using arrays
+ lives_ok {
+ is_deeply (
+ $arr_rs->find({ arrayfield => { -value => [3,4] } })->arrayfield,
+ [3,4],
+ 'Array value matches implicit equal'
+ );
+ } 'find by arrayref';
+
+ lives_ok {
+ is_deeply (
+ $arr_rs->find({ arrayfield => { '=' => { -value => [3,4] }} })->arrayfield,
+ [3,4],
+ 'Array value matches explicit equal'
+ );
+ } 'find by arrayref (equal)';
+
+ # test inferred condition for creation
+ TODO: for my $cond (
+ { -value => [3,4] },
+ \[ '= ?' => [arrayfield => [3, 4]] ],
+ ) {
+ local $TODO = 'No introspection of complex conditions :(';
+ my $arr_rs_cond = $arr_rs->search({ arrayfield => $cond });
+
+ my $row = $arr_rs_cond->create({});
+ is_deeply ($row->arrayfield, [3,4], 'Array value taken from $rs condition');
+ $row->discard_changes;
+ is_deeply ($row->arrayfield, [3,4], 'Array value made it to storage');
+ }
+ }
########## Case check
my $cds = $artist->cds_unordered->search({
year => { '!=' => 2010 }
}, { prefetch => 'liner_notes' });
-TODO: {
- todo_skip 'update resultset with a prefetch over a might_have rel', 1;
- $cds->update({ year => '2010' });
-}
-
+lives_ok { $cds->update({ year => '2010' }) } 'Update on prefetched rs';
## Test SELECT ... FOR UPDATE
SKIP: {
- if(eval "require Sys::SigAction" && !$@) {
+ if(eval { require Sys::SigAction }) {
Sys::SigAction->import( 'set_sig_handler' );
}
else {
position int,
title varchar(255),
last_updated_on date,
- last_updated_at date,
- small_dt date
+ last_updated_at date
)
EOS
for my $stat (
'DROP SCHEMA dbic_t_schema_5 CASCADE',
- 'DROP SEQUENCE public.artist_artistid_seq',
+ 'DROP SEQUENCE public.artist_artistid_seq CASCADE',
'DROP SCHEMA dbic_t_schema_4 CASCADE',
'DROP SCHEMA dbic_t_schema CASCADE',
- 'DROP SEQUENCE pkid1_seq',
- 'DROP SEQUENCE pkid2_seq',
- 'DROP SEQUENCE nonpkid_seq',
+ 'DROP SEQUENCE pkid1_seq CASCADE',
+ 'DROP SEQUENCE pkid2_seq CASCADE',
+ 'DROP SEQUENCE nonpkid_seq CASCADE',
'DROP SCHEMA dbic_t_schema_2 CASCADE',
'DROP SCHEMA dbic_t_schema_3 CASCADE',
) {