20
20
#include "drizzled/internal/m_string.h"
21
21
#include <drizzled/util/test.h>
23
using namespace drizzled;
23
25
static bool _mi_get_prev_key(MI_INFO *info, MI_KEYDEF *keyinfo, unsigned char *page,
24
26
unsigned char *key, unsigned char *keypos,
25
27
uint32_t *return_key_length);
58
60
int _mi_search(register MI_INFO *info, register MI_KEYDEF *keyinfo,
59
unsigned char *key, uint32_t key_len, uint32_t nextflag, register my_off_t pos)
61
unsigned char *key, uint32_t key_len, uint32_t nextflag, register internal::my_off_t pos)
550
return ((my_off_t) mi_uint4korr(after_key))*MI_MIN_KEY_BLOCK_LENGTH;
552
return ((internal::my_off_t) mi_uint4korr(after_key))*MI_MIN_KEY_BLOCK_LENGTH;
552
return ((my_off_t) mi_uint3korr(after_key))*MI_MIN_KEY_BLOCK_LENGTH;
554
return ((internal::my_off_t) mi_uint3korr(after_key))*MI_MIN_KEY_BLOCK_LENGTH;
554
return (my_off_t) (mi_uint2korr(after_key)*MI_MIN_KEY_BLOCK_LENGTH);
556
return (internal::my_off_t) (mi_uint2korr(after_key)*MI_MIN_KEY_BLOCK_LENGTH);
556
558
return (uint) (*after_key)*MI_MIN_KEY_BLOCK_LENGTH;
557
559
case 0: /* At leaf page */
564
566
/* Save pos to a key_block */
566
void _mi_kpointer(register MI_INFO *info, register unsigned char *buff, my_off_t pos)
568
void _mi_kpointer(register MI_INFO *info, register unsigned char *buff, internal::my_off_t pos)
568
570
pos/=MI_MIN_KEY_BLOCK_LENGTH;
569
571
switch (info->s->base.key_reflength) {
591
593
/* Calc pos to a data-record from a key */
594
my_off_t _mi_dpos(MI_INFO *info, uint32_t nod_flag, unsigned char *after_key)
596
internal::my_off_t _mi_dpos(MI_INFO *info, uint32_t nod_flag, unsigned char *after_key)
598
internal::my_off_t pos;
597
599
after_key-=(nod_flag + info->s->rec_reflength);
598
600
switch (info->s->rec_reflength) {
599
601
#if SIZEOF_OFF_T > 4
600
case 8: pos= (my_off_t) mi_uint8korr(after_key); break;
601
case 7: pos= (my_off_t) mi_uint7korr(after_key); break;
602
case 6: pos= (my_off_t) mi_uint6korr(after_key); break;
603
case 5: pos= (my_off_t) mi_uint5korr(after_key); break;
602
case 8: pos= (internal::my_off_t) mi_uint8korr(after_key); break;
603
case 7: pos= (internal::my_off_t) mi_uint7korr(after_key); break;
604
case 6: pos= (internal::my_off_t) mi_uint6korr(after_key); break;
605
case 5: pos= (internal::my_off_t) mi_uint5korr(after_key); break;
605
case 8: pos= (my_off_t) mi_uint4korr(after_key+4); break;
606
case 7: pos= (my_off_t) mi_uint4korr(after_key+3); break;
607
case 6: pos= (my_off_t) mi_uint4korr(after_key+2); break;
608
case 5: pos= (my_off_t) mi_uint4korr(after_key+1); break;
607
case 8: pos= (internal::my_off_t) mi_uint4korr(after_key+4); break;
608
case 7: pos= (internal::my_off_t) mi_uint4korr(after_key+3); break;
609
case 6: pos= (internal::my_off_t) mi_uint4korr(after_key+2); break;
610
case 5: pos= (internal::my_off_t) mi_uint4korr(after_key+1); break;
610
case 4: pos= (my_off_t) mi_uint4korr(after_key); break;
611
case 3: pos= (my_off_t) mi_uint3korr(after_key); break;
612
case 2: pos= (my_off_t) mi_uint2korr(after_key); break;
612
case 4: pos= (internal::my_off_t) mi_uint4korr(after_key); break;
613
case 3: pos= (internal::my_off_t) mi_uint3korr(after_key); break;
614
case 2: pos= (internal::my_off_t) mi_uint2korr(after_key); break;
614
616
pos=0L; /* Shut compiler up */
622
624
/* Calc position from a record pointer ( in delete link chain ) */
624
my_off_t _mi_rec_pos(MYISAM_SHARE *s, unsigned char *ptr)
626
internal::my_off_t _mi_rec_pos(MYISAM_SHARE *s, unsigned char *ptr)
628
internal::my_off_t pos;
627
629
switch (s->rec_reflength) {
628
630
#if SIZEOF_OFF_T > 4
630
pos= (my_off_t) mi_uint8korr(ptr);
632
pos= (internal::my_off_t) mi_uint8korr(ptr);
631
633
if (pos == HA_OFFSET_ERROR)
632
634
return HA_OFFSET_ERROR; /* end of list */
635
pos= (my_off_t) mi_uint7korr(ptr);
636
if (pos == (((my_off_t) 1) << 56) -1)
637
pos= (internal::my_off_t) mi_uint7korr(ptr);
638
if (pos == (((internal::my_off_t) 1) << 56) -1)
637
639
return HA_OFFSET_ERROR; /* end of list */
640
pos= (my_off_t) mi_uint6korr(ptr);
641
if (pos == (((my_off_t) 1) << 48) -1)
642
pos= (internal::my_off_t) mi_uint6korr(ptr);
643
if (pos == (((internal::my_off_t) 1) << 48) -1)
642
644
return HA_OFFSET_ERROR; /* end of list */
645
pos= (my_off_t) mi_uint5korr(ptr);
646
if (pos == (((my_off_t) 1) << 40) -1)
647
pos= (internal::my_off_t) mi_uint5korr(ptr);
648
if (pos == (((internal::my_off_t) 1) << 40) -1)
647
649
return HA_OFFSET_ERROR; /* end of list */
655
657
/* fall through */
658
pos= (my_off_t) mi_uint4korr(ptr);
659
if (pos == (my_off_t) UINT32_MAX)
660
pos= (internal::my_off_t) mi_uint4korr(ptr);
661
if (pos == (internal::my_off_t) UINT32_MAX)
660
662
return HA_OFFSET_ERROR;
663
pos= (my_off_t) mi_uint3korr(ptr);
664
if (pos == (my_off_t) (1 << 24) -1)
665
pos= (internal::my_off_t) mi_uint3korr(ptr);
666
if (pos == (internal::my_off_t) (1 << 24) -1)
665
667
return HA_OFFSET_ERROR;
668
pos= (my_off_t) mi_uint2korr(ptr);
669
if (pos == (my_off_t) (1 << 16) -1)
670
pos= (internal::my_off_t) mi_uint2korr(ptr);
671
if (pos == (internal::my_off_t) (1 << 16) -1)
670
672
return HA_OFFSET_ERROR;
672
674
default: abort(); /* Impossible */
680
682
/* save position to record */
682
void _mi_dpointer(MI_INFO *info, unsigned char *buff, my_off_t pos)
684
void _mi_dpointer(MI_INFO *info, unsigned char *buff, internal::my_off_t pos)
684
686
if (!(info->s->options &
685
687
(HA_OPTION_PACK_RECORD | HA_OPTION_COMPRESS_RECORD)) &&
799
801
if (tot_length >= 255 && *start != 255)
801
803
/* length prefix changed from a length of one to a length of 3 */
802
bmove_upp(key+length+3, key+length+1, length);
804
internal::bmove_upp(key+length+3, key+length+1, length);
804
806
mi_int2store(key+1,tot_length);
1174
1176
/* This can't be used when database is touched after last read */
1176
1178
int _mi_search_next(register MI_INFO *info, register MI_KEYDEF *keyinfo,
1177
unsigned char *key, uint32_t key_length, uint32_t nextflag, my_off_t pos)
1179
unsigned char *key, uint32_t key_length, uint32_t nextflag, internal::my_off_t pos)
1180
1182
uint32_t nod_flag;
1208
1210
if (nextflag & SEARCH_BIGGER) /* Next key */
1210
my_off_t tmp_pos=_mi_kpos(nod_flag,info->int_keypos);
1212
internal::my_off_t tmp_pos=_mi_kpos(nod_flag,info->int_keypos);
1211
1213
if (tmp_pos != HA_OFFSET_ERROR)
1213
1215
if ((error=_mi_search(info,keyinfo,key, USE_WHOLE_KEY,
1292
1294
/* This is stored in info->lastpos */
1294
1296
int _mi_search_last(register MI_INFO *info, register MI_KEYDEF *keyinfo,
1295
register my_off_t pos)
1297
register internal::my_off_t pos)
1297
1299
uint32_t nod_flag;
1298
1300
unsigned char *buff,*page;