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

SQL Server

开发平台:

Unix_Linux

  1. /*
  2.  * addflds.c  - add fields to specific table
  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: addflds.c,v 1.247 1997/04/15 11:45:41 vera Exp $ */
  29. #include "xmem.h"
  30. #include "destrn.h"
  31. #include "strml.h"
  32. #include "fdcltrn.h"
  33. extern i4_t ljmsize;
  34. extern struct des_nseg desnseg;
  35. extern struct ADBL adlj;
  36. extern char *pbuflj;
  37. int
  38. addflds (struct id_rel *pidrel, i4_t fn, struct des_field *afn)
  39. {
  40.   struct des_field *df, *bfn;
  41.   u2_t sn, size, n;
  42.   for (df = afn + fn, bfn = afn; bfn < df; bfn++)
  43.     if ((n = bfn->field_type) == T1B || n == T2B || n == T4B || n == TCH ||
  44. n == TFL || n == TFLOAT)
  45.       continue;
  46.     else
  47.       return (NCF);
  48.   sn = pidrel->urn.segnum;
  49.   if (sn == NRSNUM)
  50.     {
  51.       char **t;
  52.       struct des_trel *destrel;
  53.       u2_t kn;
  54.       
  55.       t = desnseg.tobtab + pidrel->urn.obnum;
  56.       destrel = (struct des_trel *) * t;
  57.       if (destrel->tobtr.prdt.prob != TREL)
  58. return (NDR);
  59.       n = destrel->fieldn;
  60.       kn = destrel->keysntr;
  61.       destrel = (struct des_trel *) xrealloc (*t, dtrsize + (n + fn) * rfsize + kn * size2b);
  62.       *t = (char *) destrel;
  63.       df = (struct des_field *) (destrel + 1) + n;
  64.       if (kn != 0)
  65.         {
  66.           u2_t *pnt_key_to, *pnt_key_from;
  67.           
  68.           size = (kn - 1) * size2b;
  69.           pnt_key_to = (u2_t *)((char *)(df + fn)+ size);
  70.           pnt_key_from = (u2_t *)((char *)df + size);
  71.           for (; kn != 0; kn--)
  72.             *pnt_key_to-- = *pnt_key_from--;
  73.         }
  74.       destrel->fieldn += fn;
  75.     }
  76.   else
  77.     {
  78.       struct d_r_t *desrel;
  79.       struct d_r_bd *drbd;
  80.       char *cort, *nc, *pnt_new, *pnt_old;
  81.       struct des_tid tid, ref_tid;
  82.       struct id_rel idr;
  83.       u2_t scsize, rcorsize, corsize, size1, newsize;
  84.       CPNM cpn;
  85.       
  86.       cort = pbuflj + ljmsize;
  87.       if ((desrel = getrd (pidrel, &ref_tid, cort, &corsize)) == NULL)
  88. return (NDR);
  89.       size = fn * rfsize;
  90.       if (((rcorsize = getrc (&desrel->desrbd, cort)) + size) > (BD_PAGESIZE - phsize - size2b))
  91. return (NCF);
  92.       drbd = &desrel->desrbd;
  93.       n = drbd->fieldnum;
  94.       cpn = sn_lock (pidrel, 'm', NULL, 0);
  95.       if (cpn != 0)
  96. {
  97.   rllbck (cpn, adlj); /* adlj - external var */
  98.   return (cpn);
  99. }
  100.       nc = cort + corsize;
  101.       drbd->fieldnum += fn;
  102.       scsize = scscal (cort);
  103.       bcopy (cort, nc, scsize);
  104.       pnt_old = cort + scsize;
  105.       pnt_new = nc + scsize;
  106.       bcopy ((char *) drbd, pnt_new, drbdsize);
  107.       pnt_new += drbdsize;
  108.       pnt_old += drbdsize;
  109.       size1 = n * rfsize;
  110.       bcopy (pnt_old, pnt_new, size1);     /* old fields descriptors */
  111.       pnt_new += size1;
  112.       pnt_old += size1;
  113.       bcopy ((char *) afn, pnt_new, size); /* add new fields descriptors */
  114.       pnt_new += size;
  115.       size1 = rcorsize - (pnt_old - cort);
  116.       bcopy (pnt_old, pnt_new, size1);     /* another descriptors */
  117.       pnt_new += size1;
  118.       if ((newsize = pnt_new - nc) < corsize)
  119. newsize = corsize;
  120.       tid.tpn = pidrel->pagenum;
  121.       tid.tindex = pidrel->index;
  122.       modmes ();
  123.       idr = *pidrel;
  124.       idr.urn.obnum = RDRNUM;
  125.       wmlj (ADFLJ, ljmsize + corsize + newsize, &adlj, &idr, &tid, 0);
  126.       ordmod (sn, RDRNUM, &tid, &ref_tid, corsize, nc, newsize);
  127.       BUF_endop ();
  128.       desrel = (struct d_r_t *) xrealloc ((char *) desrel, newsize);
  129.       df = (struct des_field *) (desrel + 1) + n;
  130.     }
  131.   for (; fn != 0; fn--)
  132.     *df++ = *afn++;
  133.   return (OK);
  134. }