[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