blob: 9415caba813c1ecda9e49c84c43065d825d190c5 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
// file : odb/semantics/relational/elements.txx
// copyright : Copyright (c) 2009-2013 Code Synthesis Tools CC
// license : GNU GPL v3; see accompanying LICENSE file
namespace semantics
{
namespace relational
{
// scope
//
template <typename N>
typename scope<N>::names_iterator scope<N>::
find (name_type const& name)
{
typename names_map::iterator i (names_map_.find (name));
if (i == names_map_.end ())
return names_.end ();
else
return i->second;
}
template <typename N>
typename scope<N>::names_const_iterator scope<N>::
find (name_type const& name) const
{
typename names_map::const_iterator i (names_map_.find (name));
if (i == names_map_.end ())
return names_.end ();
else
return names_const_iterator (i->second);
}
template <typename N>
typename scope<N>::names_iterator scope<N>::
find (names_type const& e)
{
typename names_iterator_map::iterator i (iterator_map_.find (&e));
return i != iterator_map_.end () ? i->second : names_.end ();
}
template <typename N>
typename scope<N>::names_const_iterator scope<N>::
find (names_type const& e) const
{
typename names_iterator_map::const_iterator i (iterator_map_.find (&e));
return i != iterator_map_.end () ? i->second : names_.end ();
}
class column;
class primary_key;
template <typename N>
void scope<N>::
add_edge_left (names_type& e)
{
nameable_type& n (e.nameable ());
name_type const& name (e.name ());
typename names_map::iterator i (names_map_.find (name));
if (i == names_map_.end ())
{
typename names_list::iterator i;
// We want the order to be columns first, then the primary key,
// and then the foreign keys.
//
if (n.is_a<column> ())
i = names_.insert (first_key_, &e);
else
{
if (n.is_a<primary_key> ())
first_key_ = i = names_.insert (first_key_, &e);
else
{
i = names_.insert (names_.end (), &e);
if (first_key_ == names_.end ())
first_key_ = i;
}
}
names_map_[name] = i;
iterator_map_[&e] = i;
}
else
throw duplicate_name (*this, (*i->second)->nameable (), n);
}
}
}
|