1 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
2 * Copyright by The HDF Group. *
3 * All rights reserved. *
4 * *
5 * This file is part of HDF5. The full HDF5 copyright notice, including *
6 * terms governing use, modification, and redistribution, is contained in *
7 * the COPYING file, which can be found at the root of the source code *
8 * distribution tree, or in https://www.hdfgroup.org/licenses. *
9 * If you do not have access to either file, you may request a copy from *
10 * help@hdfgroup.org. *
11 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
12
13 /*
14 * Purpose: Dataset callbacks for the native VOL connector
15 *
16 */
17
18 #define H5D_FRIEND /* Suppress error about including H5Dpkg */
19
20 #include "H5private.h" /* Generic Functions */
21 #include "H5CXprivate.h" /* API Contexts */
22 #include "H5Dpkg.h" /* Datasets */
23 #include "H5Eprivate.h" /* Error handling */
24 #include "H5Fprivate.h" /* Files */
25 #include "H5Gprivate.h" /* Groups */
26 #include "H5Iprivate.h" /* IDs */
27 #include "H5Pprivate.h" /* Property lists */
28 #include "H5Sprivate.h" /* Dataspaces */
29 #include "H5VLprivate.h" /* Virtual Object Layer */
30
31 #include "H5VLnative_private.h" /* Native VOL connector */
32
33 /*-------------------------------------------------------------------------
34 * Function: H5VL__native_dataset_create
35 *
36 * Purpose: Handles the dataset create callback
37 *
38 * Return: Success: dataset pointer
39 * Failure: NULL
40 *
41 *-------------------------------------------------------------------------
42 */
43 void *
H5VL__native_dataset_create(void * obj,const H5VL_loc_params_t * loc_params,const char * name,hid_t lcpl_id,hid_t type_id,hid_t space_id,hid_t dcpl_id,hid_t dapl_id,hid_t H5_ATTR_UNUSED dxpl_id,void H5_ATTR_UNUSED ** req)44 H5VL__native_dataset_create(void *obj, const H5VL_loc_params_t *loc_params, const char *name, hid_t lcpl_id,
45 hid_t type_id, hid_t space_id, hid_t dcpl_id, hid_t dapl_id,
46 hid_t H5_ATTR_UNUSED dxpl_id, void H5_ATTR_UNUSED **req)
47 {
48 H5G_loc_t loc; /* Object location to insert dataset into */
49 H5D_t * dset = NULL; /* New dataset's info */
50 const H5S_t *space; /* Dataspace for dataset */
51 void * ret_value;
52
53 FUNC_ENTER_PACKAGE
54
55 /* Check arguments */
56 if (H5G_loc_real(obj, loc_params->obj_type, &loc) < 0)
57 HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a file or file object")
58 if (H5I_DATATYPE != H5I_get_type(type_id))
59 HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a datatype ID")
60 if (NULL == (space = (const H5S_t *)H5I_object_verify(space_id, H5I_DATASPACE)))
61 HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a dataspace ID")
62
63 /* H5Dcreate_anon */
64 if (NULL == name) {
65 /* build and open the new dataset */
66 if (NULL == (dset = H5D__create(loc.oloc->file, type_id, space, dcpl_id, dapl_id)))
67 HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, NULL, "unable to create dataset")
68 } /* end if */
69 /* H5Dcreate2 */
70 else {
71 /* Create the new dataset & get its ID */
72 if (NULL == (dset = H5D__create_named(&loc, name, type_id, space, lcpl_id, dcpl_id, dapl_id)))
73 HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, NULL, "unable to create dataset")
74 } /* end else */
75
76 ret_value = (void *)dset;
77
78 done:
79 if (NULL == name) {
80 /* Release the dataset's object header, if it was created */
81 if (dset) {
82 H5O_loc_t *oloc; /* Object location for dataset */
83
84 /* Get the new dataset's object location */
85 if (NULL == (oloc = H5D_oloc(dset)))
86 HDONE_ERROR(H5E_DATASET, H5E_CANTGET, NULL, "unable to get object location of dataset")
87
88 /* Decrement refcount on dataset's object header in memory */
89 if (H5O_dec_rc_by_loc(oloc) < 0)
90 HDONE_ERROR(H5E_DATASET, H5E_CANTDEC, NULL,
91 "unable to decrement refcount on newly created object")
92 } /* end if */
93 } /* end if */
94
95 FUNC_LEAVE_NOAPI(ret_value)
96 } /* end H5VL__native_dataset_create() */
97
98 /*-------------------------------------------------------------------------
99 * Function: H5VL__native_dataset_open
100 *
101 * Purpose: Handles the dataset open callback
102 *
103 * Return: Success: dataset pointer
104 * Failure: NULL
105 *
106 *-------------------------------------------------------------------------
107 */
108 void *
H5VL__native_dataset_open(void * obj,const H5VL_loc_params_t * loc_params,const char * name,hid_t dapl_id,hid_t H5_ATTR_UNUSED dxpl_id,void H5_ATTR_UNUSED ** req)109 H5VL__native_dataset_open(void *obj, const H5VL_loc_params_t *loc_params, const char *name, hid_t dapl_id,
110 hid_t H5_ATTR_UNUSED dxpl_id, void H5_ATTR_UNUSED **req)
111 {
112 H5D_t * dset = NULL;
113 H5G_loc_t loc; /* Object location of group */
114 void * ret_value = NULL;
115
116 FUNC_ENTER_PACKAGE
117
118 if (H5G_loc_real(obj, loc_params->obj_type, &loc) < 0)
119 HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a file or file object")
120
121 /* Open the dataset */
122 if (NULL == (dset = H5D__open_name(&loc, name, dapl_id)))
123 HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, NULL, "unable to open dataset")
124
125 ret_value = (void *)dset;
126
127 done:
128 FUNC_LEAVE_NOAPI(ret_value)
129 } /* end H5VL__native_dataset_open() */
130
131 /*-------------------------------------------------------------------------
132 * Function: H5VL__native_dataset_read
133 *
134 * Purpose: Handles the dataset read callback
135 *
136 * Return: SUCCEED/FAIL
137 *
138 *-------------------------------------------------------------------------
139 */
140 herr_t
H5VL__native_dataset_read(void * obj,hid_t mem_type_id,hid_t mem_space_id,hid_t file_space_id,hid_t dxpl_id,void * buf,void H5_ATTR_UNUSED ** req)141 H5VL__native_dataset_read(void *obj, hid_t mem_type_id, hid_t mem_space_id, hid_t file_space_id,
142 hid_t dxpl_id, void *buf, void H5_ATTR_UNUSED **req)
143 {
144 H5D_t * dset = (H5D_t *)obj;
145 const H5S_t *mem_space = NULL;
146 const H5S_t *file_space = NULL;
147 herr_t ret_value = SUCCEED; /* Return value */
148
149 FUNC_ENTER_PACKAGE
150
151 /* Check arguments */
152 if (NULL == dset->oloc.file)
153 HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "dataset is not associated with a file")
154
155 /* Get validated dataspace pointers */
156 if (H5S_get_validated_dataspace(mem_space_id, &mem_space) < 0)
157 HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "could not get a validated dataspace from mem_space_id")
158 if (H5S_get_validated_dataspace(file_space_id, &file_space) < 0)
159 HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "could not get a validated dataspace from file_space_id")
160
161 /* Set DXPL for operation */
162 H5CX_set_dxpl(dxpl_id);
163
164 /* Read raw data */
165 if (H5D__read(dset, mem_type_id, mem_space, file_space, buf /*out*/) < 0)
166 HGOTO_ERROR(H5E_DATASET, H5E_READERROR, FAIL, "can't read data")
167
168 done:
169 FUNC_LEAVE_NOAPI(ret_value)
170 } /* end H5VL__native_dataset_read() */
171
172 /*-------------------------------------------------------------------------
173 * Function: H5VL__native_dataset_write
174 *
175 * Purpose: Handles the dataset write callback
176 *
177 * Return: SUCCEED/FAIL
178 *
179 *-------------------------------------------------------------------------
180 */
181 herr_t
H5VL__native_dataset_write(void * obj,hid_t mem_type_id,hid_t mem_space_id,hid_t file_space_id,hid_t dxpl_id,const void * buf,void H5_ATTR_UNUSED ** req)182 H5VL__native_dataset_write(void *obj, hid_t mem_type_id, hid_t mem_space_id, hid_t file_space_id,
183 hid_t dxpl_id, const void *buf, void H5_ATTR_UNUSED **req)
184 {
185 H5D_t * dset = (H5D_t *)obj;
186 const H5S_t *mem_space = NULL;
187 const H5S_t *file_space = NULL;
188 herr_t ret_value = SUCCEED; /* Return value */
189
190 FUNC_ENTER_PACKAGE
191
192 /* check arguments */
193 if (NULL == dset->oloc.file)
194 HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "dataset is not associated with a file")
195
196 /* Get validated dataspace pointers */
197 if (H5S_get_validated_dataspace(mem_space_id, &mem_space) < 0)
198 HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "could not get a validated dataspace from mem_space_id")
199 if (H5S_get_validated_dataspace(file_space_id, &file_space) < 0)
200 HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "could not get a validated dataspace from file_space_id")
201
202 /* Set DXPL for operation */
203 H5CX_set_dxpl(dxpl_id);
204
205 /* Write the data */
206 if (H5D__write(dset, mem_type_id, mem_space, file_space, buf) < 0)
207 HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "can't write data")
208
209 done:
210 FUNC_LEAVE_NOAPI(ret_value)
211 } /* end H5VL__native_dataset_write() */
212
213 /*-------------------------------------------------------------------------
214 * Function: H5VL__native_dataset_get
215 *
216 * Purpose: Handles the dataset get callback
217 *
218 * Return: SUCCEED/FAIL
219 *
220 *-------------------------------------------------------------------------
221 */
222 herr_t
H5VL__native_dataset_get(void * obj,H5VL_dataset_get_t get_type,hid_t H5_ATTR_UNUSED dxpl_id,void H5_ATTR_UNUSED ** req,va_list arguments)223 H5VL__native_dataset_get(void *obj, H5VL_dataset_get_t get_type, hid_t H5_ATTR_UNUSED dxpl_id,
224 void H5_ATTR_UNUSED **req, va_list arguments)
225 {
226 H5D_t *dset = (H5D_t *)obj;
227 herr_t ret_value = SUCCEED; /* Return value */
228
229 FUNC_ENTER_PACKAGE
230
231 switch (get_type) {
232 /* H5Dget_space */
233 case H5VL_DATASET_GET_SPACE: {
234 hid_t *ret_id = HDva_arg(arguments, hid_t *);
235
236 if ((*ret_id = H5D__get_space(dset)) < 0)
237 HGOTO_ERROR(H5E_ARGS, H5E_CANTGET, FAIL, "can't get space ID of dataset")
238
239 break;
240 }
241
242 /* H5Dget_space_status */
243 case H5VL_DATASET_GET_SPACE_STATUS: {
244 H5D_space_status_t *allocation = HDva_arg(arguments, H5D_space_status_t *);
245
246 /* Read data space address and return */
247 if (H5D__get_space_status(dset, allocation) < 0)
248 HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to get space status")
249
250 break;
251 }
252
253 /* H5Dget_type */
254 case H5VL_DATASET_GET_TYPE: {
255 hid_t *ret_id = HDva_arg(arguments, hid_t *);
256
257 if ((*ret_id = H5D__get_type(dset)) < 0)
258 HGOTO_ERROR(H5E_ARGS, H5E_CANTGET, FAIL, "can't get datatype ID of dataset")
259
260 break;
261 }
262
263 /* H5Dget_create_plist */
264 case H5VL_DATASET_GET_DCPL: {
265 hid_t *ret_id = HDva_arg(arguments, hid_t *);
266
267 if ((*ret_id = H5D_get_create_plist(dset)) < 0)
268 HGOTO_ERROR(H5E_ARGS, H5E_CANTGET, FAIL, "can't get creation property list for dataset")
269
270 break;
271 }
272
273 /* H5Dget_access_plist */
274 case H5VL_DATASET_GET_DAPL: {
275 hid_t *ret_id = HDva_arg(arguments, hid_t *);
276
277 if ((*ret_id = H5D_get_access_plist(dset)) < 0)
278 HGOTO_ERROR(H5E_ARGS, H5E_CANTGET, FAIL, "can't get access property list for dataset")
279
280 break;
281 }
282
283 /* H5Dget_storage_size */
284 case H5VL_DATASET_GET_STORAGE_SIZE: {
285 hsize_t *ret = HDva_arg(arguments, hsize_t *);
286
287 /* Set return value */
288 if (H5D__get_storage_size(dset, ret) < 0)
289 HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get size of dataset's storage")
290 break;
291 }
292
293 default:
294 HGOTO_ERROR(H5E_VOL, H5E_CANTGET, FAIL, "can't get this type of information from dataset")
295 } /* end switch */
296
297 done:
298 FUNC_LEAVE_NOAPI(ret_value)
299 } /* end H5VL__native_dataset_get() */
300
301 /*-------------------------------------------------------------------------
302 * Function: H5VL__native_dataset_specific
303 *
304 * Purpose: Handles the dataset specific callback
305 *
306 * Return: SUCCEED/FAIL
307 *
308 *-------------------------------------------------------------------------
309 */
310 herr_t
H5VL__native_dataset_specific(void * obj,H5VL_dataset_specific_t specific_type,hid_t H5_ATTR_UNUSED dxpl_id,void H5_ATTR_UNUSED ** req,va_list arguments)311 H5VL__native_dataset_specific(void *obj, H5VL_dataset_specific_t specific_type, hid_t H5_ATTR_UNUSED dxpl_id,
312 void H5_ATTR_UNUSED **req, va_list arguments)
313 {
314 H5D_t *dset = (H5D_t *)obj;
315 herr_t ret_value = SUCCEED; /* Return value */
316
317 FUNC_ENTER_PACKAGE
318
319 switch (specific_type) {
320 /* H5Dspecific_space */
321 case H5VL_DATASET_SET_EXTENT: { /* H5Dset_extent (H5Dextend - deprecated) */
322 const hsize_t *size = HDva_arg(arguments, const hsize_t *);
323
324 if (H5D__set_extent(dset, size) < 0)
325 HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to set extent of dataset")
326 break;
327 }
328
329 case H5VL_DATASET_FLUSH: { /* H5Dflush */
330 hid_t dset_id = HDva_arg(arguments, hid_t);
331
332 /* Flush the dataset */
333 if (H5D__flush(dset, dset_id) < 0)
334 HGOTO_ERROR(H5E_DATASET, H5E_CANTFLUSH, FAIL, "unable to flush dataset")
335
336 break;
337 }
338
339 case H5VL_DATASET_REFRESH: { /* H5Drefresh */
340 hid_t dset_id = HDva_arg(arguments, hid_t);
341
342 /* Refresh the dataset */
343 if ((H5D__refresh(dset_id, dset)) < 0)
344 HGOTO_ERROR(H5E_DATASET, H5E_CANTLOAD, FAIL, "unable to refresh dataset")
345
346 break;
347 }
348
349 default:
350 HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "invalid specific operation")
351 } /* end switch */
352
353 done:
354 FUNC_LEAVE_NOAPI(ret_value)
355 } /* end H5VL__native_dataset_specific() */
356
357 /*-------------------------------------------------------------------------
358 * Function: H5VL__native_dataset_optional
359 *
360 * Purpose: Handles the dataset optional callback
361 *
362 * Return: SUCCEED/FAIL
363 *
364 *-------------------------------------------------------------------------
365 */
366 herr_t
H5VL__native_dataset_optional(void * obj,H5VL_dataset_optional_t optional_type,hid_t dxpl_id,void H5_ATTR_UNUSED ** req,va_list arguments)367 H5VL__native_dataset_optional(void *obj, H5VL_dataset_optional_t optional_type, hid_t dxpl_id,
368 void H5_ATTR_UNUSED **req, va_list arguments)
369 {
370 H5D_t *dset = (H5D_t *)obj; /* Dataset */
371 herr_t ret_value = SUCCEED; /* Return value */
372
373 FUNC_ENTER_PACKAGE
374
375 /* Sanity checks */
376 HDassert(dset);
377
378 /* Set DXPL for operation */
379 H5CX_set_dxpl(dxpl_id);
380
381 switch (optional_type) {
382 case H5VL_NATIVE_DATASET_FORMAT_CONVERT: { /* H5Dformat_convert */
383 switch (dset->shared->layout.type) {
384 case H5D_CHUNKED:
385 /* Convert the chunk indexing type to version 1 B-tree if not */
386 if (dset->shared->layout.u.chunk.idx_type != H5D_CHUNK_IDX_BTREE)
387 if ((H5D__format_convert(dset)) < 0)
388 HGOTO_ERROR(H5E_DATASET, H5E_CANTLOAD, FAIL,
389 "unable to downgrade chunk indexing type for dataset")
390 break;
391
392 case H5D_CONTIGUOUS:
393 case H5D_COMPACT:
394 /* Downgrade the layout version to 3 if greater than 3 */
395 if (dset->shared->layout.version > H5O_LAYOUT_VERSION_DEFAULT)
396 if ((H5D__format_convert(dset)) < 0)
397 HGOTO_ERROR(H5E_DATASET, H5E_CANTLOAD, FAIL,
398 "unable to downgrade layout version for dataset")
399 break;
400
401 case H5D_VIRTUAL:
402 /* Nothing to do even though layout is version 4 */
403 break;
404
405 case H5D_LAYOUT_ERROR:
406 case H5D_NLAYOUTS:
407 HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid dataset layout type")
408
409 default:
410 HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "unknown dataset layout type")
411 } /* end switch */
412
413 break;
414 }
415
416 case H5VL_NATIVE_DATASET_GET_CHUNK_INDEX_TYPE: { /* H5Dget_chunk_index_type */
417 H5D_chunk_index_t *idx_type = HDva_arg(arguments, H5D_chunk_index_t *);
418
419 /* Make sure the dataset is chunked */
420 if (H5D_CHUNKED != dset->shared->layout.type)
421 HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a chunked dataset")
422
423 /* Get the chunk indexing type */
424 *idx_type = dset->shared->layout.u.chunk.idx_type;
425
426 break;
427 }
428
429 case H5VL_NATIVE_DATASET_GET_CHUNK_STORAGE_SIZE: { /* H5Dget_chunk_storage_size */
430 hsize_t *offset = HDva_arg(arguments, hsize_t *);
431 hsize_t *chunk_nbytes = HDva_arg(arguments, hsize_t *);
432
433 /* Make sure the dataset is chunked */
434 if (H5D_CHUNKED != dset->shared->layout.type)
435 HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a chunked dataset")
436
437 /* Call private function */
438 if (H5D__get_chunk_storage_size(dset, offset, chunk_nbytes) < 0)
439 HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get storage size of chunk")
440
441 break;
442 }
443
444 case H5VL_NATIVE_DATASET_GET_NUM_CHUNKS: { /* H5Dget_num_chunks */
445 const H5S_t *space = NULL;
446 hid_t space_id = HDva_arg(arguments, hid_t);
447 hsize_t * nchunks = HDva_arg(arguments, hsize_t *);
448
449 HDassert(dset->shared);
450 HDassert(dset->shared->space);
451
452 /* When default dataspace is given, use the dataset's dataspace */
453 if (space_id == H5S_ALL)
454 space = dset->shared->space;
455 else /* otherwise, use the given space ID */
456 if (NULL == (space = (const H5S_t *)H5I_object_verify(space_id, H5I_DATASPACE)))
457 HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a valid dataspace ID")
458
459 /* Make sure the dataset is chunked */
460 if (H5D_CHUNKED != dset->shared->layout.type)
461 HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a chunked dataset")
462
463 /* Call private function */
464 if (H5D__get_num_chunks(dset, space, nchunks) < 0)
465 HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get number of chunks")
466
467 break;
468 }
469
470 case H5VL_NATIVE_DATASET_GET_CHUNK_INFO_BY_IDX: { /* H5Dget_chunk_info */
471 const H5S_t *space = NULL;
472 hid_t space_id = HDva_arg(arguments, hid_t);
473 hsize_t chk_index = HDva_arg(arguments, hsize_t);
474 hsize_t * offset = HDva_arg(arguments, hsize_t *);
475 unsigned * filter_mask = HDva_arg(arguments, unsigned *);
476 haddr_t * addr = HDva_arg(arguments, haddr_t *);
477 hsize_t * size = HDva_arg(arguments, hsize_t *);
478
479 HDassert(dset->shared);
480 HDassert(dset->shared->space);
481
482 /* When default dataspace is given, use the dataset's dataspace */
483 if (space_id == H5S_ALL)
484 space = dset->shared->space;
485 else /* otherwise, use the given space ID */
486 if (NULL == (space = (const H5S_t *)H5I_object_verify(space_id, H5I_DATASPACE)))
487 HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a valid dataspace ID")
488
489 /* Make sure the dataset is chunked */
490 if (H5D_CHUNKED != dset->shared->layout.type)
491 HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a chunked dataset")
492
493 /* Call private function */
494 if (H5D__get_chunk_info(dset, space, chk_index, offset, filter_mask, addr, size) < 0)
495 HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get chunk info by index")
496 break;
497 }
498
499 case H5VL_NATIVE_DATASET_GET_CHUNK_INFO_BY_COORD: { /* H5Dget_chunk_info_by_coord */
500 hsize_t * offset = HDva_arg(arguments, hsize_t *);
501 unsigned *filter_mask = HDva_arg(arguments, unsigned *);
502 haddr_t * addr = HDva_arg(arguments, haddr_t *);
503 hsize_t * size = HDva_arg(arguments, hsize_t *);
504
505 HDassert(dset->shared);
506
507 /* Make sure the dataset is chunked */
508 if (H5D_CHUNKED != dset->shared->layout.type)
509 HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a chunked dataset")
510
511 /* Call private function */
512 if (H5D__get_chunk_info_by_coord(dset, offset, filter_mask, addr, size) < 0)
513 HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get chunk info by its logical coordinates")
514
515 break;
516 }
517
518 case H5VL_NATIVE_DATASET_CHUNK_READ: { /* H5Dread_chunk */
519 const hsize_t *offset = HDva_arg(arguments, hsize_t *);
520 uint32_t * filters = HDva_arg(arguments, uint32_t *);
521 void * buf = HDva_arg(arguments, void *);
522 hsize_t offset_copy[H5O_LAYOUT_NDIMS]; /* Internal copy of chunk offset */
523
524 /* Check arguments */
525 if (NULL == dset->oloc.file)
526 HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "dataset is not associated with a file")
527 if (H5D_CHUNKED != dset->shared->layout.type)
528 HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a chunked dataset")
529
530 /* Copy the user's offset array so we can be sure it's terminated properly.
531 * (we don't want to mess with the user's buffer).
532 */
533 if (H5D__get_offset_copy(dset, offset, offset_copy) < 0)
534 HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "failure to copy offset array")
535
536 /* Read the raw chunk */
537 if (H5D__chunk_direct_read(dset, offset_copy, filters, buf) < 0)
538 HGOTO_ERROR(H5E_DATASET, H5E_READERROR, FAIL, "can't read unprocessed chunk data")
539
540 break;
541 }
542
543 case H5VL_NATIVE_DATASET_CHUNK_WRITE: { /* H5Dwrite_chunk */
544 uint32_t filters = HDva_arg(arguments, uint32_t);
545 const hsize_t *offset = HDva_arg(arguments, const hsize_t *);
546 uint32_t data_size_32 = HDva_arg(arguments, uint32_t);
547 const void * buf = HDva_arg(arguments, const void *);
548 hsize_t offset_copy[H5O_LAYOUT_NDIMS]; /* Internal copy of chunk offset */
549
550 /* Check arguments */
551 if (NULL == dset->oloc.file)
552 HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "dataset is not associated with a file")
553 if (H5D_CHUNKED != dset->shared->layout.type)
554 HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a chunked dataset")
555
556 /* Copy the user's offset array so we can be sure it's terminated properly.
557 * (we don't want to mess with the user's buffer).
558 */
559 if (H5D__get_offset_copy(dset, offset, offset_copy) < 0)
560 HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "failure to copy offset array")
561
562 /* Write chunk */
563 if (H5D__chunk_direct_write(dset, filters, offset_copy, data_size_32, buf) < 0)
564 HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "can't write unprocessed chunk data")
565
566 break;
567 }
568
569 case H5VL_NATIVE_DATASET_GET_VLEN_BUF_SIZE: { /* H5Dvlen_get_buf_size */
570 hid_t type_id = HDva_arg(arguments, hid_t);
571 hid_t space_id = HDva_arg(arguments, hid_t);
572 hsize_t *size = HDva_arg(arguments, hsize_t *);
573
574 if (H5D__vlen_get_buf_size(dset, type_id, space_id, size) < 0)
575 HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get size of vlen buf needed")
576 break;
577 }
578
579 /* H5Dget_offset */
580 case H5VL_NATIVE_DATASET_GET_OFFSET: {
581 haddr_t *ret = HDva_arg(arguments, haddr_t *);
582
583 /* Set return value */
584 *ret = H5D__get_offset(dset);
585 if (!H5F_addr_defined(*ret))
586 *ret = HADDR_UNDEF;
587 break;
588 }
589
590 default:
591 HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "invalid optional operation")
592 } /* end switch */
593
594 done:
595 FUNC_LEAVE_NOAPI(ret_value)
596 } /* end H5VL__native_dataset_optional() */
597
598 /*-------------------------------------------------------------------------
599 * Function: H5VL__native_dataset_close
600 *
601 * Purpose: Handles the dataset close callback
602 *
603 * Return: Success: SUCCEED
604 * Failure: FAIL (dataset will not be closed)
605 *
606 *-------------------------------------------------------------------------
607 */
608 herr_t
H5VL__native_dataset_close(void * dset,hid_t H5_ATTR_UNUSED dxpl_id,void H5_ATTR_UNUSED ** req)609 H5VL__native_dataset_close(void *dset, hid_t H5_ATTR_UNUSED dxpl_id, void H5_ATTR_UNUSED **req)
610 {
611 herr_t ret_value = SUCCEED; /* Return value */
612
613 FUNC_ENTER_PACKAGE
614
615 if (H5D_close((H5D_t *)dset) < 0)
616 HGOTO_ERROR(H5E_DATASET, H5E_CANTDEC, FAIL, "can't close dataset")
617
618 done:
619 FUNC_LEAVE_NOAPI(ret_value)
620 } /* end H5VL__native_dataset_close() */
621