rt_key.c
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:3k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2000 MySQL AB & Ramil Kalimullin
  2.    
  3.    This program is free software; you can redistribute it and/or modify
  4.    it under the terms of the GNU General Public License as published by
  5.    the Free Software Foundation; either version 2 of the License, or
  6.    (at your option) any later version.
  7.    
  8.    This program is distributed in the hope that it will be useful,
  9.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11.    GNU General Public License for more details.
  12.    
  13.    You should have received a copy of the GNU General Public License
  14.    along with this program; if not, write to the Free Software
  15.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  16. #include "myisamdef.h"
  17. #ifdef HAVE_RTREE_KEYS
  18. #include "rt_index.h"
  19. #include "rt_key.h"
  20. #include "rt_mbr.h"
  21. /*
  22.   Add key to the page
  23.   RESULT VALUES
  24.     -1  Error
  25.     0  Not split
  26.     1 Split
  27. */
  28. int rtree_add_key(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *key, 
  29.   uint key_length, uchar *page_buf, my_off_t *new_page)
  30. {
  31.   uint page_size = mi_getint(page_buf);
  32.   uint nod_flag = mi_test_if_nod(page_buf);
  33.   if (page_size + key_length + info->s->base.rec_reflength <=
  34.       keyinfo->block_length)
  35.   {
  36.     /* split won't be necessary */
  37.     if (nod_flag)
  38.     {
  39.       /* save key */
  40.       memcpy(rt_PAGE_END(page_buf), key - nod_flag, key_length + nod_flag); 
  41.       page_size += key_length + nod_flag;
  42.     }
  43.     else
  44.     {
  45.       /* save key */
  46.       memcpy(rt_PAGE_END(page_buf), key, key_length + 
  47.                                          info->s->base.rec_reflength);
  48.       page_size += key_length + info->s->base.rec_reflength;
  49.     }
  50.     mi_putint(page_buf, page_size, nod_flag);
  51.     return 0;
  52.   }
  53.   return (rtree_split_page(info, keyinfo, page_buf, key, key_length,
  54.    new_page) ? -1 : 1);
  55. }
  56. /*
  57.   Delete key from the page
  58. */
  59. int rtree_delete_key(MI_INFO *info, uchar *page_buf, uchar *key, 
  60.      uint key_length, uint nod_flag)
  61. {
  62.   uint16 page_size = mi_getint(page_buf);
  63.   uchar *key_start;
  64.   key_start= key - nod_flag;
  65.   if (!nod_flag)
  66.     key_length += info->s->base.rec_reflength;
  67.   memmove(key_start, key + key_length, page_size - key_length -
  68.   (key - page_buf));
  69.   page_size-= key_length + nod_flag;
  70.   mi_putint(page_buf, page_size, nod_flag);
  71.   return 0;
  72. }
  73. /*
  74.   Calculate and store key MBR
  75. */
  76. int rtree_set_key_mbr(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *key, 
  77.       uint key_length, my_off_t child_page)
  78. {
  79.   if (!_mi_fetch_keypage(info, keyinfo, child_page,
  80.                          DFLT_INIT_HITS, info->buff, 0))
  81.     return -1;
  82.   return rtree_page_mbr(info, keyinfo->seg, info->buff, key, key_length);
  83. }
  84. #endif /*HAVE_RTREE_KEYS*/