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