DB-Object

 view release on metacpan or  search on metacpan

lib/DB/Object.pm  view on Meta::CPAN

        driver   => $driver,
        port     => $port,
        database => $database,
        tables   => $tables,
    };
    if( !defined( $cache_tables->set( $cache ) ) )
    {
        warn( "Unable to write to tables cache: ", $cache_tables->error, "\n" );
    }
    return( $self );
}

sub connect_via { return( shift->_set_get_scalar( 'connect_via', @_ ) ); }

sub constant_queries_cache_get
{
    my( $self, $def ) = @_;
    my $base_class  = $self->base_class;

    # Because we need the database object to revive the statement handler after having thawed it.
    if( ref( $self ) ne $base_class )
    {
        return( $self->error( "This method must be called by the database object itself." ) );
    }

    my $dbo         = $self;
    my $cache_size  = $dbo->cache_size // 0;

    if( !defined( $def ) || ref( $def // '' ) ne 'HASH' )
    {
        return( $self->error( "Parameter provided must be a hash, but I got '", $self->_str_val( $def // 'undef' ), "'." ) );
    }

    foreach my $k ( qw( pack file line ) )
    {
        return( $self->error( "Parameter \"$k\" is missing from the hash." ) )
            if( !defined( $def->{ $k } ) || !CORE::length( $def->{ $k } // '' ) );
    }

    my $cache_key   = CORE::join( '|', @$def{qw( pack file line )} );
    my $serialiser  = CORE::delete( $def->{serialiser} ) || $DB::Object::SERIALISER || 'Storable';

    my $lock;
    my $repo = Module::Generic::Global->new( queries_cache => $base_class,
        max_size    => $cache_size,
        serialiser  => $serialiser,
        key         => $cache_key,
    ) || return( $self->pass_error( Module::Generic::Global->error ) );
    $repo->lock;

    my $store = $repo->get;
    return( '' ) if( !$store );

    # $ts is thee timestamp of the file recorded at the time
    my $ts = $store->{ts} || return( $self->error( "No timestamp set in this constant statement object." ) );
    my $sth = $repo->{sth} || return( '' );
    # A DB::Object::Statement object
    my $qo = $sth->query_object;
    return( '' ) if( !CORE::length( $def->{file} ) );
    return( '' ) if( !-e( $def->{file} ) );
    return( '' ) if( ( CORE::stat( $def->{file} ) )[9] != $ts );
    return( $self->error( "Query object retrieved from constant query cache is void!" ) ) if( !$qo );
    return( $self->error( "Query object retrieved from constant query cache is not a DB::Object::Query object or one of its sub classes." ) ) if( !$self->_is_object( $qo ) || !$qo->isa( 'DB::Object::Query' ) );
    return if( $self->database ne $qo->database_object->database );

    return( $sth );
}

sub constant_queries_cache_set
{
    my( $self, $def ) = @_;
    my $base_class = $self->base_class;

    # Because we need the database object to revive the statement handler after having thawed it.
    if( ref( $self ) ne $base_class )
    {
        return( $self->error( "This method must be called by the database object itself." ) );
    }


    if( !defined( $def ) || ref( $def // '' ) ne 'HASH' )
    {
        return( $self->error( "Parameter provided must be a hash, but I got '", $self->_str_val( $def // 'undef' ), "'." ) );
    }

    foreach my $k ( qw( pack file line ) )
    {
        if( !defined( $def->{ $k } ) || !CORE::length( $def->{ $k } // '' ) )
        {
            return( $self->error( "Parameter \"$k\" is missing from the hash." ) );
        }
    }

    my $dbo        = $self;
    my $cache_size = $dbo->cache_size // 0;

    return( $self->error( "Parameter \"query_object\" is missing from the hash." ) )
        if( !defined( $def->{query_object} ) );

    if( !$self->_is_object( $def->{query_object} ) ||
        !$def->{query_object}->isa( 'DB::Object::Query' ) )
    {
        return( $self->error( "Provided query object is not a DB::Object::Query." ) );
    }

    $def->{ts} = [CORE::stat( $def->{file} )]->[9];

    my $cache_key   = CORE::join( '|', @$def{qw( pack file line )} );
    my $serialiser  = CORE::delete( $def->{serialiser} ) || $DB::Object::SERIALISER || 'Storable';

    my $repo = Module::Generic::Global->new( queries_cache => $base_class,
        max_size    => $cache_size,
        serialiser  => $serialiser,
        key         => $cache_key,
    ) || return( $self->pass_error( Module::Generic::Global->error ) );
    $repo->lock;
    $repo->set( $def ) || return( $self->pass_error( $repo->error ) );

    return( $def );
}

sub constant_queries_cache_del
{
    my( $self, $def ) = @_;
    my $base_class = $self->base_class;

    # Because we need the database object to revive the statement handler after having thawed it.
    if( ref( $self ) ne $base_class )
    {
        return( $self->error( "This method must be called by the database object itself." ) );
    }

    if( !defined( $def ) || ref( $def // '' ) ne 'HASH' )
    {
        return( $self->error( "Parameter provided must be a hash, but I got '", $self->_str_val( $def // 'undef' ), "'." ) );
    }

    foreach my $k ( qw( pack file line ) )
    {
        return( $self->error( "Parameter \"$k\" is missing from the hash." ) )
            if( !defined( $def->{ $k } ) || !CORE::length( $def->{ $k } // '' ) );
    }

    my $dbo         = $self;
    my $cache_size  = $dbo->cache_size // 0;
    my $cache_key   = CORE::join( '|', @$def{qw( pack file line )} );
    my $serialiser  = CORE::delete( $def->{serialiser} ) || $DB::Object::SERIALISER || 'Storable';

    my $repo = Module::Generic::Global->new( queries_cache => $base_class,
        max_size    => $cache_size,
        serialiser  => $serialiser,
        key         => $cache_key,
    ) || return( $self->pass_error( Module::Generic::Global->error ) );
    $repo->lock;
    $repo->remove;
    $repo->unlock;
    return(1);
}

# See also datatype_to_constant()
sub constant_to_datatype
{
    my $self = shift( @_ );
    return unless( scalar( @_ ) && defined( $_[0] ) );
    my $this = shift( @_ );
    my $ref = $self->datatypes;



( run in 1.894 second using v1.01-cache-2.11-cpan-39bf76dae61 )