AmberDB

 view release on metacpan or  search on metacpan

lib/AmberDB/Base/Ramdisk.pm  view on Meta::CPAN

        if ( defined $tdir && length $tdir ) {
            $tdir =~ s{^[\\/]+|[\\/]+$}{}g;
            $target_dir = "$ramdisk_dir/$tdir";
        }
        else {
            $target_dir = $ramdisk_dir;
        }
        $self->make_path($target_dir);
    }
    else {
        $target_dir = $self->{_path}->{table_rdir} || $self->path('table_rdir') || "$ramdisk_dir/table";
    }

    my $target  = "$target_dir/$tableid";

    return $target . ( $with_ext ? ".$self->{db_ext}" : "" );
}

# Returns target ramdisk file path (.db for records, .inx for meta/indexes)
sub ramdisk_file_for {
    my ( $self, $tableid, $key, $type ) = @_;

    $tableid = $self->sanitize_table($tableid);
    return unless defined $tableid && length $tableid;

    my $base_path = $self->ramdisk_path($tableid) or return;

    my $ext;
    if ( defined $type && $type ne '' ) {
        $ext = $type;
    }
    else {
        my $table_info = $self->table_info($tableid);
        my $is_simple  = $self->config('simple') || ( $table_info && $table_info->{use_simple} );

        if ( $is_simple || ( defined $key && $key =~ /^\d+$/ ) ) {
            $ext = $self->{db_ext} // 'db';
        }
        else {
            $ext = 'inx';
        }
    }

    my $target = "${base_path}.${ext}";
    return $target;
}

# Checks TTL expiration on ramdisk file.
# Strictly evaluated ONLY for Tier 3 (use_ramdisk => 3). Tiers 1 and 2 never expire.
# Unlinks expired file and returns 0.
sub _check_ramdisk_ttl {
    my ( $self, $tableid, $file_path ) = @_;
    return 1 unless -e $file_path;

    my $table_info  = $self->table_info($tableid);
    my $use_ramdisk = $table_info ? ( $table_info->{use_ramdisk} // 0 ) : 0;
    return 1 unless $use_ramdisk == 3;

    my $ttl = $table_info ? ( $table_info->{ramdisk_ttl} // 300 ) : 300;
    if ( defined $ttl && $ttl > 0 ) {
        my $mtime = ( stat($file_path) )[9];
        if ( defined $mtime && ( time() - $mtime ) > $ttl ) {
            $self->table_close($file_path);
            unlink $file_path;
            return 0;
        }
    }
    return 1;
}

my %RAMDISK_ENSURING;

# my $ramdisk_path = $adb->ramdisk_ensure($tableid);
# Ensures ramdisk for use_ramdisk => 1 or 2 is populated.
# Automatically triggers ramdisk_preload if files are absent.
# For Tier 3 (use_ramdisk => 3), checks TTL on RAM-disk .db without physical preloading.
# ------------------------------------------------
sub ramdisk_ensure {
    my ( $self, $tableid ) = @_;

    $tableid or return;
    return unless $self->ramdisk_is_mounted();
    return if $RAMDISK_ENSURING{$tableid};

    my $table_info  = $self->table_info($tableid);
    my $use_ramdisk = $table_info ? ( $table_info->{use_ramdisk} // 0 ) : 0;
    return unless $use_ramdisk;

    $RAMDISK_ENSURING{$tableid} = 1;

    my $ramdisk_path = $self->ramdisk_path($tableid);
    unless ( $ramdisk_path ) {
        delete $RAMDISK_ENSURING{$tableid};
        return;
    }

    # For use_ramdisk == 3: volatile pure RAM table.
    # Zero physical disk files, no preloading from physical disk!
    if ( $use_ramdisk == 3 ) {
        my $db_ext = $self->{db_ext} // 'db';
        my $ram_db = "$ramdisk_path.$db_ext";
        $self->_check_ramdisk_ttl( $tableid, $ram_db );
        delete $RAMDISK_ENSURING{$tableid};
        return $ramdisk_path;
    }

    my $table_path   = $self->table_path($tableid);
    my $needs_preload = 0;

    # For use_ramdisk == 2 or 4: ensure .db is present in RAM-disk
    # Note: Tiers 1, 2, and 4 do not expire via TTL as they are synchronized with physical disk.
    if ( $use_ramdisk == 2 || $use_ramdisk == 4 ) {
        my $db_ext = $self->{db_ext} // 'db';
        my $src_db = "$table_path.$db_ext";
        my $ram_db = "$ramdisk_path.$db_ext";
        if ( -e $src_db && !-e $ram_db ) {
            $needs_preload = 1;
        }
    }

    # For use_ramdisk >= 1: ensure all secondary & lookup index files are present



( run in 1.081 second using v1.01-cache-2.11-cpan-cb04b646d8c )