jsoc_types.h
, which
defines the data structures for series, record, keywords, links, and
data segments.
#ifndef _JSOC_TYPES_H #define _JSOC_TYPES_H #include "db.h" #include "hash_table.h" /* Constants */ #define JSOC_MAXNAMELEN (255) #define JSOC_MAXHASHKEYLEN (JSOC_MAXNAMELEN+20) #define JSOC_MAXUNITLEN (20) #define JSOC_MAXCLASSES (8192) #define JSOC_MAXQUERYLEN (8192) #define JSOC_MAXPATHLEN (8192) #define JSOC_MAXFORMATLEN (20) #define JSOC_MAXRANK (255) #define JSOC_MAXDATASEGMENTS (255) #define JSOC_LAZY_INIT (1L) #define JSOC_MAXCOMMENTLEN (2048) /*************************** JSOC related types ************************/ /* ("Keyword") values of keywords belong to one of the following simple classes. */ typedef enum {JSOC_TYPE_CHAR, JSOC_TYPE_SHORT, JSOC_TYPE_LONG, JSOC_TYPE_LONGLONG, JSOC_TYPE_FLOAT, JSOC_TYPE_DOUBLE, JSOC_TYPE_DATETIME, JSOC_TYPE_TIMESTAMP, JSOC_TYPE_STRING} JSOC_Simple_t; #ifndef JSOC_TYPES_C extern char *mdc_type_names[]; #endif #define JSOC_MAXTYPENAMELEN (9) #define JSOC_DATETIMELEN (32) #define JSOC_TIMESTAMPLEN (32) typedef union JSOC_Simple_Value { char char_val; short short_val; long long_val; long long longlong_val; float float_val; double double_val; char datetime_val[JSOC_DATETIMELEN]; char timestamp_val[JSOC_TIMESTAMPLEN]; char *string_val; } JSOC_Simple_Value_t; typedef struct JSOC_Keyword_struct { char name[JSOC_MAXNAMELEN]; /* Keyword name. */ /* If this is an inherited keyword, islink is non-zero, and linkname holds the name of the link which points to the dataset holding the actual keyword value. */ int islink; char linkname[JSOC_MAXNAMELEN]; /* Link name. */ int column; /* Which column in the dataset table holds this keyword? */ JSOC_Simple_t type; /* Keyword type. */ char format[JSOC_MAXFORMATLEN]; /* Format string for formatted input and output. */ char unit[JSOC_MAXUNITLEN]; /* Physical unit. */ int size; /* Size of keyword data in bytes.*/ JSOC_Simple_Value_t value; /* Keyword data. If the Keyword is used as part of a series template then value contains the default value. */ char comment[JSOC_MAXCOMMENTLEN]; } JSOC_Keyword_t; /* Links to other objects from which keyword values can be inherited. A link often indicates that the present object was computed using the data in the object pointed to. */ typedef enum { SIMPLE_LINK, QUERY_LINK } JSOC_Link_type_t; typedef struct JSOC_Link_struct { char name[JSOC_MAXNAMELEN]; /* Link name. */ char target_series[JSOC_MAXNAMELEN]; /* Series pointed to. */ int id, version; int column; /* Column in main series table where the target id is found; version is found in (column+1). */ JSOC_Link_type_t type; char where_clause[JSOC_MAXQUERYLEN]; char comment[JSOC_MAXCOMMENTLEN]; } JSOC_Link_t; /* The data descriptors hold basic information about the in-memory representation of the data. */ typedef enum {JSOC_BINARY, JSOC_FITZ, JSOC_FITS} JSOC_Storage_Protocol_t; typedef struct JSOC_Data_Locator_struct { long long dsindex; /* Index to the storage management table in the database. */ char *path; /* If non-null points to the resolved path. */ JSOC_Storage_Protocol_t storage_protocol; } JSOC_Data_Locator_t; typedef struct JSOC_Data_struct { JSOC_Simple_t type; /* Type of the observable. */ char unit[JSOC_MAXUNITLEN]; /* Physical unit. */ int size; /* Size in bytes of the elements. */ int naxis; /* Number of dimensions. */ int axis[JSOC_MAXRANK]; /* Size of each dimension. */ } JSOC_Data_t; /* Data descriptor for a dataset. The data part of a dataset consists of a collection of observables. Each observable is an n-dimensional array of a simple type. */ typedef struct JSOC_Data_struct { JSOC_Data_Locator_t location; /* Data set location and storage protocol. */ int num_obs; /* Number of observables. */ JSOC_Data_t obs[JSOC_MAXDATASEGMENTS]; /* An array of descriptors. Each layer represents an n-dimensional array of a single observable.*/ } JSOC_Data_t; /* An in-memory slice of an observable. If the full observable is the n-dimensional array A(0:(obs->axis[0]-1),0:(obs->axis[1]-1),...,0:(obs->axis[obs->naxis-1]-1) then the memory location pointed to by data holds the slice A(start[0]:end[0],start[1]:end[1],...,start[obs->naxis-1]:end[obs->naxis-1]) stored in column major order. */ typedef struct JSOC_Data_Slice_struct { JSOC_Data_t *obs; int start[JSOC_MAXRANK]; int end[JSOC_MAXRANK]; void *data; } JSOC_Data_Slice_t; /* Datastructure holding a single data record. */ typedef struct JSOC_DataRecord_struct { struct JSOC_Env_struct *env; /* Pointer to global JSOC environment. */ /* The following three fields uniquely identify the object: */ char seriesname[JSOC_MAXNAMELEN]; /* Name of series this dataset belongs to. */ int id, version; /* (id, version) is a unique identifier of this object within its series. */ char hashkey[JSOC_MAXHASHKEYLEN]; /* Hash key is a string containing "seriesname_<id>_<version>". */ /* Dirty flags */ int keyw_dirty; /* Have the keywords been modified? */ int link_dirty; /* Have the links been modified? */ int data_dirty; /* Have the data arrays been modified? */ /* Keywords. */ int num_keyw, max_keyw; /* Number of keywords. */ JSOC_Keyword_t *keyw; /* Array of keywords. */ Hash_Table_t keyw_hash; /* Hash table for fast lookup of keywords. */ /* Links. */ int num_link, max_link; /* Number of links. */ JSOC_Link_t *link; /* Array of links. */ Hash_Table_t link_hash; /* Hash table for fast lookup of links. */ /* "Image" data. */ JSOC_Data_t *data; /* Data descriptor. */ } JSOC_DataRecord_t; typedef struct JSOC_Series_struct { int tapegroup; int chunksize; int archive; char author[JSOC_MAXCOMMENTLEN]; char owners[JSOC_MAXCOMMENTLEN]; char description[JSOC_MAXCOMMENTLEN]; JSOC_DataRecord_t template; } JSOC_Series_t; typedef struct JSOC_Env_struct { int errno; /* Error flag. */ DB_Handle_t *db; /* Database connection handle. */ /* Series cache data structures. */ int num_series; /* Total number of series listed in the database. */ char *init_tag; /* Array of tags indicating which series templates have been populated with data from the database. */ JSOC_DataRecord_t *series_cache; /* Cache array of series templates for all series in the system. */ Hash_Table_t series_hash; /* Hash table for mapping series names to indices in the series_cache array. */ DB_Text_Result_t *series_names; /* Table of all seriesnames returned from the database. These strings are used as keys in the hash table. */ /* DataRecord cache data structures. */ int num_ds; /* Number of datasets in memory. */ int max_ds; /* Max number of datasets in cache memory. */ char *ds_freelist; /* List of free slots in the ds_cache. */ int ds_firstfree; /* Index of first free slot in the ds_cache */ JSOC_DataRecord_t *ds_cache; /* Array of all datasets currently in memory. */ Hash_Table_t ds_hash; /* Hash table for mapping dataset identifer (seriesname, id, version) to indices in the ds_cache array. */ } JSOC_Env_t; /* Return enum value for a simple type given its name. */ JSOC_Simple_t mdc_str2type(char *); const char *mdc_type2str(JSOC_Simple_t type); int mdc_copy_db2mdc(JSOC_Simple_t mdc_type, JSOC_Simple_Value_t *mdc_dst, DB_Type_t db_type, char *db_src); DB_Type_t mdc2dbtype(JSOC_Simple_t type); int mdc_sizeof(JSOC_Simple_t type);