summaryrefslogtreecommitdiff
path: root/myisam/mi_open.c
diff options
context:
space:
mode:
Diffstat (limited to 'myisam/mi_open.c')
-rw-r--r--myisam/mi_open.c35
1 files changed, 30 insertions, 5 deletions
diff --git a/myisam/mi_open.c b/myisam/mi_open.c
index bcf8369b439..3dc6c9bf61f 100644
--- a/myisam/mi_open.c
+++ b/myisam/mi_open.c
@@ -17,6 +17,8 @@
/* open a isam-database */
#include "fulltext.h"
+#include "sp_defs.h"
+#include "rt_index.h"
#include <m_ctype.h>
#if defined(MSDOS) || defined(__WIN__)
@@ -65,7 +67,7 @@ static MI_INFO *test_if_reopen(char *filename)
MI_INFO *mi_open(const char *name, int mode, uint open_flags)
{
- int lock_error,kfile,open_mode,save_errno;
+ int lock_error,kfile,open_mode,save_errno,have_rtree=0;
uint i,j,len,errpos,head_length,base_pos,offset,info_length,extra,keys,
key_parts,unique_key_parts,tmp_length,uniques;
char name_buff[FN_REFLEN], org_name [FN_REFLEN], index_name[FN_REFLEN],
@@ -293,6 +295,7 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags)
for (j=0 ; j < share->keyinfo[i].keysegs; j++,pos++)
{
disk_pos=mi_keyseg_read(disk_pos, pos);
+
if (pos->type == HA_KEYTYPE_TEXT || pos->type == HA_KEYTYPE_VARTEXT)
{
if (!pos->language)
@@ -304,7 +307,12 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags)
}
}
}
- if (share->keyinfo[i].flag & HA_FULLTEXT)
+ if (share->keyinfo[i].flag & HA_SPATIAL)
+ {
+ uint sp_segs=SPDIMS*2;
+ share->keyinfo[i].seg=pos-sp_segs;
+ share->keyinfo[i].keysegs--;
+ } else if (share->keyinfo[i].flag & HA_FULLTEXT)
{
share->keyinfo[i].seg=pos-FT_SEGS;
share->fulltext_index=1;
@@ -342,7 +350,11 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags)
}
}
for (i=0 ; i < keys ; i++)
+ {
+ if (share->keyinfo[i].key_alg == HA_KEY_ALG_RTREE)
+ have_rtree=1;
setup_key_functions(share->keyinfo+i);
+ }
for (i=j=offset=0 ; i < share->base.fields ; i++)
{
@@ -421,7 +433,8 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags)
((share->options & (HA_OPTION_READ_ONLY_DATA | HA_OPTION_TMP_TABLE |
HA_OPTION_COMPRESS_RECORD |
HA_OPTION_TEMP_COMPRESS_RECORD)) ||
- (open_flags & HA_OPEN_TMP_TABLE)) ? 0 : 1;
+ (open_flags & HA_OPEN_TMP_TABLE) ||
+ have_rtree) ? 0 : 1;
if (share->concurrent_insert)
{
share->lock.get_status=mi_get_status;
@@ -451,6 +464,7 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags)
&info.blobs,sizeof(MI_BLOB)*share->base.blobs,
&info.buff,(share->base.max_key_block_length*2+
share->base.max_key_length),
+ &info.rtree_recursion_state,have_rtree ? 1024 : 0,
&info.lastkey,share->base.max_key_length*3+1,
&info.filename,strlen(org_name)+1,
NullS))
@@ -631,6 +645,16 @@ void mi_setup_functions(register MYISAM_SHARE *share)
static void setup_key_functions(register MI_KEYDEF *keyinfo)
{
+ if (keyinfo->key_alg == HA_KEY_ALG_RTREE)
+ {
+ keyinfo->ck_insert = rtree_insert;
+ keyinfo->ck_delete = rtree_delete;
+ }
+ else
+ {
+ keyinfo->ck_insert = _mi_ck_write;
+ keyinfo->ck_delete = _mi_ck_delete;
+ }
if (keyinfo->flag & HA_BINARY_PACK_KEY)
{ /* Simple prefix compression */
keyinfo->bin_search=_mi_seq_search;
@@ -896,7 +920,7 @@ uint mi_keydef_write(File file, MI_KEYDEF *keydef)
uchar *ptr=buff;
*ptr++ = (uchar) keydef->keysegs;
- *ptr++ = 0; /* not used */
+ *ptr++ = keydef->key_alg; /* +BAR Rtree or Btree */
mi_int2store(ptr,keydef->flag); ptr +=2;
mi_int2store(ptr,keydef->block_length); ptr +=2;
mi_int2store(ptr,keydef->keylength); ptr +=2;
@@ -908,7 +932,8 @@ uint mi_keydef_write(File file, MI_KEYDEF *keydef)
char *mi_keydef_read(char *ptr, MI_KEYDEF *keydef)
{
keydef->keysegs = (uint) *ptr++;
- ptr++;
+ keydef->key_alg = *ptr++; /* +BAR Rtree or Btree */
+
keydef->flag = mi_uint2korr(ptr); ptr +=2;
keydef->block_length = mi_uint2korr(ptr); ptr +=2;
keydef->keylength = mi_uint2korr(ptr); ptr +=2;