1 package DBIx::Class::Storage;
6 use base qw/DBIx::Class/;
9 use DBIx::Class::Exception;
10 use Scalar::Util 'weaken';
12 use DBIx::Class::Storage::TxnScopeGuard;
16 __PACKAGE__->mk_group_accessors('simple' => qw/debug schema/);
17 __PACKAGE__->mk_group_accessors('inherited' => 'cursor_class');
19 __PACKAGE__->cursor_class('DBIx::Class::Cursor');
21 sub cursor { shift->cursor_class(@_); }
23 package # Hide from PAUSE
24 DBIx::Class::Storage::NESTED_ROLLBACK_EXCEPTION;
26 use overload '"' => sub {
27 'DBIx::Class::Storage::NESTED_ROLLBACK_EXCEPTION'
33 return bless $self, $class;
36 package DBIx::Class::Storage;
40 DBIx::Class::Storage - Generic Storage Handler
44 A base implementation of common Storage methods. For specific
45 information about L<DBI>-based storage, see L<DBIx::Class::Storage::DBI>.
53 Instantiates the Storage object.
58 my ($self, $schema) = @_;
60 $self = ref $self if ref $self;
65 $new->set_schema($schema);
67 if $ENV{DBIX_CLASS_STORAGE_DBI_DEBUG} || $ENV{DBIC_TRACE};
74 Used to reset the schema class or object which owns this
75 storage object, such as during L<DBIx::Class::Schema/clone>.
80 my ($self, $schema) = @_;
81 $self->schema($schema);
82 weaken $self->{schema} if ref $self->{schema};
87 Returns true if we have an open storage connection, false
88 if it is not (yet) open.
92 sub connected { die "Virtual method!" }
96 Closes any open storage connection unconditionally.
100 sub disconnect { die "Virtual method!" }
102 =head2 ensure_connected
104 Initiate a connection to the storage if one isn't already open.
108 sub ensure_connected { die "Virtual method!" }
110 =head2 throw_exception
112 Throws an exception - croaks.
116 sub throw_exception {
119 if (ref $self and $self->schema) {
120 $self->schema->throw_exception(@_);
123 DBIx::Class::Exception->throw(@_);
131 =item Arguments: C<$coderef>, @coderef_args?
133 =item Return Value: The return value of $coderef
137 Executes C<$coderef> with (optional) arguments C<@coderef_args> atomically,
138 returning its result (if any). If an exception is caught, a rollback is issued
139 and the exception is rethrown. If the rollback fails, (i.e. throws an
140 exception) an exception is thrown that includes a "Rollback failed" message.
144 my $author_rs = $schema->resultset('Author')->find(1);
145 my @titles = qw/Night Day It/;
148 # If any one of these fails, the entire transaction fails
149 $author_rs->create_related('books', {
151 }) foreach (@titles);
153 return $author->books;
158 $rs = $schema->txn_do($coderef);
162 die "something terrible has happened!" #
163 if ($error =~ /Rollback failed/); # Rollback failed
165 deal_with_failed_transaction();
168 In a nested transaction (calling txn_do() from within a txn_do() coderef) only
169 the outermost transaction will issue a L</txn_commit>, and txn_do() can be
170 called in void, scalar and list context and it will behave as expected.
172 Please note that all of the code in your coderef, including non-DBIx::Class
173 code, is part of a transaction. This transaction may fail out halfway, or
174 it may get partially double-executed (in the case that our DB connection
175 failed halfway through the transaction, in which case we reconnect and
176 restart the txn). Therefore it is best that any side-effects in your coderef
177 are idempotent (that is, can be re-executed multiple times and get the
178 same result), and that you check up on your side-effects in the case of
187 ref $coderef eq 'CODE' or $self->throw_exception
188 ('$coderef must be a CODE reference');
190 my (@return_values, $return_value);
192 $self->txn_begin; # If this throws an exception, no rollback is needed
194 my $wantarray = wantarray; # Need to save this since the context
195 # inside the try{} block is independent
196 # of the context that called txn_do()
201 # Need to differentiate between scalar/list context to allow for
202 # returning a list in scalar context to get the size of the list
205 @return_values = $coderef->(@$args);
206 } elsif (defined $wantarray) {
208 $return_value = $coderef->(@$args);
221 my $exception_class = "DBIx::Class::Storage::NESTED_ROLLBACK_EXCEPTION";
222 $self->throw_exception($error) # propagate nested rollback
223 if $_ =~ /$exception_class/;
225 $self->throw_exception(
226 "Transaction aborted: $error. Rollback failed: $_"
229 $self->throw_exception($error); # txn failed but rollback succeeded
232 return wantarray ? @return_values : $return_value;
237 Starts a transaction.
239 See the preferred L</txn_do> method, which allows for
240 an entire code block to be executed transactionally.
244 sub txn_begin { die "Virtual method!" }
248 Issues a commit of the current transaction.
250 It does I<not> perform an actual storage commit unless there's a DBIx::Class
251 transaction currently in effect (i.e. you called L</txn_begin>).
255 sub txn_commit { die "Virtual method!" }
259 Issues a rollback of the current transaction. A nested rollback will
260 throw a L<DBIx::Class::Storage::NESTED_ROLLBACK_EXCEPTION> exception,
261 which allows the rollback to propagate to the outermost transaction.
265 sub txn_rollback { die "Virtual method!" }
269 Arguments: $savepoint_name?
271 Created a new savepoint using the name provided as argument. If no name
272 is provided, a random name will be used.
276 sub svp_begin { die "Virtual method!" }
280 Arguments: $savepoint_name?
282 Release the savepoint provided as argument. If none is provided,
283 release the savepoint created most recently. This will implicitly
284 release all savepoints created after the one explicitly released as well.
288 sub svp_release { die "Virtual method!" }
292 Arguments: $savepoint_name?
294 Rollback to the savepoint provided as argument. If none is provided,
295 rollback to the savepoint created most recently. This will implicitly
296 release all savepoints created after the savepoint we rollback to.
300 sub svp_rollback { die "Virtual method!" }
304 =head2 txn_scope_guard
306 An alternative way of transaction handling based on
307 L<DBIx::Class::Storage::TxnScopeGuard>:
309 my $txn_guard = $storage->txn_scope_guard;
316 If an exception occurs, or the guard object otherwise leaves the scope
317 before C<< $txn_guard->commit >> is called, the transaction will be rolled
318 back by an explicit L</txn_rollback> call. In essence this is akin to
319 using a L</txn_begin>/L</txn_commit> pair, without having to worry
320 about calling L</txn_rollback> at the right places. Note that since there
321 is no defined code closure, there will be no retries and other magic upon
322 database disconnection. If you need such functionality see L</txn_do>.
326 sub txn_scope_guard {
327 return DBIx::Class::Storage::TxnScopeGuard->new($_[0]);
332 Returns a C<sql_maker> object - normally an object of class
333 C<DBIx::Class::SQLMaker>.
337 sub sql_maker { die "Virtual method!" }
341 Causes trace information to be emitted on the C<debugobj> object.
342 (or C<STDERR> if C<debugobj> has not specifically been set).
344 This is the equivalent to setting L</DBIC_TRACE> in your
349 Set or retrieve the filehandle used for trace/debug output. This should be
350 an IO::Handle compatible object (only the C<print> method is used. Initially
351 set to be STDERR - although see information on the
352 L<DBIC_TRACE> environment variable.
359 if ($self->debugobj->can('debugfh')) {
360 return $self->debugobj->debugfh(@_);
366 Sets or retrieves the object used for metric collection. Defaults to an instance
367 of L<DBIx::Class::Storage::Statistics> that is compatible with the original
368 method of using a coderef as a callback. See the aforementioned Statistics
369 class for more information.
377 return $self->{debugobj} = $_[0];
380 $self->{debugobj} ||= do {
381 if (my $profile = $ENV{DBIC_TRACE_PROFILE}) {
382 require DBIx::Class::Storage::Debug::PrettyPrint;
383 if ($profile =~ /^\.?\//) {
387 Config::Any->load_files({ files => [$profile], use_ext => 1 });
389 # sanitize the error message a bit
390 $_ =~ s/at \s+ .+ Storage\.pm \s line \s \d+ $//x;
391 $self->throw_exception("Failure processing \$ENV{DBIC_TRACE_PROFILE}: $_");
394 DBIx::Class::Storage::Debug::PrettyPrint->new(values %{$cfg->[0]});
397 DBIx::Class::Storage::Debug::PrettyPrint->new({ profile => $profile });
401 require DBIx::Class::Storage::Statistics;
402 DBIx::Class::Storage::Statistics->new
409 Sets a callback to be executed each time a statement is run; takes a sub
410 reference. Callback is executed as $sub->($op, $info) where $op is
411 SELECT/INSERT/UPDATE/DELETE and $info is what would normally be printed.
413 See L<debugobj> for a better way.
420 if ($self->debugobj->can('callback')) {
421 return $self->debugobj->callback(@_);
427 The cursor class for this Storage object.
433 Deploy the tables to storage (CREATE TABLE and friends in a SQL-based
434 Storage class). This would normally be called through
435 L<DBIx::Class::Schema/deploy>.
439 sub deploy { die "Virtual method!" }
443 The arguments of C<connect_info> are always a single array reference,
444 and are Storage-handler specific.
446 This is normally accessed via L<DBIx::Class::Schema/connection>, which
447 encapsulates its argument list in an arrayref before calling
448 C<connect_info> here.
452 sub connect_info { die "Virtual method!" }
456 Handle a select statement.
460 sub select { die "Virtual method!" }
464 Handle an insert statement.
468 sub insert { die "Virtual method!" }
472 Handle an update statement.
476 sub update { die "Virtual method!" }
480 Handle a delete statement.
484 sub delete { die "Virtual method!" }
488 Performs a select, fetch and return of data - handles a single row
493 sub select_single { die "Virtual method!" }
495 =head2 columns_info_for
497 Returns metadata for the given source's columns. This
498 is *deprecated*, and will be removed before 1.0. You should
499 be specifying the metadata yourself if you need it.
503 sub columns_info_for { die "Virtual method!" }
505 =head1 ENVIRONMENT VARIABLES
509 If C<DBIC_TRACE> is set then trace information
510 is produced (as when the L<debug> method is set).
512 If the value is of the form C<1=/path/name> then the trace output is
513 written to the file C</path/name>.
515 This environment variable is checked when the storage object is first
516 created (when you call connect on your schema). So, run-time changes
517 to this environment variable will not take effect unless you also
518 re-connect on your schema.
520 =head2 DBIC_TRACE_PROFILE
522 If C<DBIC_TRACE_PROFILE> is set, L<DBIx::Class::Storage::PrettyPrint>
523 will be used to format the output from C<DBIC_TRACE>. The value it
524 is set to is the C<profile> that it will be used. If the value is a
525 filename the file is read with L<Config::Any> and the results are
526 used as the configuration for tracing. See L<SQL::Abstract::Tree/new>
527 for what that structure should look like.
530 =head2 DBIX_CLASS_STORAGE_DBI_DEBUG
532 Old name for DBIC_TRACE
536 L<DBIx::Class::Storage::DBI> - reference storage implementation using
537 SQL::Abstract and DBI.
541 Matt S. Trout <mst@shadowcatsystems.co.uk>
543 Andy Grundman <andy@hybridized.org>
547 You may distribute this code under the same terms as Perl itself.