Skip to content

Commit 2d4d97b

Browse files
committed
add support for binary data in setDatasetValueByPointsSelection
1 parent 43e63ad commit 2d4d97b

File tree

1 file changed

+50
-20
lines changed

1 file changed

+50
-20
lines changed

h5json/hdf5db.py

Lines changed: 50 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,6 @@
6767
"""
6868
import errno
6969
import time
70-
import base64
7170
import h5py
7271
import numpy as np
7372
import uuid
@@ -2286,7 +2285,10 @@ def setDatasetValuesByUuid(self, obj_uuid, data, slices=None, format="json"):
22862285
s = slices[i]
22872286
np_shape.append( (s.stop - s.start) )
22882287
arr = np.fromstring(data, dtype=dset.dtype)
2289-
arr.reshape(np_shape)
2288+
print("np_shape:", np_shape)
2289+
arr = arr.reshape(np_shape)
2290+
print("arr:", arr)
2291+
22902292
if rank == 1:
22912293
s = slices[0]
22922294
dset[s] = arr
@@ -2312,33 +2314,61 @@ def setDatasetValuesByUuid(self, obj_uuid, data, slices=None, format="json"):
23122314
"""
23132315
def setDatasetValuesByPointSelection(self, obj_uuid, data, points, format="json"):
23142316
dset = self.getDatasetObjByUuid(obj_uuid)
2317+
2318+
if format not in ("json", "binary"):
2319+
msg = "only json and binary formats are supported"
2320+
self.log.info(msg)
2321+
raise IOError(errno.EINVAL, msg)
2322+
2323+
if format == "binary" and type(data) is not bytes:
2324+
msg ="data must be of type bytes for binary writing"
2325+
self.log.info(msg)
2326+
raise IOError(errno.EINVAL, msg)
2327+
2328+
if dset is None:
2329+
msg = "Dataset: " + obj_uuid + " not found"
2330+
self.log.info(msg)
2331+
raise IOError(errno.ENXIO, msg)
2332+
2333+
dt = dset.dtype
2334+
typeItem = getTypeItem(dt)
2335+
itemSize = getItemSize(typeItem)
2336+
if itemSize == "H5T_VARIABLE" and format == "binary":
2337+
msg = "Only JSON is supported for for this data type"
2338+
self.log.info(msg)
2339+
raise IOError(errno.EINVAL, msg)
2340+
23152341
# need some special conversion for compound types --
23162342
# each element must be a tuple, but the JSON decoder
23172343
# gives us a list instead.
2318-
if len(dset.dtype) > 1 and type(data) in (list, tuple):
2344+
if format == "json" and len(dset.dtype) > 1 and type(data) in (list, tuple):
23192345
converted_data = []
23202346
for i in range(len(data)):
23212347
converted_data.append(self.toTuple(data[i]))
23222348
data = converted_data
2323-
if dset is None:
2324-
msg = "Dataset: " + obj_uuid + " not found"
2325-
self.log.info(msg)
2326-
raise IOError(errno.ENXIO, msg)
2349+
23272350
rank = len(dset.shape)
2351+
2352+
if format == "json":
23282353

2329-
try:
2330-
i = 0
2331-
for point in points:
2332-
if rank == 1:
2333-
dset[[point]] = data[i]
2334-
else:
2335-
dset[tuple(point)] = data[i]
2336-
i += 1
2337-
except ValueError:
2338-
# out of range error
2339-
msg = "setDatasetValuesByPointSelection, out of range error"
2340-
self.log.info(msg)
2341-
raise IOError(errno.EINVAL, msg)
2354+
try:
2355+
i = 0
2356+
for point in points:
2357+
if rank == 1:
2358+
dset[[point]] = data[i]
2359+
else:
2360+
dset[tuple(point)] = data[i]
2361+
i += 1
2362+
except ValueError:
2363+
# out of range error
2364+
msg = "setDatasetValuesByPointSelection, out of range error"
2365+
self.log.info(msg)
2366+
raise IOError(errno.EINVAL, msg)
2367+
2368+
else:
2369+
#binary
2370+
arr = np.fromstring(data, dtype=dset.dtype)
2371+
dset[points] = arr # coordinate write
23422372

23432373
# update modified time
23442374
self.setModifiedTime(obj_uuid)

0 commit comments

Comments
 (0)