1 package DBIx::Class::Storage::DBI::UniqueIdentifier;
5 use base 'DBIx::Class::Storage::DBI';
8 __PACKAGE__->mk_group_accessors(inherited => 'new_guid');
12 DBIx::Class::Storage::DBI::UniqueIdentifier - Storage component for RDBMSes
17 This is a storage component for databases that support GUID types such as
18 C<uniqueidentifier>, C<uniqueidentifierstr> or C<guid>.
20 GUIDs are generated automatically for PK columns with a supported
21 L<data_type|DBIx::Class::ResultSource/data_type>, as well as non-PK with
22 L<auto_nextval|DBIx::Class::ResultSource/auto_nextval> set.
28 The composing class must set C<new_guid> to the method used to generate a new
29 GUID. It can also set it to C<undef>, in which case the user is required to set
30 it, or a runtime error will be thrown. It can be:
36 In which case it is used as the name of database function to create a new GUID,
40 In which case the coderef should return a string GUID, using L<Data::GUID>, or
41 whatever GUID generation method you prefer.
47 $schema->storage->new_guid(sub { Data::GUID->new->as_string });
51 my $GUID_TYPE = qr/^(?:uniqueidentifier(?:str)?|guid)\z/i;
54 my ($self, $data_type) = @_;
56 return $data_type =~ $GUID_TYPE;
59 sub _prefetch_autovalues {
61 my ($source, $to_insert) = @_;
63 my $col_info = $source->columns_info;
66 my @pk_cols = $source->primary_columns;
68 @pk_col_idx{@pk_cols} = ();
71 $col_info->{$_}{data_type}
73 $col_info->{$_}{data_type} =~ $GUID_TYPE
76 my @auto_guids = grep {
77 $col_info->{$_}{data_type}
79 $col_info->{$_}{data_type} =~ $GUID_TYPE
81 $col_info->{$_}{auto_nextval}
82 } grep { not exists $pk_col_idx{$_} } $source->columns;
85 grep { not exists $to_insert->{$_} } (@pk_guids, @auto_guids);
87 for my $guid_col (@get_guids_for) {
90 my $guid_method = $self->new_guid;
92 if (not defined $guid_method) {
93 $self->throw_exception(
94 'You must set new_guid on your storage. See perldoc '
95 .'DBIx::Class::Storage::DBI::UniqueIdentifier'
99 if (ref $guid_method eq 'CODE') {
100 $to_insert->{$guid_col} = $guid_method->();
103 ($to_insert->{$guid_col}) = $self->_get_dbh->selectrow_array("SELECT $guid_method");
107 return $self->next::method(@_);
112 See L<DBIx::Class/AUTHOR> and L<DBIx::Class/CONTRIBUTORS>.
116 You may distribute this code under the same terms as Perl itself.