| DBIx-Class-UUIDColumns documentation | Contained in the DBIx-Class-UUIDColumns distribution. |
DBIx::Class::UUIDColumns - Implicit uuid columns
In your DBIx::Class table class:
__PACKAGE__->load_components(qw/UUIDColumns ... Core/);
__PACKAGE__->uuid_columns('artist_id');
Note: The component needs to be loaded before Core.
This DBIx::Class component resembles the behaviour of Class::DBI::UUID, to make some columns implicitly created as uuid.
When loaded, UUIDColumns will search for a suitable uuid generation module
from the following list of supported modules:
Data::UUID APR::UUID* UUID Win32::Guidgen Win32API::GUID
If no supporting module can be found, an exception will be thrown.
*APR::UUID will not be loaded under OpenBSD due to an as yet unidentified XS issue.
If you would like to use a specific module, you can set uuid_class:
__PACKAGE__->uuid_class('::Data::UUID');
__PACKAGE__->uuid_class('MyUUIDGenerator');
Returns a uuid string from the current uuid_maker.
Inserts a new uuid string into each column in uuid_columns.
Gets/sets the list of columns to be filled with uuids during insert.
__PACKAGE__->uuid_columns('artist_id');
Takes the name of a UUIDMaker subclass to be used for uuid value generation. This can be a fully qualified class name, or a shortcut name starting with :: that matches one of the available DBIx::Class::UUIDColumns::UUIDMaker subclasses:
__PACKAGE__->uuid_class('CustomUUIDGenerator');
# loads CustomeUUIDGenerator
__PACKAGE__->uuid_class('::Data::UUID');
# loads DBIx::Class::UUIDMaker::Data::UUID;
Note that uuid_class checks to see that the specified class isa
DBIx::Class::UUIDColumns::UUIDMaker subclass and throws and exception if it isn't.
Returns the current UUIDMaker instance for the given module.
my $uuid = __PACKAGE__->uuid_maker->as_string;
Chia-liang Kao <clkao@clkao.org>
Chris Laco <claco@chrislaco.com>
You may distribute this code under the same terms as Perl itself.
| DBIx-Class-UUIDColumns documentation | Contained in the DBIx-Class-UUIDColumns distribution. |
package DBIx::Class::UUIDColumns; use strict; use warnings; use vars qw($VERSION); BEGIN { use base qw/DBIx::Class Class::Accessor::Grouped/; __PACKAGE__->mk_group_accessors('inherited', qw/uuid_auto_columns uuid_maker/); }; __PACKAGE__->uuid_class(__PACKAGE__->_find_uuid_module); # Always remember to do all digits for the version even if they're 0 # i.e. first release of 0.XX *must* be 0.XX000. This avoids fBSD ports # brain damage and presumably various other packaging systems too $VERSION = '0.02005'; sub uuid_columns { my $self = shift; if (scalar @_) { for (@_) { $self->throw_exception("column $_ doesn't exist") unless $self->has_column($_); } $self->uuid_auto_columns(\@_); }; return $self->uuid_auto_columns || []; } sub uuid_class { my ($self, $class) = @_; if ($class) { $class = "DBIx::Class::UUIDColumns::UUIDMaker$class" if $class =~ /^::/; if (!eval "require $class") { $self->throw_exception("$class could not be loaded: $@"); } elsif (!$class->isa('DBIx::Class::UUIDColumns::UUIDMaker')) { $self->throw_exception("$class is not a UUIDMaker subclass"); } else { $self->uuid_maker($class->new); }; }; return ref $self->uuid_maker; }; sub insert { my $self = shift; for my $column (@{$self->uuid_columns}) { $self->store_column( $column, $self->get_uuid ) unless defined $self->get_column( $column ); } $self->next::method(@_); } sub get_uuid { return shift->uuid_maker->as_string; } sub _find_uuid_module { if (eval{require Data::UUID}) { return '::Data::UUID'; } elsif (eval{require Data::GUID}) { return '::Data::GUID'; } elsif ($^O ne 'openbsd' && eval{require APR::UUID}) { # APR::UUID on openbsd causes some as yet unfound nastiness for XS return '::APR::UUID'; } elsif (eval{require UUID}) { return '::UUID'; } elsif (eval{ # squelch the 'too late for INIT' warning in Win32::API::Type local $^W = 0; require Win32::Guidgen; }) { return '::Win32::Guidgen'; } elsif (eval{require Win32API::GUID}) { return '::Win32API::GUID'; } elsif (eval{require UUID::Random}) { return '::UUID::Random'; } else { die 'no suitable uuid module could be found for use with DBIx::Class::UUIDColumns'; }; }; 1; __END__