HDK
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
UT_ORMDDLReference.h
Go to the documentation of this file.
1 /*
2  * PROPRIETARY INFORMATION. This software is proprietary to
3  * Side Effects Software Inc., and is not to be reproduced,
4  * transmitted, or disclosed in any way without written permission.
5  *
6  * NAME: UT_ORMDDLReference.h
7  *
8  * COMMENTS:
9  *
10  *
11  */
12 
13 #ifndef __UT_ORMDDLREFERENCE_H__
14 #define __UT_ORMDDLREFERENCE_H__
15 
16 #include "UT_API.h"
17 
18 #include "UT_ArrayStringMap.h"
19 #include "UT_Function.h"
20 #include "UT_NonCopyable.h"
21 #include "UT_StringArray.h"
22 #include "UT_StringHolder.h"
23 #include "UT_UniquePtr.h"
24 #include "UT_WorkBuffer.h"
25 
27 
29 {
30 public:
31  explicit UT_ORMDDLTemplate(const UT_StringHolder& ddl_template) :
32  myDDLTemplate(ddl_template)
33  {}
34 
35  // Replace a single item from the template. This is mainly helpful in cases
36  // where under certain circumstances we dont need a ddl reference and can
37  // swap the condition immediately. Generally generate() should be called to
38  // build the entire template given the references.
39  void replace(const UT_StringView& key, const UT_StringHolder& string);
42  ddl_references) const;
43 
44 private:
45  using ddl_replace_func_t = UT_Function<std::pair<bool, UT_StringHolder>(
46  const UT_StringView&)>;
47  UT_StringHolder generate_(
48  const ddl_replace_func_t& func,
49  const UT_StringHolder& replace_key) const;
50 
51  UT_StringHolder myDDLTemplate;
52 };
53 
55 {
56 public:
57  virtual ~UT_IORMDDLReference() = default;
58  UT_IORMDDLReference(const UT_IORMDDLReference&) = default;
60 
61  virtual bool referencesTable(const UT_StringHolder& table) const
62  {
63  return false;
64  }
65  virtual bool referencesColumn(
66  const UT_StringHolder& table,
67  const UT_StringHolder& column) const
68  {
69  return false;
70  }
71  virtual void renameTableReferences(
72  const UT_StringHolder& old_table,
73  const UT_StringHolder& new_table)
74  {
75  }
76  virtual void renameColumnReferences(
77  const UT_StringHolder& table,
78  const UT_StringHolder& old_column,
79  const UT_StringHolder& new_column)
80  {
81  }
82  virtual UT_StringHolder toString() const = 0;
83 
84 protected:
85  UT_IORMDDLReference() = default;
86 };
87 
89 {
90 public:
92  myTableName(table)
93  {}
94 
95  bool referencesTable(const UT_StringHolder& table) const override
96  {
97  return myTableName == table;
98  }
99 
101  const UT_StringHolder& old_table,
102  const UT_StringHolder& new_table) override
103  {
104  if (myTableName == old_table)
105  myTableName = new_table;
106  }
107 
108  UT_StringHolder toString() const override
109  {
110  return myTableName;
111  }
112 
113 protected:
115 };
116 
118 {
119 public:
120 
122  const UT_StringHolder& table,
123  const UT_StringHolder& column) const override
124  {
125  return myTableName == table && hasColumn_(column);
126  }
127 
129  const UT_StringHolder& table,
130  const UT_StringHolder& old_column,
131  const UT_StringHolder& new_column) override
132  {
133  if (myTableName == table)
134  {
135  // Its possible that a specific column is referenced multiple times
136  // so we cant exit on first match
137  for (int i = myColumns.size(); i-- > 0;)
138  {
139  if (myColumns[i] == old_column)
140  {
141  myColumns[i] = new_column;
142  }
143  }
144  }
145  }
146 
147 protected:
149  const UT_StringHolder& table,
150  const UT_StringArray& columns)
151  : UT_ORMDDLTableReference(table), myColumns(columns)
152  {
153  }
154 
155  bool hasColumn_(const UT_StringRef& column) const
156  {
157  for (auto&& col : myColumns)
158  {
159  if (col == column)
160  return true;
161  }
162  return false;
163  }
164 
166 };
167 
170 {
171 public:
173  const UT_StringHolder& table,
174  const UT_StringArray& columns,
175  const UT_StringArray& column_suffixes = UT_StringArray{})
176  : UT_ORMDDLBaseTableColumnsReference(table, columns)
177  , myColumnSuffixes(column_suffixes)
178  {
179  }
180 
181  UT_StringHolder toString() const override
182  {
183  UT_WorkBuffer wbuf;
184 
185  for (int i = 0, s = myColumnSuffixes.size(); i < s; i++)
186  {
187  if (i != 0)
188  wbuf.append(',');
189  wbuf.append(myColumns[i]);
190  if (i < myColumnSuffixes.size())
191  wbuf.append(myColumnSuffixes[i]);
192  }
193 
194  return wbuf;
195  }
196 
197 protected:
199 };
200 
203 {
204 public:
207 
209  const UT_StringHolder& from_table,
210  const UT_StringArray& from_columns,
211  const UT_StringHolder& to_table,
212  const UT_StringArray& to_columns,
213  create_fk_name_t&& create_fk_name)
214  : UT_ORMDDLBaseTableColumnsReference(from_table, from_columns)
215  , myToReference(to_table, to_columns)
216  , myCreateFKName(create_fk_name)
217  {
218  }
219 
220  bool referencesTable(const UT_StringHolder& table) const override
221  {
223  || myToReference.referencesTable(table);
224  }
225 
227  const UT_StringHolder& table,
228  const UT_StringHolder& column) const override
229  {
231  table, column)
232  || myToReference.referencesColumn(table, column);
233  }
234 
236  const UT_StringHolder& old_table,
237  const UT_StringHolder& new_table) override
238  {
240  old_table, new_table);
241  myToReference.renameTableReferences(old_table, new_table);
242  }
243 
245  const UT_StringHolder& table,
246  const UT_StringHolder& old_column,
247  const UT_StringHolder& new_column) override
248  {
250  table, old_column, new_column);
251  myToReference.renameColumnReferences(table, old_column, new_column);
252  }
253 
254  UT_StringHolder toString() const override
255  {
256  return myCreateFKName(myTableName, myColumns);
257  }
258 
259 protected:
262 };
263 
265 {
266 public:
268 
270  const UT_ORMDDLTemplate& ddl_template,
271  ddl_ref_map_t&& refs)
272  : myDDLTemplate(ddl_template), myReferences(std::move(refs))
273  {}
274  UT_ORMDDLStatement(const UT_ORMDDLTemplate& ddl_template) :
275  myDDLTemplate(ddl_template)
276  {}
277  ~UT_ORMDDLStatement() override = default;
279 
280  bool referencesTable(const UT_StringHolder& table) const override
281  {
282  for (auto&& [key, part] : myReferences)
283  {
284  if (part->referencesTable(table))
285  return true;
286  }
287  return false;
288  }
289 
291  const UT_StringHolder& table,
292  const UT_StringHolder& column) const override
293  {
294  for (auto&& [key, part] : myReferences)
295  {
296  if (part->referencesColumn(table, column))
297  return true;
298  }
299  return false;
300  }
301 
303  const UT_StringHolder& old_table,
304  const UT_StringHolder& new_table) override
305  {
306  for (auto&& [key, part] : myReferences)
307  {
308  part->renameTableReferences(old_table, new_table);
309  }
310  }
311 
313  const UT_StringHolder& table,
314  const UT_StringHolder& old_column,
315  const UT_StringHolder& new_column) override
316  {
317  for (auto&& [key, part] : myReferences)
318  {
319  part->renameColumnReferences(table, old_column, new_column);
320  }
321  }
322 
323  UT_StringHolder toString() const override
324  {
325  return myDDLTemplate.generate(myReferences);
326  }
327 
328 private:
329  UT_ORMDDLTemplate myDDLTemplate;
330  ddl_ref_map_t myReferences;
331 };
332 
333 #endif // __UT_ORMDDLREFERENCE_H__
334 
void renameColumnReferences(const UT_StringHolder &table, const UT_StringHolder &old_column, const UT_StringHolder &new_column) override
void renameColumnReferences(const UT_StringHolder &table, const UT_StringHolder &old_column, const UT_StringHolder &new_column) override
UT_ORMDDLTableReference(const UT_StringHolder &table)
void renameTableReferences(const UT_StringHolder &old_table, const UT_StringHolder &new_table) override
void renameTableReferences(const UT_StringHolder &old_table, const UT_StringHolder &new_table) override
bool referencesColumn(const UT_StringHolder &table, const UT_StringHolder &column) const override
GLdouble s
Definition: glad.h:3009
UT_ORMDDLStatement(const UT_ORMDDLTemplate &ddl_template)
#define UT_API
Definition: UT_API.h:14
bool referencesTable(const UT_StringHolder &table) const override
bool hasColumn_(const UT_StringRef &column) const
void renameColumnReferences(const UT_StringHolder &table, const UT_StringHolder &old_column, const UT_StringHolder &new_column) override
virtual ~UT_IORMDDLReference()=default
UT_ORMDDLStatement(const UT_ORMDDLTemplate &ddl_template, ddl_ref_map_t &&refs)
UT_ORMDDLColumnsReference(const UT_StringHolder &table, const UT_StringArray &columns, const UT_StringArray &column_suffixes=UT_StringArray{})
UT_StringHolder toString() const override
bool referencesColumn(const UT_StringHolder &table, const UT_StringHolder &column) const override
UT_IORMDDLReference()=default
std::unique_ptr< T, Deleter > UT_UniquePtr
A smart pointer for unique ownership of dynamically allocated objects.
Definition: UT_UniquePtr.h:39
A utility class to do read-only operations on a subset of an existing string.
Definition: UT_StringView.h:40
virtual void renameTableReferences(const UT_StringHolder &old_table, const UT_StringHolder &new_table)
UT_ORMDDLBaseTableColumnsReference(const UT_StringHolder &table, const UT_StringArray &columns)
UT_ORMDDLColumnsReference myToReference
virtual void renameColumnReferences(const UT_StringHolder &table, const UT_StringHolder &old_column, const UT_StringHolder &new_column)
#define UT_NON_COPYABLE(CLASS)
Define deleted copy constructor and assignment operator inside a class.
bool referencesTable(const UT_StringHolder &table) const override
UT_StringHolder generate(const UT_ArrayStringMap< UT_UniquePtr< UT_IORMDDLReference >> &ddl_references) const
bool referencesColumn(const UT_StringHolder &table, const UT_StringHolder &column) const override
std::function< T > UT_Function
Definition: UT_Function.h:37
virtual bool referencesColumn(const UT_StringHolder &table, const UT_StringHolder &column) const
GLenum GLenum GLsizei void * table
Definition: glad.h:5129
virtual UT_StringHolder toString() const =0
bool referencesTable(const UT_StringHolder &table) const override
UT_StringHolder toString() const override
GLenum func
Definition: glcorearb.h:783
UT_ORMDDLTemplate(const UT_StringHolder &ddl_template)
UT_StringHolder toString() const override
void renameTableReferences(const UT_StringHolder &old_table, const UT_StringHolder &new_table) override
SYS_FORCE_INLINE void append(char character)
UT_Function< UT_StringHolder(const UT_StringHolder &, const UT_StringArray &)> create_fk_name_t
UT_ORMForeignKeyNameReference(const UT_StringHolder &from_table, const UT_StringArray &from_columns, const UT_StringHolder &to_table, const UT_StringArray &to_columns, create_fk_name_t &&create_fk_name)
UT_IORMDDLReference & operator=(const UT_IORMDDLReference &)=default
void replace(const UT_StringView &key, const UT_StringHolder &string)
GLenum GLenum GLsizei void GLsizei void * column
Definition: glad.h:5135
UT_StringHolder toString() const override
virtual bool referencesTable(const UT_StringHolder &table) const