示例#1
0
/*
Calculates key page total MBR = MBR(key1) + MBR(key2) + ...
*/
int rtree_page_mbr(MI_INFO *info, HA_KEYSEG *keyseg, uchar *page_buf,
                  uchar *c, uint key_length)
{
  uint inc = 0;
  uint k_len = key_length;
  uint nod_flag = mi_test_if_nod(page_buf);
  uchar *k;
  uchar *last = rt_PAGE_END(page_buf);

  for (; (int)key_length > 0; keyseg += 2)
  {
    key_length -= keyseg->length * 2;
    
    /* Handle NULL part */
    if (keyseg->null_bit)
    {
      return 1;
    }

    k = rt_PAGE_FIRST_KEY(page_buf, nod_flag);

    switch ((enum ha_base_keytype) keyseg->type) {
    case HA_KEYTYPE_INT8:
      RT_PAGE_MBR_KORR(int8, mi_sint1korr, mi_int1store, 1);
      break;
    case HA_KEYTYPE_BINARY:
      RT_PAGE_MBR_KORR(uint8, mi_uint1korr, mi_int1store, 1);
      break;
    case HA_KEYTYPE_SHORT_INT:
      RT_PAGE_MBR_KORR(int16, mi_sint2korr, mi_int2store, 2);
      break;
    case HA_KEYTYPE_USHORT_INT:
      RT_PAGE_MBR_KORR(uint16, mi_uint2korr, mi_int2store, 2);
      break;
    case HA_KEYTYPE_INT24:
      RT_PAGE_MBR_KORR(int32, mi_sint3korr, mi_int3store, 3);
      break;
    case HA_KEYTYPE_UINT24:
      RT_PAGE_MBR_KORR(uint32, mi_uint3korr, mi_int3store, 3);
      break;
    case HA_KEYTYPE_LONG_INT:
      RT_PAGE_MBR_KORR(int32, mi_sint4korr, mi_int4store, 4);
      break;
    case HA_KEYTYPE_ULONG_INT:
      RT_PAGE_MBR_KORR(uint32, mi_uint4korr, mi_int4store, 4);
      break;
#ifdef HAVE_LONG_LONG
    case HA_KEYTYPE_LONGLONG:
      RT_PAGE_MBR_KORR(longlong, mi_sint8korr, mi_int8store, 8);
      break;
    case HA_KEYTYPE_ULONGLONG:
      RT_PAGE_MBR_KORR(ulonglong, mi_uint8korr, mi_int8store, 8);
      break;
#endif
    case HA_KEYTYPE_FLOAT:
      RT_PAGE_MBR_GET(float, mi_float4get, mi_float4store, 4);
      break;
    case HA_KEYTYPE_DOUBLE:
      RT_PAGE_MBR_GET(double, mi_float8get, mi_float8store, 8);
      break;
    case HA_KEYTYPE_END:
      return 0;
    default:
      return 1;
    }
  }
  return 0;
}
/*
  Calculates key page total MBR= MBR(key1) + MBR(key2) + ...
  Stores into *to.
*/
int maria_rtree_page_mbr(const HA_KEYSEG *keyseg,
                         MARIA_PAGE *page,
                         uchar *to, uint key_length)
{
  MARIA_HA *info= page->info;
  MARIA_SHARE *share= info->s;
  uint inc= 0;
  uint k_len= key_length;
  uint nod_flag= page->node;
  const uchar *k;
  const uchar *last= rt_PAGE_END(page);

  for (; (int)key_length > 0; keyseg += 2)
  {
    key_length -= keyseg->length * 2;

    /* Handle NULL part */
    if (keyseg->null_bit)
    {
      return 1;
    }

    k= rt_PAGE_FIRST_KEY(share, page->buff, nod_flag);

    switch ((enum ha_base_keytype) keyseg->type) {
    case HA_KEYTYPE_INT8:
      RT_PAGE_MBR_KORR(share, int8, mi_sint1korr, mi_int1store, 1, to);
      break;
    case HA_KEYTYPE_BINARY:
      RT_PAGE_MBR_KORR(share, uint8, mi_uint1korr, mi_int1store, 1, to);
      break;
    case HA_KEYTYPE_SHORT_INT:
      RT_PAGE_MBR_KORR(share, int16, mi_sint2korr, mi_int2store, 2, to);
      break;
    case HA_KEYTYPE_USHORT_INT:
      RT_PAGE_MBR_KORR(share, uint16, mi_uint2korr, mi_int2store, 2, to);
      break;
    case HA_KEYTYPE_INT24:
      RT_PAGE_MBR_KORR(share, int32, mi_sint3korr, mi_int3store, 3, to);
      break;
    case HA_KEYTYPE_UINT24:
      RT_PAGE_MBR_KORR(share, uint32, mi_uint3korr, mi_int3store, 3, to);
      break;
    case HA_KEYTYPE_LONG_INT:
      RT_PAGE_MBR_KORR(share, int32, mi_sint4korr, mi_int4store, 4, to);
      break;
    case HA_KEYTYPE_ULONG_INT:
      RT_PAGE_MBR_KORR(share, uint32, mi_uint4korr, mi_int4store, 4, to);
      break;
#ifdef HAVE_LONG_LONG
    case HA_KEYTYPE_LONGLONG:
      RT_PAGE_MBR_KORR(share, longlong, mi_sint8korr, mi_int8store, 8, to);
      break;
    case HA_KEYTYPE_ULONGLONG:
      RT_PAGE_MBR_KORR(share, ulonglong, mi_uint8korr, mi_int8store, 8, to);
      break;
#endif
    case HA_KEYTYPE_FLOAT:
      RT_PAGE_MBR_GET(share, float, mi_float4get, mi_float4store, 4, to);
      break;
    case HA_KEYTYPE_DOUBLE:
      RT_PAGE_MBR_GET(share, double, mi_float8get, mi_float8store, 8, to);
      break;
    case HA_KEYTYPE_END:
      return 0;
    default:
      return 1;
    }
  }
  return 0;
}