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