[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: [akonadi] server/src/storage: Implement DbInspector::foreignKeyCheck() for PostgreSQL
From: Dan_Vrátil <dvratil () redhat ! com>
Date: 2013-09-30 17:35:28
Message-ID: E1VQhNY-0006Jx-Lq () scm ! kde ! org
[Download RAW message or body]
Git commit 274b94f86d324d4c34140f54e590a1fb67d5de3d by Dan Vrátil.
Committed on 30/09/2013 at 16:15.
Pushed by dvratil into branch 'master'.
Implement DbInspector::foreignKeyCheck() for PostgreSQL
M +73 -1 server/src/storage/dbintrospector_impl.cpp
M +1 -0 server/src/storage/dbintrospector_impl.h
http://commits.kde.org/akonadi/274b94f86d324d4c34140f54e590a1fb67d5de3d
diff --git a/server/src/storage/dbintrospector_impl.cpp \
b/server/src/storage/dbintrospector_impl.cpp index 871bd19..db42d8f 100644
--- a/server/src/storage/dbintrospector_impl.cpp
+++ b/server/src/storage/dbintrospector_impl.cpp
@@ -96,11 +96,83 @@ DbIntrospectorPostgreSql::DbIntrospectorPostgreSql(const \
QSqlDatabase& database) {
}
+QVector<DbIntrospector::ForeignKey> \
DbIntrospectorPostgreSql::foreignKeyConstraints( const QString &tableName ) \
+{ + #define TABLE_CONSTRAINTS "information_schema.table_constraints"
+ #define KEY_COLUMN_USAGE "information_schema.key_column_usage"
+ #define REFERENTIAL_CONSTRAINTS \
"information_schema.referential_constraints" + #define \
CONSTRAINT_COLUMN_USAGE "information_schema.constraint_column_usage" +
+ Query::Condition keyColumnUsageCondition( Query::And );
+ keyColumnUsageCondition.addColumnCondition( QLatin1String( \
TABLE_CONSTRAINTS ".constraint_catalog" ), Query::Equals, + \
QLatin1String( KEY_COLUMN_USAGE ".constraint_catalog" ) ); + \
keyColumnUsageCondition.addColumnCondition( QLatin1String( \
TABLE_CONSTRAINTS ".constraint_schema" ), Query::Equals, + \
QLatin1String( KEY_COLUMN_USAGE ".constraint_schema" ) ); + \
keyColumnUsageCondition.addColumnCondition( QLatin1String( \
TABLE_CONSTRAINTS ".constraint_name" ), Query::Equals, + \
QLatin1String( KEY_COLUMN_USAGE ".constraint_name" ) ); +
+ Query::Condition referentialConstraintsCondition( Query::And );
+ referentialConstraintsCondition.addColumnCondition( QLatin1String( \
TABLE_CONSTRAINTS ".constraint_catalog" ), Query::Equals, + \
QLatin1String( REFERENTIAL_CONSTRAINTS ".constraint_catalog" ) ); + \
referentialConstraintsCondition.addColumnCondition( QLatin1String( \
TABLE_CONSTRAINTS ".constraint_schema" ), Query::Equals, + \
QLatin1String( REFERENTIAL_CONSTRAINTS ".constraint_schema" ) ); + \
referentialConstraintsCondition.addColumnCondition( QLatin1String \
(TABLE_CONSTRAINTS ".constraint_name" ), Query::Equals, + \
QLatin1String( REFERENTIAL_CONSTRAINTS ".constraint_name" ) ); +
+ Query::Condition constraintColumnUsageCondition( Query::And );
+ constraintColumnUsageCondition.addColumnCondition( QLatin1String( \
REFERENTIAL_CONSTRAINTS ".unique_constraint_catalog" ), Query::Equals, + \
QLatin1String( CONSTRAINT_COLUMN_USAGE ".constraint_catalog" ) ); + \
constraintColumnUsageCondition.addColumnCondition( QLatin1String( \
REFERENTIAL_CONSTRAINTS ".unique_constraint_schema" ), Query::Equals, + \
QLatin1String( CONSTRAINT_COLUMN_USAGE ".constraint_schema" ) ); + \
constraintColumnUsageCondition.addColumnCondition( QLatin1String( \
REFERENTIAL_CONSTRAINTS ".unique_constraint_name" ), Query::Equals, + \
QLatin1String( CONSTRAINT_COLUMN_USAGE ".constraint_name" ) ); +
+ QueryBuilder qb( QLatin1String( TABLE_CONSTRAINTS ), \
QueryBuilder::Select ); + qb.addColumn( QLatin1String( TABLE_CONSTRAINTS \
".constraint_name" ) ); + qb.addColumn( QLatin1String( KEY_COLUMN_USAGE \
".column_name" ) ); + qb.addColumn( QLatin1String( CONSTRAINT_COLUMN_USAGE \
".table_name AS referenced_table" ) ); + qb.addColumn( QLatin1String( \
CONSTRAINT_COLUMN_USAGE ".column_name AS referenced_column" ) ); + \
qb.addColumn( QLatin1String( REFERENTIAL_CONSTRAINTS ".update_rule" ) ); + \
qb.addColumn( QLatin1String( REFERENTIAL_CONSTRAINTS ".delete_rule" ) ); + \
qb.addJoin( QueryBuilder::LeftJoin, QLatin1String( KEY_COLUMN_USAGE ), \
keyColumnUsageCondition ); + qb.addJoin( QueryBuilder::LeftJoin, \
QLatin1String( REFERENTIAL_CONSTRAINTS ), referentialConstraintsCondition \
); + qb.addJoin( QueryBuilder::LeftJoin, QLatin1String( \
CONSTRAINT_COLUMN_USAGE ), constraintColumnUsageCondition ); + \
qb.addValueCondition( QLatin1String( TABLE_CONSTRAINTS ".constraint_type" \
), + Query::Equals, QLatin1String( "FOREIGN KEY" ) \
); + qb.addValueCondition( QLatin1String( TABLE_CONSTRAINTS \
".table_name"), + Query::Equals, tableName.toLower() \
); +
+ #undef TABLE_CONSTRAINTS
+ #undef KEY_COLUMN_USAGE
+ #undef REFERENTIAL_CONSTRAINTS
+ #undef CONSTRAINT_COLUMN_USAGE
+
+ if ( !qb.exec() ) {
+ throw DbException( qb.query() );
+ }
+
+ QVector<ForeignKey> result;
+ while ( qb.query().next() ) {
+ ForeignKey fk;
+ fk.name = qb.query().value( 0 ).toString();
+ fk.column = qb.query().value( 1 ).toString();
+ fk.refTable = qb.query().value( 2 ).toString();
+ fk.refColumn = qb.query().value( 3 ).toString();
+ fk.onUpdate = qb.query().value( 4 ).toString();
+ fk.onDelete = qb.query().value( 5 ).toString();
+ result.push_back( fk );
+ }
+
+ return result;
+}
+
QString DbIntrospectorPostgreSql::hasIndexQuery(const QString& tableName, \
const QString& indexName) {
QString query = QLatin1String( "SELECT indexname FROM \
pg_catalog.pg_indexes" ); query += QString::fromLatin1( " WHERE tablename \
ilike '%1'" ).arg( tableName );
- query += QString::fromLatin1( " AND indexname ilike '%1';" ).arg( \
indexName ); + query += QString::fromLatin1( " AND indexname ilike '%1'" \
).arg( indexName ); + query += QString::fromLatin1( " UNION SELECT conname \
FROM pg_catalog.pg_constraint "); + query += QString::fromLatin1( " WHERE \
conname ilike '%1'" ).arg( indexName ); return query;
}
diff --git a/server/src/storage/dbintrospector_impl.h \
b/server/src/storage/dbintrospector_impl.h index cbd1e14..ccc4813 100644
--- a/server/src/storage/dbintrospector_impl.h
+++ b/server/src/storage/dbintrospector_impl.h
@@ -42,6 +42,7 @@ class DbIntrospectorPostgreSql : public DbIntrospector
{
public:
DbIntrospectorPostgreSql( const QSqlDatabase& database );
+ virtual QVector<ForeignKey> foreignKeyConstraints( const QString \
&tableName );
QString hasIndexQuery(const QString& tableName, const QString& \
indexName); };
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic