X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FStorage.pm;h=c9f4383469ff77cce03a4e24b3b45dd835cd931d;hb=41df629c7a94f2731404ec11d224e968c16e6e94;hp=1895ab4c852af82bad45ba361431ed4d6b966152;hpb=ddf66ced51e4cb9b888001bc926bc0b3c3af0f8b;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Storage.pm b/lib/DBIx/Class/Storage.pm index 1895ab4..c9f4383 100644 --- a/lib/DBIx/Class/Storage.pm +++ b/lib/DBIx/Class/Storage.pm @@ -4,9 +4,10 @@ use strict; use warnings; use base qw/DBIx::Class/; +use mro 'c3'; -use Scalar::Util qw/weaken/; -use Carp::Clan qw/^DBIx::Class/; +use DBIx::Class::Exception; +use Scalar::Util(); use IO::File; use DBIx::Class::Storage::TxnScopeGuard; @@ -82,7 +83,7 @@ storage object, such as during L. sub set_schema { my ($self, $schema) = @_; $self->schema($schema); - weaken($self->{schema}) if ref $self->{schema}; + Scalar::Util::weaken($self->{schema}) if ref $self->{schema}; } =head2 connected @@ -119,8 +120,12 @@ Throws an exception - croaks. sub throw_exception { my $self = shift; - $self->schema->throw_exception(@_) if $self->schema; - croak @_; + if ($self->schema) { + $self->schema->throw_exception(@_); + } + else { + DBIx::Class::Exception->throw(@_); + } } =head2 txn_do @@ -248,6 +253,9 @@ sub txn_begin { die "Virtual method!" } Issues a commit of the current transaction. +It does I perform an actual storage commit unless there's a DBIx::Class +transaction currently in effect (i.e. you called L). + =cut sub txn_commit { die "Virtual method!" } @@ -264,10 +272,10 @@ sub txn_rollback { die "Virtual method!" } =head2 svp_begin -Arguments: $savepoint_name +Arguments: $savepoint_name? -Establishes a new savepoint of the specified name within the current -transaction. +Created a new savepoint using the name provided as argument. If no name +is provided, a random name will be used. =cut @@ -275,10 +283,11 @@ sub svp_begin { die "Virtual method!" } =head2 svp_release -Arguments: $savepoint_name +Arguments: $savepoint_name? -Destroy a savepoint, but keep the effects of the commands executed since -it's creation. +Release the savepoint provided as argument. If none is provided, +release the savepoint created most recently. This will implicitly +release all savepoints created after the one explicitly released as well. =cut @@ -286,28 +295,37 @@ sub svp_release { die "Virtual method!" } =head2 svp_rollback -Arguments: $savepoint_name +Arguments: $savepoint_name? -Rollback to the savepoint of the specified name. +Rollback to the savepoint provided as argument. If none is provided, +rollback to the savepoint created most recently. This will implicitly +release all savepoints created after the savepoint we rollback to. =cut sub svp_rollback { die "Virtual method!" } -=head2 svp_generate_name +=for comment -Generates a name for the next savepoint. Defaults to 'savepoint_$count', -where count is the number of current savepoints + 1. +=head2 txn_scope_guard -=cut +An alternative way of transaction handling based on +L: -sub svp_generate_name { die "Virtual method!" } + my $txn_guard = $storage->txn_scope_guard; -=for comment + $row->col1("val1"); + $row->update; -=head2 txn_scope_guard + $txn_guard->commit; -Return an object that does stuff. +If an exception occurs, or the guard object otherwise leaves the scope +before C<< $txn_guard->commit >> is called, the transaction will be rolled +back by an explicit L call. In essence this is akin to +using a L/L pair, without having to worry +about calling L at the right places. Note that since there +is no defined code closure, there will be no retries and other magic upon +database disconnection. If you need such functionality see L. =cut @@ -318,7 +336,7 @@ sub txn_scope_guard { =head2 sql_maker Returns a C object - normally an object of class -C. +C. =cut @@ -475,7 +493,8 @@ Old name for DBIC_TRACE =head1 SEE ALSO -L - reference storage inplementation using SQL::Abstract and DBI. +L - reference storage implementation using +SQL::Abstract and DBI. =head1 AUTHORS