IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Mar 9, 2004, 3:07:27 PM (22 years ago)
Author:
rhl
Message:

Updated

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/doc/draft/metadata.tex

    r130 r179  
    5959\section{Metadata Representation}
    6060
    61 We propose that an item of metadata be represented as a C structure:
     61We propose that an item of metadata be represented as a C structure with at least the following
     62fields:
    6263\begin{verbatim}
    6364/*
     
    7576    } val;                              // value of metadata
    7677    char *comment;                      // optional comment ("", not NULL)
    77 
    78 } psMetaData;
     78} psMetaDataItem;
    7979\end{verbatim}
    8080
     
    8989
    9090The possible types of metadata are identified by the enumerated type
    91 \code{psMetaDataType} (see also table \ref{tabMetaDataTypes}):
     91\code{psMetaDataType} (see also table \ref{tabMetaDataTypes}); the initial defined values are:
    9292\begin{verbatim}
    9393/*
     
    9595 */
    9696typedef enum {                          // type of val is:
    97     psMetaFloat = 0,                    // float (.f)
     97    psMetaFloat,                        // float (.f)
    9898    psMetaInt,                          // int (.i)
    9999    psMetaStr,                          // string (.v)
     
    129129\section{Collections of Metadata}
    130130
    131 We also need to support a container class for metadata.  We propose
    132 using the standard \PS{} doubly-linked list type \code{psDlist}
    133 (see \href{file:utils#psDlist}{utils.pdf} for details). For example:
    134 \begin{verbatim}
    135     psDlist *list = psDlistNew(NULL);   // list of metadata
    136 
    137     psDlistAppend(list, psMetaDataNew("const.ten", psMetaInt, &ten, NULL, 0));
    138     psDlistAppend(list, psMetaDataNew("const.sqrt2", psMetaFloat, &sqrt2,
    139                                       "square root of two", 0));
    140     psDlistAppend(list, psMetaDataNew("lang.hello", psMetaStr, "Bonjour",
    141                                       "French", 0));
    142     /*
    143      * Print all metadata to stdout
    144      */
    145     (void)psDlistGet(list, psDlistTail); // initialise iterator
    146     while ((ms = psDlistGet(list, psDlistPrev)) != NULL) {
    147         psMetaDataPrint(stdout, ms);
    148     }
    149     /*
    150      * Clean up
    151      */
    152     psDlistDel(list, (void (*)(void *))psMetaDataDel);
     131\begin{verbatim}
     132typedef struct {
     133    psDlist *list;                      // list of psMetaDataItem
     134    psHash *table;                      // hash table of the same metadata
     135} psMetaDataSet;
     136\end{verbatim}
     137
     138The type \code{psMetaDataSet} is a container class for metadata. Note that there are
     139in fact \emph{two} representations of the metadata (each \code{psMetaDataItem} appears
     140on both).
     141
     142We are using the standard \PS{} doubly-linked list types \code{psDlist} and  \code{psHash}
     143(see \href{file:utils#psDlist}{utils.pdf:psDlist} and \href{file:utils#psHash}{utils.pdf:psHash} for details).
     144For example:
     145\begin{verbatim}
     146    for (int i = 0; i < 10; i += 5) {
     147        float sqrti = sqrt(i);
     148        psMetaDataAppend(ms, psMetaDataItemAlloc(PS_META_INT, &i, NULL, "const.%d", i));
     149        psMetaDataAppend(ms, psMetaDataItemAlloc(PS_META_FLOAT, &sqrti, "square root", "const.sqrt%d", i));
     150    }
     151    psMetaDataAppend(ms, psMetaDataItemAlloc(PS_META_STR, "Bonjour", "French", "lang.hello"));
     152    /*
     153     * Remove a key
     154     */
     155    psMetaDataItemFree(psMetaDataRemove(ms, "lang.hello"));
     156    /*
     157     * Print all metadata
     158     */
     159    fprintf(stdout, "------\n");
     160    psMetaDataSetIterator(ms);
     161    while ((meta = psMetaDataGetNext(ms, NULL)) != NULL) {
     162        psMetaDataItemPrint(stdout, meta, "");
     163    }
     164    /*
     165     * Look up a key by name
     166     */
     167    fprintf(stdout, "------\n");
     168    fprintf(stdout, "Looking up by name:\n");
     169    meta = psMetaDataLookup(ms, "const.5");
     170    if (meta != NULL) {
     171        psMetaDataItemPrint(stdout, meta, "");
     172    }
    153173\end{verbatim}
    154174
    155175\section{Naming convention for MetaData}
    156176
    157 The \code{psMetaData} struct includes a name.  This name should be of
     177The \code{psMetaDataItem} struct includes a name.  This name should be of
    158178the form \code{name1.name2.name3$\cdots$}, e.g.\hfil\break
    159179\null\qquad\qquad\code{IPP.phase1.ota12.biassec}.
     
    163183all metadata names in use throughout the project.
    164184
     185\subsection{Support for Multiple Values for a Given Name}
     186
     187\begin{verbatim}
     188    psMetaDataAppend(ms, psMetaDataItemAlloc(PS_META_STR | PS_META_NON_UNIQUE,
     189                                           "Bonjour", "French", "lang.hello"));
     190    psMetaDataAppend(ms, psMetaDataItemAlloc(PS_META_STR | PS_META_NON_UNIQUE,
     191                                           "Aloha", "Hawaiian", "lang.hello"));
     192    psMetaDataAppend(ms, psMetaDataItemAlloc(PS_META_STR | PS_META_NON_UNIQUE,
     193                                           "Good Morning", "English", "lang.hello"));
     194    /*
     195     * Print all metadata starting "lang"
     196     */
     197    psMetaDataSetIterator(ms);
     198    while ((meta = psMetaDataGetNext(ms, "lang")) != NULL) {
     199        psMetaDataItemPrint(stdout, meta, "");
     200    }
     201\end{verbatim}
     202
     203It is an unfortunate fact that certain metadata keywords (such as \code{COMMENT} in a FITS header)
     204may be repeated with different values.  The \code{psMetaDataAppend} routine is required
     205to check that all metadata names are unique unless the type is qualified as \code{PS_META_NON_UNIQUE};
     206in this case a unique integer will be added to each name that you specify. In this case,
     207you may either delete individual element separately or as a complete set:
     208\begin{verbatim}
     209psMetaDataItemFree(psMetaDataRemove(ms, "lang.hello.0"));
     210psMetaDataItemFree(psMetaDataRemove(ms, "lang.hello"));
     211\end{verbatim}
     212
     213\appendix
     214\section{MetaData APIs}
     215
     216\begin{verbatim}
     217psMetaDataItem *psMetaDataItemAlloc(
     218    psMetaDataType type,                // type of this piece of metadata
     219    const void *val,                    // value of new item
     220                                        // N.b. a pointer even if the item
     221                                        // is of type e.g. int
     222    const char *comment,                // comment associated with item
     223    const char *name,                   // name of new item of metadata (may be an sprintf format)
     224    ...);                               // possible arguments for name format
     225
     226void psMetaDataItemFree(psMetaDataItem *ms); // piece of metadata to destroy
     227
     228psMetaDataSet *psMetaDataSetAlloc(void);          // make a new set of metadata
     229void psMetaDataSetDel(psMetaDataSet *ms); // destroy a set of metadata
     230
     231/*****************************************************************************/
     232/*
     233 * Utilities
     234 */
     235psMetaDataItem *psMetaDataAppend(psMetaDataSet *restrict ms, psMetaDataItem *restrict item);
     236psMetaDataItem *psMetaDataRemove(psMetaDataSet *restrict ms, const char *restrict key);
     237
     238void psMetaDataSetIterator(psMetaDataSet *ms);
     239psMetaDataItem *psMetaDataGetNext(psMetaDataSet *ms);
     240psMetaDataItem *psMetaDataLookup(const psMetaDataSet *ms, const char *key);
     241
     242void psMetaDataItemPrint(FILE *fd,              // file descriptor to write to
     243                         const psMetaDataItem *ms); // item of metadata to print
     244\end{verbatim}
    165245
    166246\bibliographystyle{plain}
Note: See TracChangeset for help on using the changeset viewer.