mirror of
https://github.com/Unidata/netcdf-c.git
synced 2025-02-05 16:20:10 +08:00
59e04ae071
cloud using a variant of the Zarr protocol and storage format. This enhancement is generically referred to as "NCZarr". The data model supported by NCZarr is netcdf-4 minus the user-defined types and the String type. In this sense it is similar to the CDF-5 data model. More detailed information about enabling and using NCZarr is described in the document NUG/nczarr.md and in a [Unidata Developer's blog entry](https://www.unidata.ucar.edu/blogs/developer/en/entry/overview-of-zarr-support-in). WARNING: this code has had limited testing, so do use this version for production work. Also, performance improvements are ongoing. Note especially the following platform matrix of successful tests: Platform | Build System | S3 support ------------------------------------ Linux+gcc | Automake | yes Linux+gcc | CMake | yes Visual Studio | CMake | no Additionally, and as a consequence of the addition of NCZarr, major changes have been made to the Filter API. NOTE: NCZarr does not yet support filters, but these changes are enablers for that support in the future. Note that it is possible (probable?) that there will be some accidental reversions if the changes here did not correctly mimic the existing filter testing. In any case, previously filter ids and parameters were of type unsigned int. In order to support the more general zarr filter model, this was all converted to char*. The old HDF5-specific, unsigned int operations are still supported but they are wrappers around the new, char* based nc_filterx_XXX functions. This entailed at least the following changes: 1. Added the files libdispatch/dfilterx.c and include/ncfilter.h 2. Some filterx utilities have been moved to libdispatch/daux.c 3. A new entry, "filter_actions" was added to the NCDispatch table and the version bumped. 4. An overly complex set of structs was created to support funnelling all of the filterx operations thru a single dispatch "filter_actions" entry. 5. Move common code to from libhdf5 to libsrc4 so that it is accessible to nczarr. Changes directly related to Zarr: 1. Modified CMakeList.txt and configure.ac to support both C and C++ -- this is in support of S3 support via the awd-sdk libraries. 2. Define a size64_t type to support nczarr. 3. More reworking of libdispatch/dinfermodel.c to support zarr and to regularize the structure of the fragments section of a URL. Changes not directly related to Zarr: 1. Make client-side filter registration be conditional, with default off. 2. Hack include/nc4internal.h to make some flags added by Ed be unique: e.g. NC_CREAT, NC_INDEF, etc. 3. cleanup include/nchttp.h and libdispatch/dhttp.c. 4. Misc. changes to support compiling under Visual Studio including: * Better testing under windows for dirent.h and opendir and closedir. 5. Misc. changes to the oc2 code to support various libcurl CURLOPT flags and to centralize error reporting. 6. By default, suppress the vlen tests that have unfixed memory leaks; add option to enable them. 7. Make part of the nc_test/test_byterange.sh test be contingent on remotetest.unidata.ucar.edu being accessible. Changes Left TO-DO: 1. fix provenance code, it is too HDF5 specific.
87 lines
3.1 KiB
C
87 lines
3.1 KiB
C
/* Copyright 2018-2018 University Corporation for Atmospheric
|
|
Research/Unidata. */
|
|
/**
|
|
* @file
|
|
* @internal This header file contains macros, types and prototypes
|
|
* used to build and manipulate filters. It contains definitions
|
|
* for multiple file formats.
|
|
*
|
|
* @author Dennis Heimbigner
|
|
*/
|
|
|
|
#ifndef NCFILTER_H
|
|
#define NCFILTER_H
|
|
|
|
|
|
/**************************************************/
|
|
/* Internal filter related structures */
|
|
|
|
/* Internal filter actions */
|
|
#define NCFILTER_DEF 1
|
|
#define NCFILTER_REMOVE 2
|
|
#define NCFILTER_FILTERIDS 3
|
|
#define NCFILTER_INFO 4
|
|
#define NCFILTER_CLIENT_REG 10
|
|
#define NCFILTER_CLIENT_UNREG 11
|
|
#define NCFILTER_CLIENT_INQ 12
|
|
|
|
typedef enum NC_FILTER_UNION {
|
|
NC_FILTER_UNION_SPEC=((int)1),
|
|
NC_FILTER_UNION_IDS=((int)2),
|
|
NC_FILTER_UNION_CLIENT=((int)3),
|
|
} NC_FILTER_UNION;
|
|
|
|
/**************************************************/
|
|
/* Provide structs to pass args to filter_actions function using strings */
|
|
/* Originally, this used the HDF5 model where ids and params were unsigned ints.
|
|
To extend to zarr, we have converted so that ids and params are strings (char*).
|
|
Additionally we now allow a string id to be either an integer (as before but as a string)
|
|
or a name defined in the known_filters table in dfilter.c */
|
|
|
|
typedef struct NC_FILTERX_SPEC {
|
|
int active; /**< true iff underlying library was told to activate filter */
|
|
char* filterid; /**< ID for arbitrary filter. */
|
|
size_t nparams;
|
|
char** params; /**< Params for arbitrary filter. */
|
|
} NC_FILTERX_SPEC;
|
|
|
|
typedef struct NC_FILTERX_IDS {
|
|
size_t nfilters; /**< number of filters */
|
|
char** filterids; /**< Filter ids. */
|
|
} NC_FILTERX_IDS;
|
|
|
|
typedef struct NC_FILTERX_CLIENT {
|
|
char* id;
|
|
/* The filter info for x */
|
|
/* Avoid needing hdf.h by using void* */
|
|
void* info;
|
|
} NC_FILTERX_CLIENT;
|
|
|
|
typedef struct NC_FILTERX_OBJ {
|
|
NC_FILTER_UNION usort; /* discriminate union */
|
|
union {
|
|
NC_FILTERX_SPEC spec;
|
|
NC_FILTERX_IDS ids;
|
|
NC_FILTERX_CLIENT client;
|
|
} u;
|
|
} NC_FILTERX_OBJ;
|
|
|
|
struct NC_VAR_INFO;
|
|
|
|
EXTERNL int NC4_filterx_lookup(struct NC_VAR_INFO* var, const char* id, NC_FILTERX_SPEC** specp);
|
|
EXTERNL int NC4_filterx_add(struct NC_VAR_INFO* var, int active, const char* id, int nparams, const char** params);
|
|
EXTERNL int NC4_filterx_remove(struct NC_VAR_INFO* var, const char* xid);
|
|
EXTERNL int NC4_filterx_freelist(struct NC_VAR_INFO* var);
|
|
EXTERNL int NC4_filterx_free(NC_FILTERX_SPEC*);
|
|
EXTERNL int NC_cvtX2I_id(const char* xid, unsigned int* id);
|
|
EXTERNL int NC_cvtI2X_id(unsigned int id, char** xidp, int usename);
|
|
EXTERNL void NC_filterx_freestringvec(size_t n, char** vec);
|
|
EXTERNL int NC_filterx_copy(size_t n, const char** vec, char*** copyp);
|
|
/* As a rule, user provides space for output */
|
|
EXTERNL int NC_cvtI2X_idlist(int n, const unsigned int* ids, char** xid);
|
|
EXTERNL int NC_cvtI2X_params(int n, const unsigned int* iparams, char** xparams);
|
|
EXTERNL int NC_cvtX2I_params(size_t nparams, const char** xparamslist, unsigned int* params);
|
|
EXTERNL int NC_cvtX2I_idlist(size_t n, const char** xidlist, unsigned int* ids);
|
|
|
|
#endif /*NCFILTER_H*/
|