17
17
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20
#include "drizzled/global.h"
21
#include "drizzled/server_includes.h" /* @TODO remove this when header include is refactored more... */
24
22
#include "drizzled/foreign_key.h"
25
23
#include "drizzled/error.h"
26
#include "drizzled/create_field.h"
27
#include "drizzled/internal/my_sys.h"
28
#include "drizzled/table_ident.h"
33
extern const CHARSET_INFO *system_charset_info;
35
void add_foreign_key_to_table_message(
36
message::Table *table_message,
37
const char* fkey_name,
38
List<Key_part_spec> &cols,
40
List<Key_part_spec> &ref_cols,
41
message::Table::ForeignKeyConstraint::ForeignKeyOption delete_opt_arg,
42
message::Table::ForeignKeyConstraint::ForeignKeyOption update_opt_arg,
43
message::Table::ForeignKeyConstraint::ForeignKeyMatchOption match_opt_arg)
45
message::Table::ForeignKeyConstraint *pfkey= table_message->add_fk_constraint();
47
pfkey->set_name(fkey_name);
48
else if (table_message->has_name())
50
std::string name(table_message->name());
53
name.append("_ibfk_");
54
snprintf(number, sizeof(number), "%d", table_message->fk_constraint_size());
57
pfkey->set_name(name);
60
pfkey->set_match(match_opt_arg);
61
pfkey->set_update_option(update_opt_arg);
62
pfkey->set_delete_option(delete_opt_arg);
64
pfkey->set_references_table_name(table->table.str);
66
Key_part_spec *keypart;
67
List_iterator<Key_part_spec> col_it(cols);
68
while ((keypart= col_it++))
70
pfkey->add_column_names(keypart->field_name.str);
73
List_iterator<Key_part_spec> ref_it(ref_cols);
74
while ((keypart= ref_it++))
76
pfkey->add_references_columns(keypart->field_name.str);
81
Foreign_key::Foreign_key(const Foreign_key &rhs, memory::Root *mem_root)
25
Foreign_key::Foreign_key(const Foreign_key &rhs, MEM_ROOT *mem_root)
83
27
ref_table(rhs.ref_table),
84
28
ref_columns(rhs.ref_columns),
180
124
my_error(ER_KEY_COLUMN_DOES_NOT_EXITS, MYF(0), column->field_name.str);
127
if (type == Key::FOREIGN_KEY && sql_field->vcol_info)
129
if (delete_opt == FK_OPTION_SET_NULL)
131
my_error(ER_WRONG_FK_OPTION_FOR_VIRTUAL_COLUMN, MYF(0),
132
"ON DELETE SET NULL");
135
if (update_opt == FK_OPTION_SET_NULL)
137
my_error(ER_WRONG_FK_OPTION_FOR_VIRTUAL_COLUMN, MYF(0),
138
"ON UPDATE SET NULL");
141
if (update_opt == FK_OPTION_CASCADE)
143
my_error(ER_WRONG_FK_OPTION_FOR_VIRTUAL_COLUMN, MYF(0),
144
"ON UPDATE CASCADE");
187
} /* namespace drizzled */