pub struct DatasetCache { /* private fields */ }
Expand description
Manages caching of downloaded datasets, using both file-based and in-memory caching
This implementation uses scirs2-core::cache’s TTLSizedCache for in-memory caching, while maintaining the file-based persistence for long-term storage.
Implementations§
Source§impl DatasetCache
impl DatasetCache
Sourcepub fn new(cache_dir: PathBuf) -> Self
pub fn new(cache_dir: PathBuf) -> Self
Create a new dataset cache with the given cache directory and default memory cache
Sourcepub fn with_config(
cache_dir: PathBuf,
cache_size: usize,
ttl_seconds: u64,
) -> Self
pub fn with_config( cache_dir: PathBuf, cache_size: usize, ttl_seconds: u64, ) -> Self
Create a new dataset cache with custom settings
Sourcepub fn with_full_config(
cache_dir: PathBuf,
cache_size: usize,
ttl_seconds: u64,
max_cache_size: u64,
offline_mode: bool,
) -> Self
pub fn with_full_config( cache_dir: PathBuf, cache_size: usize, ttl_seconds: u64, max_cache_size: u64, offline_mode: bool, ) -> Self
Create a new dataset cache with comprehensive configuration
Examples found in repository?
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}
Sourcepub fn ensure_cache_dir(&self) -> Result<()>
pub fn ensure_cache_dir(&self) -> Result<()>
Create the cache directory if it doesn’t exist
Sourcepub fn get_cached_path(&self, name: &str) -> PathBuf
pub fn get_cached_path(&self, name: &str) -> PathBuf
Get the path to a cached file
Sourcepub fn is_cached(&self, name: &str) -> bool
pub fn is_cached(&self, name: &str) -> bool
Check if a file is already cached (either in memory or on disk)
Sourcepub fn read_cached(&self, name: &str) -> Result<Vec<u8>>
pub fn read_cached(&self, name: &str) -> Result<Vec<u8>>
Read a cached file as bytes
This method checks the in-memory cache first, and falls back to the file system if needed. When reading from the file system, the result is also stored in the in-memory cache.
Sourcepub fn write_cached(&self, name: &str, data: &[u8]) -> Result<()>
pub fn write_cached(&self, name: &str, data: &[u8]) -> Result<()>
Write data to both the file cache and memory cache
Examples found in repository?
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}
Sourcepub fn clear_cache(&self) -> Result<()>
pub fn clear_cache(&self) -> Result<()>
Clear the entire cache (both memory and file-based)
Sourcepub fn remove_cached(&self, name: &str) -> Result<()>
pub fn remove_cached(&self, name: &str) -> Result<()>
Remove a specific cached file (from both memory and file system)
Sourcepub fn hash_filename(name: &str) -> String
pub fn hash_filename(name: &str) -> String
Compute a hash for a filename or URL
Sourcepub fn get_cache_size_bytes(&self) -> Result<u64>
pub fn get_cache_size_bytes(&self) -> Result<u64>
Get the total size of the cache in bytes
Sourcepub fn set_offline_mode(&mut self, offline: bool)
pub fn set_offline_mode(&mut self, offline: bool)
Set offline mode
Sourcepub fn is_offline(&self) -> bool
pub fn is_offline(&self) -> bool
Check if cache is in offline mode
Sourcepub fn set_max_cache_size(&mut self, max_size: u64)
pub fn set_max_cache_size(&mut self, max_size: u64)
Set maximum cache size in bytes (0 for unlimited)
Sourcepub fn max_cache_size(&self) -> u64
pub fn max_cache_size(&self) -> u64
Get maximum cache size in bytes
Sourcepub fn get_detailed_stats(&self) -> Result<DetailedCacheStats>
pub fn get_detailed_stats(&self) -> Result<DetailedCacheStats>
Get detailed cache information
Trait Implementations§
Auto Trait Implementations§
impl !Freeze for DatasetCache
impl !RefUnwindSafe for DatasetCache
impl Send for DatasetCache
impl !Sync for DatasetCache
impl Unpin for DatasetCache
impl UnwindSafe for DatasetCache
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
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>
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>
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