Skip to content

Commit 6a67b6a

Browse files
committed
remove get_direntries
1 parent f319991 commit 6a67b6a

File tree

9 files changed

+69
-161
lines changed

9 files changed

+69
-161
lines changed

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

stable-fs/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "stable-fs"
3-
version = "0.9.0"
3+
version = "0.10.0"
44
edition = "2024"
55
description = "A Simple File system using the stable structures of the Internet Computer that implements WASI endpoints"
66
keywords = ["ic", "internet-computer", "file-system"]

stable-fs/src/fs.rs

Lines changed: 8 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -276,16 +276,20 @@ impl FileSystem {
276276
self.get_dir(fd)?.get_entry(index, self.storage.as_ref())
277277
}
278278

279-
// Get all directory entries for a given directory file descriptor.
279+
// Iterate all directory entries for a given directory file descriptor.
280280
// if the initial_index is None, the entries "." and ".." are also added in the beginning of the list
281-
pub fn get_direntries(
281+
// To get dir entries without "." and ".." pass initial_index as Some(0)
282+
pub fn with_direntries(
282283
&self,
283284
fd: Fd,
284285
initial_index: Option<DirEntryIndex>,
285-
) -> Result<Vec<(DirEntryIndex, DirEntry)>, Error> {
286+
f: &mut dyn FnMut(&DirEntryIndex, &DirEntry) -> bool,
287+
) -> Result<(), Error> {
286288
let dir = self.get_dir(fd)?;
287289

288-
self.storage.get_direntries(dir.node, initial_index)
290+
self.storage.with_direntries(dir.node, initial_index, f);
291+
292+
Ok(())
289293
}
290294

291295
fn get_node_direntry(&self, node: Node, index: DirEntryIndex) -> Result<DirEntry, Error> {
@@ -773,26 +777,6 @@ impl FileSystem {
773777
entry_index = entry.next_entry;
774778
}
775779

776-
/*
777-
for (_index, entry) in self.get_direntries(dir_fd, Some(0))? {
778-
// here we assume the entry value name is correct UTF-8
779-
let filename = unsafe {
780-
std::str::from_utf8_unchecked(&entry.name.bytes[..(entry.name.length as usize)])
781-
}
782-
.to_string();
783-
784-
if let Some(file_type) = file_type {
785-
let meta = self.metadata_from_node(entry.node)?;
786-
787-
if meta.file_type == file_type {
788-
res.push((entry.node, filename));
789-
}
790-
} else {
791-
res.push((entry.node, filename));
792-
}
793-
}
794-
*/
795-
796780
Ok(res)
797781
}
798782

stable-fs/src/fs_tests.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -717,6 +717,7 @@ mod tests {
717717

718718
#[test]
719719
fn renaming_folder_with_contents() {
720+
//TODO: fix test
720721
let mut fs = test_stable_fs_v2();
721722
let root_fd = fs.root_fd();
722723

stable-fs/src/runtime/structure_helpers.rs

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -323,35 +323,23 @@ pub fn find_entry_index(
323323
path_element: &[u8],
324324
storage: &dyn Storage,
325325
) -> Result<DirEntryIndex, Error> {
326-
let mut result: Result<DirEntryIndex, Error> = Err(Error::NoSuchFileOrDirectory);
326+
let mut result = Err(Error::NoSuchFileOrDirectory);
327327

328328
storage.with_direntries(dir_entry_node, Some(0), &mut |index, dir_entry| {
329329
if dir_entry.name.length as usize == path_element.len()
330-
&& &dir_entry.name.bytes[0..path_element.len()] == path_element
330+
&& dir_entry.name.bytes[0..path_element.len()] == *path_element
331331
{
332332
result = Ok(*index);
333-
return;
334-
}
335-
336-
result = Err(Error::NoSuchFileOrDirectory)
337-
});
338-
339-
result
340-
341-
/*let mut result: Result<DirEntryIndex, Error> = Err(Error::NoSuchFileOrDirectory);
342333

343-
storage.with_direntries(dir_entry_node, Some(0), &mut |index, dir_entry| {
344-
if dir_entry.name.length as usize == path_element.len()
345-
&& &dir_entry.name.bytes[0..path_element.len()] == path_element
346-
{
347-
result = Ok(*index);
348-
return;
334+
// stop iterations
335+
false
336+
} else {
337+
// continue search
338+
true
349339
}
350-
351-
result = Err(Error::NoSuchFileOrDirectory)
352340
});
353341

354-
result*/
342+
result
355343
}
356344

357345
// Add new directory entry

stable-fs/src/storage.rs

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
use std::cell::RefMut;
2-
31
use ic_stable_structures::Memory;
42

53
use crate::{
@@ -57,16 +55,9 @@ pub trait Storage {
5755
&self,
5856
node: Node,
5957
initial_index: Option<DirEntryIndex>,
60-
f: &mut dyn FnMut(&DirEntryIndex, &DirEntry),
58+
f: &mut dyn FnMut(&DirEntryIndex, &DirEntry) -> bool,
6159
);
6260

63-
// Retrieve the DirEntry instancec given the parent Node.
64-
fn get_direntries(
65-
&self,
66-
node: Node,
67-
initial_index: Option<DirEntryIndex>,
68-
) -> Result<Vec<(DirEntryIndex, DirEntry)>, Error>;
69-
7061
// Update or insert the DirEntry instance given the Node and DirEntryIndex.
7162
fn put_direntry(&mut self, node: Node, index: DirEntryIndex, entry: DirEntry);
7263
// Remove the DirEntry instance given the Node and DirEntryIndex.

stable-fs/src/storage/dummy.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,19 +119,22 @@ impl Storage for DummyStorage {
119119
panic!("Not supported")
120120
}
121121

122+
/*
123+
122124
fn get_direntries(
123125
&self,
124126
_node: Node,
125127
_initial_index: Option<DirEntryIndex>,
126128
) -> Result<Vec<(DirEntryIndex, DirEntry)>, Error> {
127129
panic!("Not supported")
128130
}
131+
*/
129132

130133
fn with_direntries(
131134
&self,
132135
_node: Node,
133136
_initial_index: Option<DirEntryIndex>,
134-
_f: &mut dyn FnMut(&DirEntryIndex, &DirEntry),
137+
_f: &mut dyn FnMut(&DirEntryIndex, &DirEntry) -> bool,
135138
) {
136139
panic!("Not supported")
137140
}

stable-fs/src/storage/stable.rs

Lines changed: 23 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -752,60 +752,23 @@ impl<M: Memory> Storage for StableStorage<M> {
752752
.ok_or(Error::NoSuchFileOrDirectory)
753753
}
754754

755-
fn get_direntries(
756-
&self,
757-
node: Node,
758-
initial_index: Option<DirEntryIndex>,
759-
) -> Result<Vec<(DirEntryIndex, DirEntry)>, Error> {
760-
let mut res = Vec::new();
761-
762-
if initial_index.is_none() {
763-
let mut dot_entry = DUMMY_DOT_ENTRY;
764-
dot_entry.1.node = node;
765-
res.push(dot_entry);
766-
res.push(DUMMY_DOT_DOT_ENTRY);
767-
}
768-
769-
let initial_index = initial_index.unwrap_or(0);
770-
771-
if initial_index == DUMMY_DOT_ENTRY_INDEX {
772-
let mut dot_entry = DUMMY_DOT_ENTRY;
773-
dot_entry.1.node = node;
774-
res.push(dot_entry);
775-
res.push(DUMMY_DOT_DOT_ENTRY);
776-
}
777-
778-
if initial_index == DUMMY_DOT_DOT_ENTRY_INDEX {
779-
res.push(DUMMY_DOT_DOT_ENTRY);
780-
}
781-
782-
let max_index = MAX_FILE_ENTRY_INDEX;
783-
784-
for en in self
785-
.direntry
786-
.range((node, initial_index)..(node, max_index))
787-
{
788-
let (_node, index) = *en.key();
789-
let entry = en.value();
790-
791-
res.push((index, entry));
792-
}
793-
794-
Ok(res)
795-
}
796-
797755
fn with_direntries(
798756
&self,
799757
node: Node,
800758
initial_index: Option<DirEntryIndex>,
801-
f: &mut dyn FnMut(&DirEntryIndex, &DirEntry),
759+
f: &mut dyn FnMut(&DirEntryIndex, &DirEntry) -> bool,
802760
) {
803761
if initial_index.is_none() {
804762
let mut dot_entry = DUMMY_DOT_ENTRY;
805763
dot_entry.1.node = node;
806764

807-
f(&dot_entry.0, &dot_entry.1);
808-
f(&DUMMY_DOT_DOT_ENTRY.0, &DUMMY_DOT_DOT_ENTRY.1);
765+
if !f(&dot_entry.0, &dot_entry.1) {
766+
return;
767+
}
768+
769+
if !f(&DUMMY_DOT_DOT_ENTRY.0, &DUMMY_DOT_DOT_ENTRY.1) {
770+
return;
771+
}
809772
}
810773

811774
let initial_index = initial_index.unwrap_or(0);
@@ -814,12 +777,19 @@ impl<M: Memory> Storage for StableStorage<M> {
814777
let mut dot_entry = DUMMY_DOT_ENTRY;
815778
dot_entry.1.node = node;
816779

817-
f(&dot_entry.0, &dot_entry.1);
818-
f(&DUMMY_DOT_DOT_ENTRY.0, &DUMMY_DOT_DOT_ENTRY.1);
780+
if !f(&dot_entry.0, &dot_entry.1) {
781+
return;
782+
}
783+
784+
if !f(&DUMMY_DOT_DOT_ENTRY.0, &DUMMY_DOT_DOT_ENTRY.1) {
785+
return;
786+
}
819787
}
820788

821-
if initial_index == DUMMY_DOT_DOT_ENTRY_INDEX {
822-
f(&DUMMY_DOT_DOT_ENTRY.0, &DUMMY_DOT_DOT_ENTRY.1);
789+
if initial_index == DUMMY_DOT_DOT_ENTRY_INDEX
790+
&& !f(&DUMMY_DOT_DOT_ENTRY.0, &DUMMY_DOT_DOT_ENTRY.1)
791+
{
792+
return;
823793
}
824794

825795
let max_index = MAX_FILE_ENTRY_INDEX;
@@ -828,11 +798,12 @@ impl<M: Memory> Storage for StableStorage<M> {
828798
.direntry
829799
.range((node, initial_index)..(node, max_index))
830800
{
831-
let (_node, index) = en.key();
832-
801+
let (_node, index) = *en.key();
833802
let entry = en.value();
834803

835-
f(index, &entry);
804+
if !f(&index, &entry) {
805+
return;
806+
}
836807
}
837808
}
838809

stable-fs/src/storage/transient.rs

Lines changed: 22 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -487,57 +487,22 @@ impl Storage for TransientStorage {
487487
// Noop
488488
}
489489

490-
fn get_direntries(
491-
&self,
492-
node: Node,
493-
initial_index: Option<DirEntryIndex>,
494-
) -> Result<Vec<(DirEntryIndex, DirEntry)>, Error> {
495-
let mut res: Vec<(DirEntryIndex, DirEntry)> = Vec::new();
496-
497-
if initial_index.is_none() {
498-
let mut dot_entry = DUMMY_DOT_ENTRY;
499-
dot_entry.1.node = node;
500-
res.push(dot_entry);
501-
res.push(DUMMY_DOT_DOT_ENTRY);
502-
}
503-
504-
let initial_index = initial_index.unwrap_or(0);
505-
506-
if initial_index == DUMMY_DOT_ENTRY_INDEX {
507-
let mut dot_entry = DUMMY_DOT_ENTRY;
508-
dot_entry.1.node = node;
509-
res.push(dot_entry);
510-
res.push(DUMMY_DOT_DOT_ENTRY);
511-
}
512-
513-
if initial_index == DUMMY_DOT_DOT_ENTRY_INDEX {
514-
res.push(DUMMY_DOT_DOT_ENTRY);
515-
}
516-
517-
let max_index = MAX_FILE_ENTRY_INDEX;
518-
519-
for ((_node, index), entry) in self
520-
.direntry
521-
.range((node, initial_index)..(node, max_index))
522-
{
523-
res.push((*index, entry.clone()));
524-
}
525-
526-
Ok(res)
527-
}
528-
529490
fn with_direntries(
530491
&self,
531492
node: Node,
532493
initial_index: Option<DirEntryIndex>,
533-
f: &mut dyn FnMut(&DirEntryIndex, &DirEntry),
494+
f: &mut dyn FnMut(&DirEntryIndex, &DirEntry) -> bool,
534495
) {
535496
if initial_index.is_none() {
536497
let mut dot_entry = DUMMY_DOT_ENTRY;
537498
dot_entry.1.node = node;
499+
if !f(&dot_entry.0, &dot_entry.1) {
500+
return;
501+
}
538502

539-
f(&dot_entry.0, &dot_entry.1);
540-
f(&DUMMY_DOT_DOT_ENTRY.0, &DUMMY_DOT_DOT_ENTRY.1);
503+
if !f(&DUMMY_DOT_DOT_ENTRY.0, &DUMMY_DOT_DOT_ENTRY.1) {
504+
return;
505+
}
541506
}
542507

543508
let initial_index = initial_index.unwrap_or(0);
@@ -546,25 +511,30 @@ impl Storage for TransientStorage {
546511
let mut dot_entry = DUMMY_DOT_ENTRY;
547512
dot_entry.1.node = node;
548513

549-
f(&dot_entry.0, &dot_entry.1);
550-
f(&DUMMY_DOT_DOT_ENTRY.0, &DUMMY_DOT_DOT_ENTRY.1);
514+
if !f(&dot_entry.0, &dot_entry.1) {
515+
return;
516+
}
517+
518+
if !f(&DUMMY_DOT_DOT_ENTRY.0, &DUMMY_DOT_DOT_ENTRY.1) {
519+
return;
520+
}
551521
}
552522

553-
if initial_index == DUMMY_DOT_DOT_ENTRY_INDEX {
554-
f(&DUMMY_DOT_DOT_ENTRY.0, &DUMMY_DOT_DOT_ENTRY.1);
523+
if initial_index == DUMMY_DOT_DOT_ENTRY_INDEX
524+
&& !f(&DUMMY_DOT_DOT_ENTRY.0, &DUMMY_DOT_DOT_ENTRY.1)
525+
{
526+
return;
555527
}
556528

557529
let max_index = MAX_FILE_ENTRY_INDEX;
558530

559-
for en in self
531+
for ((_node, index), entry) in self
560532
.direntry
561533
.range((node, initial_index)..(node, max_index))
562534
{
563-
let (_node, index) = en.0;
564-
565-
let entry = en.1;
566-
567-
f(index, entry);
535+
if !f(index, entry) {
536+
return;
537+
}
568538
}
569539
}
570540
}

0 commit comments

Comments
 (0)