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

📄 aggrifn.c

📁 免费的Sql数据库系统
💻 C
📖 第 1 页 / 共 2 页
字号:
  oldpn = (u2_t) ~ 0;  for (; rep != EOI; rep = ind_tid (disc, &tid, FASTSCAN))    {      pn = tid.tpn;      if (pn != oldpn)	{	  if (oldpn != (u2_t) ~ 0)	    putpg (&pg, 'n');	  while((asp = getpg (&pg, sn, pn, 's')) == NULL);	  oldpn = pn;	  afi = (u2_t *) (asp + phsize);	}      ai = afi + tid.tindex;      if (*ai != 0 &&          fndslc (desrel, asp, ai, sc, slsz, NULL) != 0)	agrcount (agrl, asp + *ai, df, fdf, fn, nf, mnf, flaglist);    }  if (i == 1)    {      putpg (&pg, 'n');      xfree (disc->cur_key);      distagr_frm (agrl, nf, flaglist);    }  ans->csznxt = write_val (ans->cadnxt, agrl, df, nf, mnf, flaglist);  for (i = 0; i < nf; i++)    xfree (agrl[i]);  xfree ((char *) agrl);  delscan (n);  return;}#if 0voidffrm_agrcount (char **agrl, char *tuple, struct des_field *df,               u2_t fdf, u2_t f_n, u2_t nf, u2_t * mnf, char *flaglist){  char *val;  u2_t kn, fn;  char *arrpnt[BD_PAGESIZE];  u2_t arrsz[BD_PAGESIZE];  tuple_break (tuple, arrpnt, arrsz, df, fdf, f_n);  for (kn = 0; kn < nf; kn++)    {      fn = mnf[kn];      if ((val = arrpnt[fn]) != NULL)	agr_ffrm (agrl[kn], flaglist[kn], val, (df + fn)->field_type);    }}voidagr_ffrm (char *agrl, char flag, char *val, u2_t type){  char *a, *b, *c;  i4_t count;  float avg;  switch (flag)    {    case FN_COUNT:      count = 1;      t4bpack (count, agrl);      break;    case FN_AVG:      count = 1;      avg = retval (val, type);      bcopy ((char *) &avg, agrl, sizeof (float));      t4bpack (count, agrl + sizeof (float));      break;    case FN_MAX:    case FN_MIN:    case FN_SUMM:      fkv_frm (agrl, val, type);      break;    case FN_DT_COUNT:    case FN_DT_AVG:    case FN_DT_SUMM:      val = agr_dt_cfrm (val, type, agrl);      break;    default:      break;    }}#endifstatic floatretval (char *val, u2_t type){  float flval;  switch (type)    {    case T1B:      flval = *val;      break;    case T2B:      flval = t2bunpack (val);      break;    case TFLOAT:      bcopy (val, (char *) &flval, size4b);      break;    case T4B:      flval = t4bunpack (val);      break;    default:      error ("TRN.retval: This data type is incorrect");      break;    }  return (flval);}voidagrcount (char **agrl, char *tuple, struct des_field *df,          u2_t fdf, u2_t f_n, u2_t nf, u2_t * mnf, char *flaglist){  u2_t kn, fn;  char *arrpnt[BD_PAGESIZE];  u2_t arrsz[BD_PAGESIZE];  tuple_break (tuple, arrpnt, arrsz, df, fdf, f_n);  for (kn = 0; kn < nf; kn++)    {      fn = mnf[kn];      agr_frm (agrl[kn], flaglist[kn], arrpnt[fn], (df + fn)->field_type);    }}static char *agr_dt_cfrm (char *val, u2_t type, char *agrl){  char *newt, *outasp, mch[BD_PAGESIZE];  struct des_tob *dt;  i2_t n;  u2_t corsize;  struct A pg;  newt = mch;  *newt = 0;  *newt |= EOSC;  if ( val != NULL)    {      *newt |= BITVL(0);      newt++;      val = remval (val, &newt, type);    }  else    newt++;  corsize = newt - mch;  n = t2bunpack (agrl);  dt = (struct des_tob *) * (desnseg.tobtab + n);  outasp = getwl (&pg, NRSNUM, dt->lastpn);  minstr (&pg, mch, corsize, dt);  putwul (&pg, 'm');  return (val);}static voidsumfld (char *buf, char *val, u2_t type){  u2_t val2, sum2;  i4_t val4, sum4;  float fval, sumf;  switch (type)    {    case T1B:      *buf += *val;      break;    case T2B:      val2 = t2bunpack (val);      sum2 = t2bunpack (buf) + val2;      t2bpack (sum2, buf);      break;    case T4B:      val4 = t4bunpack (val);      sum4 = t4bunpack (buf) + val4;      t4bpack (sum4, buf);      break;    case TFLOAT:      bcopy (buf, (char *) &sumf, size4b);      bcopy (val, (char *) &fval, size4b);      sumf += fval;      bcopy ((char *) &sumf, buf, size4b);      break;    default:      error ("TRN.sumfld: This data type is incorrect");      break;    }}static i4_tavgfld (float *avg, i4_t n_avg, u2_t type, char *fval){  float val;  val = retval (fval, type);  *avg = ((*avg) * n_avg + val) / (n_avg + 1);  n_avg += 1;  return (n_avg);}voidagr_frm (char *agrl, i4_t flag, char *val, u2_t type){  char *b;  u2_t n;  float avg;  i4_t count;  switch (flag)    {    case FN_COUNT:      if (val != NULL)	{	  agrl++;	  count = t4bunpack (agrl);	  count += 1;	  t4bpack (count, agrl);	}      break;    case FN_SUMM:      if (val != NULL)	{	  *agrl++ = 1;      	  sumfld (agrl, val, type);	}      break;          case FN_MAX:      if (val != NULL)	{	  if (*agrl == 0)	    {	      *agrl++ = 1;	      n = get_length (val, type);              bcopy (val, agrl, n);	    }	  else	    {	      agrl++;	      if (cmpval (agrl, val, type, &n) < 0)	/* val2>val1 */                bcopy (val, agrl, n);	    }	}      break;    case FN_MIN:      if (val != NULL)	{	  if (*agrl == 0)	    {	      *agrl++ = 1;	      n = get_length (val, type);              bcopy (val, agrl, n);	    }	  else	    {	      agrl++;      	      if (cmpval (agrl, val, type, &n) > 0)	/* val2<val1 */                bcopy (val, agrl, n);	    }	}      break;    case FN_AVG:      if (val != NULL)	{	  *agrl++ = 1;          bcopy (agrl, (char *) &avg, sizeof (float));          b = agrl + sizeof (float);	  count = t4bunpack (b);	  count = avgfld (&avg, count, type, val);          bcopy ((char *) &avg, agrl, sizeof (float));	  t4bpack (count, b);	}      break;          case FN_DT_COUNT:    case FN_DT_AVG:    case FN_DT_SUMM:      val = agr_dt_cfrm (val, type, agrl);      break;    default:      break;    }}intwrite_val (char *mas, char **agrl, struct des_field *df,           u2_t nf, u2_t * mnf, char *flaglist){  char *b, *sc, *pnt;  u2_t k, type;  u2_t size;  sc = mas;  pnt = sc + nf;  for (k = 0; k < nf; k++)    {      b = agrl[k];            switch (flaglist[k])	{	case FN_DT_COUNT:          b += size2b; /* skip tmptable id */	case FN_COUNT:	  *sc++ = *b++;	  t2bpack (size4b, pnt);	  pnt += size2b;          bcopy (b, pnt, size4b);          pnt += size4b;	  break;	case FN_DT_AVG:          b += size2b; /* skip tmptable id */	case FN_AVG:	  *sc++ = *b++;	  t2bpack (size4b, pnt);	  pnt += size2b;	            pnt = write_average (TFLOAT, b, pnt);	  break;	case FN_DT_SUMM:          b += size2b; /* skip tmptable id */	case FN_MAX:	case FN_MIN:	case FN_SUMM:	  *sc++ = *b++;	  type = (df + mnf[k])->field_type;	  if (type == TCH || type == TFL)	    {	      size = t2bunpack (b);	      b += size2b;	    }	  else	    size = (df + mnf[k])->field_size;	  t2bpack (size, pnt);	  pnt += size2b;          bcopy (b, pnt, size);          pnt += size;	  break;	default:	  break;	}    }  return (pnt - mas);}char *write_average (u2_t type, char *pnt_from, char *pnt_to){  u2_t avrg2;  i4_t avrg4;  float avrg;  bcopy (pnt_from, (char *) &avrg, sizeof (float));  if (type == T1B)    *pnt_to++ = (i1_t) avrg;  else if (type == T2B)    {      avrg2 = (u2_t) avrg;      t2bpack (avrg2, pnt_to);      pnt_to += size2b;    }  else if (type == T4B)    {      avrg4 = (i4_t) avrg;      t4bpack (avrg4, pnt_to);      pnt_to += size4b;    }  else if (type == TFLOAT)    {      bcopy ((char *) &avrg, pnt_to, sizeof (float));      pnt_to += sizeof (float);    }  return (pnt_to);}

⌨️ 快捷键说明

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