AmberDB
view release on metacpan or search on metacpan
xt/amberdb_ramdisk.t view on Meta::CPAN
is( $s_info->{ramdisk_ttl}, 300, 'Default ramdisk_ttl is 300 seconds' );
ok( !exists $s_info->{record_index}, 'record_index stripped in Tier 3' );
ok( !exists $s_info->{search_block}, 'search_block stripped in Tier 3' );
ok( !exists $s_info->{match_block}, 'match_block stripped in Tier 3' );
# 3. Write data to Tier 3 volatile table
ok( $adb->insert_id( 'session_store', 101, 'token_abc', 'user_123' ), 'Record 101 inserted' );
ok( $adb->insert_id( 'session_store', 102, 'token_xyz', 'user_456' ), 'Record 102 inserted' );
# Verify physical disk has ZERO files
my $phys_db = File::Spec->catfile( $tmp, 'table', 'session_store.db' );
ok( !-e $phys_db, 'Zero physical disk files: table/session_store.db does NOT exist' );
ok( !-e File::Spec->catfile( $tmp, 'table', 'session_store.inx' ), 'Zero physical disk index files' );
# Verify RAM-disk contains the .db file
my $ram_db = File::Spec->catfile( $ramdisk_dir, 'table', 'session_store.db' );
ok( -e $ram_db, 'RAM-disk contains session_store.db' );
ok( !-e File::Spec->catfile( $ramdisk_dir, 'table', 'session_store.inx' ), 'RAM-disk has NO index files' );
# 4. Read records from Tier 3
my @rec101 = $adb->read_id( 'session_store', 101 );
is( $rec101[0], 101, 'read_id correctly returns ID 101' );
is( $rec101[1], 'token_abc', 'read_id correctly returns token_abc' );
is( $adb->table_count('session_store'), 2, 'table_count is 2' );
ok( $adb->exist_id( 'session_store', 101 ), 'exist_id is true for 101' );
ok( !$adb->exist_id( 'session_store', 999 ), 'exist_id is false for nonexistent 999' );
# 5. Modify record
ok( $adb->modify_id( 'session_store', 101, 'token_abc_renewed', 'user_123' ), 'modify_id succeeded' );
my @rec101_mod = $adb->read_id( 'session_store', 101 );
is( $rec101_mod[1], 'token_abc_renewed', 'Modified token visible in read_id' );
# 6. Delete record
ok( $adb->delete_id( 'session_store', 102 ), 'Record 102 deleted' );
ok( !$adb->exist_id( 'session_store', 102 ), 'Record 102 no longer exists' );
is( $adb->table_count('session_store'), 1, 'table_count is now 1' );
# 7. TTL Expiration Simulation
$adb->table_attr( 'temp_cache', use_ramdisk => 3, ramdisk_ttl => 5 );
ok( $adb->insert_id( 'temp_cache', 1, 'temp_val' ), 'temp_cache record inserted' );
my $temp_db = File::Spec->catfile( $ramdisk_dir, 'table', 'temp_cache.db' );
ok( -e $temp_db, 'temp_cache.db exists in RAM-disk' );
# Simulate expiration by setting mtime back in time (> 5s ago)
utime( time() - 20, time() - 20, $temp_db );
my @exp_rec = $adb->read_id( 'temp_cache', 1 );
is( scalar @exp_rec, 0, 'read_id returns empty for expired Tier 3 table' );
ok( !-e $temp_db, 'Expired file was unlinked by _check_ramdisk_ttl' );
is( $adb->table_count('temp_cache'), 0, 'table_count returns 0 for expired table' );
# 8. Sliding Expiration
$adb->table_attr( 'sliding_cache', use_ramdisk => 3, ramdisk_ttl => 60 );
ok( $adb->insert_id( 'sliding_cache', 1, 'slide_data' ), 'sliding_cache record inserted' );
my $slide_db = File::Spec->catfile( $ramdisk_dir, 'table', 'sliding_cache.db' );
# Backdate mtime slightly (25 seconds ago, < 60s TTL)
utime( time() - 25, time() - 25, $slide_db );
my $mtime_old = ( stat($slide_db) )[9];
my @slide_rec = $adb->read_id( 'sliding_cache', 1 );
is( $slide_rec[1], 'slide_data', 'Unexpired record readable' );
my $mtime_new = ( stat($slide_db) )[9];
cmp_ok( $mtime_new, '>', $mtime_old, 'read_id refreshed mtime (sliding expiration)' );
};
subtest 'table_dir custom storage directory (Disk & RAM-Disk)' => sub {
my $tmp = File::Temp->newdir( CLEANUP => 1 );
my $tbl_mount = File::Temp->newdir( CLEANUP => 1 );
my $tbl_ram = File::Spec->catdir( $tbl_mount, 'amberdb_siparis' );
make_path($tbl_ram);
local $ENV{AMBERDB_TEST_RAMDISK} = 1;
my $adb = AmberDB->new(
database => 'siparis',
path => { dbase_dir => $tmp, ramdisk_dir => $tbl_ram }
);
my $ramdisk_dir = $adb->ramdisk_dir();
# 1. Custom table_dir => 'siparis' on physical disk
$adb->table_attr( 'siparis_tbl', table_dir => 'siparis' );
my $tpath = $adb->table_path('siparis_tbl');
like( $tpath, qr{[\\/]siparis[\\/]siparis_tbl$}, 'table_path routed to siparis subfolder' );
my $rpath = $adb->ramdisk_path('siparis_tbl');
like( $rpath, qr{[\\/]siparis[\\/]siparis_tbl$}, 'ramdisk_path routed to siparis subfolder' );
ok( $adb->insert_id( 'siparis_tbl', 10, 'order_detail_10' ), 'Record inserted into siparis_tbl' );
my $phys_siparis = File::Spec->catfile( $tmp, 'siparis', 'siparis_tbl.db' );
ok( -e $phys_siparis, 'Physical disk created in dbstore/siparis/siparis_tbl.db' );
my @order_rec = $adb->read_id( 'siparis_tbl', 10 );
is( $order_rec[1], 'order_detail_10', 'Record successfully read from siparis directory' );
# 2. Overwrite default: table_dir => '' stores directly under root dbase_dir
$adb->table_attr( 'root_tbl', table_dir => '' );
my $root_tpath = $adb->table_path('root_tbl');
like( $root_tpath, qr{[\\/]root_tbl$}, 'table_path with table_dir => "" placed directly in root' );
unlike( $root_tpath, qr{[\\/]tables[\\/]}, 'table_path does not contain tables/' );
my $root_rpath = $adb->ramdisk_path('root_tbl');
like( $root_rpath, qr{amberdb_siparis[\\/]root_tbl$}, 'ramdisk_path with table_dir => "" placed directly in amberdb_siparis root' );
unlike( $root_rpath, qr{[\\/]tables[\\/]}, 'ramdisk_path does not contain tables/' );
ok( $adb->insert_id( 'root_tbl', 1, 'root_content' ), 'Record inserted into root_tbl' );
my $phys_root = File::Spec->catfile( $tmp, 'root_tbl.db' );
ok( -e $phys_root, 'Physical file exists directly at root dbstore/root_tbl.db' );
# 3. table_dir combined with use_ramdisk => 3 (Tier 3 RAM-disk with custom directory)
$adb->table_attr( 'volatile_cart',
use_ramdisk => 3,
table_dir => 'cart'
);
my $cart_tpath = $adb->table_path('volatile_cart');
like( $cart_tpath, qr{amberdb_siparis[\\/]cart[\\/]volatile_cart$}, 'table_path points to amberdb_siparis/cart/volatile_cart' );
ok( $adb->insert_id( 'volatile_cart', 55, 'cart_item_55' ), 'Cart record inserted' );
my $phys_cart = File::Spec->catfile( $tmp, 'cart', 'volatile_cart.db' );
ok( !-e $phys_cart, 'Zero physical disk files in dbstore/cart/' );
my $ram_cart = File::Spec->catfile( $ramdisk_dir, 'cart', 'volatile_cart.db' );
ok( -e $ram_cart, 'RAM-disk file created in amberdb_siparis/cart/volatile_cart.db' );
( run in 0.467 second using v1.01-cache-2.11-cpan-cb04b646d8c )