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

SQL Server

开发平台:

Unix_Linux

  1. /*
  2.  *  cntrid.c  - Relation Identificator Test
  3.  *              Kernel of 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  Vera Ponomarenko
  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: cntrid.c,v 1.248 1997/04/17 11:03:20 vera Exp $ */
  29. #include "destrn.h"
  30. #include "sctp.h"
  31. #include "strml.h"
  32. #include "../synch/sctpsyn.h"
  33. #include "fdcltrn.h"
  34. extern struct d_r_t *firstrel;
  35. extern struct ldesind **TAB_IFAM;
  36. extern struct ADBL adlj;
  37. #define CHECK_SEG_ID() 
  38. {
  39. u2_t pn;
  40. i4_t rep;
  41.   while ((rep = BUF_lockpage (sn, pn, 's')) == -1);
  42.   if (rep == NO_SUCH_SEG)
  43.     return (NO_SUCH_SEG);
  44.   else
  45.     BUF_unlock (sn, 1, &pn);
  46. }
  47. #define TABLE_ID_SYNLOCK() 
  48. {
  49. CPNM cpn;
  50. struct id_rel idr;
  51.   idr.urn.segnum = sn;
  52.   idr.urn.obnum = RDRNUM;
  53. if (size > SZSNBF)
  54.     error ("TR.synind: SYN's buffer is too small");
  55.   cpn = sn_lock (&idr, 't', lc, size);
  56.   if (cpn != 0)
  57.     {
  58.       rllbck (cpn, adlj);
  59.       return (cpn);
  60.     }
  61. }
  62. #define CHECK_TABLE_ID() 
  63. {
  64. i4_t rnr;
  65.    char *asp, *begagr, *loc;
  66.    u2_t *ai;
  67.    char key[size4b + 1];
  68.   a = key;
  69.   *a++ = BITVL(0) | EOSC;
  70.   rnr = RDRNUM;
  71.   t4bpack (rnr, a);
  72.   tab_difam (sn);
  73. m1:
  74.   a = icp_lookup (&pg, TAB_IFAM[sn], key, (char *) &pn, size2b, &begagr, &loc);
  75.   putwul (&pg, 'n');
  76.   if (a == NULL)
  77.     {
  78.       BUF_unlock (sn, 1, &pg.p_pn);
  79.       return (NDR);
  80.     }
  81.   if ((asp = getpg (&pg_table, sn, pn, 's')) == NULL)
  82.     {
  83.       BUF_unlock (sn, 1, &pg.p_pn);
  84.       goto m1;
  85.     }
  86.   ai = (u2_t *) (asp + phsize) + pidrel->index;
  87.   if (*ai == 0)
  88.     {
  89.       BUF_unlock (sn, 1, &pg.p_pn);
  90.       putpg (&pg_table, 'n');
  91.       return (NDR);
  92.     }
  93.     a = asp + *ai;
  94.     t = *a & MSKCORT;
  95.     if (t == CREM || t == IDTR)
  96.     {
  97.       BUF_unlock (sn, 1, &pg.p_pn);
  98.       putpg (&pg_table, 'n');
  99.       return (NDR);
  100.     }
  101.     if (t == IND)
  102.     {
  103.       u2_t pn2, ind2;
  104.       ind2 = t2bunpack (a + 1);
  105.       pn2 = t2bunpack (a + 1 + size2b); 
  106.       putpg (&pg_table, 'n');
  107.       while ((asp = getpg (&pg_table, sn, pn2, 's')) == NULL);
  108.       ai = (u2_t *) (asp + phsize) + ind2;
  109.       assert (*ai != 0);
  110.       a = asp + *ai;
  111.     }
  112. }
  113. CPNM
  114. contir (struct id_rel *pidrel, struct d_r_t **desrel)
  115. {
  116.   char *a, *asca;
  117.   char mch[8], lc[32];
  118.   i4_t rn, ast;
  119.   u2_t sn, pn, size;
  120.   struct A pg, pg_table;
  121.   unsigned char t;
  122.   
  123.   rn = pidrel->urn.obnum;
  124.   for (*desrel = firstrel; *desrel != NULL; *desrel = (*desrel)->drlist)
  125.     if ((*desrel)->desrbd.relnum == rn)
  126.       return (OK);
  127.   sn = pidrel->urn.segnum;
  128.   pn = pidrel->pagenum;
  129.   CHECK_SEG_ID();
  130.   
  131.   a = lc + size2b;
  132.   t4bpack (rn, a);
  133.   a += size4b;
  134.   ast = 1;
  135.   asca = mch;
  136.   sct (&asca, ast++, S_D);
  137.   sct (&asca, ast++, EQ);
  138.   sct (&asca, ast, ENDSC);
  139.   a += size2b;
  140.   for (; asca >= mch;)
  141.     *a++ = *asca--;
  142.   size = a - lc;
  143.   t2bpack (size, lc);
  144.   TABLE_ID_SYNLOCK();
  145.   CHECK_TABLE_ID();
  146.   if ((*desrel = crtrd (pidrel, a)) == NULL)
  147.     {
  148.       BUF_unlock (sn, 1, &pg.p_pn);
  149.       putpg (&pg_table, 'n');
  150.       return (NDR);
  151.     }
  152.   putpg (&pg_table, 'n');
  153.   BUF_unlock (sn, 1, &pg.p_pn);
  154.   return (OK);
  155. }
  156. CPNM
  157. cont_fir (struct id_rel *pidrel, struct d_r_t **desrel)
  158. {
  159.   i4_t rn, scsz, ast, n;
  160.   u2_t sn, pn, size;
  161.   char *a, *asca;
  162.   char lc[SZSNBF];
  163.   struct A pg, pg_table;
  164.   char mch[BD_PAGESIZE];
  165.   unsigned char t;
  166.   
  167.   rn = pidrel->urn.obnum;
  168.   for (*desrel = firstrel; *desrel != NULL; *desrel = (*desrel)->drlist)
  169.     if ((*desrel)->desrbd.relnum == rn)
  170.       break;
  171.   if (*desrel != NULL && (*desrel)->pid != NULL)
  172.     return (OK);
  173.   if (*desrel != NULL && (*desrel)->desrbd.indnum == 0)
  174.     return (OK);
  175.   sn = pidrel->urn.segnum;
  176.   pn = pidrel->pagenum;
  177.   CHECK_SEG_ID();
  178.   
  179.   a = lc + size2b;
  180.   t4bpack (rn, a);
  181.   a += size4b;
  182.   ast = 1;
  183.   asca = mch;
  184.   sct (&asca, ast++, S_D);
  185.   sct (&asca, ast++, EQ);
  186.   for (n = 0; n < 3; n++)
  187.     sct (&asca, ast++, NOTLOCK);
  188.   sct (&asca, ast++, S_S);
  189.   sct (&asca, ast++, NOTLOCK);
  190.   sct (&asca, ast++, S_S);
  191.   sct (&asca, ast, ENDSC);
  192.   if (ast % 2 == 0)
  193.     asca--;
  194.   scsz = asca + 1 - mch;
  195.   size = a - lc - size2b;
  196.   n = (size + scsz) % sizeof (i4_t);
  197.   if (n != 0)
  198.     n = sizeof (i4_t) - n;
  199.   a += n;
  200.   for (; asca >= mch;)
  201.     *a++ = *asca--;
  202.   size = a - lc;
  203.   t2bpack (size, lc);
  204.   TABLE_ID_SYNLOCK();
  205.   if (*desrel == NULL)
  206.     {
  207.       CHECK_TABLE_ID();
  208.       *desrel = crtfrd (pidrel, a);
  209.       if (*desrel == NULL)
  210. {
  211.   BUF_unlock (sn, 1, &pg.p_pn);
  212.   putpg (&pg_table, 'n');
  213.   return (NDR);
  214. }
  215.     }
  216.   if ((*desrel)->pid == NULL && (*desrel)->desrbd.indnum != 0)
  217.     crt_all_id (*desrel, a);
  218.   putpg (&pg_table, 'n');
  219.   BUF_unlock (sn, 1, &pg.p_pn);
  220.   return (OK);
  221. }
  222. CPNM
  223. tabcl (struct id_rel *pidrel, u2_t fln, u2_t * fmn)
  224. {
  225.   struct des_field *df;
  226.   struct d_r_t *desrel;
  227.   CPNM cpn;
  228.   if ((cpn = contir (pidrel, &desrel)) != OK)
  229.     return (cpn);
  230.   if (fln > desrel->desrbd.fieldnum)
  231.     return (NCR);
  232.   df = (struct des_field *) (desrel + 1);
  233.   for (; fln != 0; df++, fln--)
  234.     *fmn++ = df->field_type;
  235.   return (OK);
  236. }
  237. CPNM
  238. cont_id (struct id_ind *pidind, struct d_r_t **desrel, struct ldesind **di)
  239. {
  240.   struct id_rel *pidrel;
  241.   i4_t rn, index;
  242.   struct ldesind *cdi;
  243.   CPNM cpn;
  244.                                 
  245.   pidrel = &pidind->irii;
  246.   rn = pidrel->urn.obnum;
  247.   index = pidind->inii;
  248.   for (*desrel = firstrel; *desrel != NULL; *desrel = (*desrel)->drlist)
  249.     if ((*desrel)->desrbd.relnum == rn)
  250.       {
  251. for (*di = (*desrel)->pid; *di != NULL; *di = (*di)->listind)
  252.   if ((*di)->ldi.unindex == index)
  253.     return (OK);
  254.       }
  255.   if ((cpn = cont_fir (pidrel, desrel)) != OK)
  256.     return (cpn);
  257.   for (cdi = (*desrel)->pid; cdi != NULL; cdi = cdi->listind)
  258.     {
  259.       if (cdi->ldi.unindex == index)
  260. break;
  261.     }
  262.   if (cdi == NULL)
  263.     return (NDI);
  264.   *di = cdi;
  265.   return (OK);
  266. }