⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ordins.c

📁 免费的Sql数据库系统
💻 C
字号:
/* *  ordins.c  - Ordinary insertion *              Kernel of GNU SQL-server  * *  This file is a part of GNU SQL Server * *  Copyright (c) 1996, 1997, Free Software Foundation, Inc *  Developed at the Institute of System Programming *  This file is written by  Vera Ponomarenko * *  This program is free software; you can redistribute it and/or modify *  it under the terms of the GNU General Public License as published by *  the Free Software Foundation; either version 2 of the License, or *  (at your option) any later version. * *  This program is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *  GNU General Public License for more details. * *  You should have received a copy of the GNU General Public License *  along with this program; if not, write to the Free Software *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * *  Contacts:   gss@ispras.ru * *//* $Id: ordins.c,v 1.248 1997/04/15 11:45:41 vera Exp $ */#include <assert.h>#include "destrn.h"#include "strml.h"#include "fdcltrn.h"#include "xmem.h"extern struct ldesind **TAB_IFAM;extern struct ADBL adlj;extern i4_t ljmsize;extern struct d_r_t *firstrel;extern u2_t S_SC_S;static u2_t wild_pn = (u2_t) ~0;ARR_DECL(l_emp,u2_t,static); /* declaration of local dynamic stack/array 'l_emp'.*/ARR_PROC_DECL(l_emp,u2_t,static); /* declaration of routines for it              */static u2_talong_leaf_pages (struct A *pg, u2_t necessary_size, char *pnt, u2_t n,                  u2_t *pfms, u2_t *loc, char *key){  u2_t pn, table_pn, ksz = size4b +1, sn;  struct ind_page *indph;  char *asp = NULL, *lastb;  asp = pg->p_shm;  sn = pg->p_sn;  for (;; pnt += ksz)    {      indph = (struct ind_page *) asp;      lastb = asp + indph->ind_off;      for (; n != 0; n--)        {          table_pn = t2bunpack (pnt);          pnt += size2b;          *pfms = t2bunpack (pnt);          pnt += size2b;          if (*pfms >= necessary_size)            {              *loc = pnt - size2b - asp;              return (table_pn);            }        }      if (pnt < lastb)        {          putpg(pg, 'n');          return (wild_pn);        }      pn = indph->ind_nextpn;      putpg(pg, 'n'); /* make asp & indph etc undefined */      if (pn == wild_pn)        return wild_pn;      while ((asp = getpg (pg, sn, pn, 's')) == NULL);      pnt = asp + indphsize;      n = t2bunpack (pnt);      pnt += size2b;      if (f4b (pnt + 1, key, size4b, size4b) != 0)        {          putpg(pg, 'n');          return (wild_pn);        }    }}static u2_tfind_suit_page (struct A *pg, u2_t sn, char *key, u2_t necessary_size,                u2_t *pfms, u2_t *loc){  char *aggr = NULL, *a, *lastb, *asp = NULL;  u2_t pn, n = 0;  i4_t ksz = size4b + 1, elsz = 2*size2b, l = 0;  struct ind_page *indph;    pn = S_SC_S;     /* rootpn for Allocation Memory Index */  for (;;)    {      while ((asp = getpg (pg, sn, pn, 's')) == NULL);      indph = (struct ind_page *) asp;      lastb = asp + indph->ind_off;      for (a = asp + indphsize; a < lastb; a += ksz + n * elsz)        {          aggr = a;          n = t2bunpack (a);          a += size2b;          if ((l = f4b (a + 1, key, size4b, size4b)) >= 0)            break;        }      if (a == lastb)        {          putpg(pg, 'n');          return (wild_pn);        }      if (indph->ind_wpage == LEAF)        break;      pn = t2bunpack (aggr + size2b + ksz + size2b);     /* pn down */      putpg(pg, 'n');    }  if (l != 0)    {      putpg(pg, 'n');      return (wild_pn);    }  a += ksz;  return (along_leaf_pages (pg, necessary_size, a, n, pfms, loc, key));}static u2_tcont_search_suit_page (struct A *pg, char *key, u2_t necessary_size,                       u2_t *pfms, u2_t *loc){  char *aggr = NULL, *a, *lastb, *asp;  u2_t n = 0;  i4_t ksz = size4b + 1, elsz = 2*size2b, l = 0;    asp = pg->p_shm;  lastb = asp + ((struct ind_page *) asp)->ind_off;  for (a = asp + indphsize; a < lastb; a += ksz + n * elsz)    {      aggr = a;      n = t2bunpack (a);      a += size2b;      if ((l = f4b (a + 1, key, size4b, size4b)) >= 0)        break;    }  assert (a != lastb);  if (l != 0)    {      putpg(pg, 'n');      return (wild_pn);    }  a = asp + *loc + size2b;  n -= (a - (aggr + size2b + ksz)) / elsz;   return (along_leaf_pages (pg, necessary_size, a, n, pfms, loc, key));}static voidmod_free_size (struct A *pg, u2_t offloc, u2_t size){  char *asp, *a;  i4_t idm;  u2_t sn, pn;  sn = pg->p_sn;  pn = pg->p_pn;  while (BUF_enforce (sn, pn) < 0);  asp = pg->p_shm;  a = asp + offloc;  idm = begmop (asp);  recmjform (OLD, sn, pn, idm, offloc, size2b, a, 0);  MJ_PUTBL ();  t2bpack (size, a);  putpg (pg, 'm');}static voidfree_pages (u2_t sn, i4_t rn, i4_t i){  u2_t empn;  i4_t i1;  char *a;  char key[size4b + 1], key2[size2b];  a = key;  *a++ = BITVL(0) | EOSC;  t4bpack (rn, a);  for (i1 = i; i1 < l_emp.count; i1++)    {      empn = l_emp.arr[i1];      t2bpack (empn, key2);      icp_rem (TAB_IFAM[sn], key, key2, size2b);      /*      delrec (TAB_IFAM[sn], rn, empn);*/      emptypg (sn, empn, 'f');    }  BUF_unlock (sn, l_emp.count - i , l_emp.arr + i);  l_emp_ini();}struct des_tidordins (u2_t sn, i4_t rn, char *cort, u2_t corsize, char type){  struct page_head *ph;  struct d_r_t *desrel;  u2_t pn, pfms, offloc;  i2_t delta;  struct des_tid tid;  char *asp = NULL;  struct A pg, pg_ifam;  char key[size4b];  struct id_rel idr;  for (desrel = firstrel; desrel != NULL; desrel = desrel->drlist)    if (desrel->desrbd.relnum == rn)      break;  idr.urn.segnum = sn;  idr.urn.obnum = rn;  if (rn != RDRNUM)    {      idr.pagenum = desrel->pn_r;      idr.index = desrel->ind_r;    }  delta = corsize + size2b;  tab_difam (sn);  l_emp_ini_check();  t4bpack (rn, key);  pn = find_suit_page (&pg_ifam, sn, key, delta, &pfms, &offloc);m1:  if (pn != wild_pn)    {      u2_t lind, *ai, ind, fs;      i4_t idm;      while ((asp = getpg (&pg, sn, pn, 'x')) == NULL);      lind = ((struct page_head *) asp)->lastin;      fs = *((u2_t *) (asp + phsize) + lind) - (phsize + size2b * (lind + 1));      assert (fs <= BD_PAGESIZE - phsize);      if (fs < pfms)        {          i4_t i;          if ((i = testfree (asp, fs, delta)) == 1)            {			/* this page is empty */              putwul (&pg, 'n');              l_emp_put (pn);              pn = cont_search_suit_page (&pg_ifam, key, delta, &pfms, &offloc);              goto m1;            }          else if (i == -1)    /* no allocation */            {              putpg (&pg, 'n');              pn = cont_search_suit_page (&pg_ifam, key, delta, &pfms, &offloc);              goto m1;            }        }      idm = begmop (asp);      if (fs < pfms)        rempbd (asp, sn, pn, idm);      ai = (u2_t *) (asp + phsize);      for (ind = 0; ind <= lind && *ai != 0; ai++, ind++);      tid.tindex = ind;      tid.tpn = pn;      if (type == 'w')	wmlj (INSLJ, ljmsize + corsize, &adlj, &idr, &tid, 0);      inscort (sn, &tid, idm, asp, cort, corsize);      MJ_PUTBL ();      putpg (&pg, 'm');      mod_free_size (&pg_ifam, offloc, pfms - corsize - size2b);      if (l_emp.count != 0)        free_pages (sn, rn, 0);    }  else    {      u2_t size;      if (l_emp.count != 0)        {          pn = l_emp.arr[0];          asp = getwl (&pg, sn, pn);        }      else        {          pn = getempt (sn);          asp = getnew (&pg, sn, pn);        }      tid.tpn = pn;      tid.tindex = 0;      if (type == 'w')        wmlj (INSLJ, ljmsize + corsize, &adlj, &idr, &tid, 0);      size = BD_PAGESIZE - corsize;      bcopy (cort, asp + size, corsize);      ph = (struct page_head *) asp;      ph->lastin = 0;      t2bpack (size, asp + phsize);      ++ph->ph_ph.idmod;      if (l_emp.count != 0)        {          putpg (&pg, 'm');          modrec (sn, rn, pn, -(corsize + size2b));          free_pages (sn, rn, 1);        }      else        {          putwul (&pg, 'm');          insrec (TAB_IFAM[sn], rn, pn, size - phsize - size2b);        }    }  l_emp_ini();  return (tid);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -