Drizzled Public API Documentation

my_handler.h
1 /* Copyright (C) 2002-2006 MySQL AB
2 
3  This library is free software; you can redistribute it and/or
4  modify it under the terms of the GNU Library General Public
5  License as published by the Free Software Foundation; version 2
6  of the License.
7 
8  This library 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 GNU
11  Library General Public License for more details.
12 
13  You should have received a copy of the GNU Library General Public
14  License along with this library; if not, write to the Free
15  Software Foundation, Inc., 51 Franklin Place - Suite 330, Boston,
16  MA 02110-1301, USA */
17 
18 #pragma once
19 
20 #include <drizzled/charset.h>
21 #include <plugin/myisam/myisampack.h>
22 
23 /*
24  There is a hard limit for the maximum number of keys as there are only
25  8 bits in the index file header for the number of keys in a table.
26  This means that 0..255 keys can exist for a table. The idea of
27  HA_MAX_POSSIBLE_KEY is to ensure that one can use myisamchk & tools on
28  a MyISAM table for which one has more keys than MyISAM is normally
29  compiled for. If you don't have this, you will get a core dump when
30  running myisamchk compiled for 128 keys on a table with 255 keys.
31 */
32 
33 #define HA_MAX_POSSIBLE_KEY 255 /* For myisamchk */
34 /*
35  The following defines can be increased if necessary.
36  But beware the dependency of MI_MAX_POSSIBLE_KEY_BUFF and HA_MAX_KEY_LENGTH.
37 */
38 
39 #define HA_MAX_KEY_LENGTH 1332 /* Max length in bytes */
40 #define HA_MAX_KEY_SEG 16 /* Max segments for key */
41 
42 #define HA_MAX_POSSIBLE_KEY_BUFF (HA_MAX_KEY_LENGTH + 24+ 6+6)
43 #define HA_MAX_KEY_BUFF (HA_MAX_KEY_LENGTH+HA_MAX_KEY_SEG*6+8+8)
44 
45 typedef struct st_HA_KEYSEG /* Key-portion */
46 {
47  const drizzled::charset_info_st *charset;
48  uint32_t start; /* Start of key in record */
49  uint32_t null_pos; /* position to NULL indicator */
50  uint16_t bit_pos; /* Position to bit part */
51  uint16_t flag;
52  uint16_t length; /* Keylength */
53  uint8_t type; /* Type of key (for sort) */
54  uint8_t language;
55  uint8_t null_bit; /* bitmask to test for NULL */
56  uint8_t bit_start,bit_end; /* if bit field */
57  uint8_t bit_length; /* Length of bit part */
58 } HA_KEYSEG;
59 
60 #define get_key_length(length,key) \
61 { if (*(unsigned char*) (key) != 255) \
62  length= (uint) *(unsigned char*) ((key)++); \
63  else \
64  { length= mi_uint2korr((key)+1); (key)+=3; } \
65 }
66 
67 #define get_key_length_rdonly(length,key) \
68 { if (*(unsigned char*) (key) != 255) \
69  length= ((uint) *(unsigned char*) ((key))); \
70  else \
71  { length= mi_uint2korr((key)+1); } \
72 }
73 
74 #define get_key_pack_length(length,length_pack,key) \
75 { if (*(unsigned char*) (key) != 255) \
76  { length= (uint) *(unsigned char*) ((key)++); length_pack= 1; }\
77  else \
78  { length=mi_uint2korr((key)+1); (key)+= 3; length_pack= 3; } \
79 }
80 
81 #define store_key_length_inc(key,length) \
82 { if ((length) < 255) \
83  { *(key)++= (length); } \
84  else \
85  { *(key)=255; mi_int2store((key)+1,(length)); (key)+=3; } \
86 }
87 
88 #define size_to_store_key_length(length) ((length) < 255 ? 1 : 3)
89 
90 #define get_rec_bits(bit_ptr, bit_ofs, bit_len) \
91  (((((uint16_t) (bit_ptr)[1] << 8) | (uint16_t) (bit_ptr)[0]) >> (bit_ofs)) & \
92  ((1 << (bit_len)) - 1))
93 
94 #define set_rec_bits(bits, bit_ptr, bit_ofs, bit_len) \
95 { \
96  (bit_ptr)[0]= ((bit_ptr)[0] & ~(((1 << (bit_len)) - 1) << (bit_ofs))) | \
97  ((bits) << (bit_ofs)); \
98  if ((bit_ofs) + (bit_len) > 8) \
99  (bit_ptr)[1]= ((bit_ptr)[1] & ~((1 << ((bit_len) - 8 + (bit_ofs))) - 1)) | \
100  ((bits) >> (8 - (bit_ofs))); \
101 }
102 
103 #define clr_rec_bits(bit_ptr, bit_ofs, bit_len) \
104  set_rec_bits(0, bit_ptr, bit_ofs, bit_len)
105 
106 extern int ha_compare_text(const drizzled::charset_info_st * const, unsigned char *, uint, unsigned char *, uint, bool, bool);
107 
108 extern HA_KEYSEG *ha_find_null(HA_KEYSEG *keyseg, unsigned char *a);
109 void my_handler_error_register(void);
110 extern int ha_key_cmp(HA_KEYSEG *keyseg, unsigned char *a,unsigned char *b,
111  uint32_t key_length,uint32_t nextflag,uint32_t *diff_length);
112 
113 /*
114  Inside an in-memory data record, memory pointers to pieces of the
115  record (like BLOBs) are stored in their native byte order and in
116  this amount of bytes.
117 */
118 #define portable_sizeof_char_ptr 8
119