Skip to content

Commit 50c672a

Browse files
committed
Improve error messages for missing groups and datasets
1 parent 1f06c0d commit 50c672a

4 files changed

Lines changed: 48 additions & 41 deletions

File tree

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ Unsupported at this stage:
2121
Integer datasets and integer attributes currently use native C `int` under the hood.
2222
Values outside that range are rejected with `HDF5::Error` to avoid silent overflow.
2323

24+
`Group#list_datasets` filters datasets from group entries by checking object type per entry.
25+
For very large groups, this may be slower than `Group#list_entries`.
26+
2427
## Supported HDF5 Versions
2528

2629
- HDF5 1.10

lib/hdf5/dataset.rb

Lines changed: 43 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,7 @@
11
module HDF5
22
class Dataset
3-
class << self
4-
def create(parent_id, name, data)
5-
values = normalize_data(data)
6-
dims = ::FFI::MemoryPointer.new(:ulong_long, 1)
7-
dims.write_array_of_ulong_long([values.length])
8-
datatype_id = datatype_id_for(values)
9-
dataspace_id = HDF5::FFI.H5Screate_simple(1, dims, nil)
10-
raise HDF5::Error, "Failed to create dataspace for dataset: #{name}" if dataspace_id < 0
11-
12-
dataset = from_id(
13-
HDF5::FFI.H5Dcreate2(parent_id, name, datatype_id, dataspace_id, HDF5::DEFAULT_PROPERTY_LIST,
14-
HDF5::DEFAULT_PROPERTY_LIST, HDF5::DEFAULT_PROPERTY_LIST), name
15-
)
16-
dataset.write(values)
17-
return dataset unless block_given?
18-
19-
begin
20-
yield dataset
21-
ensure
22-
dataset.close
23-
end
24-
ensure
25-
HDF5::FFI.H5Sclose(dataspace_id) if dataspace_id && dataspace_id >= 0
26-
end
27-
28-
def open(parent_id, name)
29-
dataset = from_id(HDF5::FFI.H5Dopen2(parent_id, name, HDF5::DEFAULT_PROPERTY_LIST), name)
30-
return dataset unless block_given?
31-
32-
begin
33-
yield dataset
34-
ensure
35-
dataset.close
36-
end
37-
end
3+
module DataHelpers
4+
module_function
385

396
def normalize_data(data)
407
values = data.is_a?(Array) ? data : [data]
@@ -82,8 +49,45 @@ def validate_native_int_range!(values)
8249
raise HDF5::Error,
8350
"Integer value #{out_of_range} is outside native int range (#{min}..#{max}). Use a smaller value."
8451
end
52+
end
53+
54+
private_constant :DataHelpers
55+
56+
class << self
57+
def create(parent_id, name, data)
58+
values = DataHelpers.normalize_data(data)
59+
dims = ::FFI::MemoryPointer.new(:ulong_long, 1)
60+
dims.write_array_of_ulong_long([values.length])
61+
datatype_id = DataHelpers.datatype_id_for(values)
62+
dataspace_id = HDF5::FFI.H5Screate_simple(1, dims, nil)
63+
raise HDF5::Error, "Failed to create dataspace for dataset: #{name}" if dataspace_id < 0
64+
65+
dataset = from_id(
66+
HDF5::FFI.H5Dcreate2(parent_id, name, datatype_id, dataspace_id, HDF5::DEFAULT_PROPERTY_LIST,
67+
HDF5::DEFAULT_PROPERTY_LIST, HDF5::DEFAULT_PROPERTY_LIST), name
68+
)
69+
dataset.write(values)
70+
return dataset unless block_given?
71+
72+
begin
73+
yield dataset
74+
ensure
75+
dataset.close
76+
end
77+
ensure
78+
HDF5::FFI.H5Sclose(dataspace_id) if dataspace_id && dataspace_id >= 0
79+
end
8580

86-
private :normalize_data, :datatype_id_for, :buffer_for, :native_int_bounds, :validate_native_int_range!
81+
def open(parent_id, name)
82+
dataset = from_id(HDF5::FFI.H5Dopen2(parent_id, name, HDF5::DEFAULT_PROPERTY_LIST), name)
83+
return dataset unless block_given?
84+
85+
begin
86+
yield dataset
87+
ensure
88+
dataset.close
89+
end
90+
end
8791

8892
private
8993

@@ -103,9 +107,9 @@ def attrs
103107
end
104108

105109
def write(data)
106-
values = self.class.send(:normalize_data, data)
107-
mem_type_id = self.class.send(:datatype_id_for, values)
108-
buffer = self.class.send(:buffer_for, values)
110+
values = DataHelpers.normalize_data(data)
111+
mem_type_id = DataHelpers.datatype_id_for(values)
112+
buffer = DataHelpers.buffer_for(values)
109113
status = HDF5::FFI.H5Dwrite(@dataset_id, mem_type_id, HDF5::DEFAULT_PROPERTY_LIST, HDF5::DEFAULT_PROPERTY_LIST,
110114
HDF5::DEFAULT_PROPERTY_LIST, buffer)
111115
raise HDF5::Error, 'Failed to write dataset' if status < 0

lib/hdf5/file.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ def [](name)
7979
elsif dataset?(name)
8080
Dataset.open(@file_id, name)
8181
else
82-
raise HDF5::Error, 'Unknown object type'
82+
raise HDF5::Error, "Group or dataset not found: #{name}"
8383
end
8484
end
8585

lib/hdf5/group.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ def [](name)
8181
elsif dataset?(name)
8282
Dataset.open(@group_id, name)
8383
else
84-
raise HDF5::Error, 'Group or Dataset not found'
84+
raise HDF5::Error, "Group or dataset not found: #{name}"
8585
end
8686
end
8787

0 commit comments

Comments
 (0)