lib1.c
上传用户:dgyhgb
上传日期:2007-01-07
资源大小:676k
文件大小:39k
源码类别:

SQL Server

开发平台:

Unix_Linux

  1. /*
  2.  *  lib1.c  -  DB engine interface (part2)
  3.  *
  4.  *  This file is a part of GNU SQL Server
  5.  *
  6.  *  Copyright (c) 1996, 1997, Free Software Foundation, Inc
  7.  *  Developed at the Institute of System Programming
  8.  *  This file is written by Konstantin Dyshlevoi
  9.  *
  10.  *  This program is free software; you can redistribute it and/or modify
  11.  *  it under the terms of the GNU General Public License as published by
  12.  *  the Free Software Foundation; either version 2 of the License, or
  13.  *  (at your option) any later version.
  14.  *
  15.  *  This program is distributed in the hope that it will be useful,
  16.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  *  GNU General Public License for more details.
  19.  *
  20.  *  You should have received a copy of the GNU General Public License
  21.  *  along with this program; if not, write to the Free Software
  22.  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  23.  *
  24.  *  Contacts: gss@ispras.ru
  25.  *
  26.  */
  27. /* $Id: lib1.c,v 1.245 1997/03/31 03:46:38 kml Exp $ */
  28. #include "global.h"
  29. #ifdef HAVE_UNISTD_H
  30. #include <unistd.h>
  31. #endif
  32. #include "engine/destrn.h"
  33. #include "engine/strml.h"
  34. #include "engine/expop.h"
  35. #include "exti.h"
  36. #include "engine/fdcltrn.h"
  37. #include "type_lib.h"
  38. /*---------------------------------------------*/
  39. EXTERNAL char buffer[SOC_BUF_SIZE];
  40. EXTERNAL char res_buf[SOC_BUF_SIZE];
  41. EXTERNAL char *pointbuf;
  42. /*---------------------------------------------*/
  43. #define RTN(s)        if( s < 0 ) return (s )
  44. #define INITBUF       pointbuf = buffer
  45. /*---------------------------------------------*/
  46. #define TRANIND(pidind,indid);  
  47.      page=(u2_t)(((*indid).tabid.tabd)>>16);
  48.      index=(u2_t)(((*indid).tabid.tabd)&0xFFFF); 
  49.      Copy(&(pidind.irii.urn.segnum),
  50.                    &((*indid).tabid.segid ),sizeof(Segid) );
  51.      Copy(&(pidind.irii.urn.obnum ),
  52.                    &((*indid).tabid.untabid),sizeof(Unid)  );
  53.      Copy(&(pidind.irii.pagenum),&page,sizeof(u2_t) );
  54.      Copy(&(pidind.irii.index),&index,sizeof(u2_t) );
  55.      Copy(&(pidind.inii),&((*indid).unindid),sizeof(Unid) );
  56. /*--------------------------------------------------------*/
  57. #define TRANTAB(pidrel,tabid); 
  58.      page=(u2_t)((tabid->tabd)>>16);
  59.      index=(u2_t)((tabid->tabd)&0xFFFF);
  60.      Copy(&(pidrel.urn.segnum),&(tabid->segid ),sizeof(Segid) );
  61.      Copy(&(pidrel.urn.obnum ),&(tabid->untabid),sizeof(Unid)  );
  62.      Copy(&(pidrel.pagenum),&page,sizeof(u2_t) );
  63.      Copy(&(pidrel.index),&index,sizeof(u2_t) );
  64. /*-------------------------------------------------------*/
  65. u2_t *mk_short_arr(i4_t num, i4_t *arr);
  66. i4_t 
  67. uidnsttab (Tabid * i1tabid, Tabid * i2tabid, Tabid * otabid, i4_t code)
  68. #if 0
  69.      /* Theory-set uniting or intersection or difference
  70. of two temporal relations sorted in the same order
  71. with duplicate removing and locating results of this
  72. in the new relation sorted in the same columns and order
  73.      */
  74.  
  75.      Tabid *i1tabid; /* identifier of the first original
  76.    temporal relation                    */ 
  77.      Tabid *i2tabid; /* identifier of the second original
  78.    temporal relation                    */ 
  79.      Tabid *otabid; /* identefier of the result
  80.    temporal relation                    */
  81. #endif
  82. {
  83.   i4_t stat;
  84.   struct ans_ctob answer;
  85.   struct id_ob pit1, pit2;
  86.   
  87.   if (cl_debug)
  88.     {
  89.       if( code==(i4_t) BLDUN )
  90. fprintf (STDOUT, "BASE.unsttab n");
  91.       if ( code==(i4_t) INTRSC )
  92. fprintf (STDOUT, "BASE.intsttab n");
  93.       if ( code== (i4_t)DFFRNC )
  94. fprintf (STDOUT, "BASE.difsttab n");
  95.     }
  96.   Copy (&(pit1.segnum), &(i1tabid->segid), sizeof (Segid));
  97.   Copy (&(pit1.obnum), &(i1tabid->untabid), sizeof (Unid));
  98.   Copy (&(pit2.segnum), &(i2tabid->segid), sizeof (Segid));
  99.   Copy (&(pit2.obnum), &(i2tabid->untabid), sizeof (Unid));
  100.   
  101.   switch (code)
  102.     {
  103.     case BLDUN :  answer = bdunion   (&pit1, &pit2);
  104.                   break;
  105.     case INTRSC : answer = intersctn (&pit1, &pit2);
  106.                   break;
  107.     case DFFRNC : answer = differnc  (&pit1, &pit2);
  108.                   break;
  109.     }
  110.   
  111.   stat = answer.cpncob;
  112.   Copy (&(otabid->segid), &(answer.idob.segnum), sizeof (Segid));
  113.   Copy (&(otabid->untabid), &(answer.idob.obnum), sizeof (Unid));
  114.   if (cl_debug)
  115.     {
  116.       if( code==(i4_t) BLDUN )
  117. fprintf (STDOUT, "BASE.unsttab: segid=%d,untabid=%dn",
  118.  otabid->segid, (i4_t)otabid->untabid);
  119.       if ( code==(i4_t) INTRSC )
  120. fprintf (STDOUT, "BASE.insttab: segid=%d,untabid=%dn",
  121.  otabid->segid, (i4_t)otabid->untabid);
  122.       if ( code==(i4_t)DFFRNC )
  123. fprintf (STDOUT, "BASE.difsttab: segid=%d,untabid=%dn",
  124.  otabid->segid, (i4_t)otabid->untabid);
  125.     }
  126.   return (stat);
  127. }
  128. /**********************************************************************/
  129. /**********************************************************************
  130. i4_t 
  131. bldttfil (Tabid * tabid, Filid * filid, i4_t nc, cond_buf_t cond, i4_t *spn)
  132. #if 0
  133.      * Building the sorted filter on the basis of scaning
  134. given constant table without index using  or filter.
  135. The function result is >= 0 in the case of successful
  136. finish and negative one containing the error code
  137. otherwise
  138.      *
  139.  
  140.      Tabid *tabid;  * Basic table identifier           *
  141.      Filid *filid;  * Result parameter -
  142.    filter identifier                *
  143.               
  144.      i4_t nc;  *            *
  145.      Cond *cond;  * condition of current string selecting
  146.    NULL means absence of any conditions *
  147.      i4_t *spn;  * number of control point to which the
  148.    rolback has to be done in the case of
  149.    fail in the execution of operation
  150.    because of deadlock                  *
  151. #endif
  152. {
  153.   i4_t stat;
  154.   struct ans_ctob answer;
  155.   struct id_rel pidrel;
  156.   u2_t page, index;
  157.   
  158.   if (cl_debug)
  159.     fprintf (STDOUT, "BASE.bldtftab n");
  160.   TRANTAB (pidrel, tabid);
  161.   
  162.   answer = blflrl (&pidrel, nc, cond);
  163.   stat = answer.cpncob;
  164.   Copy (filid, &(answer.idob), sizeof (filid));
  165.   if (stat > 0)
  166.     *spn = stat;
  167.   return (stat);
  168. }
  169. **********************************************************************
  170. i4_t 
  171. bldtifil (Indid * indid, Filid * filid, i4_t nc, cond_buf_t cond, i4_t nra,
  172.   cond_buf_t range, i4_t *spn)
  173. #if 0
  174.       * Building the sorted filter on the basis of scaning
  175. given constant table with index using.
  176. The function result is >= 0 in the case of successful
  177. finish and negative one containing the error code
  178. otherwise
  179.      *
  180.  
  181.      Indid *indid;  * Basic table identifier           * 
  182.      Filid *filid;  * Result parameter -
  183.    filter identifier                * 
  184.      i4_t nc;  *             * 
  185.      Cond *cond;  * condition of current string selecting
  186.    NULL means absence of any conditions * 
  187.      i4_t nra;  *             * 
  188.      Cond *range;  * scan range is restricted form
  189.    of column condition put on the
  190.    columns included into index
  191.    NULL means undefined range         * 
  192.      i4_t *spn;  * number of control point to which the
  193.    rolback has to be done in the case of
  194.    fail in the execution of operation
  195.    because of deadlock                  *  
  196. #endif
  197. {
  198.   i4_t stat;
  199.   struct ans_ctob answer;
  200.   struct id_ind pidind;
  201.   u2_t page, index;
  202.   
  203.   if (cl_debug)
  204.     fprintf (STDOUT, "BASE.bldtifil n");
  205.   TRANIND (pidind, indid);
  206.   
  207.   answer = blflin (&pidind, nc, cond, nra, range);
  208.   stat = answer.cpncob;
  209.   Copy (filid, &(answer.idob), sizeof (filid));
  210.   if (stat > 0)
  211.     *spn = stat;
  212.   return (stat);
  213. }
  214.  ********************************************************************** 
  215. i4_t 
  216. bldtffil (Filid * ifilid, Filid * ofilid, i4_t nc, cond_buf_t cond)
  217. #if 0 
  218.  * Building the sorted filter on the basis of scaning
  219. given basic table with filter using.
  220. The function result is >= 0 in the case of successful
  221. finish and negative one containing the error code
  222. otherwise
  223.      * 
  224.   
  225.      Filid *ifilid;  * filter identifier * 
  226.      Filid *ofilid;  * Result parameter -
  227.    filter identifier                * 
  228.      i4_t nc;  *                 * 
  229.      Cond *cond;  * condition of current string selecting
  230.    NULL means absence of any conditions * 
  231. #endif
  232. {
  233.   struct ans_ctob answer;
  234.   
  235.   answer = blflfl (&ifilid, nc, cond);
  236.   Copy (ofilid, &(answer.idob), sizeof (answer.idob));
  237.   return answer.cpncob;
  238. }
  239.  **********************************************************************/
  240. i4_t 
  241. bldtttab (Tabid * itabid, Tabid * otabid, i4_t nr, i4_t *rlist, i4_t nc,
  242.   cond_buf_t cond, i4_t *spn)
  243. #if 0
  244.      /* Building the sorted filter on the basis of scaning
  245. given table without index using  or filter.
  246. The function result is >= 0 in the case of successful
  247. finish and negative one containing the error code
  248. otherwise
  249.      */
  250.      Tabid *itabid; /* Basic table identifier           */
  251.      Tabid *otabid; /* Result parameter -
  252.    temporal table identifier        */
  253.      i4_t nr; /* the number of columns which values
  254.    will be selected from basic table
  255.    and inserted in the temporal one  */
  256.      i4_t rlist[]; /* arrays of column number which
  257.    values will be selected           */
  258.      i4_t nc; /*               */
  259.      Cond *cond; /* condition of current string selecting
  260.    NULL means absence of any conditions */
  261.      i4_t *spn; /* number of control point to which the
  262.    rolback has to be done in the case of
  263.    fail in the execution of operation
  264.    because of deadlock                  */
  265. #endif
  266. {
  267.   i4_t stat;
  268.   struct ans_ctob answer;
  269.   u2_t page, index;
  270.   struct id_rel pidrel;
  271.   
  272.   if (cl_debug)
  273.     fprintf (STDOUT, "BASE. bldtttabn");
  274.   INITBUF;
  275.   TRANTAB (pidrel, itabid);
  276.   
  277.   answer = rflrel (&pidrel, nr, mk_short_arr (nr, rlist), nc, cond);
  278.   stat = answer.cpncob;
  279.   Copy (&(otabid->segid), &(answer.idob.segnum), sizeof (Segid));
  280.   Copy (&(otabid->untabid), &(answer.idob.obnum), sizeof (Unid));
  281.   if (cl_debug)
  282.     fprintf (STDOUT, "BASE.bldtttab: segid=%d,untabid=%dn",
  283.      otabid->segid, (i4_t)otabid->untabid);
  284.   if (stat > 0 && spn)
  285.     *spn = stat;
  286.   return (stat);
  287. } /* bldtttab */
  288. /**********************************************************************/
  289. i4_t 
  290. bldtitab (Indid * indid, Tabid * otabid, i4_t nr, i4_t *rlist, i4_t nc,
  291.   cond_buf_t cond, i4_t nra, cond_buf_t range, i4_t *spn)
  292. #if 0
  293.      /* Building of temporal table on basic of scaning given constant
  294. table with index using. 
  295. The function result is >= 0 in the case of successful finish
  296. and negative one containing the error code otherwise
  297. */
  298.    
  299.      Indid *indid; /* index identifier             */
  300.      Tabid *otabid; /* Result parameter -
  301.    temporal table identifier        */
  302.           
  303.      i4_t nr; /* the number of columns which values
  304.    will be selected from basic table
  305.    and inserted in the temporal one  */
  306.      i4_t rlist[]; /* arrays of column number which
  307.    values will be selected           */
  308.      i4_t nc; /*         */
  309.      Cond *cond; /* condition of current string selecting
  310.    NULL means absence of any conditions */
  311.      i4_t nra; /* range size                         */
  312.      Cond *range; /* scan range is restricted form
  313.    of column condition put on the
  314.    columns included into index
  315.    NULL means undefined range         */
  316.      i4_t *spn; /* number of control point to which the
  317.    rolback has to be done in the case of
  318.    fail in the execution of operation
  319.    because of deadlock                  */ 
  320. #endif
  321. {
  322.   i4_t stat;
  323.   struct ans_ctob answer;
  324.   struct id_ind pidind;
  325.   u2_t page, index;
  326.   if (cl_debug)
  327.     fprintf (STDOUT, "BASE.bldtitab n");
  328.   INITBUF;
  329.   TRANIND (pidind, indid);
  330.        
  331.   answer = rflind (&pidind, nr, mk_short_arr (nr, rlist), nc, cond, nra, range);
  332.   stat = answer.cpncob;
  333.   Copy (&(otabid->segid), &(answer.idob.segnum), sizeof (Segid));
  334.   Copy (&(otabid->untabid), &(answer.idob.obnum), sizeof (Unid));
  335.   if (cl_debug)
  336.     fprintf (STDOUT, "BASE.bldtitab: segid=%d,untabid=%dn",
  337.      otabid->segid, (i4_t)otabid->untabid);
  338.   if (stat > 0 && spn)
  339.     *spn = stat;
  340.   return (stat);
  341. } /* bldtitab */
  342. /**********************************************************************/
  343. i4_t 
  344. bldtftab (Filid * filid, Tabid * otabid, i4_t nr, i4_t *rlist, i4_t nc,
  345.   cond_buf_t cond)
  346. #if 0
  347.      /* Building of temporal table on basic of scaning given constant
  348. table with filter using. 
  349. The function result is >= 0 in the case of successful finish
  350. and negative one containing the error code otherwise
  351. */
  352.      
  353.      Filid *filid; /* filter identifier */
  354.      Tabid *otabid; /* Result parameter -
  355.    temporal table identifier        */
  356.      i4_t nr; /* the number of columns which values
  357.    will be selected from basic table
  358.    and inserted in the temporal one  */
  359.      i4_t rlist[]; /* arrays of column number which
  360.    values will be selected           */
  361.      i4_t nc;
  362.      Cond *cond; /* condition of current string selecting
  363.    NULL means absence of any conditions */
  364. #endif
  365. {
  366.   i4_t stat;
  367.   struct ans_ctob answer;
  368.   
  369.   INITBUF;
  370.   answer = rflflt (*filid, nr, mk_short_arr (nr, rlist), nc, cond);
  371.   stat = answer.cpncob;
  372.   Copy (&(otabid->segid), &(answer.idob.segnum), sizeof (Segid));
  373.   Copy (&(otabid->untabid), &(answer.idob.obnum), sizeof (Unid));
  374.   if (cl_debug)
  375.     fprintf (STDOUT, "BASE.bldtftab: segid=%d,untabid=%dn",
  376.      otabid->segid, (i4_t)otabid->untabid);
  377.   return (stat);
  378. }
  379. /**********************************************************************/
  380. i4_t 
  381. delttab (Tabid * tabid, i4_t nc, cond_buf_t cond, i4_t *spn)
  382. #if 0
  383.      /* string removing from given table which satisfy condition
  384. om basic of table scaning without index or filter using.
  385. The function result is >= 0 in the case of successful finish
  386. and negative one containing the error code otherwise
  387. */
  388.      Tabid *tabid; /* table identifier                   */
  389.      i4_t nc; /* condition size ( in byte )          */
  390.      Cond *cond; /* condition of current string selecting
  391.    NULL means absence of any conditions */
  392.      i4_t *spn; /* number of control point to which the
  393.    rolback has to be done in the case of
  394.    fail in the execution of operation
  395.    because of deadlock                  */ 
  396. #endif
  397. {
  398.   i4_t stat;
  399.   u2_t page, index;
  400.   struct id_rel pidrel;
  401.   
  402.   if (cl_debug)
  403.     fprintf (STDOUT, "BASE. delttabn");
  404.   TRANTAB (pidrel, tabid);
  405.   
  406.   stat = delcrl (&pidrel, nc, cond);
  407.   if (stat > 0)
  408.     *spn = stat;
  409.   return (stat);
  410. }
  411. /**********************************************************************/
  412. i4_t 
  413. delitab (Indid * indid, i4_t nc, cond_buf_t cond, i4_t nra, cond_buf_t range,
  414.  i4_t *spn)
  415. #if 0
  416.      /* string removing from given table which satisfy condition
  417. om basic of table scaning with index using.
  418. The function result is >= 0 in the case of successful finish
  419. and negative one containing the error code otherwise
  420. */
  421.  
  422.      Indid *indid; /* table identifier                   */
  423.      i4_t nc; /* condition size ( in byte )         */
  424.      Cond *cond; /* condition of current string selecting
  425.    NULL means absence of any conditions */
  426.      i4_t nra; /* range size                         */
  427.      Cond *range; /* scan range is restricted form
  428.    of column condition put on the
  429.    columns included into index
  430.    NULL means undefined range         */
  431.      i4_t *spn; /* number of control point to which the
  432.    rolback has to be done in the case of
  433.    fail in the execution of operation
  434.    because of deadlock                  */ 
  435. #endif
  436. {
  437.   i4_t stat;
  438.   u2_t page, index;
  439.   struct id_ind pidind;
  440.   
  441.   TRANIND (pidind, indid);
  442.   
  443.   stat = delcin (&pidind, nc, cond, nra, range);
  444.   if (stat > 0)
  445.     *spn = stat;
  446.   return (stat);
  447. }
  448. /**********************************************************************/
  449. i4_t 
  450. delftab (Filid * filid, i4_t nc, cond_buf_t cond, i4_t *spn)
  451. #if 0
  452.      /* string removing from given table which satisfy condition
  453. om basic of table scaning with filter using.
  454. The function result is >= 0 in the case of successful finish
  455. and negative one containing the error code otherwise
  456. */
  457.  
  458.      Filid *filid; /* filter identifier                  */
  459.      i4_t nc;
  460.      Cond *cond; /* condition of current string selecting
  461.    NULL means absence of any conditions */
  462.      i4_t *spn; /* number of control point to which the
  463.    rolback has to be done in the case of
  464.    fail in the execution of operation
  465.    because of deadlock                  */ 
  466. #endif
  467. {
  468.   i4_t stat;
  469.   
  470.   stat = delcfl (*filid, nc, cond);
  471.   if (stat > 0)
  472.     *spn = stat;
  473.   return (stat);
  474. }
  475. /**********************************************************************/
  476. i4_t 
  477. modttab (Tabid * tabid, i4_t nc, cond_buf_t cond, i4_t nm, i4_t *mlist,
  478.  Colval lenval, Colval colval, i4_t *spn)
  479. #if 0
  480.      /* function updates strings in given table if they
  481. satisfies condition on the basic of table scaning 
  482. without index or filter using.
  483. The function result is >= 0 in the case of successful finish
  484. and negative one containing the error code otherwise
  485. */
  486.  
  487.      Tabid *tabid; /* table identifier                   */
  488.      i4_t nc;
  489.      Cond *cond; /* condition of current string selecting
  490.    NULL means absence of any conditions */
  491.      i4_t nm; /* the number of columns which values
  492.    will be modified                     */
  493.      i4_t mlist[]; /* array  of columns which values
  494.    will be modified                     */
  495.      Colval lenval; /* pointer of lenght array              */
  496.      Colval colval; /* pointer of new values of current
  497.    string array; the number of pointers 
  498.    in array has to be equal the value of
  499.    "nm" parameter, NULL pointer is NULL
  500.    corresponds undefined value of 
  501.    responding column                    */
  502.      i4_t *spn; /* number of control point to which the
  503.    rolback has to be done in the case of
  504.    fail in the execution of operation
  505.    because of deadlock                  */ 
  506. #endif
  507. {
  508.   i4_t stat;
  509.   u2_t page, index;
  510.   i4_t len = 0, i;
  511.   struct id_rel pidrel;
  512.   char bufbyte = 0;
  513.   
  514.   INITBUF;
  515.   TRANTAB (pidrel, tabid);
  516.   
  517.   for (i = 0; i < nm; i++)
  518.     {
  519.       if (colval[i] == NULL)
  520. bufbyte |= EQUN;
  521.       else
  522. bufbyte |= NEQ;
  523.       if (i & 01 == 0)
  524. bufbyte <<= 4;
  525.       else
  526. {
  527.   *pointbuf++ = bufbyte;
  528.   len += 1;
  529.   bufbyte = 0;
  530. }
  531.     }
  532. /*    tuple with length to buffer   */
  533.   for (i = 0; i < nm; i++)
  534.     {
  535.       if (colval[i] != NULL)
  536. {
  537.   stat = Copy (pointbuf, lenval[i], sizeof (u2_t));
  538.   stat = Copy (pointbuf, colval[i], *(u2_t *) lenval[i]);
  539.   RTN (stat);
  540.   len += stat + sizeof (u2_t);
  541. }
  542.     }
  543.   stat = modcrl (&pidrel, nc, cond, nm, mk_short_arr (nm, mlist), len, buffer);
  544.   if (stat > 0)
  545.     *spn = stat;
  546.   return (stat);
  547. }
  548. /**********************************************************************/
  549. i4_t 
  550. moditab (Indid * indid, i4_t nc, cond_buf_t cond, i4_t nr, cond_buf_t range,
  551.  i4_t nm, i4_t *mlist, Colval lenval, Colval colval, i4_t *spn)
  552. #if 0
  553.      /* function updates strings in given table if they
  554. satisfies condition on the basic of table scaning 
  555. with index using.
  556. The function result is >= 0 in the case of successful finish
  557. and negative one containing the error code otherwise
  558. */
  559.      Indid *indid; /* index identifier                   */
  560.      i4_t nc;
  561.      Cond *cond; /* condition of current string selecting
  562.    NULL means absence of any conditions */
  563.      i4_t nr;
  564.      Cond *range; /* scan range is restricted form
  565.    of column condition put on the
  566.    columns included into index
  567.    NULL means undefined range         */
  568.      i4_t nm; /* the number of columns which values
  569.    will be modified                     */
  570.      i4_t mlist[]; /* array  of columns which values
  571.    will be modified                     */
  572.      Colval lenval; /* pointer of lenght array              */
  573.      Colval colval; /* pointer of new values of current
  574.    string array; the number of pointers 
  575.    in array has to be equal the value of
  576.    "nm" parameter, NULL pointer is NULL
  577.    corresponds undefined value of 
  578.    responding column                    */
  579.      i4_t *spn; /* number of control point to which the
  580.    rolback has to be done in the case of
  581.    fail in the execution of operation
  582.    because of deadlock                  */ 
  583. #endif
  584. {
  585.   i4_t stat;
  586.   struct id_ind pidind;
  587.   i4_t len = 0, i;
  588.   u2_t page, index;
  589.   char bufbyte = 0;
  590.   
  591.   INITBUF;
  592.   TRANIND (pidind, indid);
  593.   
  594.   for (i = 0; i < nm; i++)
  595.     {
  596.       if (colval[i] == NULL)
  597. bufbyte |= EQUN;
  598.       else
  599. bufbyte |= NEQ;
  600.       if (i & 01 == 0)
  601. bufbyte = bufbyte << 4;
  602.       else
  603. {
  604.   *pointbuf++ = bufbyte;
  605.   len += 1;
  606.   bufbyte = 0;
  607. }
  608.     }
  609. /*    tuple with length to buffer   */
  610.   for (i = 0; i < nm; i++)
  611.     {
  612.       if (colval[i] != NULL)
  613. {
  614.   stat = Copy (pointbuf, lenval[i], sizeof (u2_t));
  615.   stat = Copy (pointbuf, colval[i], (*(u2_t *) lenval[i]));
  616.   RTN (stat);
  617.   len += stat + sizeof (u2_t);
  618. }
  619.     }
  620.   stat = modcin (&pidind, nc, cond, nr, range,
  621.                  nm, mk_short_arr (nm, mlist), len, buffer);
  622.   if (stat > 0)
  623.     *spn = stat;
  624.   return (stat);
  625. }
  626. /**********************************************************************/
  627. i4_t 
  628. modftab (Filid * filid, i4_t nc, cond_buf_t cond, i4_t nm, i4_t *mlist,
  629.  Colval lenval, Colval colval, i4_t *spn)
  630. #if 0
  631.      /* function updates strings in given table if they
  632. satisfies condition on the basic of table scaning 
  633. with filter using.
  634. The function result is >= 0 in the case of successful finish
  635. and negative one containing the error code otherwise
  636. */
  637.  
  638.      Filid *filid; /* filter identifier                  */
  639.      i4_t nc; /*        */
  640.      Cond *cond; /* condition of current string selecting
  641.    NULL means absence of any conditions */
  642.      i4_t nm; /* the number of column number  which
  643.    values will be modified              */
  644.      i4_t mlist[]; /* array  of columns which values
  645.    will be modified                     */
  646.      Colval lenval;             /* pointer of lenght array              */
  647.      Colval colval; /* pointer of new values of current
  648.    string array; the number of pointers 
  649.    in array has to be equal the value of
  650.    "nm" parameter, NULL pointer is NULL
  651.    corresponds undefined value of 
  652.    responding column                    */
  653.      i4_t *spn; /* number of control point to which the
  654.    rolback has to be done in the case of
  655.    fail in the execution of operation
  656.    because of deadlock                  */ 
  657. #endif
  658. {
  659.   i4_t stat;
  660.   i4_t len = 0, i;
  661.   char bufbyte = 0;
  662.   
  663.   INITBUF;
  664.   
  665.   for (i = 0; i < nm; i++)
  666.     {
  667.       if (colval[i] == NULL)
  668. bufbyte |= EQUN;
  669.       else
  670. bufbyte |= NEQ;
  671.       if (i & 01 == 0)
  672. bufbyte = bufbyte << 4;
  673.       else
  674. {
  675.   *pointbuf++ = bufbyte;
  676.   len += 1;
  677.   bufbyte = 0;
  678. }
  679.     }
  680. /*    tuple to buffer   */
  681.   for (i = 0; i < nm; i++)
  682.     {
  683.       if (colval[i] != NULL)
  684. {
  685.   stat = Copy (pointbuf, lenval[i], sizeof (u2_t));
  686.   stat = Copy (pointbuf, colval[i], *(u2_t *) lenval[i]);
  687.   RTN (stat);
  688.   len += stat + sizeof (u2_t);
  689. }
  690.     }
  691.   stat = modcfl (*filid, nc, cond, nm, mk_short_arr (nm, mlist), len, buffer);
  692.   if (stat > 0)
  693.     *spn = stat;
  694.   return (stat);
  695. }
  696. /**********************************************************************/
  697. i4_t 
  698. instttab (Tabid * itabid, Tabid * otabid, i4_t nr, i4_t *rlist,
  699.   i4_t nc, cond_buf_t cond, i4_t *spn)
  700. #if 0
  701.      /* inserts set of strings received by scaning another
  702. table with given condition without index or filter
  703. using. 
  704. The function result is >= 0 in the case of successful 
  705. finish and negative one containing the error code otherwise
  706. */
  707.  
  708.     
  709.      Tabid *itabid; /* scaned table identifier           */
  710.      Tabid *otabid; /* identifier of the table in which
  711.    strings are inserted              */
  712.      i4_t nr; /* the number of columns which will be
  713.    selected from basic table and
  714.    inserted in temporal one          */
  715.      i4_t rlist[]; /* array  of column number  which
  716.    values  will be selected          */
  717.      i4_t nc;                    /* condition size                    */
  718.      Cond *cond; /* condition of current string selecting
  719.    NULL means absence of any conditions */
  720.      i4_t *spn; /* number of control point to which the
  721.    rolback has to be done in the case of
  722.    fail in the execution of operation
  723.    because of deadlock                  */ 
  724. #endif
  725. {
  726.   i4_t stat;
  727.   struct id_rel ipidrel, pidrel;
  728.   u2_t page, index;
  729.   
  730.   if (cl_debug)
  731.     fprintf (STDOUT, "BASE.instttab n");
  732.   INITBUF;
  733.   TRANTAB (pidrel, itabid);
  734.   TRANTAB (ipidrel, otabid);
  735.   
  736.   stat = inscrl (&pidrel, &ipidrel, nr, mk_short_arr (nr, rlist), nc, cond);
  737.   if (stat > 0)
  738.     *spn = stat;
  739.   return (stat);
  740. }
  741. /**********************************************************************/
  742. i4_t 
  743. institab (Indid * indid, Tabid * otabid, i4_t nr, i4_t *rlist, i4_t nc,
  744.   cond_buf_t cond, i4_t nra, cond_buf_t range, i4_t *spn)
  745. #if 0
  746.      /* inserts set of strings received by scaning another
  747. table with given condition with index using. 
  748. The function result is >= 0 in the case of successful 
  749. finish and negative one containing the error code otherwise
  750. */
  751.   
  752.      Indid *indid; /* scaned table identifier           */
  753.      Tabid *otabid; /* identifier of the table in which
  754.    strings are inserted              */
  755.      i4_t nr; /* the number of columns which will be
  756.    selected from basic table and
  757.    inserted in temporal one          */
  758.      i4_t rlist[]; /* array  of column number  which
  759.    values  will be selected          */
  760.      i4_t nc; /* condition size                    */
  761.      Cond *cond; /* condition of current string selecting
  762.    NULL means absence of any conditions */
  763.      i4_t nra; /* scan range size                    */
  764.      Cond *range; /* scan range is restricted form
  765.    of column condition put on the
  766.    columns included into index
  767.    NULL means undefined range         */
  768.      i4_t *spn; /* number of control point to which the
  769.    rolback has to be done in the case of
  770.    fail in the execution of operation
  771.    because of deadlock                  */ 
  772. #endif
  773. {
  774.   i4_t stat;
  775.   struct id_ind pidind;
  776.   u2_t page, index;
  777.   struct id_rel pidrel;
  778.   
  779.   INITBUF;
  780.   TRANIND (pidind, indid);
  781.   if (cl_debug)
  782.     fprintf (STDOUT, "BASE.institab n");
  783.   TRANTAB (pidrel, otabid);
  784.   
  785.   stat = inscin (&pidind, &pidrel, nr,
  786.                  mk_short_arr (nr, rlist), nc, cond, nra, range);
  787.   if (stat > 0)
  788.     *spn = stat;
  789.   return (stat);
  790. }
  791. /**********************************************************************/
  792. i4_t 
  793. instftab (Filid * filid, Tabid * otabid, i4_t nr, i4_t *rlist, i4_t nc,
  794.   cond_buf_t cond, i4_t *spn)
  795. #if 0
  796.      /* inserts set of strings received by scaning another
  797. table with given condition with filter using. 
  798. The function result is >= 0 in the case of successful 
  799. finish and negative one containing the error code otherwise
  800. */
  801.  
  802.      Filid *filid; /* identifier of scaned table filter   */
  803.      Tabid *otabid; /* identifier of the table in which
  804.    strings are inserted              */
  805.      i4_t nr; /* the number of columns which will be
  806.    selected from basic table and
  807.    inserted in temporal one          */
  808.      i4_t rlist[]; /* array  of column number  which
  809.    values  will be selected          */
  810.      i4_t nc; /*  condition size                   */
  811.      Cond *cond; /* condition of current string selecting
  812.    NULL means absence of any conditions */
  813.      i4_t *spn; /* number of control point to which the
  814.    rolback has to be done in the case of
  815.    fail in the execution of operation
  816.    because of deadlock                  */ 
  817. #endif
  818. {
  819.   i4_t stat;
  820.   struct id_rel pidrel;
  821.   u2_t page, index;
  822.   if (cl_debug)
  823.     fprintf (STDOUT, "BASE.instftab n");
  824.   INITBUF;
  825.   TRANTAB (pidrel, otabid);
  826.   
  827.   stat = inscfl (*filid, &pidrel, nr, mk_short_arr (nr, rlist), nc, cond);
  828.   if (stat > 0)
  829.     *spn = stat;
  830.   return (stat);
  831. }
  832. /**********************************************************************/
  833. i4_t 
  834. jnsttab (Tabid * i1tabid, Tabid * i2tabid, Tabid * otabid, i4_t ns,
  835.  i4_t *r1list, i4_t *r2list)
  836. #if 0
  837.      /* natural joining of two sorted in the same order
  838. temporal relations and locating result in new
  839. sorted in the same order and columns temporal
  840. relation
  841. */
  842.  
  843.      Tabid *i1tabid;         /* identifier of the first original
  844.            temporal relation                    */
  845.      Tabid *i2tabid; /* identifier of the second original
  846.            temporal relation                    */
  847.      Tabid *otabid; /* identefier of the result
  848.            temporal relation                    */
  849.      i4_t ns; /* the number of columns on which 
  850.            values the natural joining 
  851.            is produced                          */
  852.      i4_t r1list[]; /* array of column numbers on which
  853.            values  the natural joining 
  854.    is produced                          */
  855.      i4_t r2list[]; /* array of column numbers of the second
  856.    relation by which values the
  857.    natural joining is produced          */
  858. #endif
  859. {
  860.   i4_t stat;
  861.   struct ans_ctob answer;
  862.   struct id_rel pit1, pit2;
  863.   u2_t page, index;
  864.   
  865.   TRANTAB (pit1, i1tabid);
  866.   TRANTAB (pit2, i2tabid);
  867.   if (cl_debug)
  868.     fprintf (STDOUT, "BASE.jnsttab n");
  869.   INITBUF;
  870.   answer = join (&pit1, ns, mk_short_arr (ns, r1list),
  871.                  &pit2, ns, mk_short_arr (ns, r2list));
  872.   stat = answer.cpncob;
  873.   Copy (&(otabid->segid), &(answer.idob.segnum), sizeof (Segid));
  874.   Copy (&(otabid->untabid), &(answer.idob.obnum), sizeof (Unid));
  875.   if (cl_debug)
  876.     fprintf (STDOUT, "BASE.jnsttab: segid=%d,untabid=%dn",
  877.      otabid->segid, (i4_t)otabid->untabid);
  878.   return (stat);
  879. }
  880. /*---------------------------------------------*/
  881. /*            aggregate functions              */
  882. /*---------- only  "SUM" is absent !!! --------*/
  883. i4_t 
  884. cnt_ttab (Tabid * tabid, i4_t nc, cond_buf_t cond)
  885. #if 0
  886.      /* counting the number of the strings on basic of scaning
  887. basic table without index or filter using;
  888. The function result is >= 0 in the case of successful 
  889. finish and negative one containing the error code otherwise
  890. */
  891.     
  892.      Tabid *tabid; /* table identifier                   */
  893.      i4_t nc; /* condition size ( in bytes )        */
  894.      Cond *cond; /* condition of current string selecting
  895.    NULL means absence of any conditions */
  896. #endif
  897. {
  898.   i4_t stat;
  899.   struct ans_cnt *answer;
  900.   struct id_rel pidrel;
  901.   u2_t page, index;
  902.   answer = (struct ans_cnt *)res_buf;
  903.   if (cl_debug)
  904.     fprintf (STDOUT, "BASE.cntttab n");
  905.   TRANTAB (pidrel, tabid);
  906.   
  907.   cntttab (answer, &pidrel, nc, cond);
  908.   stat = answer->cpncnt;
  909.   if (stat < 0)
  910.     return (stat);
  911. /*   if(stat > 0 )  *spn = stat;   */
  912.   return (answer->cntn);
  913. }
  914. /*--------------------------------------------------------*/
  915. i4_t 
  916. cnt_itab (Indid * indid, i4_t nc, cond_buf_t cond, i4_t nr, cond_buf_t range)
  917. #if 0
  918.      /* counting the number of the strings on basic of scaning
  919. basic table with index using;
  920. The function result is >= 0 in the case of successful 
  921. finish and negative one containing the error code otherwise
  922. */
  923.     
  924.      Indid *indid; /* index identifier                   */
  925.      i4_t nc; /* condition size ( in bytes )        */
  926.      Cond *cond; /* condition of current string selecting
  927.    NULL means absence of any conditions */
  928.      i4_t nr; /* range size ( in bytes )            */
  929.      Cond *range; /* scan range is restricted form
  930.    of column condition put on the
  931.    columns included into index
  932.    NULL means undefined range         */
  933. #endif
  934. {
  935.   i4_t stat;
  936.   struct ans_cnt *answer = (struct ans_cnt *)res_buf;
  937.   struct id_ind pidind;
  938.   u2_t page, index;
  939.   if (cl_debug)
  940.     fprintf (STDOUT, "BASE.cntitab n");
  941.   TRANIND(pidind,indid);
  942.   cntitab (answer, &pidind, nc, cond, nr, range);
  943.   stat = answer->cpncnt;
  944.   if (stat < 0)
  945.     return (stat);
  946. /*     if(stat > 0 )  *spn = stat;     */
  947.   return (answer->cntn);
  948. }
  949. /*--------------------------------------------------------*/
  950. i4_t 
  951. cnt_ftab (Filid * filid, i4_t nc, cond_buf_t cond)
  952. #if 0
  953.      /* counting the number of the strings on basic of scaning
  954. basic table with filter using;
  955. The function result is >= 0 in the case of successful 
  956. finish and negative one containing the error code otherwise
  957. */
  958.      Filid *filid; /* filter identifier                  */
  959.      i4_t nc; /* condition size ( in bytes )        */
  960.      Cond *cond; /* condition of current string selecting
  961.    NULL means absence of any conditions */
  962. #endif
  963. {
  964.   return cntftab (*filid, nc, cond);
  965. }
  966. /*--------------------------------------------------------*/
  967. /*--------------------------------------------------------*/
  968. i4_t 
  969. maxminavgitab (Indid * indid, i4_t maxminavg, i4_t nc, cond_buf_t cond,
  970.        i4_t nr, cond_buf_t range, i4_t code)
  971. #if 0
  972.      /* counting the maximum or minimum or average of values of
  973. the first field key of index on basic of given table scaning
  974. with index using.
  975. The function result is >= 0 in the case of successful 
  976. finish and negative one containing the error code otherwise
  977. */
  978.      Indid *indid; /* index identifier                  */
  979.      i4_t maxminavg; /* result                            */
  980.      i4_t nc; /* condition size ( in bytes )       */
  981.      Cond *cond; /* condition of current string selecting
  982.    NULL means absence of any conditions */
  983.      i4_t nr; /* range size ( in byte )             */
  984.      Cond *range; /* scan range is restricted form
  985.    of column condition put on the
  986.    columns included into index
  987.    NULL means undefined range         */
  988. #endif
  989. {
  990.   i4_t stat;
  991.   struct ans_next *answer;
  992.   struct id_ind pidind;
  993.   u2_t page, index;
  994.   
  995.   answer = (struct ans_next *)res_buf;
  996.   if (cl_debug)
  997.     {
  998.       if( code==(i4_t) MAXITAB)
  999. fprintf (STDOUT, "BASE.maxitab n"); 
  1000.       if ( code==(i4_t) MINITAB )
  1001. fprintf (STDOUT, "BASE.minitab n");
  1002.       if ( code==(i4_t)AVGITAB )
  1003. fprintf (STDOUT, "BASE.avgitab n");
  1004.     }
  1005.   TRANIND (pidind, indid);
  1006.   
  1007.   answer->csznxt = 0;
  1008.   switch (code)
  1009.     {
  1010.     case MAXITAB : maxitab (answer, &pidind, nc, cond, nr, range);
  1011.                    break;
  1012.     case MINITAB : minitab (answer, &pidind, nc, cond, nr, range);
  1013.       break;
  1014.    /*
  1015.     case AVGITAB : avgitab (answer, &pidind, nc, cond, nr, range);
  1016.     break;
  1017.     */
  1018.     }
  1019.   stat = answer->cotnxt;
  1020.   if (stat < 0)
  1021.     return (stat);
  1022.   return ((i4_t) (answer->cadnxt));
  1023. }
  1024. /*--------------------------------------------------------*/
  1025. i4_t 
  1026. minmaxavgstab (Tabid * tabid, i4_t minmaxavg, i4_t code)
  1027. #if 0
  1028.      /* counting the maximum or minimum or average of values of
  1029. the first field of value of sorting for sorted temporal
  1030. table.
  1031. The function result is >= 0 in the case of successful 
  1032. finish and negative one containing the error code otherwise
  1033. */
  1034.  
  1035.      Tabid *tabid; /* temporal relation identifier       */
  1036.      i4_t minmaxavg;       /* result                             */
  1037. #endif
  1038. {
  1039.   i4_t stat, res;
  1040.   struct id_rel pidrel;
  1041.   u2_t page, index;
  1042.   if (cl_debug)
  1043.     {
  1044.       if( code==(i4_t)MINSTAB )
  1045. fprintf (STDOUT, "BASE.minstab n");
  1046.       if( code==(i4_t)MAXSTAB )
  1047. fprintf (STDOUT, "BASE.maxstab n");
  1048.       if( code==(i4_t)AVGSTAB )
  1049. fprintf (STDOUT, "BASE.avgstab n");
  1050.     }
  1051.   TRANTAB(pidrel,tabid);
  1052.   switch (code)
  1053.     {
  1054.     case MINSTAB :
  1055.       stat = minstab (&pidrel, (char *)(&res));
  1056.       break;
  1057.     case MAXSTAB :
  1058.       stat = maxstab (&pidrel, (char *)(&res));
  1059.       break;
  1060.     default:
  1061.       stat = -1;
  1062.    /* This function can't return the result of this operation
  1063.     case AVGSTAB : answer = minstab (&pidrel, p);
  1064.     break;
  1065.     */
  1066.     }
  1067.   if (stat < 0)
  1068.     return (stat);
  1069. /*   if(stat > 0 )  *spn = stat;   */
  1070.   return (res);
  1071. }
  1072. /*----------------------------------------------------------*/
  1073. i4_t 
  1074. funci (Indid * indid, i4_t *spn, i4_t nc, cond_buf_t cond,
  1075.        i4_t nr, cond_buf_t range, DataUnit **colval, i4_t nf, 
  1076.        i4_t *flist, char *fl)
  1077. #if 0
  1078.      /* computing of aggregate functions on basic of table scaning
  1079. with index using
  1080. */
  1081.  
  1082.      Indid *indid; /* index identifier                   */
  1083.      i4_t *spn; /* number of control point to which the
  1084.    rolback has to be done in the case of
  1085.    fail in the execution of operation
  1086.    because of deadlock                  */ 
  1087.      i4_t nc; /* condition size ( in bytes )       */
  1088.      char *cond; /* condition of current string selecting
  1089.    NULL means absence of any conditions */
  1090.      i4_t nr; /* range size                         */
  1091.      Cond *range; /* scan range is restricted form
  1092.    of column condition put on the
  1093.    columns included into index
  1094.    NULL means undefined range         */
  1095.      DataUnit **colval; /* array of pointer for location of 
  1096.    function values; the number of pointers
  1097.    in the array has to be equal to value
  1098.    of parameter "nf"                  */
  1099.      i4_t nf;                    /* the number of columns for which 
  1100.    functions have be used           */
  1101.                        
  1102.      i4_t flist[]; /* array of column values for which 
  1103.    functions have be used */
  1104.      char *fl; /* char fl[nf-1] - string of flags,  *
  1105.                          * corresponding every elements      *
  1106.                          * from flist[].                     */
  1107. #endif
  1108. {
  1109.   i4_t stat, i, m, err;
  1110.   struct ans_next *answer;
  1111.   struct id_ind pidind;
  1112.   u2_t page, index;
  1113.   
  1114.   answer = (struct ans_next *)res_buf;
  1115.   if (cl_debug)
  1116.     fprintf (STDOUT, "BASE.funci n");
  1117.   INITBUF;
  1118.   TRANIND(pidind,indid);
  1119.   agrfind (answer, &pidind, nf, mk_short_arr (nf, flist), nc, cond, nr, range, fl);
  1120. /*    analasing of answer and writing it in colval       */
  1121.   stat = answer->cotnxt;
  1122.   if (stat < 0)
  1123.     return (stat);
  1124.   m = answer->csznxt;
  1125.   if (cl_debug)
  1126.     fprintf (STDOUT, "BASE:funci csznxt=%dn", m);
  1127.   for (i = 0; i < m; i++)
  1128.     if (cl_debug)
  1129.       fprintf (STDOUT, "%X ", answer->cadnxt[i]);
  1130.   
  1131.   err = res_row_save (answer->cadnxt, nr, colval);
  1132.   if (err < 0)
  1133.     return err;
  1134.   
  1135.   if (cl_debug)
  1136.     fprintf (STDOUT, "BASE:end funci n");
  1137.   if (stat > 0 && spn)
  1138.     *spn = stat;
  1139.   return (stat);
  1140. } /* funci */
  1141. /*--------------------------------------------------------*/
  1142. i4_t 
  1143. func (Tabid * tabid, i4_t *spn, i4_t nc, cond_buf_t cond,
  1144.       DataUnit **colval, i4_t nf, i4_t *flist, char *fl)
  1145. #if 0
  1146.      /* computing of aggregate functions on basic of table scaning
  1147. without index or filter using
  1148. */
  1149.    
  1150.      Tabid *tabid; /* table identifier                   */
  1151.      i4_t *spn; /* number of control point to which the
  1152.    rolback has to be done in the case of
  1153.    fail in the execution of operation
  1154.    because of deadlock                  */ 
  1155.      i4_t nc;                    /* condition size ( in bytes )       */
  1156.      char *cond; /* condition of current string selecting
  1157.    NULL means absence of any conditions */
  1158.      DataUnit **colval; /* array of pointer for location of 
  1159.    function values; the number of pointers
  1160.    in the array has to be equal to value
  1161.    of parameter "nf"                    */
  1162.      i4_t nf; /* the number of columns for which 
  1163.    functions have be used           */
  1164.      i4_t flist[]; /* array of column values for which 
  1165.    functions have be used */
  1166.      char *fl; /* char fl[nf-1] - string of flags  *
  1167.                          * corresponding every elements     *
  1168.                          * from flist[].                    */
  1169. #endif
  1170. {
  1171.   i4_t stat, i, m, err;
  1172.   struct ans_next *answer;
  1173.   u2_t page, index;
  1174.   struct id_rel pidrel;
  1175.   
  1176.   answer = (struct ans_next *)res_buf;
  1177.   if (cl_debug)
  1178.     fprintf (STDOUT, "BASE.func n");
  1179.   INITBUF;
  1180.   TRANTAB(pidrel,tabid);
  1181.   agrfrel (answer, &pidrel, nf, mk_short_arr (nf, flist), nc, cond, fl);
  1182. /*   analising of answer and writing it in colval         */
  1183.   stat = answer->cotnxt;
  1184.   if (stat < 0)
  1185.     return (stat);
  1186.   m = answer->csznxt;
  1187.   if (cl_debug)
  1188.     fprintf (STDOUT, "BASE:func csznxt=%dn", m);
  1189.   for (i = 0; i < m; i++)
  1190.     if (cl_debug)
  1191.       fprintf (STDOUT, "%X ", answer->cadnxt[i]);
  1192.   
  1193.   err = res_row_save (answer->cadnxt, nf, colval);
  1194.   if (err < 0)
  1195.     return err;
  1196.   
  1197.   if (cl_debug)
  1198.     fprintf (STDOUT, "BASE:end func n");
  1199.   if (stat > 0 && spn)
  1200.     *spn = stat;
  1201.   return (stat);
  1202. } /* func */
  1203. /*--------------------- E N D  P A R T 2 ------------------ */