1 BEGIN { do "./t/lib/ANFANG.pm" or die ( $@ || $! ) }
10 use Storable qw(dclone freeze nfreeze thaw);
11 use Scalar::Util qw/refaddr/;
15 my ($refa, $refb) = map { refaddr $_ or croak "$_ is not a reference!" } @_[0,1];
20 sprintf ('%s (0x%07x != 0x%07x)',
28 my $schema = DBICTest->init_schema;
31 dclone_method => sub { return $schema->dclone($_[0]) },
33 local $DBIx::Class::ResultSourceHandle::thaw_schema = $schema;
36 "freeze/thaw_method" => sub {
37 my $ice = $schema->freeze($_[0]);
38 return $schema->thaw($ice);
40 "nfreeze/thaw_func" => sub {
41 my $ice = freeze($_[0]);
42 local $DBIx::Class::ResultSourceHandle::thaw_schema = $schema;
46 "freeze/thaw_func (cdbi legacy)" => sub {
47 # this one is special-cased to leak the $schema all over
48 # the same way as cdbi-compat does
49 DBICTest::Artist->result_source_instance->schema($schema);
50 DBICTest::CD->result_source_instance->schema($schema);
52 my $fire = thaw(freeze($_[0]));
55 $_->result_source_instance->schema(undef)
56 for map { $schema->class ($_) } $schema->sources;
63 if ($ENV{DBICTEST_MEMCACHED}) {
64 if (DBIx::Class::Optional::Dependencies->req_ok_for ('test_memcached')) {
65 my $memcached = Cache::Memcached->new(
66 { servers => [ $ENV{DBICTEST_MEMCACHED} ] }
69 my $key = 'tmp_dbic_84serialize_memcached_test';
71 $stores{memcached} = sub {
72 $memcached->set( $key, $_[0], 60 )
73 or die "Unable to insert into $ENV{DBICTEST_MEMCACHED} - is server running?";
74 local $DBIx::Class::ResultSourceHandle::thaw_schema = $schema;
75 return $memcached->get($key);
80 skip 'Memcached tests need ' . DBIx::Class::Optional::Dependencies->req_missing_for ('test_memcached'), 1;
86 skip 'Set $ENV{DBICTEST_MEMCACHED} to run the memcached serialization tests', 1;
92 for my $name (keys %stores) {
94 my $store = $stores{$name};
97 my $artist = $schema->resultset('Artist')->find(1);
99 lives_ok { $copy = $store->($artist) } "serialize row object lives: $name";
100 ref_ne($copy, $artist, 'Simple row cloned');
101 is_deeply($copy, $artist, "serialize row object works: $name");
103 my $cd_rs = $artist->search_related("cds");
105 # test that a live result source can be serialized as well
106 is( $cd_rs->count, 3, '3 CDs in database');
107 ok( $cd_rs->next, 'Advance cursor' );
110 $copy = $store->($cd_rs);
112 ref_ne($copy, $artist, 'Simple row cloned');
117 "serialize resultset works: $name",
119 } "serialize resultset lives: $name";
121 # Test that an object with a related_resultset can be serialized.
122 ok $artist->{related_resultsets}, 'has key: related_resultsets';
124 lives_ok { $copy = $store->($artist) } "serialize row object with related_resultset lives: $name";
125 for my $key (keys %$artist) {
126 next if $key eq 'related_resultsets';
127 next if $key eq '_inflated_column';
129 ref_ne($copy->{$key}, $artist->{$key}, "Simple row internals cloned '$key'")
130 if ref $artist->{$key};
132 is_deeply($copy->{$key}, $artist->{$key},
133 qq[serialize with related_resultset '$key']);
137 sub { $copy->discard_changes }, "Discard changes works: $name"
139 is($copy->id, $artist->id, "IDs still match ");
142 # Test resultsource with cached rows
143 $schema->is_executed_querycount( sub {
144 $cd_rs = $cd_rs->search ({}, { cache => 1 });
146 # this will hit the database once and prime the cache
147 my @cds = $cd_rs->all;
149 $copy = $store->($cd_rs);
150 ref_ne($copy, $cd_rs, 'Cached resultset cloned');
154 "serialize cached resultset works: $name",
157 is ($copy->count, $cd_rs->count, 'Cached count identical');
158 }, 1, 'Only one db query fired');
161 # test schema-less detached thaw
163 my $artist = $schema->resultset('Artist')->find(1);
165 $artist = dclone $artist;
167 is( $artist->name, 'Caterwauler McCrae', 'getting column works' );
169 ok( $artist->update, 'Non-dirty update noop' );
171 ok( $artist->name( 'Beeeeeeees' ), 'setting works' );
173 ok( $artist->is_column_changed( 'name' ), 'Column dirtyness works' );
174 ok( $artist->is_changed, 'object dirtyness works' );
176 my $rs = $artist->result_source->resultset;
177 $rs->set_cache([ $artist ]);
179 is( $rs->count, 1, 'Synthetic resultset count works' );
181 my $exc = qr/Unable to perform storage-dependent operations with a detached result source.+use \$schema->thaw/;
183 throws_ok { $artist->update }
185 'Correct exception on row op'
188 throws_ok { $artist->discard_changes }
190 'Correct exception on row op'
193 throws_ok { $rs->find(1) }
195 'Correct exception on rs op'