1
1
/* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
2
* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
4
* Copyright (C) 2008 Sun Microsystems, Inc.
4
* Copyright (C) 2008 Sun Microsystems
6
6
* This program is free software; you can redistribute it and/or modify
7
7
* it under the terms of the GNU General Public License as published by
20
20
#ifndef DRIZZLED_STORED_KEY_H
21
21
#define DRIZZLED_STORED_KEY_H
23
#include <drizzled/memory/sql_alloc.h>
24
#include <drizzled/copy_field.h>
33
26
/** class to store an field/item as a key struct */
34
27
class StoredKey :public memory::SqlAlloc
46
38
Field *to_field; // Store data here
47
39
unsigned char *null_ptr;
49
41
virtual enum store_key_result copy_inner()=0;
52
43
StoredKey(Session *session,
54
45
unsigned char *ptr,
55
46
unsigned char *null,
53
if (field_arg->type() == DRIZZLE_TYPE_BLOB)
56
Key segments are always packed with a 2 byte length prefix.
57
See mi_rkey for details.
59
to_field= new Field_varstring(ptr,
64
field_arg->field_name,
65
field_arg->getTable()->getMutableShare(),
66
field_arg->charset());
67
to_field->init(field_arg->getTable());
70
to_field= field_arg->new_key_field(session->mem_root, field_arg->getTable(),
73
to_field->setWriteSet();
58
75
virtual ~StoredKey() {} /** Not actually needed */
59
76
virtual const char *name() const=0;
64
81
@details this function makes sure truncation warnings when preparing the
65
82
key buffers don't end up as errors (because of an enclosing INSERT/UPDATE).
67
enum store_key_result copy();
84
enum store_key_result copy()
86
enum store_key_result result;
87
Session *session= to_field->getTable()->in_use;
88
enum_check_fields saved_count_cuted_fields= session->count_cuted_fields;
89
session->count_cuted_fields= CHECK_FIELD_IGNORE;
91
session->count_cuted_fields= saved_count_cuted_fields;
71
97
class store_key_field: public StoredKey
73
99
CopyField copy_field;
74
100
const char *field_name;
77
102
store_key_field(Session *session, Field *to_field_arg, unsigned char *ptr,
78
103
unsigned char *null_ptr_arg,
79
uint32_t length, Field *from_field, const char *name_arg) :
80
StoredKey(session, to_field_arg,ptr,
81
null_ptr_arg ? null_ptr_arg : from_field->maybe_null() ? &err
82
: (unsigned char*) 0, length), field_name(name_arg)
104
uint32_t length, Field *from_field, const char *name_arg)
105
:StoredKey(session, to_field_arg,ptr,
106
null_ptr_arg ? null_ptr_arg : from_field->maybe_null() ? &err
107
: (unsigned char*) 0, length), field_name(name_arg)
86
111
copy_field.set(to_field,from_field,0);
100
125
class store_key_item :public StoredKey
106
130
store_key_item(Session *session, Field *to_field_arg, unsigned char *ptr,
107
unsigned char *null_ptr_arg, uint32_t length, Item *item_arg) :
108
StoredKey(session, to_field_arg, ptr,
131
unsigned char *null_ptr_arg, uint32_t length, Item *item_arg)
132
:StoredKey(session, to_field_arg, ptr,
109
133
null_ptr_arg ? null_ptr_arg : item_arg->maybe_null ?
110
134
&err : (unsigned char*) 0, length), item(item_arg)
123
147
class store_key_const_item :public store_key_item
128
151
store_key_const_item(Session *session, Field *to_field_arg, unsigned char *ptr,
129
unsigned char *null_ptr_arg, uint32_t length,
131
store_key_item(session, to_field_arg,ptr,
132
null_ptr_arg ? null_ptr_arg : item_arg->maybe_null ?
133
&err : (unsigned char*) 0, length, item_arg), inited(0)
152
unsigned char *null_ptr_arg, uint32_t length,
154
:store_key_item(session, to_field_arg,ptr,
155
null_ptr_arg ? null_ptr_arg : item_arg->maybe_null ?
156
&err : (unsigned char*) 0, length, item_arg), inited(0)
136
159
const char *name() const { return "const"; }