Provided by: elektra-doc_0.8.14-5_all bug

NAME

       md_src_plugins_struct_README - README

       • infos = Information about struct plugin is in keys below

       • infos/author = Markus Raab elektra@libelektra.org

       • infos/licence = BSD

       • infos/needs =

       • infos/provides = apply

       • infos/ordering = check

       • infos/placements = presetstorage

       • infos/description = Copies meta data to keys using structbing

       This  plugin  is a check plugin which checks the structure and interrelations of Keys in order the verify
       that they represent a valid configuration.

   Purpose
       The glob plugin together with the check plugins create a good combination to check keys which are present
       in the KeySet. For some storage plugins like fstab, however, missing keys are as fatal as not  validating
       keys – it is not possible to write a valid configuration file without them.

       The  problem  can  be described as a structure built with lists and other structures that must match with
       the key names of a KeySet. If a structure must have an element, contrary to glob, the plugin can yield an
       error if it is missing. During the matching, the plugin also applies metadata  to  the  individual  keys.
       Such  plugins  that check the structure and interrelations of keys are called structure checker. They can
       require that various subkeys have to or must not exist.  This  can  happen  recursively  to  specify  any
       structure.

       The  struct  plugin implements such a behaviour. It allows enforcement of a strong consistency within the
       keys of one backend.

   Usage
       In order for the struct plugin to do its job, it needs a plugin configuration to know which structure  it
       should check for. This configuration can be passed from a storage plugin’s config/needs clause.

   Example
       The  fstab  plugin  uses  the  struct plugin to verify the correct structure. Here is a snippet from it's
       contract:

           keyNew ("system/elektra/modules/fstab/config/needs/struct",
           KEY_VALUE, "list FStab",
           KEY_END),
           keyNew ("system/elektra/modules/fstab/config/needs/struct/FStab",
           KEY_META, "check/type", "null empty",
           KEY_END),
           keyNew ("system/elektra/modules/fstab/config/needs/struct/FStab/device",
           KEY_META, "check/type", "string",
           KEY_META, "check/path", "device",
           KEY_END),
           keyNew ("system/elektra/modules/fstab/config/needs/struct/FStab/mpoint",
           KEY_META, "check/type", "string",
           KEY_META, "check/path", "directory",
           KEY_END),
           keyNew ("system/elektra/modules/fstab/config/needs/struct/FStab/type",
           KEY_META, "check/type", "FSType",
           KEY_END),
           keyNew ("system/elektra/modules/fstab/config/needs/struct/FStab/options",
           KEY_META, "check/type", "string",
           KEY_END),
           keyNew ("system/elektra/modules/fstab/config/needs/struct/FStab/dumpfreq",
           KEY_META, "check/type", "unsigned_short",
           KEY_END), keyNew ("system/elektra/modules/fstab/config/needs/struct/FStab/passno",
           KEY_META, "check/type", "unsigned_short",
           KEY_END),

       The key value of needs/struct within the plugin configuration marks the starting  point.  list  describes
       the  first  structure  to be generated. It is a built-in structure of the struct plugin that supports all
       subkeys in one level. It applies to every direct subkey the structure  check  received  by  the  template
       parameter.  The  template  parameter is, in this case, FStab. The rest of the configuration specifies how
       entries of FStab must look.

       The information applied to the keys is given through metadata. This metadata is copied to each key during
       the structure check. If,however,a key is missing,the structure check will terminate with a  failure.  Any
       additional key will also lead to an error.

       The  metadata  may  be evaluated by subsequent checks. In the situation of fstab a typechecker and a path
       checker are both useful.

       The purpose of such structure checks is that only a valid configuration can be stored  and  that  neither
       applications nor storage plugins are surprised by configuration they do not understand.

       The  fstab  plugin  trusts  the fact that no invalid configuration is passed. It does not check it again.
       Missing configuration would lead to partially set data structures.  The  internally  used  API  setmntent
       crashes  in  that  case.  This  leads us to the {purpose of contracts}: We want a guarantee that specific
       conditions are already met because we know that the code of the plugin cannot handle it.

       Let us look at a different scenario with the same configuration. Instead of using the  fstab  plugin,  we
       will  use  a general purpose storage plugin. For example, the dump plugin. Note that the metadata will be
       stored permanently in this situation. No plugin exports a config/needs clauses for the struct  plugin  in
       this situation. But the user can add the struct plugin and the plugin configuration, as shown in the code
       above, to the backend manually. Applications still can be sure that only a specific configuration will be
       stored and passed to them. The unwritten contract is between the application and the backend. No contract
       checker, however, would detect the missing configuration.

   Limitation
       This  approach  for  defining  the structure works recursively. Every element can have a value with a new
       structure  check.  Additionally,  multiple  template  parameters  can  support  even  more  generic  data
       structures. This is, however, not yet implemented.

Version 0.8.14                                   Tue Dec 15 2015          md_src_plugins_struct_README(3elektra)