Persistence::ValueGenerator - Unqiue value generator.


Persistence-Entity documentation Contained in the Persistence-Entity distribution.

Index


Code Index:

NAME

Top

Persistence::ValueGenerator - Unqiue value generator.

SYNOPSIS

Top

   use Persistence::ValueGenerator::TableGenerator;

    my $generator = Persistence::ValueGenerator::TableGenerator->new(
        entity_manager           => $entity_manager_name,
        name                     => 'empno_generator',
        table                    => 'seq_generator',
        primary_key_column_name  => 'pk_column',
        primary_key_column_value => 'empno',
        value_column             => 'value_column',
        allocation_size          =>  5,
    );

    my $entity = Persistence::Entity->new(
        name                  => 'emp',
        unique_expression     => 'empno',
        primary_key           => ['empno'],
        columns               => [
            sql_column(name => 'ename'),
            sql_column(name => 'empno'),
            sql_column(name => 'deptno')
        ],
        value_generators => {empno => 'empno_generator'},
    );
    # or
    # $entity->add_value_generators(empno => 'empno_generator');

    $entity_manager->add_entities($entity);




DESCRIPTION

Top

Abstract class for value generator's class.

EXPORT

Top

None

ATTRIBUTES

name

Defines the name of the Persistence::ValueGenerator::TableGenerator instance and is the name referenced in the

allocation_size

Defined how much the counter will be incremented when entity queries the table for a new value, This feature is to cache blocks so that it doesn't have to go to the database every time it needs a new ID.

_cached_seq

Stores counter for current seq and allocation_size

entity_manager_name

Entity manager name

_entity_manager

Caches entity manager instance.

METHODS

initialise
generator

Returns generator instance, takes table generator name.

nextval

Returns next value for the instance generator

retrieve_next_value

Abstract method retrieve_next_value

has_cached_seq

Return true if objects holds cached_seq.

entity_manager

Returns entity manager.

SEE ALSO

Top

Persistence::ValueGenerator::TableGenerator Persistence::ValueGenerator::SequenceGenerator

COPYRIGHT AND LICENSE

Top

AUTHOR

Top

Adrian Witas, adrian@webapp.strefa.pl


Persistence-Entity documentation Contained in the Persistence-Entity distribution.
package Persistence::ValueGenerator;

use strict;
use warnings;
use vars qw($VERSION);

use Abstract::Meta::Class ':all';

abstract_class;

$VERSION = 0.01;

has '$.name' => (required => 1);


has '$.allocation_size' => (default => 20);


has '$._cached_seq';


has '$.entity_manager_name' => (required => 1);


has '$._entity_manager' => (associated_class => 'Persistence::Entity::Manager');

{
my %generators;

    sub initialise {
        my ($self) = @_;    
        $generators{$self->name} = $self;        
    }


    sub generator {
        my ($class, $name) = @_;
        $generators{$name};
    }

}

sub nextval {
    my ($self) = @_;
    my $result = $self->has_cached_seq ? $self->_cached_seq : $self->retrieve_next_value;
    $self->_cached_seq($result + 1);
    $result;
}


abstract 'retrieve_next_value';


sub has_cached_seq {
    my ($self) = @_;
    my $cached_seq = $self->_cached_seq or return;
    my $allocation_size = $self->allocation_size or return;
    return if($cached_seq &&  ! (($cached_seq  -1) % ($allocation_size)));
    $self;
}


sub entity_manager {
    my ($self) = @_;
    $self->_entity_manager || $self->_entity_manager(Persistence::Entity::Manager->manager($self->entity_manager_name));
}


1;    

__END__

1;