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

SQL Server

开发平台:

Unix_Linux

  1. /*
  2.  *  insrtn.c  - Insertion operation
  3.  *              Kernel of GNU SQL-server 
  4.  *
  5.  * $Id: insrtn.c,v 1.247 1997/04/15 11:45:41 vera Exp $
  6.  *
  7.  *  This file is a part of GNU SQL Server
  8.  *
  9.  *  Copyright (c) 1996, 1997, Free Software Foundation, Inc
  10.  *  Developed at the Institute of System Programming
  11.  *  This file is written by  Vera Ponomarenko
  12.  *
  13.  *  This program is free software; you can redistribute it and/or modify
  14.  *  it under the terms of the GNU General Public License as published by
  15.  *  the Free Software Foundation; either version 2 of the License, or
  16.  *  (at your option) any later version.
  17.  *
  18.  *  This program is distributed in the hope that it will be useful,
  19.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  20.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  21.  *  GNU General Public License for more details.
  22.  *
  23.  *  You should have received a copy of the GNU General Public License
  24.  *  along with this program; if not, write to the Free Software
  25.  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  26.  *
  27.  *  Contacts:   gss@ispras.ru
  28.  *
  29.  */
  30. #include "destrn.h"
  31. #include "strml.h"
  32. #include "fdcltrn.h"
  33. #include "xmem.h"
  34. extern struct des_nseg desnseg;
  35. extern struct ADBL adlj;
  36. extern char *pbuflj;
  37. extern i4_t ljmsize;
  38. extern i4_t ljrsize;
  39. static
  40. int
  41. tuple_frm (struct des_field *df, u2_t fnum, u2_t fdf, char *c,
  42.            u2_t scsize, char *tuple, u2_t * corsize)
  43. {
  44.   i4_t k, kt;
  45.   char *aval, *b, *d, *t;
  46.   u2_t fn, size, type;
  47.   t = tuple;
  48.   b = c;
  49.   d = aval = c + scsize;
  50.   for (k = 0, fn = 0; fn < fdf; fn++, k++) /* for always defined fields */
  51.     if (k == 7)
  52.       {
  53. k = 0;
  54. b++;
  55.       }
  56.   for (kt = 0, *t++ = CORT, *t = 0; b < d && fn < fnum; k++, kt++, fn++)
  57.     {
  58.       if (k == 7)
  59. {
  60.   k = 0;
  61.   b++;
  62. }
  63.       if (kt == 7)
  64. {
  65.   kt = 0;
  66.   t++;
  67.   *t = 0;
  68. }
  69.       if ((*b & BITVL(k)) != 0)
  70. *t |= BITVL(kt);
  71.     }
  72.   *t |= EOSC;
  73.   t++;
  74.   for (k = 0, fn = 0; c < d && fn < fnum; k++, df++, fn++)
  75.     {
  76.       if (k == 7)
  77. {
  78.   k = 0;
  79.   c++;
  80. }
  81.       if ((*c & BITVL(k)) != 0)
  82. {
  83.   size = t2bunpack (aval);
  84.   aval += size2b;
  85.   if (size > df->field_size)
  86.     size = df->field_size;
  87.   if ((type = df->field_type) == TCH || type == TFL)
  88.     {
  89.       t2bpack (size, t);
  90.       t += size2b;
  91.     }
  92.           bcopy (aval, t, size);
  93.           t += size;
  94.           aval += size;
  95. }
  96.       else if (fn < fdf)
  97. return (NCF);
  98.     }
  99.   *corsize = t - tuple;
  100.   if (*corsize > BD_PAGESIZE - phsize)
  101.     return (NCF);
  102.   return (OK);
  103. }
  104. int
  105. insrtn (struct id_rel *pidrel, char *cort)
  106. {
  107.   char *tuple;
  108.   struct des_field *df;
  109.   u2_t sn, scsize = 1, corsize, fn, fdf;
  110.   
  111.   for (tuple = cort; (*tuple & EOSC) == 0; tuple++)
  112.     {
  113.       scsize += 1;
  114.         if (scsize > BD_PAGESIZE - phsize)
  115.   return (NCF);
  116.     }      
  117.   sn = pidrel->urn.segnum;
  118.   if (sn == NRSNUM)
  119.     {
  120.       struct des_trel *destrel;
  121.       destrel = (struct des_trel *) * (desnseg.tobtab + pidrel->urn.obnum);
  122.       if (destrel->tobtr.prdt.prob != TREL)
  123. return (NIOB);
  124.       df = (struct des_field *) (destrel + 1);
  125.       fn = destrel->fieldn;
  126.       fdf = destrel->fdftr;
  127.       if (tuple_frm (df, fn, fdf, cort, scsize, pbuflj, &corsize) != OK)
  128. return (NCF);
  129.       if (corsize < MIN_TUPLE_LENGTH)
  130.         corsize = MIN_TUPLE_LENGTH;
  131.       return (instr ((struct des_tob *) destrel, pbuflj, corsize));
  132.     }
  133.   else
  134.     {
  135.       struct d_r_bd *drbd;
  136.       struct ADBL last_adlj;
  137.       struct d_r_t *desrel;
  138.       i4_t n, ni;
  139.       struct des_tid tid;
  140.       i4_t rn;
  141.       CPNM cpn;
  142.       if ((cpn = cont_fir (pidrel, &desrel)) != OK)
  143. return (cpn);
  144.       df = (struct des_field *) (desrel + 1);
  145.       drbd = &desrel->desrbd;
  146.       fn = drbd->fieldnum;
  147.       fdf = drbd->fdfnum;
  148.       tuple = pbuflj + ljmsize;
  149.       if (tuple_frm (df, fn, fdf, cort, scsize, tuple, &corsize) != OK)
  150. return (NCF);
  151.       if ((cpn = synlock (pidrel, drbd, tuple)) != 0)
  152. return (cpn);
  153.       modmes ();
  154.       last_adlj = adlj;
  155.       rn = pidrel->urn.obnum;
  156.       if (corsize < MIN_TUPLE_LENGTH)
  157.         corsize = MIN_TUPLE_LENGTH;
  158.       tid = ordins (sn, rn, tuple, corsize, 'w');
  159.       n = drbd->indnum;
  160.       ni = proind (ordindi, desrel, n, tuple, &tid);
  161.       if (ni < n)
  162. {
  163.           struct des_tid ref_tid;
  164.   wmlj (RLBLJ, ljrsize, &last_adlj, pidrel, &tid, 0);
  165.   proind (ordindd, desrel, ni, tuple, &tid);
  166.           ref_tid.tpn = (u2_t) ~ 0;
  167.   orddel (sn, rn, &tid, &ref_tid, corsize);
  168.           BUF_endop ();
  169.   return (NU);
  170. }
  171.       BUF_endop ();
  172.       return (OK);
  173.     }
  174. }