netcdf-c/libnczarr/zinternal.h
Dennis Heimbigner d85bb6fe20 The big change for this commit is complete the
disengagement of enable-netcdf4 from enable-hdf5.
That is, with the advent of nczarr, it is possible
to turn off hdf5 but still need netcdf-4 enabled
because nczarr uses libsrc4, but not libhdf5.
This change involves a bunch of things:
1. Modify configure.ac and CMakelist to make enable_hdf5
   control if hdf5 support is provided. For back compatibility,
   disable-netcdf4 is treated as disable-hdf5. But internally,
   netcdf4 support is controlled only by the enabling of formats
   that require it.
2. In support of #1, modify .travis.yml to use enable/disable-hdf5
   instead of enable/disable-netcdf4.
3. test_common.in is modified to track selected features,
   including enable-hdf5 and enable-s3-tests. This is used in
   selected tests that mix netcdf-3 and netcdf4 tests.
4. The conflation of USE_HDF5 and USE_NETCDF4 is common in
   code, tests, and build files, so all of those had to be weeded out.
5. It turns out that some of the NC4_dim functions really are HDF5 specific,
   but are not treated as such. So they are moved from nc4dim.c to
   hdf5dim.c or hdf5dispatch.c
6. Some generic functions in libhdf5 can be (and were) moved to libsrc4.
2020-08-12 15:42:50 -06:00

218 lines
6.2 KiB
C

/* Copyright 2018-2018 University Corporation for Atmospheric
Research/Unidata. */
/**
* @file This header file contains macros, types, and prototypes for
* the ZARR code in libzarr. This header should not be included in
* code outside libzarr.
*
* @author Dennis Heimbigner, Ed Hartnett
*/
#ifndef ZINTERNAL_H
#define ZINTERNAL_H
#define ZARRVERSION 2
/* NCZARRVERSION is ndependent of Zarr version,
but NCZARRVERSION => ZARRVERSION */
#define NCZARRVERSION "1.0.0"
/* These have to do with creating chuncked datasets in ZARR. */
#define NCZ_CHUNKSIZE_FACTOR (10)
#define NCZ_MIN_CHUNK_SIZE (2)
/* An attribute in the ZARR root group of this name means that the
* file must follow strict netCDF classic format rules. */
#define NCZ_NC3_STRICT_ATT_NAME "_nc3_strict"
/** Define Filter API Operations */
#define NCZ_FILTER_REG 1
#define NCZ_FILTER_UNREG 2
#define NCZ_FILTER_INQ 3
/**************************************************/
/* Constants */
#define RCFILEENV "DAPRCFILE"
/* Figure out a usable max path name max */
#ifdef PATH_MAX /* *nix* */
#define NC_MAX_PATH PATH_MAX
#else
# ifdef MAX_PATH /*windows*/
# define NC_MAX_PATH MAX_PATH
# else
# define NC_MAX_PATH 4096
# endif
#endif
#define NCZMETAROOT "/.nczarr"
#define NCZGROUP ".nczgroup"
#define NCZVAR ".nczvar"
#define NCZATTR ".nczattr"
#define ZGROUP ".zgroup"
#define ZATTRS ".zattrs"
#define ZARRAY ".zarray"
#define PUREZARR "zarr"
/**************************************************/
/* Forward */
struct NCjson;
struct NCauth;
struct NCZMAP;
struct NCZChunkCache;
/**************************************************/
/* Define annotation data for NCZ objects */
/* Common fields for all annotations */
typedef struct NCZcommon {
NC_FILE_INFO_T* file; /* root of the dataset tree */
} NCZcommon;
/** Struct to hold ZARR-specific info for the file. */
typedef struct NCZ_FILE_INFO {
NCZcommon common;
struct NCZMAP* map; /* implementation */
struct NCauth* auth;
struct nczarr {
int zarr_version;
struct {
unsigned long major;
unsigned long minor;
unsigned long release;
} nczarr_version;
} zarr;
int created; /* 1=> created 0=>open */
int native_endianness; /* NC_ENDIAN_LITTLE | NC_ENDIAN_BIG */
char** controls; /* Envv format */
struct Features {
size64_t flags;
# define FLAG_PUREZARR 1
# define FLAG_SHOWFETCH 2
# define FLAG_LOGGING 4
# define FLAG_BYTERANGE 8
NCZM_IMPL mapimpl;
} features;
} NCZ_FILE_INFO_T;
/* This is a struct to handle the dim metadata. */
typedef struct NCZ_DIM_INFO {
NCZcommon common;
} NCZ_DIM_INFO_T;
/** Strut to hold ZARR-specific info for attributes. */
typedef struct NCZ_ATT_INFO {
NCZcommon common;
} NCZ_ATT_INFO_T;
/* Struct to hold ZARR-specific info for a group. */
typedef struct NCZ_GRP_INFO {
NCZcommon common;
#if 0
/* The jcontent field stores the following:
1. List of (name,length) for dims in the group
2. List of (name,type) for user-defined types in the group
3. List of var names in the group
4. List of subgroups names in the group
*/
NClist* dims;
NClist* types; /* currently not used */
NClist* vars;
NClist* grps;
#endif
} NCZ_GRP_INFO_T;
/* Struct to hold ZARR-specific info for a variable. */
typedef struct NCZ_VAR_INFO {
NCZcommon common;
size64_t chunkproduct; /* product of chunksizes */
int order; /* 1=>column major, 0=>row major (default); not currently enforced */
struct NCZChunkCache* cache;
/* Following are duplicates of NC_VAR_INFO_T equivalents */
size_t chunk_cache_nelems; /**< Number of slots in var chunk cache. */
} NCZ_VAR_INFO_T;
/* Struct to hold ZARR-specific info for a field. */
typedef struct NCZ_FIELD_INFO {
NCZcommon common;
} NCZ_FIELD_INFO_T;
/* Struct to hold ZARR-specific info for a type. */
typedef struct NCZ_TYPE_INFO {
NCZcommon common;
} NCZ_TYPE_INFO_T;
#if 0
/* Define the contents of the .nczcontent object */
/* The .nczcontent field stores the following:
1. List of (name,length) for dims in the group
2. List of (name,type) for user-defined types in the group
3. List of var names in the group
4. List of subgroups names in the group
*/
typedef struct NCZCONTENT{
NClist* dims;
NClist* types; /* currently not used */
NClist* vars;
NClist* grps;
} NCZCONTENT;
#endif
/**************************************************/
extern int ncz_initialized; /**< True if initialization has happened. */
/* Forward */
struct NC_FILTER_INFO;
/* zinternal.c */
int NCZ_initialize(void);
int NCZ_finalize(void);
int NCZ_initialize_internal(void);
int NCZ_finalize_internal(void);
int ncz_get_fill_value(NC_FILE_INFO_T* file, NC_VAR_INFO_T* var, void **fillp);
int ncz_find_grp_var_att(int ncid, int varid, const char *name, int attnum,
int use_name, char *norm_name, NC_FILE_INFO_T** file,
NC_GRP_INFO_T** grp, NC_VAR_INFO_T** var,
NC_ATT_INFO_T** att);
int NCZ_set_log_level();
/* zcache.c */
int ncz_adjust_var_cache(NC_GRP_INFO_T* grp, NC_VAR_INFO_T* var);
int NCZ_set_var_chunk_cache(int ncid, int varid, size_t size, size_t nelems, float preemption);
/* zfile.c */
int ncz_enddef_netcdf4_file(NC_FILE_INFO_T*);
int ncz_closeorabort(NC_FILE_INFO_T*, void* params, int abort);
/* zclose.c */
int ncz_close_ncz_file(NC_FILE_INFO_T* file, int abort);
/* zattr.c */
int ncz_getattlist(NC_GRP_INFO_T *grp, int varid, NC_VAR_INFO_T **varp, NCindex **attlist);
int ncz_create_fillvalue(NC_VAR_INFO_T* var);
int ncz_makeattr(NC_OBJ*, NCindex* attlist, const char* name, nc_type typid, size_t len, void* values, NC_ATT_INFO_T**);
/* zvar.c */
int ncz_gettype(NC_FILE_INFO_T*, NC_GRP_INFO_T*, int xtype, NC_TYPE_INFO_T** typep);
int ncz_find_default_chunksizes2(NC_GRP_INFO_T *grp, NC_VAR_INFO_T *var);
/* zfilter.c */
int NCZ_filter_actions(int ncid, int varid, int op, void* args);
#ifdef ENABLE_CLIENTSIDE_FILTERS
int NCZ_global_filter_action(int op, unsigned int id, NC_FILTER_OBJ_HDF5* infop);
#endif
/* Undefined */
/* Find var, doing lazy var metadata read if needed. */
int ncz_find_grp_file_var(int ncid, int varid, NC_FILE_INFO_T** file,
NC_GRP_INFO_T** grp, NC_VAR_INFO_T** var);
#endif /* ZINTERNAL_H */