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

SQL Server

开发平台:

Unix_Linux

  1. /*
  2.  *  libfunc1.c  -  engine interface library (part 1)
  3.  *                 GNU SQL server
  4.  *
  5.  *  This file is a part of GNU SQL Server
  6.  *
  7.  *  Copyright (c) 1996, 1997, Free Software Foundation, Inc
  8.  *  Developed at the Institute of System Programming
  9.  *  This file is written by Konstantin Dyshlevoi
  10.  *
  11.  *  This program is free software; you can redistribute it and/or modify
  12.  *  it under the terms of the GNU General Public License as published by
  13.  *  the Free Software Foundation; either version 2 of the License, or
  14.  *  (at your option) any later version.
  15.  *
  16.  *  This program is distributed in the hope that it will be useful,
  17.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  18.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  19.  *  GNU General Public License for more details.
  20.  *
  21.  *  You should have received a copy of the GNU General Public License
  22.  *  along with this program; if not, write to the Free Software
  23.  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  24.  *
  25.  *  Contacts: gss@ispras.ru
  26.  *
  27.  */
  28. /* $Id: libfunc1.c,v 1.245 1997/03/31 03:46:38 kml Exp $ */
  29. #include "setup_os.h"
  30. #ifdef HAVE_UNISTD_H
  31. #include <unistd.h>
  32. #endif
  33. #include "engine/pupsi.h"
  34. #include "sql_decl.h"
  35. #include "type_lib.h"
  36. #include "pr_glob.h"
  37. #include "typeif.h"
  38. #include "engine/tptrn.h"
  39. #include "engine/expop.h"
  40. #include "engine/destrn.h"
  41. #include "engine/strml.h"
  42. #include "engine/expop.h"
  43. #include "engine/fdcltrn.h"
  44. #include "exti.h"
  45. #include "assert.h"
  46. #include "funall.h"
  47. /*---------------------------------------------*/
  48. EXTERNAL char res_buf[SOC_BUF_SIZE];
  49. EXTERNAL char buffer[SOC_BUF_SIZE];
  50. EXTERNAL char *pointbuf;
  51. /*---------------------------------------------*/
  52. #define RTN(s)        if( s < 0 ) return (s )
  53. #define INITBUF       pointbuf = buffer
  54. /*--------------------------------------------------*/
  55. #define TRANIND(pidind,indid);  page=(u2_t)(((*indid).tabid.tabd)>>16);
  56.      index=(u2_t)(((*indid).tabid.tabd)&0xFFFF); 
  57.      Copy(&(pidind.irii.urn.segnum),
  58.                    &((*indid).tabid.segid ),sizeof(Segid) );
  59.      Copy(&(pidind.irii.urn.obnum ),
  60.                    &((*indid).tabid.untabid),sizeof(Unid)  );
  61.      Copy(&(pidind.irii.pagenum),&page,sizeof(u2_t) );
  62.      Copy(&(pidind.irii.index),&index,sizeof(u2_t) );
  63.      Copy(&(pidind.inii),&((*indid).unindid),sizeof(Unid) );
  64. /*--------------------------------------------------------*/
  65. #define TRANTAB(pidrel,tabid)  page=(u2_t)((tabid->tabd)>>16);
  66.      index=(u2_t)((tabid->tabd)&0xFFFF);
  67.      Copy(&(pidrel.urn.segnum),&(tabid->segid ),sizeof(Segid) );
  68.      Copy(&(pidrel.urn.obnum ),&(tabid->untabid),sizeof(Unid)  );
  69.      Copy(&(pidrel.pagenum),&page,sizeof(u2_t) );
  70.      Copy(&(pidrel.index),&index,sizeof(u2_t) );
  71.  /*---------------------------------------------*/
  72. #define PUTIND(indid,answer);     Copy(&((*indid).tabid.segid),
  73.                 &(answer.idinci.irii.urn.segnum),sizeof(Segid) );
  74.      Copy(&((*indid).tabid.untabid),
  75.                 &(answer.idinci.irii.urn.obnum),sizeof(Unid) );
  76. tid = ((i4_t)(answer.idinci.irii.pagenum)<<16)|(i4_t)(answer.idinci.irii.index);
  77.      Copy(&((*indid).tabid.tabd),&(tid),sizeof(Tid) );
  78.      Copy(&((*indid).unindid),&(answer.idinci.inii),sizeof(Unid) );
  79. /*------------------------------------------------*/
  80. #define PUTTAB(tabid,answer);     Copy(&(tabid->segid),
  81.                             &(answer.idracr.urn.segnum),sizeof(Segid) );
  82.      Copy(&(tabid->untabid),&(answer.idracr.urn.obnum),sizeof(Unid) );
  83.      tid = ((i4_t)(answer.idracr.pagenum)<<16)|(i4_t)(answer.idracr.index);
  84.      Copy(&(tabid->tabd),&(tid),sizeof(Tid) );
  85. /*================================================================*/
  86. u2_t *
  87. mk_short_arr(i4_t num, i4_t *arr)
  88. {
  89.   i4_t i, align;
  90.   u2_t *res;
  91.   
  92.   if ((align = (pointbuf - buffer)%SZ_LNG))
  93.     pointbuf+= SZ_LNG - align;
  94.   res = (u2_t *)pointbuf;
  95.   pointbuf += sizeof(u2_t) * num;
  96.   for(i=0; i<num; i++)
  97.     {
  98.       assert(arr[i]>=0); 
  99.       assert(arr[i]<0xffffL); 
  100.       res[i] = (u2_t)arr[i];
  101.     }
  102.   return res;
  103. } /* mk_short_arr */
  104. i4_t 
  105. opentscan (Tabid * tabid, i4_t *spn, char mode, i4_t nr, i4_t *rlist,
  106.    i4_t nc, cond_buf_t cond, i4_t nm, i4_t *mlist)
  107. #if 0
  108.      /* table scan opening without using of index or filter,
  109.       * function value if scan identifier or negative number
  110.       * containing error code
  111.      */
  112.      Tabid *tabid; /* relation identifier    */
  113.      i4_t *spn; /* the number or control point till wich
  114.  * rollback has to be done when breaking of 
  115.  * scan open was coused by deadlock           */
  116.      char mode; /* open mode:string containing wether one of
  117.  * symbols R-reading, D-deleting, M-updating
  118.  * or combination of D and M                  */
  119.      i4_t nr;         /* the number of columns which values will
  120.  * be selected                                */
  121.      i4_t rlist[];       /* array of column numbers which values will
  122.  * be selected                                */
  123.      i4_t nc;            /* size of select condition                   */
  124.      cond_buf_t cond;   /* condition of current string selection
  125.                          * NULL - condition is absent                 */
  126.      i4_t nm;         /* the number of column which values will
  127.  * be updated                        */
  128.      i4_t mlist[]; /* array of column numbers which values will
  129.  * be updated                                 */
  130. #endif
  131. {
  132.   i4_t stat;
  133.   struct ans_opsc answer;
  134.   u2_t page, index;
  135.   struct id_rel pidrel;
  136.   if (cl_debug)
  137.     fprintf (STDOUT, "BASE.opentscan n");
  138.   TRANTAB (pidrel, tabid);
  139.   INITBUF;
  140.   
  141.   answer = opscrel (&pidrel, mode, nr, mk_short_arr (nr, rlist),
  142.     nc, cond, nm, mk_short_arr (nm, mlist));
  143.   
  144.   stat = answer.cpnops;
  145.   if (stat < 0)
  146.     return (stat);
  147.   if (stat > 0)
  148.     *spn = stat;
  149.   if (cl_debug)
  150.     fprintf (STDOUT, "BASE.opentscan  answer=%dn", stat);
  151.   return (answer.scnum);
  152. } /* opentscan */
  153. /*--------------------------------------------------------------*/
  154. i4_t 
  155. openiscan (Indid * indid, i4_t *spn, char mode, i4_t nr, i4_t *rlist,
  156.      i4_t nc, cond_buf_t cond, i4_t nra, cond_buf_t range, i4_t nm, i4_t *mlist)
  157. #if 0
  158.      /* table scan opening with using of index or filter,
  159.       * function value is scan identifier or negative number
  160.       * comtaining error code
  161.      */
  162.    
  163.      Indid *indid; /* index identifier */
  164.      i4_t *spn;
  165.                  /* the number or control point till wich      *
  166.  * rollback has to be done when breaking of   *
  167.  * scan open was coused by deadlock           */
  168.               
  169.      char mode;        /* open mode: string containig wether one      *
  170. * symbol from set: R - reading, D - removing, *
  171. * M - updating or pair of D and M             */
  172.                            
  173.      i4_t nr;        /* The number of columns which values will be  *
  174.                         * selected                                    */
  175.      i4_t rlist[];      /* array of columns' numbers                   */
  176.      i4_t    nc;        /* size of select condition                    */
  177.      Cond *cond;       /* select condition of current string          *
  178.                 * NULL - means absence of condition           */
  179.      i4_t nra;        /*                                             */
  180.      Cond *range;      /* scan range - restricted form of condition   *
  181.                         * applied to columns locating in idex.        *
  182.                         * NULL - condition is absent                  */
  183.      i4_t nm;        /* the number of columns which values will be  */
  184.                         * modified                                    */
  185.      i4_t mlist[];      /* array of columns' numbers which values will *
  186.                         * be modified                                 */
  187. #endif
  188. {
  189.   i4_t stat;
  190.   struct ans_opsc answer;
  191.   struct id_ind pidind;
  192.   u2_t page, index;
  193.   if (cl_debug)
  194.     fprintf (STDOUT, "BASE.openiscan nm=%d nr=%d unindid=%dn", nm, nr,
  195.      (i4_t)((*indid).unindid));
  196.   TRANIND (pidind, indid);
  197.   INITBUF;
  198.   
  199.   answer = opscin (&pidind, mode, nr, mk_short_arr (nr, rlist),
  200.    nc, cond, nra, range, nm, mk_short_arr (nm, mlist));
  201.   
  202.   stat = answer.cpnops;
  203.   if (stat < 0)
  204.     return (stat);
  205.   if (stat > 0)
  206.     *spn = stat;
  207.   return (answer.scnum);
  208. } /* openiscan */
  209. /**********************************************************************/
  210. i4_t 
  211. openfscan (Filid * filid, char *mode, i4_t nr, i4_t *rlist,
  212.    i4_t nc, cond_buf_t cond, i4_t nm, i4_t *mlist)
  213. #if 0
  214.      /* table scan opening with using of filter,
  215.       * function value is scan identifier or negative number
  216.       * comtaining error code
  217.      */
  218.     
  219.      Filid *filid;      /* filter identifier                          */
  220.      char *mode;        /* open mode: string containig wether one     *
  221.          * symbol from set: R - reading, D - removing,*
  222.          * M - updating or pair of D and M            */
  223.       i4_t nr;         /* the number of columns which values will
  224.  * be selected                                */
  225.      i4_t rlist[];       /* array of column numbers which values will
  226.  * be selected                                */
  227.      i4_t nc;            /* size of select condition                   */
  228.      cond_buf_t cond;   /* condition of current string selection
  229.                          * NULL - condition is absent                 */
  230.      i4_t nm;         /* the number of column which values will
  231.  * be updated                        */
  232.      i4_t mlist[]; /* array of column numbers which values will
  233.  * be updated                                 */
  234.    
  235. #endif
  236. {
  237.   INITBUF;
  238.   if (cl_debug)
  239.     fprintf (STDOUT, "BASE.openfscan nm=%d nr=%d filid=%dn", nm, nr, *filid);
  240.   return opscfl (*filid, *mode, nr, mk_short_arr (nr, rlist),
  241.  nc, cond, nm, mk_short_arr (nm, mlist));
  242. } /* openfscan */
  243. /**********************************************************************/
  244. i4_t 
  245. findrow (Scanid scanid, i4_t nr, DataUnit **colval)
  246. #if 0
  247.      /* scan pointer locating on next table string satisfying
  248.       * the select condition and selecting values from this
  249.       * string;
  250.       * in the case of correct finish of function
  251.       * the function value is equal value of colval's parameter,
  252.       * NULL means the the finish of scaning;
  253.       * in the case of error the function value is equal
  254.       * neither colval nor NULL.                          */
  255.      
  256.      Scanid scanid; /* scan identifier */
  257.      DataUnit **colval; /* array of pointers used for location values
  258.  * of current string; the number of pointers
  259.  * in the array has to be equal the value of
  260.  * parameter nr defined during the scan 
  261.  * opening
  262. */
  263.      i4_t nr;
  264. #endif
  265. {
  266.   i4_t stat, err;
  267.   struct ans_next *answer = (struct ans_next *)res_buf;
  268.   
  269.   if (cl_debug)
  270.     fprintf (STDOUT, "BASE: findrown");
  271.   
  272.   answer->csznxt = 0;
  273.   next (answer, scanid);
  274.   stat = answer->cotnxt;
  275.   
  276.   if (stat >= 0)
  277.     {
  278.       err = res_row_save (answer->cadnxt, nr, colval);
  279.       if (err < 0)
  280. return err;
  281.     }
  282.   return (stat);
  283. } /* findrow */
  284. /**********************************************************************/
  285. i4_t 
  286. read_row (Scanid scanid, i4_t nr, i4_t *rlist, DataUnit **colval)
  287. #if 0
  288.      /* reading the values of given column set of current
  289.       * scan string
  290.       * in the case of correct finish of function
  291.       * the function value is equal value of colval's parameter,
  292.       * NULL means the the finish of scaning;
  293.       * in the case of error the function value is equal
  294.       * neither colval nor NULL.                          */
  295.      Scanid scanid;    /* scan identifier                   */
  296.      i4_t nr;        /* the number of columns which values will    *
  297.         * be selected                                */
  298.      i4_t rlist[];      /* array of column numbers which values will  *
  299.         * be selected                                */
  300.      DataUnit **colval;    /* array of pointers for current string       *
  301.                         * location; the number of pointer in the     *
  302.                         * array has to be equal "nr"                 */
  303. #endif
  304. {
  305.   i4_t stat, err;
  306.   struct ans_next *answer = (struct ans_next *)res_buf;
  307.   
  308.   INITBUF;
  309.   if (cl_debug)
  310.     fprintf (STDOUT, "BASE: readrown");
  311.   
  312.   answer->csznxt = 0;
  313.   readrow (answer, scanid, nr, mk_short_arr (nr, rlist));
  314.   stat = answer->cotnxt;
  315.   
  316.   if (stat >= 0)
  317.     {
  318.       err = res_row_save (answer->cadnxt, nr, colval);
  319.       if (err < 0)
  320. return err;
  321.     }
  322.   return (stat);
  323. } /* read_row */
  324. /**********************************************************************/
  325. i4_t 
  326. saposit (i4_t scanid)
  327. #if 0
  328. /*  mempos(scnum)  */
  329. /* stores the current position of pointed scan;
  330.    function returns value >=0 in the case of correct
  331.    finish and <0 in the case of error                     */
  332.      i4_t scanid;
  333. #endif
  334. {
  335.   if (cl_debug)
  336.     fprintf (STDOUT, "BASE: sapositn");
  337.   return mempos (scanid);
  338. } /* saposit */ 
  339. /**********************************************************************/
  340. i4_t 
  341. reposit (i4_t scanid)
  342. #if 0
  343. /*  curpos(scnum)  */
  344. /* recovers stored position of pointed scan;
  345.    returns values which >=0 in the case of correct
  346.    finish and <0 in the case of error                     */
  347.      i4_t scanid;
  348. #endif
  349. {
  350.   if (cl_debug)
  351.     fprintf (STDOUT, "BASE: repositn");
  352.   return curpos (scanid);
  353. } /* reposit */
  354. /**********************************************************************/
  355. i4_t 
  356. delrow (i4_t scanid, i4_t *spn)
  357. #if 0
  358. /*  dltn(scnum)  */
  359. /* removing of current string of pointed scan;
  360.  * function returns 0 in the case of correct finish and
  361.  * negative value in the case of error; positive result
  362.  * corresponds number of control point to which
  363.  * transaction has to rollback                            */
  364.      i4_t scanid;    /* scan identifier                 */
  365.      i4_t *spn;     /* number of control point to which               *
  366.                      * rollback would be needed to do if scan opening *
  367.                      * were failed because of synchronization deadlock*/
  368. #endif
  369. {
  370.   i4_t stat;
  371.   
  372.   if (cl_debug)
  373.     fprintf (STDOUT, "BASE: delrown");
  374.   
  375.   stat = dltn (scanid);
  376.   if (stat > 0 && spn)
  377.     *spn = stat;
  378.   return (stat);
  379. } /* delrow */
  380. /**********************************************************************/
  381. i4_t 
  382. mod_data (Scanid scanid, i4_t nm, DataUnit *mod_from,
  383.   sql_type_t *dt_types, i4_t *spn, i4_t *mlist)
  384. #if 0
  385.      /* updating of current string of pointed scan;       *
  386.       * function returns "0" in the case of correct finish*
  387.       * , negative value in the case of error, positive   *
  388.       * value corresponds number of control point to wich *
  389.       * given transaction is needed to rollback           */
  390.      Scanid scanid;      /* scan identifier                                */
  391.      i4_t nm;          /* the number of modification elements            */
  392.      DataUnit *mod_from; /* array of data for modification : needed element*
  393.     number i is on mlist[i] place in this array    */
  394.      sql_type_t *dt_types;     /* array of types of data for modification        */
  395.      i4_t *spn;          /* number of control point to which               *
  396.                           * rollback would be needed to do if scan opening *
  397.                           * were failed because of synchronization deadlock*/
  398.      i4_t mlist[];        /* array of numbers of updated columns            */
  399. #endif
  400. {
  401.   i4_t stat, fl, err;
  402.   i4_t i;
  403.   char bufbyte = 0;
  404.   i4_t equn4 = EQUN << 4, neq4 = NEQ << 4;
  405.   INITBUF;
  406.   if (cl_debug)
  407.     fprintf (STDOUT, "BASE: modrown");
  408.   
  409.   for (i = 0; i <= nm; i++)
  410.     {
  411.       fl = ((i & 01) == 1);
  412.       if (i == nm)
  413. bufbyte |= (fl) ? ENDSC4 : ENDSC;
  414.       else
  415. if (mod_from[mlist[i]].dat.nl_fl == NULL_VALUE) /* new NULL value */
  416.   bufbyte |= (fl) ? equn4 : EQUN;
  417. else
  418.   {
  419.     assert (mod_from[mlist[i]].dat.nl_fl == REGULAR_VALUE);
  420.     /* new regular value */
  421.     bufbyte |= (fl) ? neq4 : NEQ;
  422.   }
  423.       if (fl || (i == nm))
  424. {
  425.   *pointbuf++ = bufbyte;
  426.   bufbyte = 0;
  427. }
  428.     }
  429.   
  430.   /* insertoion values to buffer */
  431.   for (i = 0; i < nm; i++)
  432.     if (mod_from[mlist[i]].dat.nl_fl == REGULAR_VALUE)
  433.       if ((err = DU_to_buf (mod_from + mlist[i], &pointbuf, dt_types + i)) < 0)
  434. return err;
  435.   
  436.   stat = (mlist) ? mod_spec_flds (scanid, nm, mk_short_arr (nm, mlist), buffer) :
  437.                    mdfctn (scanid, buffer);
  438.   
  439.   if (stat > 0 && spn)
  440.     *spn = stat;
  441.   return (stat);
  442. } /* mod_data */
  443. /**********************************************************************/
  444. i4_t 
  445. insrow (Tabid * tabid, i4_t nv, u2_t * lenval, Colval colval, i4_t *spn)
  446. #if 0
  447.      /* inserting of current string of pointed scan;      *
  448.       * function returns "0" in the case of correct finish*
  449.       * , negative value in the case of error, positive   *
  450.       * value corresponds number of control point to wich *
  451.       * given transaction is needed to rollback           */
  452.      Tabid *tabid; /* table identifier                         */
  453.      i4_t nv; /* the number of elements in "colval"       */
  454.      u2_t *lenval; /* array of lenghts of inserted elements    */
  455.      Colval colval; /* array of pointers to columns' values of  *
  456.                          * inserted string; order of pointers has to*
  457.                          * corresponds table definition; NULL       *
  458.                          * corresponds undefined value of given     *
  459.                          * column; "nv" could be less than the      *
  460.                          * number of columns in the table, undefined*
  461.                          * values for all other are supposed        */
  462.      i4_t *spn;      /* number of control point to which               *
  463.                       * rollback would be needed to do if scan opening *
  464.                       * were failed because of synchronization deadlock*/
  465. #endif
  466. {
  467.   i4_t stat, i, j;
  468.   u2_t page, index;
  469.   struct id_rel pidrel;
  470.   char bufbyte = 0;
  471.   
  472.   INITBUF;
  473.   TRANTAB (pidrel, tabid);
  474.   for (i = 0; i < nv;)
  475.     {
  476.       for (j = 0; j < 7; j++)
  477. {
  478.   if (colval[i])
  479.     bufbyte |= BITVL(j);
  480.   i++;
  481.   if (i == nv)
  482.     {
  483.       bufbyte |= BITVL(7);
  484.       break;
  485.     }
  486. }
  487.       *pointbuf++ = bufbyte;
  488.       bufbyte = 0;
  489.     }
  490. /*    tuple and it's length to buffer   */
  491.   for (i = 0; i < nv; i++)
  492.     {
  493.       if (colval[i])
  494. {
  495.   stat = Copy (pointbuf, lenval + i, sizeof (u2_t));
  496.   stat = Copy (pointbuf, colval[i], lenval[i]);
  497.   RTN (stat);
  498. }
  499.     }
  500.   
  501.   stat = insrtn (&pidrel, buffer);
  502.   if (stat > 0 && spn)
  503.     *spn = stat;
  504.   return (stat);
  505. } /* insrow */
  506. /**********************************************************************/
  507. i4_t 
  508. ins_data (Tabid *tabid, i4_t nv, DataUnit *ins_from, sql_type_t *dt_types, i4_t *spn)
  509. #if 0
  510.      /* inserting of current string of pointed scan;      *
  511.       * function returns "0" in the case of correct finish*
  512.       * , negative value in the case of error, positive   *
  513.       * value corresponds number of control point to wich *
  514.       * given transaction is needed to rollback           */
  515.      Tabid *tabid;  /* table identifier                               */
  516.      i4_t nv;  /* the number of insertion elements               */
  517.      DataUnit *ins_from; /* array of data for insertion                    */
  518.      sql_type_t *dt_types;     /* array of types of data for insertion           */
  519.      i4_t *spn;          /* number of control point to which               *
  520.                           * rollback would be needed to do if scan opening *
  521.                           * were failed because of synchronization deadlock*/
  522. #endif
  523. {
  524.   i4_t stat, i, j, err;
  525.   u2_t page, index;
  526.   struct id_rel pidrel;
  527.   char bufbyte = 0;
  528.   
  529.   INITBUF;
  530.   TRANTAB (pidrel, tabid);
  531.   for (i = 0; i < nv;)
  532.     {
  533.       for (j = 0; j < 7; j++)
  534. {
  535.   if (ins_from[i].dat.nl_fl == REGULAR_VALUE)
  536.     bufbyte |= BITVL(j);
  537.   else
  538.     assert (ins_from[i].dat.nl_fl == NULL_VALUE);
  539.   i++;
  540.   if (i == nv)
  541.     {
  542.       bufbyte |= BITVL(7);
  543.       break;
  544.     }
  545. }
  546.       *pointbuf++ = bufbyte;
  547.       bufbyte = 0;
  548.     }
  549.   
  550.   /* insertion values to buffer */
  551.   for (i = 0; i < nv; i++)
  552.     if (ins_from[i].dat.nl_fl == REGULAR_VALUE)
  553.       if ((err = DU_to_buf (ins_from + i, &pointbuf, dt_types + i)) < 0)
  554. return err;
  555.   
  556.   stat = insrtn (&pidrel, buffer);
  557.   if (stat > 0 && spn)
  558.     *spn = stat;
  559.   return (stat);
  560. } /* ins_data */
  561. /**********************************************************************/
  562. i4_t 
  563. instid (Scanid scanid, Filid filid)
  564. #if 0
  565.      /* inserting of identifier of current scan string    *
  566.       * in existing filter; function returns value >=0 in *
  567.       * the case of succesful finish and negative value   *
  568.       * in the case of error                              */
  569.      Scanid scanid; /* scan identifier        */
  570.      Filid filid; /* filter identifier      */
  571. #endif
  572. {
  573.   if (cl_debug)
  574.     fprintf (STDOUT, "BASE: instidn");
  575.   
  576.   return insfltr (scanid, filid);
  577. } /* instid */
  578. /**********************************************************************/
  579. i4_t 
  580. closescan (Scanid scanid)
  581. #if 0
  582.      /* closes pointed scan;                       *
  583.       * function returns value >=0 in  the case of *
  584.       * succesful finish and negative value        *
  585.       * in the case of error                       */ 
  586.      Scanid scanid; /* scan identifier */
  587. #endif
  588. {
  589.   return closesc (scanid);
  590. } /* closescan */
  591. /**********************************************************************/
  592. i4_t 
  593. crepview (Tabid * tabid, Segid segid, i4_t *spn, i4_t colnum,
  594.   sql_type_t * types)
  595. #if 0
  596.      /* view creation                              * 
  597.       * function returns value >=0 in  the case of *
  598.       * correct finish and negative value          *
  599.       * in the case of error                       */
  600.      Tabid *tabid;    /* output parameter - relation identifier  */
  601.      Segid segid;     /* segment identifier                      */
  602.      i4_t *spn;       /* number of control point to which               *
  603.                        * rollback would be needed to do if operation    *
  604.                        * were failed because of synchronization deadlock*/
  605.      i4_t colnum;            /* the number of columns in the view      */
  606.      sql_type_t types[];   /* array of columns' descriptions         */
  607. #endif
  608. {
  609.   i4_t stat, i;
  610.   struct ans_ctob answer;
  611.   struct des_field descol;
  612.   
  613.   INITBUF;
  614.   if (cl_debug)
  615.     fprintf (STDOUT, "BASE: create view colnum=%dn", colnum);
  616.   for (i = 0; i < colnum; i++)
  617.     {
  618.       descol.field_type = types[i].code;
  619.       descol.field_size = types[i].len;
  620.       stat = Copy (pointbuf, &descol, sizeof (struct des_field));
  621.       RTN (stat);
  622.     }
  623.   
  624.   answer = crview (segid, colnum, (struct des_field *)buffer);
  625.   if (cl_debug)
  626.     fprintf (STDOUT, "BASE.after crview: answer.cpncob=%dn", answer.cpncob);
  627.   stat = answer.cpncob;
  628.   if (stat < 0)
  629.     return (stat);
  630.   Copy (&(tabid->segid), &(answer.idob.segnum), sizeof (Segid));
  631.   Copy (&(tabid->untabid), &(answer.idob.obnum), sizeof (Unid));
  632.   if (cl_debug)
  633.     fprintf (STDOUT, "BASE.crepview: segid=%d,untabid=%dn", tabid->segid,
  634.      (i4_t)tabid->untabid);
  635.   return (stat);
  636. } /* crepview */
  637. /**********************************************************************/
  638. i4_t 
  639. creptab (Tabid * tabid, Segid segid, i4_t *spn, i4_t colnum,
  640.  i4_t nnulnum, sql_type_t * types)
  641. #if 0
  642.      /* creation of relation (non temporal)        *
  643.       * function returns value >=0 in  the case of *
  644.       * correct finish and negative value          *
  645.       * in the case of error                       */
  646.      Tabid *tabid;   /* output parameter - relation identifier */
  647.      Segid segid;    /* segment identifier                     */
  648.      i4_t *spn;      /* number of control point to which               *
  649.                       * rollback would be needed to do if operation    *
  650.                       * were failed because of synchronization deadlock*/
  651.      i4_t colnum;     /* the number of columns in the table             */
  652.      i4_t nnulnum;    /* the number of first columns which have not to  *
  653.                       * contain undefined values                       */
  654.      sql_type_t types[];    /* array of columns' descriptions         */
  655. #endif
  656. {
  657.   i4_t stat, tid, i;
  658.   struct ans_cr answer;
  659.   struct des_field descol;
  660.   
  661.   INITBUF;
  662.   if (cl_debug)
  663.     fprintf (STDOUT, "BASE: create rel CRR colnum=%d,nnulnum=%dn",
  664.      colnum, nnulnum);
  665.   
  666.   for (i = 0; i < colnum; i++)
  667.     {
  668.       descol.field_type = types[i].code;
  669.       descol.field_size = types[i].len;
  670.       stat = Copy (pointbuf, &descol, sizeof (struct des_field));
  671.       RTN (stat);
  672.     }
  673.   
  674.   answer = crrel (segid, colnum, nnulnum, (struct des_field *)buffer);
  675.   stat = answer.cpnacr;
  676.   if (stat < 0)
  677.     return (stat);
  678.   Copy (&(tabid->segid), &(answer.idracr.urn.segnum), sizeof (Segid));
  679.   Copy (&(tabid->untabid), &(answer.idracr.urn.obnum), sizeof (Unid));
  680.   tid = ((i4_t) (answer.idracr.pagenum) << 16) | (i4_t) (answer.idracr.index);
  681.   Copy (&(tabid->tabd), &(tid), sizeof (Tid));
  682.   if (stat > 0 && spn)
  683.     *spn = stat;
  684.   return (stat);
  685. } /* creptab */
  686. /**********************************************************************/
  687. i4_t 
  688. crettab (Tabid * tabid, i4_t colnum, i4_t nnulnum, sql_type_t * types)
  689. #if 0
  690.      /* creation of temporal relation              *
  691.       * function returns value >=0 in  the case of *
  692.       * correct finish and negative value          *
  693.       * in the case of error                       */
  694.      Tabid *tabid;    /* output parameter - relation identifier        */
  695.      i4_t nnulnum;     /* the number of first columns which have not to *
  696.                        * contain undefined values                      */
  697.      i4_t colnum; /* the number of columns in the table  */
  698.      sql_type_t types[]; /* array of columns' descriptions      */
  699. #endif
  700. {
  701.   i4_t i, stat;
  702.   struct ans_ctob answer;
  703.   struct des_field descol;
  704.   
  705.   INITBUF;
  706.   for (i = 0; i < colnum; i++)
  707.     {
  708.       descol.field_type = types[i].code;
  709.       descol.field_size = types[i].len;
  710.       stat = Copy (pointbuf, &descol, sizeof (struct des_field));
  711.       RTN (stat);
  712.     }
  713.   
  714.   answer = crtrel (colnum, nnulnum, (struct des_field *)buffer);
  715.   
  716.   stat = answer.cpncob;
  717.   if (stat < 0)
  718.     return (stat);
  719.   Copy (&(tabid->segid), &(answer.idob.segnum), sizeof (Segid));
  720.   Copy (&(tabid->untabid), &(answer.idob.obnum), sizeof (Unid));
  721.   if (cl_debug)
  722.     fprintf (STDOUT, "BASE.crettab: segid=%d,untabid=%dn", tabid->segid,
  723.      (i4_t)tabid->untabid);
  724.   return (stat);
  725. } /* crettab */
  726. /**********************************************************************/
  727. i4_t 
  728. crefil (Filid * filid, Tabid * tabid)
  729. #if 0
  730.      /* filter creation                            *
  731.       * function returns value >=0 in  the case of *
  732.       * correct finish and negative value          *
  733.       * in the case of error                       */
  734.      Filid *filid; /* output parameter - filter identifier      */
  735.      Tabid *tabid; /* relation identifier                       */
  736. #endif
  737. {
  738.   i4_t stat;
  739.   struct ans_ctob answer;
  740.   u2_t page, index;
  741.   struct id_rel pidrel;
  742.   
  743.   if (cl_debug)
  744.     fprintf (STDOUT, "BASE.crefil n");
  745.   TRANTAB (pidrel, tabid);
  746.   
  747.   answer = crfltr (&pidrel);
  748.   stat = answer.cpncob;
  749.   if (stat >= 0)
  750.     Copy (filid, &(answer.idob), sizeof (answer.idob));
  751.    return (stat);
  752. } /* crefil */
  753. /**********************************************************************/
  754. i4_t 
  755. creind (Indid * indid, Tabid * tabid, i4_t *spn, char unique,
  756. char clust, i4_t ncn, i4_t *cnlist)
  757. #if 0
  758.      /* index creation                             *
  759.       * function returns value >=0 in  the case of *
  760.       * correct finish and negative value          *
  761.       * in the case of error                       */
  762.      Indid *indid;   /* output parameter - index identifier */
  763.      Tabid *tabid;   /* relation identifier                 */
  764.      i4_t *spn;      /* number of control point to which               *
  765.                       * rollback would be needed to do if operation    *
  766.                       * were failed because of synchronization deadlock*/
  767.      char unique;    /* sign of unique key: 'U'                        */
  768.      char clust;     /*                      */
  769.      i4_t ncn;      /* the number of columns for key of index         */
  770.      i4_t cnlist[];   /* array of numbers of columns forming index's key*/
  771. #endif
  772. {
  773.   i4_t tid, stat;
  774.   struct ans_cind answer;
  775.   u2_t page, index;
  776.   struct id_rel pidrel;
  777.   
  778.   if (cl_debug)
  779.     fprintf (STDOUT, "BASE.creind n");
  780.   INITBUF;
  781.   TRANTAB (pidrel, tabid);
  782.   
  783.   answer = crind (&pidrel, unique, clust, ncn, mk_short_arr (ncn, cnlist));
  784.   stat = answer.cpnci;
  785.   if (stat < 0)
  786.     return (stat);
  787.   PUTIND (indid, answer);
  788.   if (cl_debug)
  789.     fprintf (STDOUT, "BASE.creind: segid=%d,untabid=%d,tid=%d,unindid=%dn",
  790.      (*indid).tabid.segid, (i4_t)(*indid).tabid.untabid,
  791.      (i4_t)(*indid).tabid.tabd, (i4_t)(*indid).unindid);
  792.   if (stat > 0 && spn)
  793.     *spn = stat;
  794.   return (stat);
  795. } /* creind */
  796. /**********************************************************************/
  797. i4_t 
  798. dropptab (Tabid * tabid, i4_t *spn)
  799. #if 0
  800.      i4_t *spn;       /* number of control point to which rollback
  801.       * has to be done when execution of operation
  802.       * was broken because of deadlock          
  803.      */
  804.                             
  805.      Tabid *tabid;    /* relation identifier */
  806.      
  807.      /* dropping of non temporal relation;            * 
  808.       * function returns 0 in  the case of correct    *
  809.       * finish and positive value in the case         *
  810.       * of error, where it denotes the point to which *
  811.       * rollback has to be done                       */
  812. #endif
  813. {
  814.   i4_t stat;
  815.   u2_t page, index;
  816.   struct id_rel pidrel;
  817.   
  818.   if (cl_debug)
  819.     fprintf (STDOUT, "BASE.droptab n");
  820.   TRANTAB (pidrel, tabid);
  821.   
  822.   stat = delrel (&pidrel);
  823.   if (stat > 0)
  824.     *spn = stat;
  825.   return (stat);
  826. } /* dropptab */
  827. /**********************************************************************/
  828. i4_t 
  829. dropttab (Tabid * tabid)
  830. #if 0
  831.      /* dropping of temporal relation;             * 
  832.       * function returns value >=0 in  the case of *
  833.       * correct finish and negative value          *
  834.       * in the case of error                       */
  835.      Tabid *tabid; /* relation identifier */
  836. #endif
  837. {
  838.   struct id_ob pidtob;
  839.   
  840.   if (cl_debug)
  841.     fprintf (STDOUT, "BASE.dropttab n");
  842.   Copy (&(pidtob.segnum), &(tabid->segid), sizeof (Segid));
  843.   Copy (&(pidtob.obnum), &(tabid->untabid), sizeof (Unid));
  844.   
  845.   return deltob (&pidtob);
  846. } /* dropttab */
  847. /**********************************************************************/
  848. i4_t 
  849. dropind (Indid * indid, i4_t *spn)
  850. #if 0
  851.      /* index dropping;
  852.       * function returns 0 in  the case of correct        *
  853.       * finish, negative value in the case                *
  854.       * of error and positive value denotes the point to  *
  855.       * which given tranzaction has to rollback           */
  856.      Indid *indid;   /* index identifier                           */
  857.      i4_t *spn;      /* number of control point to which rollback  *
  858.       * has to be done when execution of operation *
  859.       * was broken because of deadlock             */
  860. #endif
  861. {
  862.   i4_t stat;
  863.   struct id_ind pidind;
  864.   u2_t page, index;
  865.   
  866.   if (cl_debug)
  867.     fprintf (STDOUT, "BASE.dropind n");
  868.   TRANIND (pidind, indid);
  869.   
  870.   stat = delind (&pidind);
  871.   if (stat > 0)
  872.     *spn = stat;
  873.   return (stat);
  874. } /* dropind */
  875. /**********************************************************************/
  876. i4_t 
  877. addcol (Tabid * tabid, i4_t *spn, i4_t ncn, sql_type_t * types)
  878. #if 0
  879. /* addflds(pidrel,fn,afn)     */
  880.      /* column adding to the pointed relation;  function      *
  881.       * returns 0 in the case of correct finish, negative     *
  882.       * value in the case of error and positive value denotes *
  883.       * the point to which given tranzaction has to rollback  */
  884.      Tabid *tabid; /* relation identifier                        */
  885.      i4_t ncn; /* size of array of columns' descriptions     */
  886.      i4_t *spn; /* number of control point to which rollback  *
  887.          * has to be done when execution of operation *
  888.          * was broken because of deadlock             */
  889.      sql_type_t types[]; /* array of columns' descriptions     */
  890. #endif
  891. {
  892.   i4_t stat, i;
  893.   u2_t page, index;
  894.   struct id_rel pidrel;
  895.   struct des_field descol;
  896.   
  897.   if (cl_debug)
  898.     fprintf (STDOUT, "BASE.addcol n");
  899.   INITBUF;
  900.   TRANTAB (pidrel, tabid);
  901.   
  902.   for (i = 0; i < ncn; i++)
  903.     {
  904.       descol.field_type = types[i].code;
  905.       descol.field_size = types[i].len;
  906.       stat = Copy (pointbuf, &descol, sizeof (struct des_field));
  907.       RTN (stat);
  908.     }
  909.   
  910.   stat = addflds (&pidrel, ncn, (struct des_field *) buffer);
  911.   if (stat > 0)
  912.     *spn = stat;
  913.   return (stat);
  914. } /* addcol */
  915. /**********************************************************************/
  916. i4_t 
  917. savepoint (void)
  918.      /* setting of control(save) point in the current tranzaction *
  919.       * function returns number of control(save) point            */
  920. {
  921.   if (cl_debug)
  922.     fprintf (STDOUT, "BASE.savepointn");
  923.   return svpnt ();
  924. } /* savepoint */
  925. /**********************************************************************/
  926. /**********************************************************************/
  927. i4_t 
  928. sorttab (Tabid * itabid, Tabid * otabid, i4_t ns, i4_t *slist, char order, char fl)
  929. #if 0
  930.      /* sorting of temporal table in the order of decrease *
  931.       *  or increase of values of pointed columns; locates *
  932.       * result in the new temporal relation                */
  933.      Tabid *itabid;  /* identifier of source temporal relation */
  934.      Tabid *otabid;  /* identifier of a new temporal relation  */
  935.      i4_t ns;  /* the number of columns which values are *
  936.   * used in sorting                        */
  937.      i4_t slist[];  /* array of columns' numbers which values *
  938.   * are used in sorting                    */
  939.      char order;  /* indicator of sort order: 'A' - increase*
  940.   *, 'D' (or any other symbol exept 'A') - *
  941.   * decrease                               */
  942.      char fl;  /* = CH_ALL | CH_UNIC - unique flag       */
  943. /*    char  order[]; array of indicator of sort order              */
  944. #endif
  945. {
  946.   i4_t stat, i;
  947.   struct ans_ctob answer;
  948.   struct id_rel pidrel;
  949.   char ord;
  950.   
  951.   if (cl_debug)
  952.     fprintf (STDOUT, "BASE.sorttab n");
  953.   INITBUF;
  954.   if (order == 'A')
  955.     ord = GROW;
  956.   else
  957.     ord = DECR;
  958.   for (i = 0; i < ns; i++)
  959.     {
  960.       stat = Copy (pointbuf, &ord, 1);
  961.       RTN (stat);
  962.     }
  963.   Copy (&(pidrel.urn.segnum), &(itabid->segid), sizeof (Segid));
  964.   Copy (&(pidrel.urn.obnum), &(itabid->untabid), sizeof (Unid));
  965.   
  966.   answer = trsort (&pidrel, ns, mk_short_arr (ns, slist),
  967.    buffer, (fl == CH_UNIC) ? NODBL : DBL);
  968.   stat = answer.cpncob;
  969.   if (stat < 0)
  970.     return (stat);
  971.   Copy (&(otabid->segid), &(answer.idob.segnum), sizeof (Segid));
  972.   Copy (&(otabid->untabid), &(answer.idob.obnum), sizeof (Unid));
  973.   if (cl_debug)
  974.     fprintf (STDOUT, "BASE.sorttab: segid=%d,untabid=%dn",
  975.      otabid->segid, (i4_t)otabid->untabid);
  976.   return (stat);
  977. } /* sorttab */
  978. /********************INCORRECT***************************
  979. i4_t 
  980. sortfil (Filid * ifilid, Filid * ofilid)
  981. #if 0
  982.       *  sorting of pointed filter in the increase of string    *
  983.       * identifier order; function locates result in new filter *
  984.       * function returns answer code and object's identifier    *
  985.       
  986.      Filid *ifilid; * source filter idenyifier   *
  987.      Tabid *ofilid; * result filter identifier   *
  988. #endif
  989. {
  990.   i4_t type, stat;
  991.   struct ans_ctob answer;
  992.   answer = flsort (struct id_ob pidtob, i4_t fln, i2_t *fl,
  993.    char mode, char smthing);
  994.   return answer.cpncob;
  995. }
  996. */
  997. /*--------------------------------------------------------------*/
  998. i4_t 
  999. make_group (Tabid * itabid, Tabid * otabid, i4_t ng, i4_t *glist,
  1000.     char order, i4_t nf, i4_t *flist, char *fl)
  1001. #if 0
  1002.      /* group separation in temporal table; function     *
  1003.       * locates result in a new temporal relation and    *
  1004.       * counts agregate functions; new temporal relation *
  1005.       * is sorted by the group's columns in the given    *
  1006.       * order ("order")                                  */
  1007.      Tabid *itabid; /* identifier of source temporal relation  */
  1008.      Tabid *otabid; /* identifier of new temporal relation; if *
  1009.  * agregate functions are there then last  *
  1010.  * "nf" columns correspond "flist[]"       */
  1011.      i4_t ng; /* the number of columns which are included*
  1012.  * in the group                            */
  1013.      i4_t glist[]; /* array of columns which are included in  *
  1014.  * the group                               */
  1015.      char order; /* indicator of sort order: 'A' - increase *
  1016.  *, 'D' (or any other symbol exept 'A') -  *
  1017.  * decrease                                */
  1018.      i4_t nf; /* the number of columns for which         *
  1019.  * functions have to be counted            */
  1020.      i4_t flist[]; /* array of columns' numbers for which     *
  1021.  * functions have to be counted            */
  1022.      char *fl; /* char fl[nf-1] - string of flags         *
  1023.                  * corresponding every element of 哨 flist[]. */
  1024. #endif
  1025. {
  1026.   i4_t stat, i;
  1027.   struct ans_ctob answer;
  1028.   struct id_rel pidrel;
  1029.   char ord;
  1030.   
  1031.   INITBUF;
  1032.   if (order == 'A')
  1033.     ord = GROW;
  1034.   else
  1035.     ord = DECR;
  1036.   for (i = 0; i < ng; i++)
  1037.     {
  1038.       stat = Copy (pointbuf, &ord, 1);
  1039.       RTN (stat);
  1040.     }
  1041.   if (cl_debug)
  1042.     fprintf (STDOUT, "BASE.makegroup n");
  1043.   Copy (&(pidrel.urn.segnum), &(itabid->segid), sizeof (Segid));
  1044.   Copy (&(pidrel.urn.obnum), &(itabid->untabid), sizeof (Unid));
  1045.   answer = makegroup (&pidrel, ng, mk_short_arr (ng, glist),
  1046.       nf, mk_short_arr (nf, flist), fl, buffer);
  1047.   stat = answer.cpncob;
  1048.   if (stat < 0)
  1049.     return (stat);
  1050.   Copy (&(otabid->segid), &(answer.idob.segnum), sizeof (Segid));
  1051.   Copy (&(otabid->untabid), &(answer.idob.obnum), sizeof (Unid));
  1052.   if (cl_debug)
  1053.     fprintf (STDOUT, "BASE.makegroup: segid=%d,untabid=%dn",
  1054.      otabid->segid, (i4_t)otabid->untabid);
  1055.   return (stat);
  1056. } /* make_group */
  1057. /*------------------ E N D   P A R T 1 ----------------------*/