File: catalog_templates.h

package info (click to toggle)
mysql-workbench 6.3.8%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 113,932 kB
  • ctags: 87,814
  • sloc: ansic: 955,521; cpp: 427,465; python: 59,728; yacc: 59,129; xml: 54,204; sql: 7,091; objc: 965; makefile: 638; sh: 613; java: 237; perl: 30; ruby: 6; php: 1
file content (301 lines) | stat: -rw-r--r-- 7,779 bytes parent folder | download | duplicates (3)
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
/* 
 * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; version 2 of the
 * License.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301  USA
 */
#ifndef _CATALOG_TEMPLATES_
#define _CATALOG_TEMPLATES_

#include "grts/structs.h"
#include "grts/structs.db.mgmt.h"
#include "grts/structs.db.mysql.h"

namespace ct
{

//! \addtogroup grt_iter GRT iterators
//!  
//! To iterate through GRT model catalog_iterators can be used.
//! The following code explains how to use template based iterators
//!
//! Enumeration \ref SubcontainerNamesEnum lists types of object for 
//! which iteration is possible.
//!
//! \anchor foreachusage
//! \code
//! //==============================================================
//! class TableWalker
//! {
//!   public:
//!     void operator()(const db_TableRef& table);
//!     int tablesCount() const { return tablesCnt; }
//!   private:
//!     int tablesCnt;
//! };
//! 
//! //--------------------------------------------------------------
//! void TableWalker::operator()(const db_TableRef& table)
//! {
//!   ++tableCnt;
//! }
//!
//! //--------------------------------------------------------------
//! {
//!   db_SchemaRef schema = ...;
//!   ...
//!   TableWalker tw;
//!   ct::for_each<ct::Tables>(schema, tw);
//!   std::cout << tw.tablesCount();
//! }
//!
//! \endcode
//!   @{
//!


//! \enum SubcontainerNamesEnum
//! \brief Possible types of objects to iterate on
enum SubcontainerNamesEnum
{
  Schemata= 0,                  //!< Schemata
  Tables,                       //!< Table
  Views,                        //!< View
  Routines,                     //!< Routine
  Triggers,                     //!< Trigger
  Columns,                      //!< Column
  Indices,                      //!< Index
  ForeignKeys,                  //!< Foreign key
  ReferedColumns,               //!< Referenced column
  Users,                        //!< User
  Size                          //!< Number of values in SubcontainerNamesEnum
};

template<typename T, int SubcontainerSelector>
struct Subc
{
};

template<typename T>
struct Subc<T, ct::Schemata>
{
  typedef T ParentRef;
  typedef db_mysql_Schema Type;
  static grt::ListRef<Type> get(ParentRef p) { return p->schemata(); }
};

template<typename T>
struct Subc<T, ct::Tables>
{
  typedef T ParentRef;
  typedef db_mysql_Table Type;
  static grt::ListRef<Type> get(ParentRef p) { return p->tables(); }
};

template<typename T>
struct Subc<T, ct::Views>
{
  typedef T ParentRef;
  typedef db_mysql_View Type;
  static grt::ListRef<Type> get(ParentRef p) { return p->views(); }
};

template<typename T>
struct Subc<T, ct::Routines>
{
  typedef T ParentRef;
  typedef db_mysql_Routine Type;
  static grt::ListRef<Type> get(ParentRef p) { return p->routines(); }
};

template<>
struct Subc<db_mysql_IndexRef, ct::Columns>
{
  typedef db_mysql_IndexRef ParentRef;
  typedef db_mysql_IndexColumn Type;
  static grt::ListRef<Type> get(ParentRef p) { return p->columns(); }
};

template<typename T>
struct Subc<T, ct::Columns>
{
  typedef T ParentRef;
  typedef db_mysql_Column Type;
  static grt::ListRef<Type> get(ParentRef p) { return p->columns(); }
};

template<typename T>
struct Subc<T, ct::Indices>
{
  typedef T ParentRef;
  typedef db_mysql_Index Type;
  static grt::ListRef<Type> get(ParentRef p) { return p->indices(); }
};

template<typename T>
struct Subc<T, ct::Triggers>
{
  typedef T ParentRef;
  typedef db_mysql_Trigger Type;
  static grt::ListRef<Type> get(ParentRef p) { return p->triggers(); }
};

template<typename T>
struct Subc<T, ct::ForeignKeys>
{
  typedef T ParentRef;
  typedef db_mysql_ForeignKey Type;
  static grt::ListRef<Type> get(ParentRef p) { return p->foreignKeys(); }
};

template<typename T>
struct Subc<T, ct::ReferedColumns>
{
  typedef T ParentRef;
  typedef db_Column Type;
  static grt::ListRef<Type> get(ParentRef p) { return p->referencedColumns(); }
};

template<typename T>
struct Subc<T, ct::Users>
{
  typedef T ParentRef;
  typedef db_User Type;
  static grt::ListRef<Type> get(ParentRef p) { return p->users(); }
};

//! Iterates over specified type of GRT objects in given container
//! For example see \ref foreachusage "ct::for_each usage example"
template<int _Selector, typename _Parent, typename _Pred>
void for_each(_Parent parent, _Pred& pred)
{
  typedef ct::Subc<_Parent, _Selector> Container;
  typedef typename Container::Type Type;
  typedef grt::ListRef<Type> ListType;

  ListType list= Container::get(parent);
  for(size_t i= 0, count= list.count(); i < count; i++)
  {
    grt::Ref<Type> t= list.get(i);
    pred(t);
  }
}

typedef std::vector<std::string> StringList;
//-----------------------------------------------------------------------------
template <typename T>
std::vector<std::string> findDupIds(const grt::ListRef<T> &list)
{
  const int count = list.count();
  std::vector<std::string> dup_ids;
  
  for(int bound = count - 1; bound > 0; --bound)
  {
    const T& bound_item(list.get(bound));
    for ( int i = bound - 1; i >= 0; --i )
    {
      if ( bound_item->name() == list.get(i)->name() )
      {
        dup_ids.push_back(bound_item->name().c_str());
      }
    }
  }
  
  return dup_ids;
}

template<typename T> struct Traits
{
};

template<typename T> struct TraitsBase
{
  typedef T Type;
};

template<> struct Traits<db_mysql_Schema> : public TraitsBase<db_mysql_Schema>
{
  typedef db_mysql_Catalog ParentType;
};

template<> struct Traits<db_mysql_Table> : public TraitsBase<db_mysql_Table>
{
  typedef db_mysql_Schema ParentType;
};

template<> struct Traits<db_User> : public TraitsBase<db_User>
{
  typedef db_mysql_Schema ParentType;
};

template<> struct Traits<db_Column> : public TraitsBase<db_Column>
{
  typedef db_mysql_Table ParentType;
};

template<> struct Traits<db_mysql_Column> : public TraitsBase<db_mysql_Column>
{
  typedef db_mysql_Table ParentType;
};

template<> struct Traits<db_mysql_Index> : public TraitsBase<db_mysql_Index>
{
  typedef db_mysql_Table ParentType;
};

template<> struct Traits<db_mysql_ForeignKey> : public TraitsBase<db_mysql_ForeignKey>
{
  typedef db_mysql_Table ParentType;
};

template<> struct Traits<db_mysql_View> : public TraitsBase<db_mysql_View>
{
  typedef db_mysql_Schema ParentType;
};

template<> struct Traits<db_mysql_Routine> : public TraitsBase<db_mysql_Routine>
{
  typedef db_mysql_Schema ParentType;
};

template<> struct Traits<db_mysql_Trigger> : public TraitsBase<db_mysql_Trigger>
{
  typedef db_mysql_Table ParentType;
};

// ct_foreach usage:
// ct_foreach(db_mysql_SchemaRef schema, catalog->schemata())
//   print(schema->name());
// or
// ct_foreach(db_mysql_TableRef table, schema->tables())
// {
//    print(table->name())
// }

#define ct_foreach(value, container)                 \
  for(int ct_foreach_index= 0, ct_foreach_inner= 1,  \
          ct_foreach_count= container.count();       \
          ct_foreach_index < ct_foreach_count;       \
          ct_foreach_inner= 1, ct_foreach_index++)   \
  for(value= container.get(ct_foreach_index);        \
          ct_foreach_inner == 1;                     \
          ct_foreach_inner= 0)


} // namespace ct

#endif // _CATALOG_TEMPLATES_

//! @}