Index of Functions: A  B  C  D  E  F  G  H  I  J  K  L  M  N  O  P  Q  R  S  T  U  V  W  X 
Index Page
eknelt_c

Table of contents
Procedure
Abstract
Required_Reading
Keywords
Brief_I/O
Detailed_Input
Detailed_Output
Parameters
Exceptions
Files
Particulars
Examples
Restrictions
Literature_References
Author_and_Institution
Version
Index_Entries

Procedure

   eknelt_c ( EK, get number of elements in column entry ) 

   SpiceInt eknelt_c ( SpiceInt  selidx,
                       SpiceInt  row     )

Abstract

   Return the number of elements in a specified column entry in
   the current row.

Required_Reading

   EK

Keywords

   EK


Brief_I/O

   VARIABLE  I/O  DESCRIPTION
   --------  ---  --------------------------------------------------
   selidx     I   Index of parent column in SELECT clause.
   row        I   Row containing element.

   The function returns the number of elements in entry in current row.

Detailed_Input

   selidx      is the SELECT clause index of the column to
               fetch from. The range of selidx is 0 : (nsel-1)
               inclusive, where nsel is the number of items in
               the SELECT clause of the current query.

   row         is the index of the row containing the element.
               This number refers to a member of the set of rows
               matching a query. row must be in the range

                 0 : nmrows-1

               where nmrows is the matching row count returned
               by ekfind_c.

Detailed_Output

   The function returns the number of elements in the column entry
   belonging to the specified column in the current row.

   Null entries in variable-size columns are considered to have size 1.

Parameters

   None.

Exceptions

   1)  If this routine is called when no E-kernels have been loaded,
       the error SPICE(NOLOADEDFILES) is signaled by a routine in the
       call tree of this routine.

   2)  If `selidx' is outside of the range established by the last query
       passed to the EK search engine, the error SPICE(INVALIDINDEX) is
       signaled by a routine in the call tree of this routine.

   3)  If `row' is outside of the range established by the last query passed
       to the EK search engine, the error SPICE(INVALIDINDEX) is signaled by
       a routine in the call tree of this routine.

Files

   At least one E-kernel must be loaded before queries may be passed to
   the EK system via ekfind_c.

Particulars

   This routine is meant to be used in conjunction with the EK
   fetch entry points ekgc_c, ekgd_c, and ekgi_c. This routine
   allows the caller of those routines to determine appropriate
   loop bounds to use to fetch each column entry in the current row.

Examples

   The numerical results shown for this example may differ across
   platforms. The results depend on the SPICE kernels used as
   input, the compiler and supporting libraries, and the machine
   specific arithmetic implementation.

   1) This example demonstrates how to fetch integer, double
      precision and character string values from a column when such
      column corresponds to either a variable-size array or to a
      static-size array.

      Create an EK that contains a table TAB that has the following
      columns:

          Column name   Data Type   Size
          -----------   ---------   ----
          IARRAY        INT         3
          DARRAY        DP          VARIABLE
          CARRAY        CHR         VARIABLE

      Issue the following query

          query = "SELECT IARRAY, DARRAY, CARRAY FROM TAB"

      to fetch and dump column values from the rows that satisfy the
      query.


      Example code begins here.


      /.
         Program eknelt_ex1
      ./
      #include <stdio.h>
      #include <string.h>
      #include "SpiceUsr.h"

      int main( )
      {

         /.
         Local parameters
         ./
         #define EKNAME       "eknelt_ex1.bdb"
         #define TABLE        "TAB"
         #define CHRSLN       6
         #define COL1SZ       3
         #define DECLEN       201
         #define ERRLEN       1841
         #define MXC2SZ       4
         #define MXC3SZ       7
         #define NCOLS        3
         #define NROWS        4
         #define STRSIZ       31

         /.
         Local variables
         ./
         SpiceChar            cdecls [NCOLS] [DECLEN];
         SpiceChar            cnames [NCOLS] [SPICE_EK_CSTRLN];
         SpiceChar            col3   [MXC3SZ][CHRSLN];
         SpiceChar            cvals  [MXC3SZ][STRSIZ];
         SpiceChar            errmsg [ERRLEN];
         SpiceChar          * ifname;
         SpiceChar          * query;

         SpiceDouble          col2   [MXC2SZ];
         SpiceDouble          dvals  [MXC2SZ];

         SpiceInt             col1   [COL1SZ];
         SpiceInt             eltidx;
         SpiceInt             handle;
         SpiceInt             i;
         SpiceInt             ivals  [COL1SZ];
         SpiceInt             j;
         SpiceInt             nelt;
         SpiceInt             nmrows;
         SpiceInt             nresvc;
         SpiceInt             recno;
         SpiceInt             row;
         SpiceInt             segno;
         SpiceInt             selidx;

         SpiceBoolean         error;
         SpiceBoolean         found;
         SpiceBoolean         isnull;

         /.
         Open a new EK file.  For simplicity, we will not
         reserve any space for the comment area, so the
         number of reserved comment characters is zero.
         The variable `ifname' is the internal file name.
         ./
         nresvc  =  0;
         ifname  =  "Test EK/Created 13-JUN-2019";

         ekopn_c ( EKNAME, ifname, nresvc, &handle );

         /.
         Set up the column names and declarations
         for the TAB segment.  We'll index all of
         the columns.
         ./
         strcpy( cnames[0], "IARRAY" );
         strcpy( cdecls[0], "DATATYPE = INTEGER, SIZE = 3" );

         strcpy( cnames[1], "DARRAY" );
         strcpy( cdecls[1], "DATATYPE = DOUBLE PRECISION, SIZE = VARIABLE" );

         strcpy( cnames[2], "CARRAY" );
         strcpy( cdecls[2], "DATATYPE = CHARACTER*(5), SIZE = VARIABLE" );

         /.
         Start the segment.
         ./
         ekbseg_c ( handle, TABLE,  NCOLS,   SPICE_EK_CSTRLN,
                    cnames, DECLEN, cdecls, &segno           );

         /.
         At the records to the table.
         ./
         for ( i = 0; i < NROWS; i++ )
         {

            /.
            Append a new record to the EK.
            ./
            ekappr_c ( handle, segno, &recno );

            /.
            Add 3 items to IARRAY
            ./
            for ( j = 0; j < COL1SZ; j++ )
            {
               col1[j] =  i+1 + (j+1)*100;
            }

            ekacei_c ( handle,    segno,  recno,
                       cnames[0], COL1SZ, col1,  SPICEFALSE );

            /.
            Add i+1 items to DARRAY
            ./
            for ( j = 0; j <= i; j++ )
            {
               col2[j] = j+1 + (i+1)*200.0;
            }

            ekaced_c ( handle,    segno, recno,
                       cnames[1], i+1,   col2,  SPICEFALSE );

            /.
            Add 4+i items to CARRAY
            ./
            for ( j = 0; j < 4+i; j++ )
            {
               repmi_c ( "ST#", "#", j+1 + (i+1)*100, CHRSLN, col3[j] );
            }

            ekacec_c ( handle, segno,  recno, cnames[2],
                       i+4,    CHRSLN, col3,  SPICEFALSE );

         }

         /.
         Close the file.
         ./
         ekcls_c ( handle );

         /.
         Open the created file. Perform the query and show the
         results.
         ./
         furnsh_c ( EKNAME );

         query = "SELECT IARRAY, DARRAY, CARRAY FROM TAB";

         /.
         Query the EK system for data rows matching the
         SELECT constraints.
         ./
         ekfind_c ( query, ERRLEN, &nmrows, &error, errmsg );

         /.
         Check whether an error occurred while processing the
         SELECT clause. If so, output the error message.
         ./
         if ( error )
         {
            printf( "SELECT clause error:  %s\n", errmsg );
         }
         else
         {

            for ( row = 0; row < nmrows; row++ )
            {

               printf( " \n" );
               printf( "ROW  =  %2d\n", row );

               /.
               Fetch values from column IARRAY in the current
               row.  Since IARRAY was the first column selected,
               the selection index `selidx' is set to 0.
               ./
               selidx = 0;
               eltidx = 0;
               isnull = SPICEFALSE;

               while ( ( eltidx < COL1SZ ) && ( !isnull ) )
               {
                  /.
                  If the column entry is null, we'll be kicked
                  out of this loop after the first iteration.
                  ./
                  ekgi_c ( selidx,        row,     eltidx,
                           ivals+eltidx, &isnull, &found  );

                  eltidx = eltidx + 1;

               }

               printf( "  COLUMN = IARRAY:" );

               if ( isnull )
               {
                  printf( "<Null>\n" );
               }
               else
               {

                  for ( i = 0; i < COL1SZ; i++ )
                  {
                     printf( "%6d", ivals[i] );
                  }

                  printf( " \n" );

               }

               /.
               Fetch values from column DARRAY in the current
               row.  Since DARRAY contains variable-size array
               elements, we call eknelt_c to determine how many
               elements to fetch.
               ./
               selidx = 1;
               nelt   = eknelt_c ( selidx, row );

               eltidx = 0;
               isnull = SPICEFALSE;

               while ( ( eltidx < nelt ) && ( !isnull ) )
               {

                  ekgd_c ( selidx,        row,     eltidx,
                           dvals+eltidx, &isnull, &found  );

                  eltidx = eltidx + 1;

               }

               printf( "  COLUMN = DARRAY:" );

               if ( isnull )
               {
                  printf( "<Null>\n" );
               }
               else
               {

                  for ( i = 0; i < nelt; i++ )
                  {
                     printf( "%6.1f", dvals[i] );
                  }

                  printf( " \n" );

               }

               /.
               Fetch values from column CARRAY in the current
               row.
               ./
               selidx = 2;
               nelt   = eknelt_c ( selidx, row );

               eltidx = 0;
               isnull = SPICEFALSE;

               while ( ( eltidx < nelt ) && ( !isnull ) )
               {

                  ekgc_c ( selidx,         row,     eltidx, STRSIZ,
                           cvals[eltidx], &isnull, &found          );

                  eltidx = eltidx + 1;

               }

               printf( "  COLUMN = CARRAY:" );

               if ( isnull )
               {
                  printf( "<Null>\n" );
               }
               else
               {

                  for ( i = 0; i < nelt; i++ )
                  {
                     printf( " %s", cvals[i] );
                  }

                  printf( " \n" );

               }

            }

         /.
         We either parsed the SELECT clause or had an error.
         ./
         }

         return ( 0 );
      }


      When this program was executed on a Mac/Intel/cc/64-bit
      platform, the output was:


      ROW  =   0
        COLUMN = IARRAY:   101   201   301
        COLUMN = DARRAY: 201.0
        COLUMN = CARRAY: ST101 ST102 ST103 ST104

      ROW  =   1
        COLUMN = IARRAY:   102   202   302
        COLUMN = DARRAY: 401.0 402.0
        COLUMN = CARRAY: ST201 ST202 ST203 ST204 ST205

      ROW  =   2
        COLUMN = IARRAY:   103   203   303
        COLUMN = DARRAY: 601.0 602.0 603.0
        COLUMN = CARRAY: ST301 ST302 ST303 ST304 ST305 ST306

      ROW  =   3
        COLUMN = IARRAY:   104   204   304
        COLUMN = DARRAY: 801.0 802.0 803.0 804.0
        COLUMN = CARRAY: ST401 ST402 ST403 ST404 ST405 ST406 ST407


      Note that after run completion, a new EK file exists in the
      output directory.

Restrictions

   None.

Literature_References

   None.

Author_and_Institution

   N.J. Bachman        (JPL)
   J. Diaz del Rio     (ODC Space)

Version

   -CSPICE Version 1.1.1, 02-AUG-2021 (JDR)

       Edited the header to comply with NAIF standard. Added
       complete code example based on existing fragment.

   -CSPICE Version 1.1.0, 23-JUL-2001 (NJB)

      Removed tab characters from source file.

   -CSPICE Version 1.0.0, 24-FEB-1999 (NJB)

Index_Entries

   return the number of elements in a column entry
Fri Dec 31 18:41:06 2021