21
21
#ifndef DRIZZLED_KEY_H
22
22
#define DRIZZLED_KEY_H
25
#include <boost/dynamic_bitset.hpp>
27
#include "drizzled/memory/sql_alloc.h"
28
#include "drizzled/key_part_spec.h"
29
#include "drizzled/sql_list.h"
30
#include "drizzled/lex_string.h"
31
#include "drizzled/sql_string.h"
32
#include "drizzled/handler_structs.h"
37
namespace memory { class Root; }
25
#include <drizzled/sql_alloc.h>
26
#include <drizzled/key_part_spec.h>
27
#include <drizzled/sql_list.h>
28
#include <drizzled/lex_string.h>
29
#include <drizzled/handler_structs.h>
32
typedef struct st_mem_root MEM_ROOT;
41
class Key :public memory::SqlAlloc {
34
class Key :public Sql_alloc {
43
36
enum Keytype { PRIMARY, UNIQUE, MULTIPLE, FOREIGN_KEY};
45
38
KEY_CREATE_INFO key_create_info;
46
39
List<Key_part_spec> columns;
51
const lex_string_t &name_arg,
43
Key(enum Keytype type_par, const LEX_STRING &name_arg,
52
44
KEY_CREATE_INFO *key_info_arg,
53
bool generated_arg, List<Key_part_spec> &cols) :
55
key_create_info(*key_info_arg),
58
generated(generated_arg)
45
bool generated_arg, List<Key_part_spec> &cols)
46
:type(type_par), key_create_info(*key_info_arg), columns(cols),
47
name(name_arg), generated(generated_arg)
64
KEY_CREATE_INFO *key_info_arg,
66
List<Key_part_spec> &cols) :
68
key_create_info(*key_info_arg),
49
Key(enum Keytype type_par, const char *name_arg, size_t name_len_arg,
50
KEY_CREATE_INFO *key_info_arg, bool generated_arg,
51
List<Key_part_spec> &cols)
52
:type(type_par), key_create_info(*key_info_arg), columns(cols),
70
53
generated(generated_arg)
72
name.str= const_cast<char *>(name_arg);
55
name.str= (char *)name_arg;
73
56
name.length= name_len_arg;
60
* Construct an (almost) deep copy of this key. Only those
61
* elements that are known to never change are not copied.
62
* If out of memory, a partial copy is returned and an error is set
65
Key(const Key &rhs, MEM_ROOT *mem_root);
77
67
/* Equality comparison of keys (ignoring name) */
78
68
friend bool foreign_key_prefix(Key *a, Key *b);
70
Used to make a clone of this object for ALTER/CREATE TABLE
71
@sa comment for Key_part_spec::clone
73
virtual Key *clone(MEM_ROOT *mem_root) const
74
{ return new (mem_root) Key(*this, mem_root); }
82
int find_ref_key(KeyInfo *key, uint32_t key_count, unsigned char *record, Field *field,
78
int find_ref_key(KEY *key, uint32_t key_count, unsigned char *record, Field *field,
83
79
uint32_t *key_length, uint32_t *keypart);
85
81
Copy part of a record that forms a key or key prefix to a buffer.
96
92
@param key_length specifies length of all keyparts that will be copied
99
DRIZZLED_API void key_copy(unsigned char *to_key, unsigned char *from_record, KeyInfo *key_info, uint32_t key_length);
95
void key_copy(unsigned char *to_key, unsigned char *from_record, KEY *key_info, uint32_t key_length);
100
96
void key_copy(std::basic_string<unsigned char> &to_key,
101
unsigned char *from_record, KeyInfo *key_info, uint32_t key_length);
102
void key_restore(unsigned char *to_record, unsigned char *from_key, KeyInfo *key_info,
97
unsigned char *from_record, KEY *key_info, uint32_t key_length);
98
void key_restore(unsigned char *to_record, unsigned char *from_key, KEY *key_info,
103
99
uint16_t key_length);
104
void key_zero_nulls(unsigned char *tuple, KeyInfo *key_info);
100
void key_zero_nulls(unsigned char *tuple, KEY *key_info);
105
101
bool key_cmp_if_same(Table *form,const unsigned char *key,uint32_t index,uint32_t key_length);
106
void key_unpack(String *to, const Table *form,uint32_t index);
107
bool is_key_used(Table *table, uint32_t idx, const boost::dynamic_bitset<>& fields);
108
int key_cmp(KeyPartInfo *key_part, const unsigned char *key, uint32_t key_length);
110
} /* namespace drizzled */
102
void key_unpack(String *to,Table *form,uint32_t index);
103
bool is_key_used(Table *table, uint32_t idx, const MyBitmap *fields);
104
int key_cmp(KEY_PART_INFO *key_part, const unsigned char *key, uint32_t key_length);
105
extern "C" int key_rec_cmp(void *key_info, unsigned char *a, unsigned char *b);
112
106
#endif /* DRIZZLED_KEY_H */