X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FStorage.pm;h=9a58b94f71f72f7ef634aa1efcd5f1ec285af40f;hb=db4b5f116bc5a3813d83a2880a55cd5fe399e702;hp=973f31b63fa38b4b5e82f73ea62b38bef67e762d;hpb=4012acd8f58480ab7729933dc9078c5f2a6feef2;p=dbsrgits%2FDBIx-Class-Historic.git diff --git a/lib/DBIx/Class/Storage.pm b/lib/DBIx/Class/Storage.pm index 973f31b..9a58b94 100644 --- a/lib/DBIx/Class/Storage.pm +++ b/lib/DBIx/Class/Storage.pm @@ -3,6 +3,13 @@ package DBIx::Class::Storage; use strict; use warnings; +use base qw/DBIx::Class/; + +use Scalar::Util qw/weaken/; +use Carp::Clan qw/^DBIx::Class/; + +__PACKAGE__->mk_group_accessors('simple' => qw/debug debugobj schema/); + package # Hide from PAUSE DBIx::Class::Storage::NESTED_ROLLBACK_EXCEPTION; @@ -18,29 +25,104 @@ sub new { package DBIx::Class::Storage; -sub new { die "Virtual method!" } -sub set_schema { die "Virtual method!" } -sub debug { die "Virtual method!" } -sub debugcb { die "Virtual method!" } -sub debugfh { die "Virtual method!" } -sub debugobj { die "Virtual method!" } -sub cursor { die "Virtual method!" } -sub disconnect { die "Virtual method!" } +=head1 NAME + +DBIx::Class::Storage - Generic Storage Handler + +=head1 DESCRIPTION + +A base implementation of common Storage methods. For specific +information about L-based storage, see L. + +=head1 METHODS + +=head2 new + +Arguments: $schema + +Instantiates the Storage object. + +=cut + +sub new { + my ($self, $schema) = @_; + + $self = ref $self if ref $self; + + my $new = {}; + bless $new, $self; + + $new->set_schema($schema); + $new->debugobj(new DBIx::Class::Storage::Statistics()); + + my $fh; + + my $debug_env = $ENV{DBIX_CLASS_STORAGE_DBI_DEBUG} + || $ENV{DBIC_TRACE}; + + if (defined($debug_env) && ($debug_env =~ /=(.+)$/)) { + $fh = IO::File->new($1, 'w') + or $new->throw_exception("Cannot open trace file $1"); + } else { + $fh = IO::File->new('>&STDERR'); + } + + $new->debugfh($fh); + $new->debug(1) if $debug_env; + + $new; +} + +=head2 set_schema + +Used to reset the schema class or object which owns this +storage object, such as during L. + +=cut + +sub set_schema { + my ($self, $schema) = @_; + $self->schema($schema); + weaken($self->{schema}) if ref $self->{schema}; +} + +=head2 connected + +Returns true if we have an open storage connection, false +if it is not (yet) open. + +=cut + sub connected { die "Virtual method!" } + +=head2 disconnect + +Closes any open storage connection unconditionally. + +=cut + +sub disconnect { die "Virtual method!" } + +=head2 ensure_connected + +Initiate a connection to the storage if one isn't already open. + +=cut + sub ensure_connected { die "Virtual method!" } -sub on_connect_do { die "Virtual method!" } -sub connect_info { die "Virtual method!" } -sub sql_maker { die "Virtual method!" } -sub txn_begin { die "Virtual method!" } -sub txn_commit { die "Virtual method!" } -sub txn_rollback { die "Virtual method!" } -sub insert { die "Virtual method!" } -sub update { die "Virtual method!" } -sub delete { die "Virtual method!" } -sub select { die "Virtual method!" } -sub select_single { die "Virtual method!" } -sub columns_info_for { die "Virtual method!" } -sub throw_exception { die "Virtual method!" } + +=head2 throw_exception + +Throws an exception - croaks. + +=cut + +sub throw_exception { + my $self = shift; + + $self->schema->throw_exception(@_) if $self->schema; + croak @_; +} =head2 txn_do @@ -143,4 +225,205 @@ sub txn_do { return $wantarray ? @return_values : $return_value; } +=head2 txn_begin + +Starts a transaction. + +See the preferred L method, which allows for +an entire code block to be executed transactionally. + +=cut + +sub txn_begin { die "Virtual method!" } + +=head2 txn_commit + +Issues a commit of the current transaction. + +=cut + +sub txn_commit { die "Virtual method!" } + +=head2 txn_rollback + +Issues a rollback of the current transaction. A nested rollback will +throw a L exception, +which allows the rollback to propagate to the outermost transaction. + +=cut + +sub txn_rollback { die "Virtual method!" } + +=head2 sql_maker + +Returns a C object - normally an object of class +C. + +=cut + +sub sql_maker { die "Virtual method!" } + +=head2 debug + +Causes trace information to be emitted on the C object. +(or C if C has not specifically been set). + +This is the equivalent to setting L in your +shell environment. + +=head2 debugfh + +Set or retrieve the filehandle used for trace/debug output. This should be +an IO::Handle compatible ojbect (only the C method is used. Initially +set to be STDERR - although see information on the +L environment variable. + +=cut + +sub debugfh { + my $self = shift; + + if ($self->debugobj->can('debugfh')) { + return $self->debugobj->debugfh(@_); + } +} + +=head2 debugobj + +Sets or retrieves the object used for metric collection. Defaults to an instance +of L that is compatible with the original +method of using a coderef as a callback. See the aforementioned Statistics +class for more information. + +=head2 debugcb + +Sets a callback to be executed each time a statement is run; takes a sub +reference. Callback is executed as $sub->($op, $info) where $op is +SELECT/INSERT/UPDATE/DELETE and $info is what would normally be printed. + +See L for a better way. + +=cut + +sub debugcb { + my $self = shift; + + if ($self->debugobj->can('callback')) { + return $self->debugobj->callback(@_); + } +} + +=head2 cursor + +The cursor class for this Storage object. + +=cut + +sub cursor { die "Virtual method!" } + +=head2 deploy + +Deploy the tables to storage (CREATE TABLE and friends in a SQL-based +Storage class). This would normally be called through +L. + +=cut + +sub deploy { die "Virtual method!" } + +=head2 connect_info + +The arguments of C are always a single array reference, +and are Storage-handler specific. + +This is normally accessed via L, which +encapsulates its argument list in an arrayref before calling +C here. + +=cut + +sub connect_info { die "Virtual method!" } + +=head2 select + +Handle a select statement. + +=cut + +sub select { die "Virtual method!" } + +=head2 insert + +Handle an insert statement. + +=cut + +sub insert { die "Virtual method!" } + +=head2 update + +Handle an update statement. + +=cut + +sub update { die "Virtual method!" } + +=head2 delete + +Handle a delete statement. + +=cut + +sub delete { die "Virtual method!" } + +=head2 select_single + +Performs a select, fetch and return of data - handles a single row +only. + +=cut + +sub select_single { die "Virtual method!" } + +=head2 columns_info_for + +Returns metadata for the given source's columns. This +is *deprecated*, and will be removed before 1.0. You should +be specifying the metadata yourself if you need it. + +=cut + +sub columns_info_for { die "Virtual method!" } + +=head1 ENVIRONMENT VARIABLES + +=head2 DBIC_TRACE + +If C is set then trace information +is produced (as when the L method is set). + +If the value is of the form C<1=/path/name> then the trace output is +written to the file C. + +This environment variable is checked when the storage object is first +created (when you call connect on your schema). So, run-time changes +to this environment variable will not take effect unless you also +re-connect on your schema. + +=head2 DBIX_CLASS_STORAGE_DBI_DEBUG + +Old name for DBIC_TRACE + +=head1 AUTHORS + +Matt S. Trout + +Andy Grundman + +=head1 LICENSE + +You may distribute this code under the same terms as Perl itself. + +=cut + 1;