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