3
#include <grts/structs.db.h>
5
#include <grtpp_util.h>
6
#include <grtpp_undo_manager.h>
8
//================================================================================
12
// don't hold reference to the fk!
13
static std::map<grt::internal::Value*, std::set<db_ForeignKey*> > referenced_table_to_fk;
16
void db_ForeignKey::init()
21
static void delete_mapping(const db_TableRef &table, db_ForeignKey *fk)
25
grt::internal::Value *t= table.valueptr();
26
std::map<grt::internal::Value*, std::set<db_ForeignKey*> >::iterator iter= referenced_table_to_fk.find(t);
28
if (iter != referenced_table_to_fk.end())
30
iter->second.erase(iter->second.find(fk));
32
// if no more FKs to this table, remove the entry
33
if (iter->second.empty())
34
referenced_table_to_fk.erase(iter);
39
db_ForeignKey::~db_ForeignKey()
41
delete_mapping(_referencedTable, this);
46
grt::ListRef<db_ForeignKey> get_foreign_keys_referencing_table(const db_TableRef &value)
48
std::map<grt::internal::Value*, std::set<db_ForeignKey*> >::const_iterator iter;
49
grt::ListRef<db_ForeignKey> result(value.get_grt());
51
if ((iter= referenced_table_to_fk.find(value.valueptr())) != referenced_table_to_fk.end())
53
for (std::set<db_ForeignKey*>::const_iterator fk= iter->second.begin();
54
fk != iter->second.end(); ++fk)
56
result.insert(db_ForeignKeyRef(*fk));
63
void db_ForeignKey::referencedTable(const db_TableRef &value)
65
grt::ValueRef ovalue(_referencedTable);
67
// remove old referenced table from backreference map
68
delete_mapping(_referencedTable, this);
70
_referencedTable= value;
72
// add new referenced table to backreference map
73
if (_referencedTable.is_valid())
75
std::set<db_ForeignKey*> list;
76
std::map<grt::internal::Value*, std::set<db_ForeignKey*> >::iterator iter;
78
if ((iter= referenced_table_to_fk.find(_referencedTable.valueptr())) != referenced_table_to_fk.end())
80
iter->second.insert(this);
85
referenced_table_to_fk[_referencedTable.valueptr()]= list;
89
member_changed("referencedTable", ovalue, value);
91
if (_owner.is_valid())
92
(*owner()->signal_foreignKeyChanged())(this);
97
void db_ForeignKey::owner(const db_TableRef &value)
101
if (value.is_valid())
102
(*value->signal_foreignKeyChanged())(this);
106
void db_ForeignKey::owned_list_item_added(grt::internal::OwnedList *list, const grt::ValueRef &value)
108
super::owned_list_item_added(list, value);
110
if (_owner.is_valid())
111
(*owner()->signal_foreignKeyChanged())(this);
115
void db_ForeignKey::owned_list_item_removed(grt::internal::OwnedList *list, const grt::ValueRef &value)
117
super::owned_list_item_removed(list, value);
119
if (_owner.is_valid())
120
(*owner()->signal_foreignKeyChanged())(this);
125
/** Performs basic validation of the foreign key
127
grt::IntegerRef db_ForeignKey::checkCompleteness()
129
if (!_owner.is_valid() || !_referencedTable.is_valid())
132
// If we are currently undoing then don't check completeness either.
133
grt::UndoManager *um= get_grt()->get_undo_manager();
134
if (um != NULL && um->is_undoing())
137
if (db_TableRef::cast_from(_owner)->foreignKeys().get_index(db_ForeignKeyRef(this)) == grt::BaseListRef::npos)
140
if (_columns.count() != _referencedColumns.count())
143
for (size_t i= 0, c= _columns.count(); i < c; i++)
145
if (!_columns[i].is_valid() || !_referencedColumns[i].is_valid())