diff options
Diffstat (limited to 'myisam/rt_key.c')
-rw-r--r-- | myisam/rt_key.c | 63 |
1 files changed, 30 insertions, 33 deletions
diff --git a/myisam/rt_key.c b/myisam/rt_key.c index c08e918c6db..a48aec53c97 100644 --- a/myisam/rt_key.c +++ b/myisam/rt_key.c @@ -1,5 +1,4 @@ -/* Copyright (C) 2000 MySQL AB & Ramil Kalimullin & MySQL Finland AB - & TCX DataKonsult AB +/* Copyright (C) 2000 MySQL AB & Ramil Kalimullin 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 @@ -22,14 +21,16 @@ #include "rt_mbr.h" /* -Add key to the page -Result values: --1 - error - 0 - not split - 1 - split + Add key to the page + + RESULT VALUES + -1 Error + 0 Not split + 1 Split */ + int rtree_add_key(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *key, - uint key_length, uchar *page_buf, my_off_t *new_page) + uint key_length, uchar *page_buf, my_off_t *new_page) { uint page_size = mi_getint(page_buf); uint nod_flag = mi_test_if_nod(page_buf); @@ -53,47 +54,39 @@ int rtree_add_key(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *key, mi_putint(page_buf, page_size, nod_flag); return 0; } - else - { - if (rtree_split_page(info, keyinfo, page_buf, key, key_length, new_page)) - return -1; - else - return 1; - } + + return (rtree_split_page(info, keyinfo, page_buf, key, key_length, + new_page) ? -1 : 0); } /* -Delete key from the page + Delete key from the page */ int rtree_delete_key(MI_INFO *info, uchar *page_buf, uchar *key, - uint key_length, uint nod_flag) + uint key_length, uint nod_flag) { uint16 page_size = mi_getint(page_buf); uchar *key_start; + key_start= key - nod_flag; if (nod_flag) - { - key_start = key - nod_flag; - } - else - { - key_start = key; key_length += info->s->base.rec_reflength; - } - memmove(key_start, key + key_length, page_size - key_length - - (key - page_buf)); - page_size -= key_length + nod_flag; - mi_putint(page_buf, page_size, nod_flag); + memmove(key_start, key + key_length, page_size - key_length - + (key - page_buf)); + page_size-= key_length + nod_flag; + mi_putint(page_buf, page_size, nod_flag); return 0; } + /* -Calculate and store key MBR + Calculate and store key MBR */ + int rtree_set_key_mbr(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *key, - uint key_length, my_off_t child_page) + uint key_length, my_off_t child_page) { uchar *k; uchar *last; @@ -114,21 +107,25 @@ err1: return -1; } + /* -Choose non-leaf better key for insertion + Choose non-leaf better key for insertion */ + uchar *rtree_choose_key(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *key, - uint key_length, uchar *page_buf, uint nod_flag) + uint key_length, uchar *page_buf, uint nod_flag) { double increase; double best_incr = DBL_MAX; double area; double best_area; uchar *best_key; - uchar *k = rt_PAGE_FIRST_KEY(page_buf, nod_flag); uchar *last = rt_PAGE_END(page_buf); + LINT_INIT(best_area); + LINT_INIT(best_key); + for (; k < last; k = rt_PAGE_NEXT_KEY(k, key_length, nod_flag)) { if ((increase = rtree_area_increase(keyinfo->seg, key, k, key_length, |