Coverage Report

Created: 2026-01-16 06:15

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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() */