pub struct CacheStats {
pub total_size_bytes: u64,
pub file_count: usize,
pub cache_dir: PathBuf,
}
Expand description
Cache statistics
Fields§
§total_size_bytes: u64
Total size of all cached files in bytes
file_count: usize
Number of cached files
cache_dir: PathBuf
Cache directory path
Implementations§
Source§impl CacheStats
impl CacheStats
Sourcepub fn formatted_size(&self) -> String
pub fn formatted_size(&self) -> String
Get total size formatted as human-readable string
Examples found in repository?
examples/cache_management_demo.rs (line 79)
9fn main() {
10 println!("=== Enhanced Cache Management Demonstration ===\n");
11
12 // Demonstrate platform-specific cache directory detection
13 println!("=== Platform-Specific Cache Directory =========");
14 match get_cache_dir() {
15 Ok(cache_dir) => {
16 println!("Default cache directory: {}", cache_dir.display());
17 println!("Platform: {}", std::env::consts::OS);
18 }
19 Err(e) => {
20 println!("Error getting cache directory: {}", e);
21 }
22 }
23 println!();
24
25 // Demonstrate environment variable override
26 println!("=== Environment Variable Configuration =========");
27 println!("Set SCIRS2_CACHE_DIR to override default cache location");
28 println!("Set SCIRS2_OFFLINE=true to enable offline mode");
29 if let Ok(cache_env) = std::env::var("SCIRS2_CACHE_DIR") {
30 println!("Custom cache directory: {}", cache_env);
31 } else {
32 println!("Using default cache directory");
33 }
34
35 if let Ok(offline_env) = std::env::var("SCIRS2_OFFLINE") {
36 println!("Offline mode: {}", offline_env);
37 } else {
38 println!("Offline mode: Not set (defaults to false)");
39 }
40 println!();
41
42 // Create a temporary cache for demonstration
43 let temp_dir = tempfile::tempdir().unwrap();
44 let demo_cache_dir = temp_dir.path().join("demo_cache");
45
46 // Demonstrate cache with size limits
47 println!("=== Cache with Size Limits =====================");
48 let mut cache_manager = CacheManager::with_full_config(
49 demo_cache_dir.clone(),
50 50, // 50 items in memory cache
51 3600, // 1 hour TTL
52 1024 * 1024, // 1MB disk cache limit
53 false, // Not in offline mode
54 );
55
56 println!("Created cache with 1MB size limit");
57 println!("Cache directory: {}", demo_cache_dir.display());
58
59 // Add some test data to the cache
60 let cache =
61 DatasetCache::with_full_config(demo_cache_dir.clone(), 50, 3600, 1024 * 1024, false);
62
63 // Write several files of different sizes
64 let small_data = vec![0u8; 1024]; // 1KB
65 let medium_data = vec![1u8; 10240]; // 10KB
66 let large_data = vec![2u8; 102400]; // 100KB
67
68 cache.write_cached("small_file.dat", &small_data).unwrap();
69 cache.write_cached("medium_file.dat", &medium_data).unwrap();
70 cache.write_cached("large_file.dat", &large_data).unwrap();
71
72 println!("Added test files to cache");
73 println!();
74
75 // Demonstrate basic cache statistics
76 println!("=== Basic Cache Statistics ====================");
77 let basic_stats = cache_manager.get_stats();
78 println!("Files: {}", basic_stats.file_count);
79 println!("Total size: {}", basic_stats.formatted_size());
80 println!();
81
82 // Demonstrate detailed cache statistics
83 println!("=== Detailed Cache Statistics ==================");
84 match cache_manager.get_detailed_stats() {
85 Ok(detailed_stats) => {
86 println!("Cache Directory: {}", detailed_stats.cache_dir.display());
87 println!(
88 "Total Size: {} ({} files)",
89 detailed_stats.formatted_size(),
90 detailed_stats.file_count
91 );
92 println!("Max Size: {}", detailed_stats.formatted_max_size());
93 println!("Usage: {:.1}%", detailed_stats.usage_percentage() * 100.0);
94 println!(
95 "Offline Mode: {}",
96 if detailed_stats.offline_mode {
97 "Enabled"
98 } else {
99 "Disabled"
100 }
101 );
102
103 if !detailed_stats.files.is_empty() {
104 println!("\nCached Files (sorted by size):");
105 for file in &detailed_stats.files {
106 println!(
107 " {} - {} (modified {})",
108 file.name,
109 file.formatted_size(),
110 file.formatted_modified()
111 );
112 }
113 }
114 }
115 Err(e) => {
116 println!("Error getting detailed stats: {}", e);
117 }
118 }
119 println!();
120
121 // Demonstrate cache management operations
122 println!("=== Cache Management Operations ===============");
123 println!("Available operations:");
124 println!("1. List cached files");
125 let cached_files = cache_manager.list_cached_files().unwrap();
126 for file in &cached_files {
127 println!(" - {}", file);
128 }
129
130 println!("2. Check if specific files are cached");
131 println!(
132 " small_file.dat: {}",
133 cache_manager.is_cached("small_file.dat")
134 );
135 println!(
136 " nonexistent.dat: {}",
137 cache_manager.is_cached("nonexistent.dat")
138 );
139
140 println!("3. Remove specific file");
141 cache_manager.remove("medium_file.dat").unwrap();
142 println!(" Removed medium_file.dat");
143 println!(
144 " Files remaining: {}",
145 cache_manager.list_cached_files().unwrap().len()
146 );
147 println!();
148
149 // Demonstrate offline mode
150 println!("=== Offline Mode Configuration ================");
151 println!("Current offline mode: {}", cache_manager.is_offline());
152 cache_manager.set_offline_mode(true);
153 println!("Enabled offline mode: {}", cache_manager.is_offline());
154 cache_manager.set_offline_mode(false);
155 println!("Disabled offline mode: {}", cache_manager.is_offline());
156 println!();
157
158 // Demonstrate cache size management
159 println!("=== Cache Size Management =====================");
160 println!(
161 "Current max cache size: {} bytes",
162 cache_manager.max_cache_size()
163 );
164 cache_manager.set_max_cache_size(512 * 1024); // 512KB
165 println!(
166 "Set max cache size to: {} bytes",
167 cache_manager.max_cache_size()
168 );
169
170 // Add a large file that would exceed the new limit
171 let very_large_data = vec![3u8; 400 * 1024]; // 400KB
172 cache
173 .write_cached("very_large_file.dat", &very_large_data)
174 .unwrap();
175
176 let final_stats = cache_manager.get_detailed_stats().unwrap();
177 println!(
178 "Final cache size: {} (should be within limit)",
179 final_stats.formatted_size()
180 );
181 println!(
182 "Final usage: {:.1}%",
183 final_stats.usage_percentage() * 100.0
184 );
185 println!();
186
187 // Demonstrate cache cleanup
188 println!("=== Cache Cleanup ==============================");
189 println!(
190 "Files before cleanup: {}",
191 cache_manager.list_cached_files().unwrap().len()
192 );
193 cache_manager.cleanup_old_files(100 * 1024).unwrap(); // Clean up to fit 100KB
194 let cleanup_stats = cache_manager.get_detailed_stats().unwrap();
195 println!("Files after cleanup: {}", cleanup_stats.file_count);
196 println!("Size after cleanup: {}", cleanup_stats.formatted_size());
197 println!();
198
199 // Demonstrate cache report
200 println!("=== Complete Cache Report ======================");
201 cache_manager.print_cache_report().unwrap();
202 println!();
203
204 // Clear all cache data
205 println!("=== Cache Clearing =============================");
206 cache_manager.clear_all().unwrap();
207 let empty_stats = cache_manager.get_stats();
208 println!("Files after clearing: {}", empty_stats.file_count);
209 println!("Size after clearing: {}", empty_stats.formatted_size());
210 println!();
211
212 // Demonstrate configuration examples
213 println!("=== Configuration Examples =====================");
214 println!("Example configurations for different use cases:");
215 println!();
216
217 println!("1. Development (small cache, frequent cleanup):");
218 println!(" CacheManager::with_full_config(cache_dir, 20, 1800, 50*1024*1024, false)");
219 println!(" - 20 items in memory, 30 min TTL, 50MB disk limit");
220 println!();
221
222 println!("2. Production (large cache, longer retention):");
223 println!(" CacheManager::with_full_config(cache_dir, 500, 86400, 1024*1024*1024, false)");
224 println!(" - 500 items in memory, 24 hour TTL, 1GB disk limit");
225 println!();
226
227 println!("3. Offline environment:");
228 println!(" CacheManager::with_full_config(cache_dir, 100, 3600, 0, true)");
229 println!(" - Offline mode enabled, unlimited disk cache");
230 println!();
231
232 println!("4. Memory-constrained (minimal cache):");
233 println!(" CacheManager::with_full_config(cache_dir, 10, 900, 10*1024*1024, false)");
234 println!(" - 10 items in memory, 15 min TTL, 10MB disk limit");
235 println!();
236
237 println!("=== Cache Management Demo Complete =============");
238}
Auto Trait Implementations§
impl Freeze for CacheStats
impl RefUnwindSafe for CacheStats
impl Send for CacheStats
impl Sync for CacheStats
impl Unpin for CacheStats
impl UnwindSafe for CacheStats
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more