1 #ifndef SQLQUERYMODELCOLUMN_H 2 #define SQLQUERYMODELCOLUMN_H 3 4 #include "db/queryexecutor.h" 5 #include "parser/ast/sqlitecreatetable.h" 6 #include "datatype.h" 7 #include "common/global.h" 8 #include "guiSQLiteStudio_global.h" 9 10 class Icon; 11 12 class GUI_API_EXPORT SqlQueryModelColumn 13 { 14 public: 15 /** 16 * @brief The EditionForbiddenReason enum 17 * Order of this enum is important, because when user requests item edition, 18 * then reason for edition forbidden (if any) is taken as specified order. 19 * The earlier item is in the enum, the more significant it is and user 20 * will be notified with the more significant reason before any other. 21 */ 22 enum class EditionForbiddenReason 23 { 24 SYSTEM_TABLE, 25 NOT_A_SELECT, 26 COMPOUND_SELECT, 27 GROUPED_RESULTS, 28 EXPRESSION, 29 SMART_EXECUTION_FAILED, 30 DISTINCT_RESULTS, 31 COMMON_TABLE_EXPRESSION, 32 GENERATED_COLUMN 33 }; 34 35 struct Constraint 36 { 37 enum class Type 38 { 39 PRIMARY_KEY, 40 NOT_NULL, 41 UNIQUE, 42 CHECK, 43 DEFAULT, 44 COLLATE, 45 GENERATED, 46 FOREIGN_KEY, 47 null 48 }; 49 50 enum class Scope 51 { 52 TABLE, 53 COLUMN 54 }; 55 ~ConstraintConstraint56 virtual ~Constraint() {} 57 58 static Constraint* create(const QString& column, SqliteCreateTable::ConstraintPtr tableConstraint); 59 static Constraint* create(SqliteCreateTable::Column::ConstraintPtr columnConstraint); 60 61 virtual QString getTypeString() const = 0; 62 virtual QString getDetails() const = 0; 63 virtual Icon* getIcon() const = 0; 64 65 Type type; 66 Scope scope; 67 QString definition; 68 }; 69 70 struct ConstraintPk : public Constraint 71 { 72 QString getTypeString() const; 73 QString getDetails() const; 74 Icon* getIcon() const; 75 76 bool autoIncrement; 77 SqliteConflictAlgo onConflict = SqliteConflictAlgo::null; 78 }; 79 80 struct ConstraintFk : public Constraint 81 { 82 QString getTypeString() const; 83 QString getDetails() const; 84 Icon* getIcon() const; 85 86 QString foreignTable; 87 QString foreignColumn; 88 }; 89 90 struct ConstraintUnique : public Constraint 91 { 92 QString getTypeString() const; 93 QString getDetails() const; 94 Icon* getIcon() const; 95 96 SqliteConflictAlgo onConflict = SqliteConflictAlgo::null; 97 }; 98 99 struct ConstraintNotNull : public Constraint 100 { 101 QString getTypeString() const; 102 QString getDetails() const; 103 Icon* getIcon() const; 104 105 SqliteConflictAlgo onConflict = SqliteConflictAlgo::null; 106 }; 107 108 struct ConstraintDefault : public Constraint 109 { 110 QString getTypeString() const; 111 QString getDetails() const; 112 Icon* getIcon() const; 113 114 QString defaultValue; 115 }; 116 117 struct ConstraintCheck : public Constraint 118 { 119 QString getTypeString() const; 120 QString getDetails() const; 121 Icon* getIcon() const; 122 123 QString condition; 124 SqliteConflictAlgo onConflict = SqliteConflictAlgo::null; 125 }; 126 127 struct ConstraintCollate : public Constraint 128 { 129 QString getTypeString() const; 130 QString getDetails() const; 131 Icon* getIcon() const; 132 133 QString collationName; 134 }; 135 136 struct ConstraintGenerated : public Constraint 137 { 138 QString getTypeString() const; 139 QString getDetails() const; 140 Icon* getIcon() const; 141 142 SqliteCreateTable::Column::Constraint::GeneratedType generatedType = SqliteCreateTable::Column::Constraint::GeneratedType::null; 143 }; 144 145 SqlQueryModelColumn(const QueryExecutor::ResultColumnPtr& resultColumn); 146 virtual ~SqlQueryModelColumn(); 147 148 static void initMeta(); 149 static EditionForbiddenReason convert(QueryExecutor::EditionForbiddenReason reason); 150 static EditionForbiddenReason convert(QueryExecutor::ColumnEditionForbiddenReason reason); 151 static QString resolveMessage(EditionForbiddenReason reason); 152 void postProcessConstraints(); 153 bool isNumeric(); 154 bool isNull(); 155 bool canEdit(); 156 QString getEditionForbiddenReason(); 157 bool isPk() const; 158 bool isRowIdPk() const; 159 bool isAutoIncr() const; 160 bool isNotNull() const; 161 bool isUnique() const; 162 bool isFk() const; 163 bool isDefault() const; 164 bool isCollate() const; 165 bool isGenerated() const; 166 QList<ConstraintFk*> getFkConstraints() const; 167 ConstraintDefault* getDefaultConstraint() const; 168 169 QString displayName; 170 QString column; 171 QString alias; 172 QString table; 173 QString database; 174 QString tableAlias; 175 DataType dataType; 176 QSet<EditionForbiddenReason> editionForbiddenReason; 177 QList<Constraint*> constraints; 178 179 private: 180 template <class T> 181 QList<T> getConstraints() const; 182 }; 183 184 typedef QSharedPointer<SqlQueryModelColumn> SqlQueryModelColumnPtr; 185 186 int qHash(SqlQueryModelColumn::EditionForbiddenReason reason); 187 188 QDataStream &operator<<(QDataStream &out, const SqlQueryModelColumn* col); 189 QDataStream &operator>>(QDataStream &in, SqlQueryModelColumn*& col); 190 191 Q_DECLARE_METATYPE(SqlQueryModelColumn*) 192 193 #endif // SQLQUERYMODELCOLUMN_H 194