/src/hdf5/src/H5VLnative_object.c
Line | Count | Source |
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 LICENSE 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: Object callbacks for the native VOL connector |
15 | | * |
16 | | */ |
17 | | |
18 | | /****************/ |
19 | | /* Module Setup */ |
20 | | /****************/ |
21 | | |
22 | | #define H5F_FRIEND /* Suppress error about including H5Fpkg */ |
23 | | #define H5O_FRIEND /* Suppress error about including H5Opkg */ |
24 | | |
25 | | /***********/ |
26 | | /* Headers */ |
27 | | /***********/ |
28 | | #include "H5private.h" /* Generic Functions */ |
29 | | #include "H5Eprivate.h" /* Error handling */ |
30 | | #include "H5Fpkg.h" /* Files (pkg needed for id_exists) */ |
31 | | #include "H5Gprivate.h" /* Groups */ |
32 | | #include "H5Iprivate.h" /* IDs */ |
33 | | #include "H5Opkg.h" /* Object headers */ |
34 | | #include "H5VLprivate.h" /* Virtual Object Layer */ |
35 | | |
36 | | #include "H5VLnative_private.h" /* Native VOL connector */ |
37 | | |
38 | | /****************/ |
39 | | /* Local Macros */ |
40 | | /****************/ |
41 | | |
42 | | /******************/ |
43 | | /* Local Typedefs */ |
44 | | /******************/ |
45 | | |
46 | | /********************/ |
47 | | /* Local Prototypes */ |
48 | | /********************/ |
49 | | |
50 | | /*********************/ |
51 | | /* Package Variables */ |
52 | | /*********************/ |
53 | | |
54 | | /*****************************/ |
55 | | /* Library Private Variables */ |
56 | | /*****************************/ |
57 | | |
58 | | /*******************/ |
59 | | /* Local Variables */ |
60 | | /*******************/ |
61 | | |
62 | | /*------------------------------------------------------------------------- |
63 | | * Function: H5VL__native_object_open |
64 | | * |
65 | | * Purpose: Handles the object open callback |
66 | | * |
67 | | * Return: Success: object pointer |
68 | | * Failure: NULL |
69 | | * |
70 | | *------------------------------------------------------------------------- |
71 | | */ |
72 | | void * |
73 | | H5VL__native_object_open(void *obj, const H5VL_loc_params_t *loc_params, H5I_type_t *opened_type, |
74 | | hid_t H5_ATTR_UNUSED dxpl_id, void H5_ATTR_UNUSED **req) |
75 | 0 | { |
76 | 0 | H5G_loc_t loc; |
77 | 0 | void *ret_value = NULL; |
78 | |
|
79 | 0 | FUNC_ENTER_PACKAGE |
80 | |
|
81 | 0 | if (H5G_loc_real(obj, loc_params->obj_type, &loc) < 0) |
82 | 0 | HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a file or file object"); |
83 | | |
84 | 0 | switch (loc_params->type) { |
85 | 0 | case H5VL_OBJECT_BY_NAME: { |
86 | | /* Open the object */ |
87 | 0 | if (NULL == (ret_value = H5O_open_name(&loc, loc_params->loc_data.loc_by_name.name, opened_type))) |
88 | 0 | HGOTO_ERROR(H5E_OHDR, H5E_CANTOPENOBJ, NULL, "unable to open object by name"); |
89 | 0 | break; |
90 | 0 | } |
91 | | |
92 | 0 | case H5VL_OBJECT_BY_IDX: { |
93 | | /* Open the object */ |
94 | 0 | if (NULL == (ret_value = H5O__open_by_idx(&loc, loc_params->loc_data.loc_by_idx.name, |
95 | 0 | loc_params->loc_data.loc_by_idx.idx_type, |
96 | 0 | loc_params->loc_data.loc_by_idx.order, |
97 | 0 | loc_params->loc_data.loc_by_idx.n, opened_type))) |
98 | 0 | HGOTO_ERROR(H5E_OHDR, H5E_CANTOPENOBJ, NULL, "unable to open object by index"); |
99 | 0 | break; |
100 | 0 | } |
101 | | |
102 | 0 | case H5VL_OBJECT_BY_TOKEN: { |
103 | 0 | H5O_token_t token = *loc_params->loc_data.loc_by_token.token; |
104 | 0 | haddr_t addr; |
105 | | |
106 | | /* Decode token */ |
107 | 0 | if (H5VL_native_token_to_addr(loc.oloc->file, H5I_FILE, token, &addr) < 0) |
108 | 0 | HGOTO_ERROR(H5E_OHDR, H5E_CANTUNSERIALIZE, NULL, |
109 | 0 | "can't deserialize object token into address"); |
110 | | |
111 | | /* Open the object */ |
112 | 0 | if (NULL == (ret_value = H5O__open_by_addr(&loc, addr, opened_type))) |
113 | 0 | HGOTO_ERROR(H5E_OHDR, H5E_CANTOPENOBJ, NULL, "unable to open object by address"); |
114 | 0 | break; |
115 | 0 | } |
116 | | |
117 | 0 | case H5VL_OBJECT_BY_SELF: |
118 | 0 | default: |
119 | 0 | HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, NULL, "unknown open parameters"); |
120 | 0 | } /* end switch */ |
121 | | |
122 | 0 | done: |
123 | 0 | FUNC_LEAVE_NOAPI(ret_value) |
124 | 0 | } /* end H5VL__native_object_open() */ |
125 | | |
126 | | /*------------------------------------------------------------------------- |
127 | | * Function: H5VL__native_object_copy |
128 | | * |
129 | | * Purpose: Handles the object copy callback |
130 | | * |
131 | | * Return: SUCCEED/FAIL |
132 | | * |
133 | | *------------------------------------------------------------------------- |
134 | | */ |
135 | | herr_t |
136 | | H5VL__native_object_copy(void *src_obj, const H5VL_loc_params_t *loc_params1, const char *src_name, |
137 | | void *dst_obj, const H5VL_loc_params_t *loc_params2, const char *dst_name, |
138 | | hid_t ocpypl_id, hid_t lcpl_id, hid_t H5_ATTR_UNUSED dxpl_id, |
139 | | void H5_ATTR_UNUSED **req) |
140 | 0 | { |
141 | 0 | H5G_loc_t src_loc; /* Source object group location */ |
142 | 0 | H5G_loc_t dst_loc; /* Destination group location */ |
143 | 0 | herr_t ret_value = FAIL; |
144 | |
|
145 | 0 | FUNC_ENTER_PACKAGE |
146 | | |
147 | | /* get location for objects */ |
148 | 0 | if (H5G_loc_real(src_obj, loc_params1->obj_type, &src_loc) < 0) |
149 | 0 | HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file or file object"); |
150 | 0 | if (H5G_loc_real(dst_obj, loc_params2->obj_type, &dst_loc) < 0) |
151 | 0 | HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file or file object"); |
152 | | |
153 | | /* Copy the object */ |
154 | 0 | if ((ret_value = H5O__copy(&src_loc, src_name, &dst_loc, dst_name, ocpypl_id, lcpl_id)) < 0) |
155 | 0 | HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, FAIL, "unable to copy object"); |
156 | | |
157 | 0 | done: |
158 | 0 | FUNC_LEAVE_NOAPI(ret_value) |
159 | 0 | } /* end H5VL__native_object_copy() */ |
160 | | |
161 | | /*------------------------------------------------------------------------- |
162 | | * Function: H5VL__native_object_get |
163 | | * |
164 | | * Purpose: Handles the object get callback |
165 | | * |
166 | | * Return: SUCCEED/FAIL |
167 | | * |
168 | | *------------------------------------------------------------------------- |
169 | | */ |
170 | | herr_t |
171 | | H5VL__native_object_get(void *obj, const H5VL_loc_params_t *loc_params, H5VL_object_get_args_t *args, |
172 | | hid_t H5_ATTR_UNUSED dxpl_id, void H5_ATTR_UNUSED **req) |
173 | 0 | { |
174 | 0 | herr_t ret_value = SUCCEED; /* Return value */ |
175 | 0 | H5G_loc_t loc; /* Location of group */ |
176 | |
|
177 | 0 | FUNC_ENTER_PACKAGE |
178 | |
|
179 | 0 | if (H5G_loc_real(obj, loc_params->obj_type, &loc) < 0) |
180 | 0 | HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file or file object"); |
181 | | |
182 | 0 | switch (args->op_type) { |
183 | | |
184 | | /* Object file */ |
185 | 0 | case H5VL_OBJECT_GET_FILE: { |
186 | 0 | if (loc_params->type == H5VL_OBJECT_BY_SELF) { |
187 | 0 | *args->args.get_file.file = (void *)loc.oloc->file; |
188 | | |
189 | | /* TODO we currently need to set id_exists to true because |
190 | | * the upper layer will create an ID from the returned |
191 | | * object. In theory this should not be needed and id_exists |
192 | | * should be removed once the H5Fmount code gets fixed. */ |
193 | 0 | loc.oloc->file->id_exists = true; |
194 | 0 | } |
195 | 0 | else |
196 | 0 | HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "unknown get_file parameters"); |
197 | | |
198 | 0 | break; |
199 | 0 | } |
200 | | |
201 | | /* Object name */ |
202 | 0 | case H5VL_OBJECT_GET_NAME: { |
203 | 0 | if (loc_params->type == H5VL_OBJECT_BY_SELF) { |
204 | | /* Retrieve object's name */ |
205 | 0 | if (H5G_get_name(&loc, args->args.get_name.buf, args->args.get_name.buf_size, |
206 | 0 | args->args.get_name.name_len, NULL) < 0) |
207 | 0 | HGOTO_ERROR(H5E_VOL, H5E_CANTGET, FAIL, "can't retrieve object name"); |
208 | 0 | } /* end if */ |
209 | 0 | else if (loc_params->type == H5VL_OBJECT_BY_TOKEN) { |
210 | 0 | H5O_loc_t obj_oloc; /* Object location */ |
211 | 0 | H5O_token_t token = *loc_params->loc_data.loc_by_token.token; |
212 | | |
213 | | /* Initialize the object location */ |
214 | 0 | H5O_loc_reset(&obj_oloc); |
215 | 0 | obj_oloc.file = loc.oloc->file; |
216 | | |
217 | | /* Decode token */ |
218 | 0 | if (H5VL_native_token_to_addr(obj_oloc.file, H5I_FILE, token, &obj_oloc.addr) < 0) |
219 | 0 | HGOTO_ERROR(H5E_OHDR, H5E_CANTUNSERIALIZE, FAIL, |
220 | 0 | "can't deserialize object token into address"); |
221 | | |
222 | | /* Retrieve object's name */ |
223 | 0 | if (H5G_get_name_by_addr(loc.oloc->file, &obj_oloc, args->args.get_name.buf, |
224 | 0 | args->args.get_name.buf_size, args->args.get_name.name_len) < 0) |
225 | 0 | HGOTO_ERROR(H5E_VOL, H5E_CANTGET, FAIL, "can't determine object name"); |
226 | 0 | } /* end else-if */ |
227 | 0 | else |
228 | 0 | HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "unknown get_name parameters"); |
229 | | |
230 | 0 | break; |
231 | 0 | } |
232 | | |
233 | | /* Object type */ |
234 | 0 | case H5VL_OBJECT_GET_TYPE: { |
235 | 0 | if (loc_params->type == H5VL_OBJECT_BY_TOKEN) { |
236 | 0 | H5O_loc_t obj_oloc; /* Object location */ |
237 | 0 | unsigned rc; /* Reference count of object */ |
238 | 0 | H5O_token_t token = *loc_params->loc_data.loc_by_token.token; |
239 | | |
240 | | /* Initialize the object location */ |
241 | 0 | H5O_loc_reset(&obj_oloc); |
242 | 0 | obj_oloc.file = loc.oloc->file; |
243 | | |
244 | | /* Decode token */ |
245 | 0 | if (H5VL_native_token_to_addr(obj_oloc.file, H5I_FILE, token, &obj_oloc.addr) < 0) |
246 | 0 | HGOTO_ERROR(H5E_OHDR, H5E_CANTUNSERIALIZE, FAIL, |
247 | 0 | "can't deserialize object token into address"); |
248 | | |
249 | | /* Get the # of links for object, and its type */ |
250 | | /* (To check to make certain that this object hasn't been deleted) */ |
251 | 0 | if (H5O_get_rc_and_type(&obj_oloc, &rc, args->args.get_type.obj_type) < 0 || 0 == rc) |
252 | 0 | HGOTO_ERROR(H5E_REFERENCE, H5E_LINKCOUNT, FAIL, "dereferencing deleted object"); |
253 | 0 | } |
254 | 0 | else |
255 | 0 | HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "unknown get_type parameters"); |
256 | | |
257 | 0 | break; |
258 | 0 | } |
259 | | |
260 | | /* H5Oget_info(_name|_by_idx)3 */ |
261 | 0 | case H5VL_OBJECT_GET_INFO: { |
262 | 0 | if (loc_params->type == H5VL_OBJECT_BY_SELF) { |
263 | 0 | if (H5G_loc_info(&loc, ".", args->args.get_info.oinfo, args->args.get_info.fields) < 0) |
264 | 0 | HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, FAIL, "object not found"); |
265 | 0 | } /* end if */ |
266 | 0 | else if (loc_params->type == H5VL_OBJECT_BY_NAME) { |
267 | 0 | if (H5G_loc_info(&loc, loc_params->loc_data.loc_by_name.name, args->args.get_info.oinfo, |
268 | 0 | args->args.get_info.fields) < 0) |
269 | 0 | HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, FAIL, "object not found"); |
270 | 0 | } /* end else-if */ |
271 | 0 | else if (loc_params->type == H5VL_OBJECT_BY_IDX) { |
272 | 0 | H5G_loc_t obj_loc; /* Location used to open group */ |
273 | 0 | H5G_name_t obj_path; /* Opened object group hier. path */ |
274 | 0 | H5O_loc_t obj_oloc; /* Opened object object location */ |
275 | | |
276 | | /* Set up opened group location to fill in */ |
277 | 0 | obj_loc.oloc = &obj_oloc; |
278 | 0 | obj_loc.path = &obj_path; |
279 | 0 | H5G_loc_reset(&obj_loc); |
280 | | |
281 | | /* Find the object's location, according to the order in the index */ |
282 | 0 | if (H5G_loc_find_by_idx(&loc, loc_params->loc_data.loc_by_idx.name, |
283 | 0 | loc_params->loc_data.loc_by_idx.idx_type, |
284 | 0 | loc_params->loc_data.loc_by_idx.order, |
285 | 0 | loc_params->loc_data.loc_by_idx.n, &obj_loc /*out*/) < 0) |
286 | 0 | HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, FAIL, "group not found"); |
287 | | |
288 | | /* Retrieve the object's information */ |
289 | 0 | if (H5O_get_info(obj_loc.oloc, args->args.get_info.oinfo, args->args.get_info.fields) < 0) { |
290 | 0 | H5G_loc_free(&obj_loc); |
291 | 0 | HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "can't retrieve object info"); |
292 | 0 | } /* end if */ |
293 | | |
294 | | /* Release the object location */ |
295 | 0 | if (H5G_loc_free(&obj_loc) < 0) |
296 | 0 | HGOTO_ERROR(H5E_OHDR, H5E_CANTRELEASE, FAIL, "can't free location"); |
297 | 0 | } /* end else-if */ |
298 | 0 | else |
299 | 0 | HGOTO_ERROR(H5E_OHDR, H5E_UNSUPPORTED, FAIL, "unknown get info parameters"); |
300 | | |
301 | 0 | break; |
302 | 0 | } |
303 | | |
304 | 0 | default: |
305 | 0 | HGOTO_ERROR(H5E_VOL, H5E_CANTGET, FAIL, "can't get this type of information from object"); |
306 | 0 | } /* end switch */ |
307 | | |
308 | 0 | done: |
309 | 0 | FUNC_LEAVE_NOAPI(ret_value) |
310 | 0 | } /* end H5VL__native_object_get() */ |
311 | | |
312 | | /*------------------------------------------------------------------------- |
313 | | * Function: H5VL__native_object_specific |
314 | | * |
315 | | * Purpose: Handles the object specific callback |
316 | | * |
317 | | * Return: SUCCEED/FAIL |
318 | | * |
319 | | *------------------------------------------------------------------------- |
320 | | */ |
321 | | herr_t |
322 | | H5VL__native_object_specific(void *obj, const H5VL_loc_params_t *loc_params, |
323 | | H5VL_object_specific_args_t *args, hid_t H5_ATTR_UNUSED dxpl_id, |
324 | | void H5_ATTR_UNUSED **req) |
325 | 0 | { |
326 | 0 | H5G_loc_t loc; |
327 | 0 | herr_t ret_value = SUCCEED; /* Return value */ |
328 | |
|
329 | 0 | FUNC_ENTER_PACKAGE |
330 | |
|
331 | 0 | if (H5G_loc_real(obj, loc_params->obj_type, &loc) < 0) |
332 | 0 | HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file or file object"); |
333 | | |
334 | 0 | switch (args->op_type) { |
335 | | /* H5Oincr_refcount / H5Odecr_refcount */ |
336 | 0 | case H5VL_OBJECT_CHANGE_REF_COUNT: { |
337 | 0 | if (H5O_link(loc.oloc, args->args.change_rc.delta) < 0) |
338 | 0 | HGOTO_ERROR(H5E_OHDR, H5E_LINKCOUNT, FAIL, "modifying object link count failed"); |
339 | | |
340 | 0 | break; |
341 | 0 | } |
342 | | |
343 | | /* H5Oexists_by_name */ |
344 | 0 | case H5VL_OBJECT_EXISTS: { |
345 | 0 | if (loc_params->type == H5VL_OBJECT_BY_NAME) { |
346 | | /* Check if the object exists */ |
347 | 0 | if (H5G_loc_exists(&loc, loc_params->loc_data.loc_by_name.name, args->args.exists.exists) < 0) |
348 | 0 | HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "unable to determine if '%s' exists", |
349 | 0 | loc_params->loc_data.loc_by_name.name); |
350 | 0 | } /* end if */ |
351 | 0 | else |
352 | 0 | HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "unknown object exists parameters"); |
353 | | |
354 | 0 | break; |
355 | 0 | } |
356 | | |
357 | | /* Lookup object */ |
358 | 0 | case H5VL_OBJECT_LOOKUP: { |
359 | 0 | if (loc_params->type == H5VL_OBJECT_BY_NAME) { |
360 | 0 | H5G_loc_t obj_loc; /* Group hier. location of object */ |
361 | 0 | H5G_name_t obj_path; /* Object group hier. path */ |
362 | 0 | H5O_loc_t obj_oloc; /* Object object location */ |
363 | | |
364 | | /* Set up opened group location to fill in */ |
365 | 0 | obj_loc.oloc = &obj_oloc; |
366 | 0 | obj_loc.path = &obj_path; |
367 | 0 | H5G_loc_reset(&obj_loc); |
368 | | |
369 | | /* Find the object */ |
370 | 0 | if (H5G_loc_find(&loc, loc_params->loc_data.loc_by_name.name, &obj_loc) < 0) |
371 | 0 | HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, FAIL, "object not found"); |
372 | | |
373 | | /* Encode token */ |
374 | 0 | if (H5VL_native_addr_to_token(loc.oloc->file, H5I_FILE, obj_loc.oloc->addr, |
375 | 0 | args->args.lookup.token_ptr) < 0) |
376 | 0 | HGOTO_ERROR(H5E_OHDR, H5E_CANTSERIALIZE, FAIL, |
377 | 0 | "can't serialize address into object token"); |
378 | | |
379 | | /* Release the object location */ |
380 | 0 | if (H5G_loc_free(&obj_loc) < 0) |
381 | 0 | HGOTO_ERROR(H5E_OHDR, H5E_CANTRELEASE, FAIL, "can't free location"); |
382 | 0 | } /* end if */ |
383 | 0 | else |
384 | 0 | HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "unknown object exists parameters"); |
385 | 0 | break; |
386 | 0 | } |
387 | | |
388 | | /* H5Ovisit/H5Ovisit_by_name */ |
389 | 0 | case H5VL_OBJECT_VISIT: { |
390 | 0 | H5VL_object_visit_args_t *visit_args = &args->args.visit; |
391 | | |
392 | | /* Call internal object visitation routine */ |
393 | 0 | if (loc_params->type == H5VL_OBJECT_BY_SELF) { |
394 | 0 | if ((ret_value = H5O__visit(&loc, ".", visit_args->idx_type, visit_args->order, |
395 | 0 | visit_args->op, visit_args->op_data, visit_args->fields)) < 0) |
396 | 0 | HGOTO_ERROR(H5E_OHDR, H5E_BADITER, FAIL, "object visitation failed"); |
397 | 0 | } /* end if */ |
398 | 0 | else if (loc_params->type == H5VL_OBJECT_BY_NAME) { |
399 | 0 | if ((ret_value = H5O__visit(&loc, loc_params->loc_data.loc_by_name.name, visit_args->idx_type, |
400 | 0 | visit_args->order, visit_args->op, visit_args->op_data, |
401 | 0 | visit_args->fields)) < 0) |
402 | 0 | HGOTO_ERROR(H5E_OHDR, H5E_BADITER, FAIL, "object visitation failed"); |
403 | 0 | } /* end else-if */ |
404 | 0 | else |
405 | 0 | HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "unknown object visit params"); |
406 | | |
407 | 0 | break; |
408 | 0 | } |
409 | | |
410 | 0 | case H5VL_OBJECT_FLUSH: { |
411 | | /* Flush the object's metadata */ |
412 | 0 | if (H5O_flush(loc.oloc, args->args.flush.obj_id) < 0) |
413 | 0 | HGOTO_ERROR(H5E_OHDR, H5E_CANTFLUSH, FAIL, "unable to flush object"); |
414 | | |
415 | 0 | break; |
416 | 0 | } |
417 | | |
418 | 0 | case H5VL_OBJECT_REFRESH: { |
419 | | /* Refresh the metadata */ |
420 | 0 | if (H5O_refresh_metadata(loc.oloc, args->args.refresh.obj_id) < 0) |
421 | 0 | HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, FAIL, "unable to refresh object"); |
422 | | |
423 | 0 | break; |
424 | 0 | } |
425 | | |
426 | 0 | default: |
427 | 0 | HGOTO_ERROR(H5E_VOL, H5E_CANTGET, FAIL, "can't recognize this operation type"); |
428 | 0 | } /* end switch */ |
429 | | |
430 | 0 | done: |
431 | 0 | FUNC_LEAVE_NOAPI(ret_value) |
432 | 0 | } /* end H5VL__native_object_specific() */ |
433 | | |
434 | | /*------------------------------------------------------------------------- |
435 | | * Function: H5VL__native_object_optional |
436 | | * |
437 | | * Purpose: Handles the object optional callback |
438 | | * |
439 | | * Return: SUCCEED/FAIL |
440 | | * |
441 | | *------------------------------------------------------------------------- |
442 | | */ |
443 | | herr_t |
444 | | H5VL__native_object_optional(void *obj, const H5VL_loc_params_t *loc_params, H5VL_optional_args_t *args, |
445 | | hid_t H5_ATTR_UNUSED dxpl_id, void H5_ATTR_UNUSED **req) |
446 | 0 | { |
447 | 0 | H5G_loc_t loc; /* Location of group */ |
448 | 0 | H5VL_native_object_optional_args_t *opt_args = args->args; /* Pointer to native operation's arguments */ |
449 | 0 | herr_t ret_value = SUCCEED; /* Return value */ |
450 | |
|
451 | 0 | FUNC_ENTER_PACKAGE |
452 | |
|
453 | 0 | if (H5G_loc_real(obj, loc_params->obj_type, &loc) < 0) |
454 | 0 | HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file or file object"); |
455 | | |
456 | 0 | switch (args->op_type) { |
457 | | /* H5Oget_comment / H5Oget_comment_by_name */ |
458 | 0 | case H5VL_NATIVE_OBJECT_GET_COMMENT: { |
459 | 0 | H5VL_native_object_get_comment_t *gc_args = &opt_args->get_comment; |
460 | | |
461 | | /* Retrieve the object's comment */ |
462 | 0 | if (loc_params->type == H5VL_OBJECT_BY_SELF) { /* H5Oget_comment */ |
463 | 0 | if (H5G_loc_get_comment(&loc, ".", gc_args->buf, gc_args->buf_size, gc_args->comment_len) < 0) |
464 | 0 | HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "can't get comment for object"); |
465 | 0 | } /* end if */ |
466 | 0 | else if (loc_params->type == H5VL_OBJECT_BY_NAME) { /* H5Oget_comment_by_name */ |
467 | 0 | if (H5G_loc_get_comment(&loc, loc_params->loc_data.loc_by_name.name, gc_args->buf, |
468 | 0 | gc_args->buf_size, gc_args->comment_len) < 0) |
469 | 0 | HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "can't get comment for object"); |
470 | 0 | } /* end else-if */ |
471 | 0 | else |
472 | 0 | HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "unknown set_coment parameters"); |
473 | | |
474 | 0 | break; |
475 | 0 | } |
476 | | |
477 | | /* H5Oset_comment */ |
478 | 0 | case H5VL_NATIVE_OBJECT_SET_COMMENT: { |
479 | 0 | if (loc_params->type == H5VL_OBJECT_BY_SELF) { /* H5Oset_comment */ |
480 | 0 | if (H5G_loc_set_comment(&loc, ".", opt_args->set_comment.comment) < 0) |
481 | 0 | HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, FAIL, "object not found"); |
482 | 0 | } /* end if */ |
483 | 0 | else if (loc_params->type == H5VL_OBJECT_BY_NAME) { /* H5Oset_comment_by_name */ |
484 | 0 | if (H5G_loc_set_comment(&loc, loc_params->loc_data.loc_by_name.name, |
485 | 0 | opt_args->set_comment.comment) < 0) |
486 | 0 | HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, FAIL, "object not found"); |
487 | 0 | } /* end else-if */ |
488 | 0 | else |
489 | 0 | HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "unknown set_coment parameters"); |
490 | | |
491 | 0 | break; |
492 | 0 | } |
493 | | |
494 | | /* H5Odisable_mdc_flushes */ |
495 | 0 | case H5VL_NATIVE_OBJECT_DISABLE_MDC_FLUSHES: { |
496 | 0 | if (H5O__disable_mdc_flushes(loc.oloc) < 0) |
497 | 0 | HGOTO_ERROR(H5E_OHDR, H5E_CANTCORK, FAIL, "unable to cork the metadata cache"); |
498 | | |
499 | 0 | break; |
500 | 0 | } |
501 | | |
502 | | /* H5Oenable_mdc_flushes */ |
503 | 0 | case H5VL_NATIVE_OBJECT_ENABLE_MDC_FLUSHES: { |
504 | 0 | if (H5O__enable_mdc_flushes(loc.oloc) < 0) |
505 | 0 | HGOTO_ERROR(H5E_OHDR, H5E_CANTUNCORK, FAIL, "unable to uncork the metadata cache"); |
506 | | |
507 | 0 | break; |
508 | 0 | } |
509 | | |
510 | | /* H5Oare_mdc_flushes_disabled */ |
511 | 0 | case H5VL_NATIVE_OBJECT_ARE_MDC_FLUSHES_DISABLED: { |
512 | 0 | if (H5O__are_mdc_flushes_disabled(loc.oloc, opt_args->are_mdc_flushes_disabled.flag) < 0) |
513 | 0 | HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "unable to determine metadata cache cork status"); |
514 | | |
515 | 0 | break; |
516 | 0 | } |
517 | | |
518 | | /* H5Oget_native_info(_name|_by_idx) */ |
519 | 0 | case H5VL_NATIVE_OBJECT_GET_NATIVE_INFO: { |
520 | 0 | H5VL_native_object_get_native_info_t *gni_args = &opt_args->get_native_info; |
521 | | |
522 | | /* Use the original H5Oget_info code to get the data */ |
523 | 0 | if (loc_params->type == H5VL_OBJECT_BY_SELF) { |
524 | 0 | if (H5G_loc_native_info(&loc, ".", gni_args->ninfo, gni_args->fields) < 0) |
525 | 0 | HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, FAIL, "object not found"); |
526 | 0 | } /* end if */ |
527 | 0 | else if (loc_params->type == H5VL_OBJECT_BY_NAME) { /* H5Oget_info_by_name */ |
528 | 0 | if (H5G_loc_native_info(&loc, loc_params->loc_data.loc_by_name.name, gni_args->ninfo, |
529 | 0 | gni_args->fields) < 0) |
530 | 0 | HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, FAIL, "object not found"); |
531 | 0 | } /* end else-if */ |
532 | 0 | else if (loc_params->type == H5VL_OBJECT_BY_IDX) { /* H5Oget_info_by_idx */ |
533 | 0 | H5G_loc_t obj_loc; /* Location used to open group */ |
534 | 0 | H5G_name_t obj_path; /* Opened object group hier. path */ |
535 | 0 | H5O_loc_t obj_oloc; /* Opened object object location */ |
536 | | |
537 | | /* Set up opened group location to fill in */ |
538 | 0 | obj_loc.oloc = &obj_oloc; |
539 | 0 | obj_loc.path = &obj_path; |
540 | 0 | H5G_loc_reset(&obj_loc); |
541 | | |
542 | | /* Find the object's location, according to the order in the index */ |
543 | 0 | if (H5G_loc_find_by_idx(&loc, loc_params->loc_data.loc_by_idx.name, |
544 | 0 | loc_params->loc_data.loc_by_idx.idx_type, |
545 | 0 | loc_params->loc_data.loc_by_idx.order, |
546 | 0 | loc_params->loc_data.loc_by_idx.n, &obj_loc /*out*/) < 0) |
547 | 0 | HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, FAIL, "group not found"); |
548 | | |
549 | 0 | if (H5O_get_native_info(obj_loc.oloc, gni_args->ninfo, gni_args->fields) < 0) { |
550 | 0 | H5G_loc_free(&obj_loc); |
551 | 0 | HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "can't retrieve object info"); |
552 | 0 | } /* end if */ |
553 | | |
554 | | /* Release the object location */ |
555 | 0 | if (H5G_loc_free(&obj_loc) < 0) |
556 | 0 | HGOTO_ERROR(H5E_OHDR, H5E_CANTRELEASE, FAIL, "can't free location"); |
557 | 0 | } /* end else-if */ |
558 | 0 | else |
559 | 0 | HGOTO_ERROR(H5E_OHDR, H5E_UNSUPPORTED, FAIL, "unknown get info parameters"); |
560 | | |
561 | 0 | break; |
562 | 0 | } |
563 | | |
564 | 0 | default: |
565 | 0 | HGOTO_ERROR(H5E_VOL, H5E_CANTGET, FAIL, "can't perform this operation on object"); |
566 | 0 | } /* end switch */ |
567 | | |
568 | 0 | done: |
569 | 0 | FUNC_LEAVE_NOAPI(ret_value) |
570 | 0 | } /* end H5VL__native_object_optional() */ |