diff --git a/src/sqlitetypes.cpp b/src/sqlitetypes.cpp index 640dd2b4..b64e27d0 100644 --- a/src/sqlitetypes.cpp +++ b/src/sqlitetypes.cpp @@ -67,6 +67,16 @@ QString ForeignKeyClause::toSql(const FieldVector& applyOn) const return result; } +QString UniqueConstraint::toSql(const FieldVector& applyOn) const +{ + QString result; + if(!m_name.isNull()) + result += QString("CONSTRAINT %1 ").arg(escapeIdentifier(m_name)); + result += QString("UNIQUE(%1)").arg(fieldVectorToFieldNames(applyOn).join(",")); + + return result; +} + QString Field::toString(const QString& indent, const QString& sep) const { QString str = indent + escapeIdentifier(m_name) + sep + m_type; @@ -154,24 +164,39 @@ void Table::setField(int index, FieldPtr f) if(oldField) { // Unique constraints - for(int i=0;igetNextSibling(); // skip UNIQUE tc = tc->getNextSibling(); // skip LPAREN @@ -538,7 +565,7 @@ Table CreateTableWalker::table() if(fields.size() == 1) fields[0]->setUnique(true); else - tab.addUniqueConstraint(fields); + tab.addUniqueConstraint(fields, unique); } break; case sqlite3TokenTypes::FOREIGN: diff --git a/src/sqlitetypes.h b/src/sqlitetypes.h index 9ed7a534..6d5e7cfa 100644 --- a/src/sqlitetypes.h +++ b/src/sqlitetypes.h @@ -17,10 +17,12 @@ QString escapeIdentifier(QString id); class Field; class ForeignKeyClause; +class UniqueConstraint; typedef QSharedPointer FieldPtr; typedef QVector< FieldPtr > FieldVector; typedef QMap ForeignKeyMap; +typedef QMap UniqueMap; class Constraint { @@ -74,6 +76,14 @@ private: QString m_override; }; +class UniqueConstraint : public Constraint +{ +public: + UniqueConstraint() {} + + virtual QString toSql(const FieldVector& applyOn) const; +}; + class Field { public: @@ -164,7 +174,7 @@ public: bool isWithoutRowidTable() const { return m_rowidColumn != "_rowid_"; } void clear(); - void addUniqueConstraint(FieldVector fields); + void addUniqueConstraint(FieldVector fields, UniqueConstraint unique); void addForeignKey(FieldPtr field, ForeignKeyClause fk); void addForeignKey(FieldVector fields, ForeignKeyClause fk); @@ -198,7 +208,7 @@ private: QString m_name; FieldVector m_fields; QString m_rowidColumn; - QVector m_uniqueConstraints; + UniqueMap m_uniqueConstraints; ForeignKeyMap m_foreignKeyClauses; };