1use strict; 2use warnings; 3 4use Test::More; 5use lib qw(t/lib); 6use DBICTest; 7 8my $schema = DBICTest->init_schema(); 9 10plan tests => 4; 11 12# add some rows inside a transaction and commit it 13# XXX: Is storage->dbh the only way to get a dbh? 14$schema->storage->txn_begin; 15for (10..15) { 16 $schema->resultset("Artist")->create( { 17 artistid => $_, 18 name => "artist number $_", 19 } ); 20} 21$schema->storage->txn_commit; 22my ($artist) = $schema->resultset("Artist")->find(15); 23is($artist->name, 'artist number 15', "Commit ok"); 24 25# add some rows inside a transaction and roll it back 26$schema->storage->txn_begin; 27for (21..30) { 28 $schema->resultset("Artist")->create( { 29 artistid => $_, 30 name => "artist number $_", 31 } ); 32} 33$schema->storage->txn_rollback; 34($artist) = $schema->resultset("Artist")->search({ artistid => 25 }); 35is($artist, undef, "Rollback ok"); 36 37is_deeply ( 38 get_storage_column_info ($schema->storage, 'collection', qw/size is_nullable/), 39 { 40 collectionid => { 41 data_type => 'INTEGER', 42 }, 43 name => { 44 data_type => 'varchar', 45 }, 46 }, 47 'Correctly retrieve column info (no size or is_nullable)' 48); 49 50{ 51 is_deeply ( 52 get_storage_column_info ($schema->storage, 'artist', qw/size/), 53 { 54 'artistid' => { 55 'data_type' => 'INTEGER', 56 'is_nullable' => 0, 57 }, 58 'name' => { 59 'data_type' => 'varchar', 60 'is_nullable' => 1, 61 }, 62 'rank' => { 63 'data_type' => 'integer', 64 'is_nullable' => 0, 65 'default_value' => '13', 66 }, 67 'charfield' => { 68 'data_type' => 'char', 69 'is_nullable' => 1, 70 }, 71 }, 72 'Correctly retrieve column info (mixed null and non-null columns)' 73 ); 74}; 75 76 77# Depending on test we need to strip away certain column info. 78# - SQLite is known to report the size differently from release to release 79# - Current DBD::SQLite versions do not implement NULLABLE 80# - Some SQLite releases report stuff that isn't there as undef 81 82sub get_storage_column_info { 83 my ($storage, $table, @ignore) = @_; 84 85 my $type_info = $storage->columns_info_for($table); 86 87 for my $col (keys %$type_info) { 88 for my $type (keys %{$type_info->{$col}}) { 89 if ( 90 grep { $type eq $_ } (@ignore) 91 or 92 not defined $type_info->{$col}{$type} 93 ) { 94 delete $type_info->{$col}{$type}; 95 } 96 } 97 } 98 99 return $type_info; 100} 101