From: <ibr...@us...> - 2012-06-25 15:44:15
|
Revision: 4368 http://tora.svn.sourceforge.net/tora/?rev=4368&view=rev Author: ibre5041 Date: 2012-06-25 15:44:03 +0000 (Mon, 25 Jun 2012) Log Message: ----------- Browse/visualize schema Modified Paths: -------------- branches/tora3/src/CMakeLists.txt branches/tora3/src/tests/test2.cpp branches/tora3/src/tools/tobrowsertablewidget.cpp branches/tora3/src/tools/tobrowsertablewidget.h Added Paths: ----------- branches/tora3/src/core/toresultdrawing.cpp branches/tora3/src/core/toresultdrawing.h Modified: branches/tora3/src/CMakeLists.txt =================================================================== --- branches/tora3/src/CMakeLists.txt 2012-06-24 23:34:14 UTC (rev 4367) +++ branches/tora3/src/CMakeLists.txt 2012-06-25 15:44:03 UTC (rev 4368) @@ -20,6 +20,7 @@ ${CMAKE_SOURCE_DIR}/extlibs/otl ${CMAKE_SOURCE_DIR}/extlibs/trotl/src ${CMAKE_SOURCE_DIR}/extlibs/parsing + ${CMAKE_SOURCE_DIR}/extlibs/libermodel ${BOOST_INCLUDE_DIRS} ${QT_INCLUDES} ) @@ -195,6 +196,7 @@ core/toresultfield.h core/toresultgrants.h core/toresultdepend.h + core/toresultdrawing.h core/tocodemodel.h core/totableselect.h core/toresultdatasingle.h @@ -343,6 +345,7 @@ # sources SET(TORA_SOURCES + stdafx.cpp # NOTE(MSVC) the there is NO way how to force /Yc option fot this file only core/toabout.cpp core/tobackground.cpp core/tobackgroundlabel.cpp @@ -420,6 +423,7 @@ core/tocodemodel.cpp core/totableselect.cpp core/toresultdatasingle.cpp + core/toresultdrawing.cpp core/todatatype.cpp core/tovisualize.cpp core/topiechart.cpp @@ -647,9 +651,9 @@ LIST(APPEND TORA_LIBS ${POPPLER_QT4_LIBRARIES}) ENDIF(POPPLER_QT4_FOUND) -#IF(graphviz_FOUND) -# LIST(APPEND TORA_LIBS ermodel) -#ENDIF(graphviz_FOUND) +IF(graphviz_FOUND) + LIST(APPEND TORA_LIBS ermodel) +ENDIF(graphviz_FOUND) IF (WANT_INTERNAL_QSCINTILLA) LIST(APPEND TORA_LIBS ${TORA_QSCINTILLA_LIB} ${QT_LIBRARIES}) @@ -738,8 +742,8 @@ "connection/tooracletraits.cpp" "connection/tooracleconnection.cpp" "connection/tooraclequery.cpp") - # TARGET_LINK_LIBRARIES(${PROVIDER_ORACLE} ${ORACLE_LIBRARIES} ${QT_LIBRARIES} ${TORA_LIB} "trotl") - TARGET_LINK_LIBRARIES(${PROVIDER_ORACLE} ${ORACLE_LIBRARIES} ${QT_LIBRARIES} test2 "trotl") + TARGET_LINK_LIBRARIES(${PROVIDER_ORACLE} ${ORACLE_LIBRARIES} ${QT_LIBRARIES} ${TORA_LIB} "trotl") + # TARGET_LINK_LIBRARIES(${PROVIDER_ORACLE} ${ORACLE_LIBRARIES} ${QT_LIBRARIES} test1 "trotl") ADD_DEPENDENCIES(${PROVIDER_ORACLE} ${EXE_NAME}) MESSAGE(STATUS "${PROVIDER_ORACLE} ${ORACLE_LIBRARIES} ${QT_LIBRARIES} ${TORA_LIB} trotl") ENDIF(ORACLE_FOUND) Added: branches/tora3/src/core/toresultdrawing.cpp =================================================================== --- branches/tora3/src/core/toresultdrawing.cpp (rev 0) +++ branches/tora3/src/core/toresultdrawing.cpp 2012-06-25 15:44:03 UTC (rev 4368) @@ -0,0 +1,217 @@ + +/* BEGIN_COMMON_COPYRIGHT_HEADER + * + * TOra - An Oracle Toolkit for DBA's and developers + * + * Shared/mixed copyright is held throughout files in this product + * + * Portions Copyright (C) 2000-2001 Underscore AB + * Portions Copyright (C) 2003-2005 Quest Software, Inc. + * Portions Copyright (C) 2004-2009 Numerous Other Contributors + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; only version 2 of + * the License is valid for this program. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * As a special exception, you have permission to link this program + * with the Oracle Client libraries and distribute executables, as long + * as you follow the requirements of the GNU GPL in regard to all of the + * software in the executable aside from Oracle client libraries. + * + * Specifically you are not permitted to link this program with the + * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. + * And you are not permitted to distribute binaries compiled against + * these libraries. + * + * You may link this product with any GPL'd Qt library. + * + * All trademarks belong to their respective owners. + * + * END_COMMON_COPYRIGHT_HEADER */ + +#include "core/toresultdrawing.h" +#include "dotgraph.h" + +static toSQL SQLTableFK( + "toResultDrawing:FKConstraints", + " SELECT \n" + " c.constraint_name \n" // c1 + " -- max(a.constraint_name) as constraint_name \n" + " -- , c.constraint_name \n" + " , max(r.constraint_name) as r_constraint_name \n" // c2 + " , max(c.owner) as owner \n" // c3 + " , max(c.table_name) as table_name \n" // c4 + " , c.column_name as column_name \n" // c5 + " , max(r.owner) as r_owner \n" // c6 + " , max(r.table_name) as r_table_name \n" // c7 + " , max(r.column_name) as r_column_name \n" // c8 + " , max(a.constraint_type) \n" // c9 + " FROM sys.all_constraints a \n" + " JOIN sys.all_cons_columns c ON (c.constraint_name = a.constraint_name AND c.owner = a.owner) \n" + " JOIN sys.all_cons_columns r ON (r.constraint_name = a.r_constraint_name AND r.owner = a.r_owner AND r.position = c.position) \n" + " WHERE \n" + " a.owner = :f1<char[101]> \n" + " AND a.table_name = :f2<char[101]> \n" + " AND a.constraint_type = 'R' \n" + " GROUP BY ROLLUP (c.constraint_name, c.column_name) \n", + "Get list of all the FK referenced tables", + "8000", + "Oracle"); + +static toSQL SQLTableREF( + "toResultDrawing:REFConstraints", + " SELECT \n" + " c.constraint_name \n" // c1 + " -- max(a.constraint_name) as constraint_name \n" + " -- , c.constraint_name \n" + " , max(r.constraint_name) as r_constraint_name \n" // c2 + " , max(c.owner) as owner \n" // c3 + " , max(c.table_name) as table_name \n" // c4 + " , c.column_name as column_name \n" // c5 + " , max(r.owner) as r_owner \n" // c6 + " , max(r.table_name) as r_table_name \n" // c7 + " , max(r.column_name) as r_column_name \n" // c8 + " , max(a.constraint_type) \n" // c9 + " FROM sys.all_constraints a \n" + " JOIN sys.all_cons_columns c ON (c.constraint_name = a.constraint_name AND c.owner = a.owner) \n" + " JOIN sys.all_cons_columns r ON (r.constraint_name = a.r_constraint_name AND r.owner = a.r_owner AND r.position = c.position) \n" + " WHERE \n" + " a.r_owner = :f1<char[101]> \n" + " AND r.table_name = :f2<char[101]> \n" + " AND a.constraint_type = 'R' \n" + " GROUP BY ROLLUP (c.constraint_name, c.column_name) \n", + "Get list of all the FK referencing tables", + "8000", + "Oracle"); + +toResultDrawing::toResultDrawing(QWidget *parent, const char *name, Qt::WindowFlags f) + : DotGraphView(NULL, parent) + , toResult() +{ + initEmpty(); + setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding); +} + + +void toResultDrawing::query(const QString &, toQueryParams const& params) +{ + typedef QPair<QString, QString> Reference; + toConnection &conn = connection(); + + initEmpty(); + QString schema(params.at(0)), table(params.at(1)); + QSet<QString> tables; + QSet<Reference> references; + + tables.insert(table); + + DotGraph newGraph("dot"); + QMap<QString,QString> ga; + ga["id"] = "Schema"; + ga["compound"] = "true"; + ga["shape"] = "box"; + ga["rankdir"] = "BT"; // BOTTOM to TOP arrows + + newGraph.setGraphAttributes(ga); + + toQValue c1, c2, c3, c4, c5, c6, c7, c8, c9; + // TODO: use toCache here - additional attributes + toQuery QueryC(conn, SQLTableFK, toQueryParams() << schema.toUpper() << table.toUpper()); + while (!QueryC.eof()) + { + c1 = QueryC.readValue(); + c2 = QueryC.readValue(); + c3 = QueryC.readValue(); + c4 = QueryC.readValue(); + c5 = QueryC.readValue(); + c6 = QueryC.readValue(); + c7 = QueryC.readValue(); + c8 = QueryC.readValue(); + c9 = QueryC.readValue(); + + if( c5.isNull() && c1.isNull()) + { + // Here collect FK details (column list for compound keys) + } + + if( c5.isNull() && !c1.isNull()) // c5 (column_name) is null - see rollup def + { + TLOG(0, toNoDecorator, __HERE__) + << c3.displayData() << '.' << c4.displayData() + << " => " + << c6.displayData() << '.' << c7.displayData() + << std::endl; + tables.insert(c7); // r_table_name + references.insert( Reference( table, c7)); + } + } + + toQuery QueryR(conn, SQLTableREF, toQueryParams() << schema.toUpper() << table.toUpper()); + while (!QueryR.eof()) + { + c1 = QueryR.readValue(); + c2 = QueryR.readValue(); + c3 = QueryR.readValue(); + c4 = QueryR.readValue(); + c5 = QueryR.readValue(); + c6 = QueryR.readValue(); + c7 = QueryR.readValue(); + c8 = QueryR.readValue(); + c9 = QueryR.readValue(); + + if( c5.isNull() && c1.isNull()) + { + // Here collect FK details (column list for compound keys) + } + + if( c5.isNull() && !c1.isNull()) + { + TLOG(0, toNoDecorator, __HERE__) + << c3.displayData() << '.' << c4.displayData() + << " => " + << c6.displayData() << '.' << c7.displayData() + << std::endl; + tables.insert(c4); // table_name + references.insert( Reference( c4, table)); + } + } + + Q_FOREACH(QString const&t, tables) + { + QMap<QString,QString> ta; // table atributes + ta["name"] = t; + ta["label"] = t; + ta["fontsize"] = "12"; + ta["comment"]= t; + ta["id"]= t; + ta["tooltip"] = t; + newGraph.addNewNode(ta); + } + + Q_FOREACH(Reference const&r, references) + { + QMap<QString,QString> ea; // edge attreibutes + newGraph.addNewEdge(r.first, r.second, ea); + } + + graph()->updateWithGraph(newGraph); + //update(); + graph()->update(); + update(); +} + + /** Clear result widget */ +void toResultDrawing::clearData() +{ + initEmpty(); +} Added: branches/tora3/src/core/toresultdrawing.h =================================================================== --- branches/tora3/src/core/toresultdrawing.h (rev 0) +++ branches/tora3/src/core/toresultdrawing.h 2012-06-25 15:44:03 UTC (rev 4368) @@ -0,0 +1,69 @@ + +/* BEGIN_COMMON_COPYRIGHT_HEADER + * + * TOra - An Oracle Toolkit for DBA's and developers + * + * Shared/mixed copyright is held throughout files in this product + * + * Portions Copyright (C) 2000-2001 Underscore AB + * Portions Copyright (C) 2003-2005 Quest Software, Inc. + * Portions Copyright (C) 2004-2009 Numerous Other Contributors + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; only version 2 of + * the License is valid for this program. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * As a special exception, you have permission to link this program + * with the Oracle Client libraries and distribute executables, as long + * as you follow the requirements of the GNU GPL in regard to all of the + * software in the executable aside from Oracle client libraries. + * + * Specifically you are not permitted to link this program with the + * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. + * And you are not permitted to distribute binaries compiled against + * these libraries. + * + * You may link this product with any GPL'd Qt library. + * + * All trademarks belong to their respective owners. + * + * END_COMMON_COPYRIGHT_HEADER */ + +#ifndef TORESULTDRAWING_H +#define TORESULTDRAWING_H + +#include "core/toresult.h" +#include "dotgraphview.h" + +class toResultDrawing : public DotGraphView, public toResult +{ +private: + Q_OBJECT; + +public: + toResultDrawing(QWidget *parent = 0, + const char *name = 0, + Qt::WindowFlags f = 0); + + /** + * Implemented abstract method from toResult + */ + virtual void query(const QString &, toQueryParams const& params); + + /** Clear result widget */ + virtual void clearData(); +}; + + +#endif + Modified: branches/tora3/src/tests/test2.cpp =================================================================== --- branches/tora3/src/tests/test2.cpp 2012-06-24 23:34:14 UTC (rev 4367) +++ branches/tora3/src/tests/test2.cpp 2012-06-25 15:44:03 UTC (rev 4368) @@ -106,11 +106,11 @@ qRegisterMetaType<ValuesList>("ValuesList&"); qRegisterMetaType<toConnection::exception>("toConnection::exception"); - if (qApp->argc() != 2 && qApp->argc() != 3) + if (qApp->argc() == 1) usage(); QString connect = QString::fromLatin1(qApp->argv()[1]); - QString user, password, database, schema; + QString user, password, database, schema, table; QStringList slashList, atList = connect.split("@", QString::SkipEmptyParts); if( atList.size() == 1) @@ -137,6 +137,13 @@ schema = QString::fromLatin1(qApp->argv()[2]); } + if( qApp->argc() == 4) + { + table = QString::fromLatin1(qApp->argv()[3]) ; + } else { + table = QString::fromLatin1("T_CHILD6"); + } + // List of all connection provider finders std::vector<std::string> finders = ConnectionProviderFinderFactory::Instance().keys(); // Resulting list of all the providers found @@ -199,42 +206,59 @@ " JOIN sys.all_cons_columns c ON (c.constraint_name = a.constraint_name AND c.owner = a.owner) \n" " JOIN sys.all_cons_columns r ON (r.constraint_name = a.r_constraint_name AND r.owner = a.r_owner AND r.position = c.position) \n" " WHERE \n" - " a.Owner = :f1<char[101]> \n" - " -- AND a.Table_Name = 'T_MN_1' \n" + " a.owner = :f1<char[101]> \n" + " AND a.table_name = :f2<char[101]> \n" " AND a.constraint_type = 'R' \n" " GROUP BY ROLLUP (c.constraint_name, c.column_name) \n" - " ORDER BY 1, 2, 3 \n" ); - QList<toCache::CacheEntry const*> tables = oraCon->getCache().getEntriesInSchema(schema, toCache::TABLE); - Q_FOREACH(toCache::CacheEntry const*e, tables) + QString ReferencesSQL = QString::fromLatin1( + " SELECT \n" + " c.constraint_name \n" // c1 + " -- max(a.constraint_name) as constraint_name \n" + " -- , c.constraint_name \n" + " , max(r.constraint_name) as r_constraint_name \n" // c2 + " , max(c.owner) as owner \n" // c3 + " , max(c.table_name) as table_name \n" // c4 + " , c.column_name as column_name \n" // c5 + " , max(r.owner) as r_owner \n" // c6 + " , max(r.table_name) as r_table_name \n" // c7 + " , max(r.column_name) as r_column_name \n" // c8 + " , max(a.constraint_type) \n" // c9 + " FROM sys.all_constraints a \n" + " JOIN sys.all_cons_columns c ON (c.constraint_name = a.constraint_name AND c.owner = a.owner) \n" + " JOIN sys.all_cons_columns r ON (r.constraint_name = a.r_constraint_name AND r.owner = a.r_owner AND r.position = c.position) \n" + " WHERE \n" + " a.r_owner = :f1<char[101]> \n" + " AND r.table_name = :f2<char[101]> \n" + " AND a.constraint_type = 'R' \n" + " GROUP BY ROLLUP (c.constraint_name, c.column_name) \n" + ); + + //QList<toCache::CacheEntry const*> tables = oraCon->getCache().getEntriesInSchema(schema, toCache::TABLE); + //Q_FOREACH(toCache::CacheEntry const*e, tables) { toQValue c1, c2, c3, c4, c5, c6, c7, c8, c9; - toCacheEntryTable const* f = static_cast<toCacheEntryTable const*>(e); - oraCon->getCache().describeEntry(f); - toQuery Query(*oraCon, ConstrainsSQL, toQueryParams() << schema.toUpper() ); - while (!Query.eof()) + //toCacheEntryTable const* f = static_cast<toCacheEntryTable const*>(e); + //oraCon->getCache().describeEntry(f); + toQuery QueryC(*oraCon, ConstrainsSQL, toQueryParams() << schema.toUpper() << table.toUpper()); + while (!QueryC.eof()) { - c1 = Query.readValue(); - c2 = Query.readValue(); - c3 = Query.readValue(); - c4 = Query.readValue(); - c5 = Query.readValue(); - c6 = Query.readValue(); - c7 = Query.readValue(); - c8 = Query.readValue(); - c9 = Query.readValue(); + c1 = QueryC.readValue(); + c2 = QueryC.readValue(); + c3 = QueryC.readValue(); + c4 = QueryC.readValue(); + c5 = QueryC.readValue(); + c6 = QueryC.readValue(); + c7 = QueryC.readValue(); + c8 = QueryC.readValue(); + c9 = QueryC.readValue(); - // if( !c5.isNull() && !c1.isNull()) - // { - // std::cout << qPrintable(c3.displayData()) - // << '.' << qPrintable(c4.displayData()) - // << '.' << qPrintable(c5.displayData()) - // << " => " - // << qPrintable(c6.displayData()) - // << '.' << qPrintable(c7.displayData()) - // << '.' << qPrintable(c8.displayData()) << std::endl; - // } + if( c5.isNull() && c1.isNull()) + { + // Here collect FK?details (column list for compound keys) + } + if( c5.isNull() && !c1.isNull()) { TLOG(0, toNoDecorator, __HERE__) @@ -244,6 +268,30 @@ << std::endl; } } + + toQuery QueryR(*oraCon, ReferencesSQL, toQueryParams() << schema.toUpper() << table.toUpper()); + while (!QueryR.eof()) + { + c1 = QueryR.readValue(); + c2 = QueryR.readValue(); + c3 = QueryR.readValue(); + c4 = QueryR.readValue(); + c5 = QueryR.readValue(); + c6 = QueryR.readValue(); + c7 = QueryR.readValue(); + c8 = QueryR.readValue(); + c9 = QueryR.readValue(); + + if( c5.isNull() && !c1.isNull()) + { + TLOG(0, toNoDecorator, __HERE__) + << c3.displayData() << '.' << c4.displayData() + << " => " + << c6.displayData() << '.' << c7.displayData() + << std::endl; + } + } + } delete oraCon; Modified: branches/tora3/src/tools/tobrowsertablewidget.cpp =================================================================== --- branches/tora3/src/tools/tobrowsertablewidget.cpp 2012-06-24 23:34:14 UTC (rev 4367) +++ branches/tora3/src/tools/tobrowsertablewidget.cpp 2012-06-25 15:44:03 UTC (rev 4368) @@ -48,6 +48,7 @@ #include "core/toresultitem.h" #include "core/toresulttableview.h" #include "core/toresultgrants.h" +#include "core/toresultdrawing.h" #include "core/utils.h" #include "core/toextract.h" #include "core/toconnection.h" @@ -55,6 +56,8 @@ #include "core/toconnectiontraits.h" #include "core/toconnectionsubloan.h" + + static toSQL SQLTableIndex("toBrowserTableWidget:TableIndex", "SELECT IND.index_name AS \"Index Name\",\n" " ind.column_name AS \"Column Name\",\n" @@ -419,6 +422,9 @@ referencesView->setSQL(SQLTableReferences); referencesView->setReadAll(true); + schemaView = new toResultDrawing(this); + schemaView->setObjectName("schemaView"); + grantsView = new toResultGrants(this); grantsView->setObjectName("grantsView"); @@ -476,6 +482,11 @@ referencesView->hide(); if (c.providerIs("Oracle")) + addTab(schemaView, "&Schema"); + else + schemaView->hide(); + + if (c.providerIs("Oracle")) addTab(grantsView, "&Grants"); else grantsView->hide(); Modified: branches/tora3/src/tools/tobrowsertablewidget.h =================================================================== --- branches/tora3/src/tools/tobrowsertablewidget.h 2012-06-24 23:34:14 UTC (rev 4367) +++ branches/tora3/src/tools/tobrowsertablewidget.h 2012-06-25 15:44:03 UTC (rev 4368) @@ -51,8 +51,8 @@ class toResultExtent; class toResultExtract; class toResultGrants; +class toResultDrawing; - /*! \brief Table browser for toBrowser tool. See toBrowserBaseWidget for more info. \author Petr Vanek <pe...@sc...> @@ -65,6 +65,7 @@ toResultTableView *indexView; toResultTableView *constraintsView; toResultTableView *referencesView; + toResultDrawing *schemaView; toResultGrants *grantsView; toResultTableView *triggersView; toResultData *resultData; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |