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

SQL Server

开发平台:

Unix_Linux

  1. /*
  2.  *  crrel.c  - create a DB 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: crrel.c,v 1.245 1997/03/31 03:46:38 kml Exp $ */
  29. #include "xmem.h"
  30. #include "destrn.h"
  31. #include "strml.h"
  32. #include "fdcltrn.h"
  33. extern i4_t ljmsize;
  34. extern char *pbuflj;
  35. struct ans_cr
  36. crrel (i4_t sn, i4_t fn, i4_t fdf, struct des_field *df)
  37. {
  38.   char *a, *c, *val;
  39.   struct des_field *ldf, *cdf;
  40.   u2_t n;
  41.   struct d_r_bd drbd;
  42.   i4_t rn;
  43.   struct ans_cr ans;
  44.   struct des_tid tid;
  45.     
  46.   if (fdf > fn)
  47.     {
  48.       ans.cpnacr = NCF;
  49.       return (ans);
  50.     }
  51.   for (ldf = df + fn, cdf = df; cdf < ldf; cdf++)
  52.     {
  53.       if ((n = cdf->field_type) == T1B || n == T2B || n == T4B || n == TCH ||
  54.   n == TFL || n == TFLOAT)
  55. continue;
  56.       else
  57. {
  58.   ans.cpnacr = NCF;
  59.   return (ans);
  60. }
  61.     }
  62.   if (sn == NRSNUM)
  63.     {
  64.       ans.cpnacr = NDR;
  65.       return (ans);
  66.     }
  67.   rn = uniqnm ();
  68.   drbd.relnum = rn;
  69.   drbd.fieldnum = fn;
  70.   drbd.fdfnum = fdf;
  71.   drbd.indnum = 0;
  72.   c = a = pbuflj + ljmsize;
  73.   *a++ = CORT;
  74.   *a++ |= EOSC;
  75.   val = a;
  76.   drbdpack (&drbd, a);
  77.   a += drbdsize;
  78.   dfpack (df, fn, a);
  79.   a += fn * rfsize;
  80.   n = a - c;
  81.   if ((ans.cpnacr = synrd (sn, val, n - scscal (c))) != OK)
  82.     return (ans);
  83.   modmes ();
  84.   tid = ordins (sn, RDRNUM, c, n + DELRD, 'w');
  85.   ans.idracr.urn.segnum = sn;
  86.   ans.idracr.urn.obnum = rn;
  87.   ans.idracr.pagenum = tid.tpn;
  88.   ans.idracr.index = tid.tindex;
  89.   BUF_endop ();
  90.   return (ans);
  91. }
  92. void
  93. drbdpack (struct d_r_bd *drbd, char *pnt)
  94. {
  95. /*
  96.     t4bpack(drbd->relnum,pnt); pnt+=size4b;
  97.     t2bpack(drbd->fieldnum,pnt); pnt+=size2b;
  98.     t2bpack(drbd->fdfnum,pnt); pnt+=size2b;
  99.     t2bpack(drbd->indnum,pnt); pnt+=size2b;
  100.     */
  101.   bcopy ((char *) drbd, pnt, drbdsize);
  102. }
  103. void
  104. dfpack (struct des_field * df, u2_t fn, char * pnt)
  105. {
  106.   bcopy ((char *) df, pnt, fn * rfsize);
  107. }
  108. struct ans_ctob
  109. crview (
  110.  u2_t sn,
  111.  u2_t fn,
  112.  struct des_field *df
  113. )
  114. {
  115.   i4_t rn;
  116.   struct ans_ctob ansctob;
  117.   rn = uniqnm ();
  118.   ansctob = crtrel (fn, fn, df);
  119.   return (ansctob);
  120. }