package Data::Conveyor::Storage; # $Id: Storage.pm 13653 2007-10-22 09:11:20Z gr $ use strict; use warnings; use Error::Hierarchy::Util 'assert_defined'; use Class::Scaffold::Exception::Util 'assert_object_type'; our $VERSION = '0.10'; use base 'Class::Scaffold::Base'; __PACKAGE__->mk_abstract_accessors(qw( ticket_update ticket_insert get_ticket_shift_data )); # Within Data-Conveyor, rollback_mode isn't taken from the superclass' # property of the same name, but we ask the delegate. # Class::Scaffold::App::Test will set the rollback_mode on the Environment # (which is the delegate), for example. Just be sure to place # Data::Conveyor::Storage first in multiple inheritance, e.g., when inheriting # both from Data::Conveyor::Storage and Data::Storage::* sub rollback_mode { $_[0]->delegate->rollback_mode } sub set_rollback_mode { $_[0]->delegate->set_rollback_mode } sub clear_rollback_mode { $_[0]->delegate->clear_rollback_mode } sub ticket_store { my ($self, $ticket) = @_; $ticket->assert_ticket_no; if ($self->ticket_exists($ticket)) { $self->ticket_update($ticket); } else { $self->ticket_insert($ticket); } } sub ticket_serialized_payload { my ($self, $payload) = @_; assert_object_type $payload, 'ticket_payload'; # Serialize the ticket payload using Storable. The serialized version is # stored in the dem_payload table. We need to enable the serialization of # code references. require Storable; $Storable::Deparse = 1; $payload = Storable::nfreeze($payload); # compression require Compress::Zlib; Compress::Zlib::compress($payload) || throw Error::Hierarchy::Internal::CustomMessage( custom_message => 'zlib compress() failure' ); } sub ticket_deserialized_payload { my ($self, $payload) = @_; assert_defined $payload, 'called without defind serialized payload.'; # compression require Compress::Zlib; $payload = Compress::Zlib::uncompress($payload) || throw Error::Hierarchy::Internal::CustomMessage( custom_message => 'zlib uncompress() failure' ); # deserialize the ticket payload using Storable if it exists. # we need to enable the deserialization of code references. require Storable; $Storable::Eval = 1; Storable::thaw($payload); } sub ticket_handle_exception { my ($self, $E, $ticket) = @_; throw $E; } 1; __END__ =head1 NAME Data::Conveyor::Storage - stage-based conveyor-belt-like ticket handling system =head1 SYNOPSIS Data::Conveyor::Storage->new; =head1 DESCRIPTION None yet. This is an early release; fully functional, but undocumented. The next release will have more documentation. =head1 METHODS =over 4 =back Data::Conveyor::Storage inherits from L. The superclass L defines these methods and functions: new(), FIRST_CONSTRUCTOR_ARGS(), MUNGE_CONSTRUCTOR_ARGS(), add_autoloaded_package(), init(), log() The superclass L defines these methods and functions: every_hash(), every_list(), flush_every_cache_by_key() The superclass L defines these methods and functions: comparable(), comparable_scalar(), dump_comparable(), prepare_comparable(), yaml_dump_comparable() The superclass L defines these methods and functions: delegate() The superclass L defines these methods and functions: mk_framework_object_accessors(), mk_framework_object_array_accessors(), mk_readonly_accessors() The superclass L defines these methods and functions: mk_abstract_accessors(), mk_array_accessors(), mk_boolean_accessors(), mk_class_array_accessors(), mk_class_hash_accessors(), mk_class_scalar_accessors(), mk_concat_accessors(), mk_forward_accessors(), mk_hash_accessors(), mk_integer_accessors(), mk_new(), mk_object_accessors(), mk_scalar_accessors(), mk_set_accessors(), mk_singleton() The superclass L defines these methods and functions: _carp(), _croak(), _mk_accessors(), accessor_name_for(), best_practice_accessor_name_for(), best_practice_mutator_name_for(), follow_best_practice(), get(), make_accessor(), make_ro_accessor(), make_wo_accessor(), mk_accessors(), mk_ro_accessors(), mk_wo_accessors(), mutator_name_for(), set() The superclass L defines these methods and functions: install_accessor() The superclass L defines these methods and functions: _make_constructor(), mk_constructor(), mk_constructor_with_dirty(), mk_singleton_constructor() The superclass L defines these methods and functions: clear_factory_typed_accessors(), clear_factory_typed_array_accessors(), count_factory_typed_accessors(), count_factory_typed_array_accessors(), factory_typed_accessors(), factory_typed_accessors_clear(), factory_typed_accessors_count(), factory_typed_accessors_index(), factory_typed_accessors_pop(), factory_typed_accessors_push(), factory_typed_accessors_set(), factory_typed_accessors_shift(), factory_typed_accessors_splice(), factory_typed_accessors_unshift(), factory_typed_array_accessors(), factory_typed_array_accessors_clear(), factory_typed_array_accessors_count(), factory_typed_array_accessors_index(), factory_typed_array_accessors_pop(), factory_typed_array_accessors_push(), factory_typed_array_accessors_set(), factory_typed_array_accessors_shift(), factory_typed_array_accessors_splice(), factory_typed_array_accessors_unshift(), index_factory_typed_accessors(), index_factory_typed_array_accessors(), mk_factory_typed_accessors(), mk_factory_typed_array_accessors(), pop_factory_typed_accessors(), pop_factory_typed_array_accessors(), push_factory_typed_accessors(), push_factory_typed_array_accessors(), set_factory_typed_accessors(), set_factory_typed_array_accessors(), shift_factory_typed_accessors(), shift_factory_typed_array_accessors(), splice_factory_typed_accessors(), splice_factory_typed_array_accessors(), unshift_factory_typed_accessors(), unshift_factory_typed_array_accessors() The superclass L defines these methods and functions: factory_log() The superclass L defines these methods and functions: add_factory_type(), make_object_for_type(), register_factory_type() The superclass L defines these methods and functions: factory_error(), get_factory_class(), get_factory_type_for(), get_loaded_classes(), get_loaded_types(), get_my_factory(), get_my_factory_type(), get_registered_class(), get_registered_classes(), get_registered_types(), remove_factory_type(), unregister_factory_type() The superclass L defines these methods and functions: STORE(), clear_dirty(), clear_hygienic(), clear_unhygienic(), contains_hygienic(), contains_unhygienic(), delete_hygienic(), delete_unhygienic(), dirty(), dirty_clear(), dirty_set(), elements_hygienic(), elements_unhygienic(), hygienic(), hygienic_clear(), hygienic_contains(), hygienic_delete(), hygienic_elements(), hygienic_insert(), hygienic_is_empty(), hygienic_size(), insert_hygienic(), insert_unhygienic(), is_empty_hygienic(), is_empty_unhygienic(), set_dirty(), size_hygienic(), size_unhygienic(), unhygienic(), unhygienic_clear(), unhygienic_contains(), unhygienic_delete(), unhygienic_elements(), unhygienic_insert(), unhygienic_is_empty(), unhygienic_size() The superclass L defines these methods and functions: CLEAR(), DELETE(), EXISTS(), FETCH(), FIRSTKEY(), NEXTKEY(), SCALAR(), TIEHASH() =head1 BUGS AND LIMITATIONS No bugs have been reported. Please report any bugs or feature requests through the web interface at L. =head1 INSTALLATION See perlmodinstall for information and options on installing Perl modules. =head1 AVAILABILITY The latest version of this module is available from the Comprehensive Perl Archive Network (CPAN). Visit to find a CPAN site near you. Or see . =head1 AUTHORS Florian Helmberger C<< >> Achim Adam C<< >> Mark Hofstetter C<< >> Heinz Ekker C<< >> Marcel GrEnauer, C<< >> =head1 COPYRIGHT AND LICENSE Copyright 2004-2009 by the authors. This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut