1 /*
2 # PostgreSQL Database Modeler (pgModeler)
3 #
4 # Copyright 2006-2020 - Raphael Araújo e Silva <raphael@pgmodeler.io>
5 #
6 # This program is free software: you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation version 3.
9 #
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 # GNU General Public License for more details.
14 #
15 # The complete text of GPLv3 is at LICENSE file on source code root directory.
16 # Also, you can get the complete GNU General Public License at <http://www.gnu.org/licenses/>
17 */
18 
19 #include "pgmodelerns.h"
20 #include "databasemodel.h"
21 #include <QDebug>
22 #include <QHash>
23 
24 namespace PgModelerNs {
25 	const QString
26 	FilterWildcard("wildcard"),
27 	FilterRegExp("regexp");
28 
29 	template <class Class>
copyObject(BaseObject ** psrc_obj,Class * copy_obj)30 	void copyObject(BaseObject **psrc_obj, Class *copy_obj)
31 	{
32 		Class *orig_obj=nullptr;
33 
34 		//Gets the objects stored in the pointer
35 		orig_obj=dynamic_cast<Class *>(*psrc_obj);
36 
37 		//Raises an error if the copy object is not allocated
38 		if(!copy_obj)
39 			throw Exception(ErrorCode::AsgNotAllocattedObject,__PRETTY_FUNCTION__,__FILE__,__LINE__);
40 
41 		//Allocates the source object if its not allocated
42 		if(!orig_obj)
43 		{
44 			orig_obj=new Class;
45 			(*psrc_obj)=orig_obj;
46 		}
47 
48 		//Makes the copy between the objects
49 		(*orig_obj)=(*copy_obj);
50 	}
51 
copyObject(BaseObject ** psrc_obj,BaseObject * copy_obj,ObjectType obj_type)52 	void copyObject(BaseObject **psrc_obj, BaseObject *copy_obj, ObjectType obj_type)
53 	{
54 		switch(obj_type)
55 		{
56 			case ObjectType::Relationship:
57 				Relationship *rel1;
58 				rel1=new Relationship(dynamic_cast<Relationship *>(copy_obj));
59 				if(!(*psrc_obj))
60 					(*psrc_obj)=rel1;
61 				else
62 					(*(dynamic_cast<Relationship *>(*psrc_obj)))=(*rel1);
63 			break;
64 			case ObjectType::BaseRelationship:
65 				BaseRelationship *rel;
66 				rel=new BaseRelationship(dynamic_cast<BaseRelationship *>(copy_obj));
67 				if(!(*psrc_obj))
68 					(*psrc_obj)=rel;
69 				else
70 					(*(dynamic_cast<BaseRelationship *>(*psrc_obj)))=(*rel);
71 			break;
72 			case ObjectType::Column:
73 				copyObject(psrc_obj, dynamic_cast<Column *>(copy_obj));
74 			break;
75 			case ObjectType::Constraint:
76 				copyObject(psrc_obj, dynamic_cast<Constraint *>(copy_obj));
77 			break;
78 			case ObjectType::Trigger:
79 				copyObject(psrc_obj, dynamic_cast<Trigger *>(copy_obj));
80 			break;
81 			case ObjectType::Rule:
82 				copyObject(psrc_obj, dynamic_cast<Rule *>(copy_obj));
83 			break;
84 			case ObjectType::Index:
85 				copyObject(psrc_obj, dynamic_cast<Index *>(copy_obj));
86 			break;
87 			case ObjectType::Policy:
88 				copyObject(psrc_obj, dynamic_cast<Policy *>(copy_obj));
89 			break;
90 			case ObjectType::Table:
91 				copyObject(psrc_obj, dynamic_cast<Table *>(copy_obj));
92 			break;
93 			case ObjectType::Textbox:
94 				copyObject(psrc_obj, dynamic_cast<Textbox *>(copy_obj));
95 			break;
96 			case ObjectType::OpClass:
97 				copyObject(psrc_obj, dynamic_cast<OperatorClass *>(copy_obj));
98 			break;
99 			case ObjectType::Conversion:
100 				copyObject(psrc_obj, dynamic_cast<Conversion *>(copy_obj));
101 			break;
102 			case ObjectType::Cast:
103 				copyObject(psrc_obj, dynamic_cast<Cast *>(copy_obj));
104 			break;
105 			case ObjectType::Domain:
106 				copyObject(psrc_obj, dynamic_cast<Domain *>(copy_obj));
107 			break;
108 			case ObjectType::Tablespace:
109 				copyObject(psrc_obj, dynamic_cast<Tablespace *>(copy_obj));
110 			break;
111 			case ObjectType::Schema:
112 				copyObject(psrc_obj, dynamic_cast<Schema *>(copy_obj));
113 			break;
114 			case ObjectType::OpFamily:
115 				copyObject(psrc_obj, dynamic_cast<OperatorFamily *>(copy_obj));
116 			break;
117 			case ObjectType::Function:
118 				copyObject(psrc_obj, dynamic_cast<Function *>(copy_obj));
119 			break;
120 			case ObjectType::Aggregate:
121 				copyObject(psrc_obj, dynamic_cast<Aggregate *>(copy_obj));
122 			break;
123 			case ObjectType::Language:
124 				copyObject(psrc_obj, dynamic_cast<Language *>(copy_obj));
125 			break;
126 			case ObjectType::Operator:
127 				copyObject(psrc_obj, dynamic_cast<Operator *>(copy_obj));
128 			break;
129 			case ObjectType::Role:
130 				copyObject(psrc_obj, dynamic_cast<Role *>(copy_obj));
131 			break;
132 			case ObjectType::Sequence:
133 				copyObject(psrc_obj, dynamic_cast<Sequence *>(copy_obj));
134 			break;
135 			case ObjectType::Type:
136 				copyObject(psrc_obj, dynamic_cast<Type *>(copy_obj));
137 			break;
138 			case ObjectType::View:
139 				copyObject(psrc_obj, dynamic_cast<View *>(copy_obj));
140 			break;
141 			case ObjectType::Collation:
142 				copyObject(psrc_obj, dynamic_cast<Collation *>(copy_obj));
143 			break;
144 			case ObjectType::Extension:
145 				copyObject(psrc_obj, dynamic_cast<Extension *>(copy_obj));
146 			break;
147 			case ObjectType::Tag:
148 				copyObject(psrc_obj, dynamic_cast<Tag *>(copy_obj));
149 			break;
150 			case ObjectType::EventTrigger:
151 				copyObject(psrc_obj, dynamic_cast<EventTrigger *>(copy_obj));
152 			break;
153 			case ObjectType::GenericSql:
154 				copyObject(psrc_obj, dynamic_cast<GenericSQL *>(copy_obj));
155 			break;
156 			case ObjectType::ForeignDataWrapper:
157 				copyObject(psrc_obj, dynamic_cast<ForeignDataWrapper *>(copy_obj));
158 			break;
159 			case ObjectType::ForeignServer:
160 				copyObject(psrc_obj, dynamic_cast<ForeignServer *>(copy_obj));
161 			break;
162 			case ObjectType::UserMapping:
163 				copyObject(psrc_obj, dynamic_cast<UserMapping *>(copy_obj));
164 			break;
165 			case ObjectType::ForeignTable:
166 				copyObject(psrc_obj, dynamic_cast<ForeignTable *>(copy_obj));
167 			break;
168 			default:
169 				throw Exception(ErrorCode::OprObjectInvalidType,__PRETTY_FUNCTION__,__FILE__,__LINE__);
170 		}
171 	}
172 
isReservedKeyword(const QString & word)173 	bool isReservedKeyword(const QString &word)
174 	{
175 		static QHash<QChar, QStringList> keywords={
176 			{QChar('A'), {QString("ALL"), QString("ANALYSE"), QString("ANALYZE"), QString("AND"),
177 										QString("ANY"), QString("AS"),      QString("ASC"),     QString("AUTHORIZATION")}},
178 
179 			{QChar('B'), {QString("BETWEEN"), QString("BIGINT"), QString("BINARY"), QString("BIT"),
180 										QString("BOOLEAN"), QString("BOTH")}},
181 
182 			{QChar('C'), {QString("CASE"),         QString("CAST"),         QString("CHAR"),    QString("CHARACTER"),
183 										QString("CHECK"),        QString("COALESCE"),     QString("COLLATE"), QString("COLUMN"),
184 										QString("CONSTRAINT"),   QString("CONVERT"),      QString("CREATE"),  QString("CROSS"),
185 										QString("CURRENT_DATE"), QString("CURRENT_TIME"), QString("CURRENT_TIMESTAMP"), QString("CURRENT_USER")}},
186 
187 			{QChar('D'), {QString("DEC"),  QString("DECIMAL"),  QString("DEFAULT"), QString("DEFERRABLE"),
188 										QString("DESC"), QString("DISTINCT"), QString("DO")}},
189 
190 			{QChar('E'), {QString("ELSE"), QString("END"), QString("EXCEPT"), QString("EXISTS"),
191 										QString("EXTRACT")}},
192 
193 			{QChar('F'), {QString("FALSE"),  QString("FLOAT"), QString("FOR"), QString("FOREIGN"),
194 										QString("FREEZE"), QString("FROM"),  QString("FULL")}},
195 
196 			{QChar('G'), {QString("GRANT"), QString("GROUP")}},
197 
198 			{QChar('H'), {QString("HAVING")}},
199 
200 			{QChar('I'), {QString("ILIKE"), QString("IN"),      QString("INITIALLY"), QString("INNER"),
201 										QString("INT"),   QString("INTEGER"), QString("INTERSECT"), QString("INTERVAL"),
202 										QString("INTO"),  QString("IS"),      QString("ISNULL")}},
203 
204 			{QChar('J'), {QString("JOIN")}},
205 
206 			{QChar('L'), {QString("LEADING"),   QString("LEFT"), QString("LIKE"), QString("LIMIT"),
207 										QString("LOCALTIME"), QString("LOCALTIMESTAMP")}},
208 
209 			{QChar('N'), {QString("NATURAL"),      QString("NCHAR"),   QString("NEW"), QString("NOCREATEDB"),
210 										QString("NOCREATEUSER"), QString("NONE"),    QString("NOT"), QString("NOTHING"),
211 										QString("NOTIFY"),       QString("NOTNULL"), QString("NULL"), QString("NULLIF"),
212 										QString("NUMERIC")}},
213 
214 			{QChar('O'), {QString("OFF"),   QString("OFFSET"),  QString("OLD"),   QString("ON"),
215 										QString("ONLY"),  QString("OR"),      QString("ORDER"), QString("OUTER"),
216 										QString("OVERLAPS"), QString("OVERLAY")}},
217 
218 			{QChar('P'), {QString("PLACING"), QString("POSITION"), QString("PRIMARY")}},
219 
220 			{QChar('R'), {QString("REAL"), QString("REFERENCES"), QString("RIGHT"), QString("ROW")}},
221 
222 			{QChar('S'), {QString("SELECT"),   QString("SESSION_USER"), QString("SETOF"), QString("SIMILAR"),
223 										QString("SMALLINT"), QString("SOME"),         QString("SUBSTRING")}},
224 
225 			{QChar('T'), {QString("TABLE"), QString("THEN"),  QString("TIME"),  QString("TIMESTAMP"),
226 										QString("TO"), QString("TRAILING"), QString("TREAT"), QString("TRIM"),
227 										QString("TRUE")}},
228 
229 			{QChar('U'), {QString("UNION"), QString("UNIQUE"), QString("USER"), QString("USING")}},
230 
231 			{QChar('V'), {QString("VARCHAR"), QString("VERBOSE")}},
232 
233 			{QChar('W'), {QString("WHEN"), QString("WHERE")}}
234 		};
235 
236 		if(word.isEmpty())
237 			return false;
238 		else
239 		{
240 			QChar chr=word.at(0).toUpper();
241 
242 			if(!keywords.contains(chr))
243 				return false;
244 			else
245 				return keywords[chr].contains(word.toUpper());
246 		}
247 	}
248 }
249