From: <mrj...@us...> - 2008-08-17 18:07:32
|
Revision: 2948 http://tora.svn.sourceforge.net/tora/?rev=2948&view=rev Author: mrjohnson0 Date: 2008-08-17 18:07:41 +0000 (Sun, 17 Aug 2008) Log Message: ----------- remove cache objects usage from todebug and use a model instead. cache objects takes a couple minutes to run on my database and this code will block the main thread until it finishes, then clears it and calls for a refresh. new code simply runs a sql query to get at just the objects we want using toeventquery and is much faster (and doesn't block). Modified Paths: -------------- trunk/tora/src/CMakeLists.txt trunk/tora/src/Makefile.am trunk/tora/src/todebug.cpp trunk/tora/src/todebug.h Added Paths: ----------- trunk/tora/src/tocodemodel.cpp trunk/tora/src/tocodemodel.h Modified: trunk/tora/src/CMakeLists.txt =================================================================== --- trunk/tora/src/CMakeLists.txt 2008-08-16 18:23:22 UTC (rev 2947) +++ trunk/tora/src/CMakeLists.txt 2008-08-17 18:07:41 UTC (rev 2948) @@ -155,6 +155,7 @@ toresultlock.h toresultlong.h toresultmodel.h + tocodemodel.h toresultparam.h toresultpie.h toresultplan.h @@ -298,6 +299,7 @@ toresultlock.cpp toresultlong.cpp toresultmodel.cpp + tocodemodel.cpp toresultparam.cpp toresultpie.cpp toresultplan.cpp Modified: trunk/tora/src/Makefile.am =================================================================== --- trunk/tora/src/Makefile.am 2008-08-16 18:23:22 UTC (rev 2947) +++ trunk/tora/src/Makefile.am 2008-08-17 18:07:41 UTC (rev 2948) @@ -125,6 +125,7 @@ toscript.cpp toscript.h \ toscriptschemawidget.cpp toscriptschemawidget.h \ toscripttreeitem.cpp toscripttreeitem.h \ + tocodemodel.cpp tocodemodel.h \ toscripttreemodel.cpp toscripttreemodel.h \ tosecurity.cpp tosecurity.h \ tosecuritytreemodel.cpp tosecuritytreemodel.h \ @@ -280,6 +281,7 @@ moc_tochartmanager.cpp \ moc_toconnection.cpp \ moc_toconnectionmodel.cpp \ + moc_tocodemodel.cpp \ moc_toconnectionpool.cpp \ moc_toconnectionimport.cpp \ moc_torunnable.cpp \ Added: trunk/tora/src/tocodemodel.cpp =================================================================== --- trunk/tora/src/tocodemodel.cpp (rev 0) +++ trunk/tora/src/tocodemodel.cpp 2008-08-17 18:07:41 UTC (rev 2948) @@ -0,0 +1,275 @@ +/***** +* +* TOra - An Oracle Toolkit for DBA's and developers +* Copyright (C) 2003-2005 Quest Software, Inc +* Portions Copyright (C) 2005 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 without written consent from Quest Software, Inc. +* Observe that this does not disallow linking to the Qt Free Edition. +* +* You may link this product with any GPL'd Qt library such as Qt/Free +* +* All trademarks belong to their respective owners. +* +*****/ + +#include "config.h" + +#include "tosql.h" +#include "toconnection.h" +#include "tomain.h" +#include "toqvalue.h" +#include "utils.h" +#include "tocodemodel.h" +#include "toeventquery.h" + +static toSQL SQLListObjects("toCode:ListObjects", + "SELECT a.object_name,\n" + " a.object_type\n" + " FROM sys.all_objects a,\n" + " sys.all_tab_comments b\n" + " WHERE a.owner = b.owner ( + )\n" + " AND a.object_name = b.table_name ( + )\n" + " AND a.object_type = b.table_type ( + )\n" + " AND a.object_type IN ( 'FUNCTION',\n" + " 'PACKAGE',\n" + " 'PROCEDURE',\n" + " 'TYPE' )\n" + " AND a.owner = :owner<char[50]>", + "Get list of code objects"); + +toCodeModel::toCodeModel(QObject *parent) : QAbstractItemModel(parent), query(0) +{ + rootItem = new QTreeWidgetItem(); + packageItem = new QTreeWidgetItem(rootItem); + procItem = new QTreeWidgetItem(rootItem); + typeItem = new QTreeWidgetItem(rootItem); + + rootItem->setText(0, tr("Code")); + packageItem->setText(0, tr("Package")); + procItem->setText(0, tr("Procedure")); + typeItem->setText(0, tr("Type")); +} + +toCodeModel::~toCodeModel() +{ + if(rootItem) + delete rootItem; + if(query) + cleanup(); +} + +int toCodeModel::columnCount(const QModelIndex &parent) const +{ + if (parent.isValid()) + return static_cast<QTreeWidgetItem*>(parent.internalPointer())->columnCount(); + else + return rootItem->columnCount(); +} + +QVariant toCodeModel::data(const QModelIndex &index, int role) const +{ + if (!index.isValid()) + return QVariant(); + + if (role != Qt::DisplayRole) + return QVariant(); + + QTreeWidgetItem *item = static_cast<QTreeWidgetItem*>(index.internalPointer()); + if (!item) + return QVariant(); + + return item->text(index.column()); +} + +Qt::ItemFlags toCodeModel::flags(const QModelIndex &index) const +{ + if (!index.isValid()) + return 0; + + return Qt::ItemIsEnabled | Qt::ItemIsSelectable; +} + +QVariant toCodeModel::headerData(int section, Qt::Orientation orientation, + int role) const +{ + if (orientation == Qt::Horizontal && role == Qt::DisplayRole) + return tr("Objects"); + + return QVariant(); +} + +QModelIndex toCodeModel::index(int row, int column, const QModelIndex &parent) + const +{ + if (!hasIndex(row, column, parent)) + return QModelIndex(); + + QTreeWidgetItem *parentItem; + + if (!parent.isValid()) + parentItem = rootItem; + else + parentItem = static_cast<QTreeWidgetItem*>(parent.internalPointer()); + + QTreeWidgetItem *childItem = parentItem->child(row); + if (childItem) + return createIndex(row, column, childItem); + else + return QModelIndex(); +} + +QModelIndex toCodeModel::parent(const QModelIndex &index) const +{ + if (!index.isValid()) + return QModelIndex(); + + QTreeWidgetItem *childItem = static_cast<QTreeWidgetItem*>(index.internalPointer()); + QTreeWidgetItem *parentItem = childItem->parent(); + + if (parentItem == rootItem) + return QModelIndex(); + if (parentItem == packageItem) + return createIndex(1, 0, parentItem); + if (parentItem == procItem) + return createIndex(2, 0, parentItem); + if (parentItem == typeItem) + return createIndex(3, 0, parentItem); + + return QModelIndex(); +} + +int toCodeModel::rowCount(const QModelIndex &parent) const +{ + QTreeWidgetItem *parentItem; + if (parent.column() > 0) + return 0; + + if (!parent.isValid()) + parentItem = rootItem; + else + parentItem = static_cast<QTreeWidgetItem*>(parent.internalPointer()); + + return parentItem->childCount(); +} + + +void toCodeModel::queryError(const toConnection::exception &err) { + toStatusMessage(err); + cleanup(); +} + + +void toCodeModel::refresh(toConnection &conn, const QString &owner) +{ + delete rootItem; + rootItem = new QTreeWidgetItem(); + + packageItem = new QTreeWidgetItem(rootItem); + procItem = new QTreeWidgetItem(rootItem); + typeItem = new QTreeWidgetItem(rootItem); + + rootItem->setText(0, tr("Code")); + packageItem->setText(0, tr("Package")); + procItem->setText(0, tr("Procedure")); + typeItem->setText(0, tr("Type")); + + toQList param; + param.push_back(owner); + + try { + query = new toEventQuery(conn, + toQuery::Long, + toSQL::sql(SQLListObjects, conn), + param); + + qRegisterMetaType<toConnection::exception>("toConnection::exception"); + + connect(query, + SIGNAL(dataAvailable()), + this, + SLOT(readData())); + connect(query, + SIGNAL(error(const toConnection::exception &)), + this, + SLOT(queryError(const toConnection::exception &))); + connect(query, + SIGNAL(done()), + this, + SLOT(readData())); + + query->start(); + } + TOCATCH; +} + +void toCodeModel::cleanup() +{ + if (query) + { + disconnect(query, 0, this, 0); + + query->stop(); + delete query; + } + + query = 0; +} + +void toCodeModel::readData() +{ + if (!query) + { + cleanup(); + return; + } + + while(query->hasMore()) { + QString cname = query->readValueNull().toString(); + QString ctype = query->readValueNull().toString(); + + QTreeWidgetItem *item = 0; + if(ctype == QString("FUNCTION")) + item = new QTreeWidgetItem(procItem); + else if(ctype == QString("PACKAGE")) + item = new QTreeWidgetItem(packageItem); + else if(ctype == QString("PROCEDURE")) + item = new QTreeWidgetItem(procItem); + else if(ctype == QString("TYPE")) + item = new QTreeWidgetItem(typeItem); + + item->setText(0, cname); + } + + reset(); + + if(!query->hasMore() && query->eof()) + { + cleanup(); + return; + } + + query->readAll(); +} Added: trunk/tora/src/tocodemodel.h =================================================================== --- trunk/tora/src/tocodemodel.h (rev 0) +++ trunk/tora/src/tocodemodel.h 2008-08-17 18:07:41 UTC (rev 2948) @@ -0,0 +1,93 @@ +/***** +* +* TOra - An Oracle Toolkit for DBA's and developers +* Copyright (C) 2003-2005 Quest Software, Inc +* Portions Copyright (C) 2005 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 without written consent from Quest Software, Inc. +* Observe that this does not disallow linking to the Qt Free Edition. +* +* You may link this product with any GPL'd Qt library such as Qt/Free +* +* All trademarks belong to their respective owners. +* +*****/ +#ifndef TOCODEMODEL_H +#define TOCODEMODEL_H + +#include <QAbstractItemModel> +#include <QModelIndex> +#include <QVariant> +#include <QTreeWidgetItem> + +#include "config.h" +#include "toconnection.h" + +class toEventQuery; + + +/*! \brief A tree model for QTreeView used in the sql editor and sql + * debugger tools. + * + */ +class toCodeModel : public QAbstractItemModel +{ + Q_OBJECT + +public: + toCodeModel(QObject *parent = 0); + ~toCodeModel(); + + QVariant data(const QModelIndex &index, int role) const; + Qt::ItemFlags flags(const QModelIndex &index) const; + QVariant headerData(int section, Qt::Orientation orientation, + int role = Qt::DisplayRole) const; + QModelIndex index(int row, int column, + const QModelIndex &parent = QModelIndex()) const; + QModelIndex parent(const QModelIndex &index) const; + int rowCount(const QModelIndex &parent = QModelIndex()) const; + int columnCount(const QModelIndex &parent = QModelIndex()) const; + + /** + * Run query for model + * + */ + void refresh(toConnection &conn, const QString &owner); + +private slots: + void cleanup(void); + void readData(void); + void queryError(const toConnection::exception &); + +private: + //! An universal root item. It's deleted and recreated in setupModelData() + QTreeWidgetItem *rootItem; + QTreeWidgetItem *packageItem; + QTreeWidgetItem *procItem; + QTreeWidgetItem *typeItem; + toEventQuery *query; +}; + +#endif Modified: trunk/tora/src/todebug.cpp =================================================================== --- trunk/tora/src/todebug.cpp 2008-08-16 18:23:22 UTC (rev 2947) +++ trunk/tora/src/todebug.cpp 2008-08-17 18:07:41 UTC (rev 2948) @@ -51,6 +51,7 @@ #include "tosql.h" #include "tosqlparse.h" #include "totool.h" +#include "tocodemodel.h" #include <stack> @@ -72,6 +73,7 @@ #include <QMdiArea> #include <QMessageBox> #include <QButtonGroup> +#include <QTreeView> #include "icons/addwatch.xpm" #include "icons/changewatch.xpm" @@ -1754,8 +1756,8 @@ } toDebug::toDebug(QWidget *main, toConnection &connection) - : toToolWidget(DebugTool, "debugger.html", main, connection, "toDebug"), - TargetThread() + : toToolWidget(DebugTool, "debugger.html", main, connection, "toDebug"), + TargetThread() { createActions(); QToolBar *toolbar = toAllocBar(this, tr("Debugger")); @@ -1829,15 +1831,19 @@ QSplitter *objSplitter = new QSplitter(Qt::Vertical, hsplitter); - Objects = new toListView(objSplitter); - Objects->addColumn(tr("Objects")); - Objects->setRootIsDecorated(true); - Objects->setTreeStepSize(10); - Objects->setSorting(0); - Objects->setSelectionMode(toTreeWidget::Single); - Objects->setResizeMode(toTreeWidget::AllColumns); - connect(Objects, SIGNAL(selectionChanged(toTreeWidgetItem *)), - this, SLOT(changePackage(toTreeWidgetItem *))); + Objects = new QTreeView(objSplitter); + CodeModel = new toCodeModel(Objects); + Objects->setModel(CodeModel); + QString selected = Schema->currentText(); + if(!selected.isEmpty()) + CodeModel->refresh(connection, selected); +// Objects->setSelectionMode(toTreeWidget::Single); +// Objects->setResizeMode(toTreeWidget::AllColumns); + connect(Objects->selectionModel(), + SIGNAL(currentChanged(const QModelIndex &, const QModelIndex &)), + this, + SLOT(changePackage(const QModelIndex &, const QModelIndex &))); + Contents = new toListView(objSplitter); Contents->addColumn(tr("Contents")); Contents->setRootIsDecorated(true); @@ -2230,66 +2236,16 @@ } if (!selected.isEmpty()) { + for (int i = 0;i < Schema->count();i++) { - for (int i = 0;i < Schema->count();i++) - if (Schema->itemText(i) == selected) - { - Schema->setCurrentIndex(i); - break; - } - } - Objects->clear(); - - // refresh the objects - connection().rereadCache(); - std::list<toConnection::objectName> &objs = connection().objects(true); - - std::map<QString, toTreeWidgetItem *> typeItems; - bool any = false; - for (std::list<toConnection::objectName>::iterator i = objs.begin(); - i != objs.end();i++) - { - if ((*i).Owner == selected) + if (Schema->itemText(i) == selected) { - any = true; - QString type = (*i).Type; - if (type == QString::fromLatin1("FUNCTION") || - type == QString::fromLatin1("PACKAGE") || - type == QString::fromLatin1("PROCEDURE") || - type == QString::fromLatin1("TYPE")) - { - toTreeWidgetItem *typeItem; - std::map<QString, toTreeWidgetItem *>::iterator j = typeItems.find(type); - if (j == typeItems.end()) - { - typeItem = new toTreeWidgetItem(Objects, type); - typeItems[type] = typeItem; -#ifndef AUTOEXPAND - - typeItem->setSelectable(false); -#endif - - } - else - typeItem = (*j).second; - - QString bodyType(type); - bodyType += QString::fromLatin1(" BODY"); - QString name = (*i).Name; - toTreeWidgetItem *item = new toTreeWidgetItem(typeItem, name, type); - if (selected == currentEditor()->schema() && - (type == currentEditor()->type() || - bodyType == currentEditor()->type()) && - name == currentEditor()->object()) - { - Objects->setOpen(typeItem, true); - Objects->setSelected(item, true); - } - } - } - else if (any) + Schema->setCurrentIndex(i); break; + } } + + CodeModel->refresh(connection(), selected); } } TOCATCH @@ -2426,14 +2382,21 @@ // qDebug() << "toDebug::updateCurrent 2"; } -void toDebug::changePackage(toTreeWidgetItem *item) +void toDebug::changePackage(const QModelIndex ¤t, const QModelIndex &previous) { // qDebug() << "toDebug::changePackage 1"; + QTreeWidgetItem *item = static_cast<QTreeWidgetItem*>(current.internalPointer()); if (item && item->parent()) { - viewSource(Schema->currentText(), item->text(0), item->text(1), 0); - if (item->text(1) == "PACKAGE" || item->text(1) == "TYPE") - viewSource(Schema->currentText(), item->text(0), item->text(1) + " BODY", 0); + QString ctype = item->parent()->text(0); + if(ctype.isEmpty() || ctype == "Code") + return; + ctype = ctype.toUpper(); + + if (ctype == "PACKAGE" || ctype == "TYPE") + ctype += " BODY"; + + viewSource(Schema->currentText(), item->text(0), ctype, 0); } #ifdef AUTOEXPAND else if (item && !item->parent()) @@ -3034,10 +2997,10 @@ } } - if (Objects->selectedItem() && - Objects->selectedItem()->text(0) == editor->object() && - Schema->currentText() == editor->schema()) - Objects->clearSelection(); +// if (Objects->selectedItem() && +// Objects->selectedItem()->text(0) == editor->object() && +// Schema->currentText() == editor->schema()) +// Objects->clearSelection(); Editors->removeTab(Editors->indexOf(editor)); delete editor; Modified: trunk/tora/src/todebug.h =================================================================== --- trunk/tora/src/todebug.h 2008-08-16 18:23:22 UTC (rev 2947) +++ trunk/tora/src/todebug.h 2008-08-17 18:07:41 UTC (rev 2948) @@ -84,16 +84,18 @@ #define TO_BREAK_HANDLER 2048 #define TO_ABORT_EXECUTION 8192 +class QButtonGroup; class QComboBox; -class toTreeWidget; -class toTreeWidgetItem; class QTabWidget; +class QTreeView; class QToolButton; +class toCodeModel; class toConnection; class toDebugText; class toMarkedText; class toOutput; -class QButtonGroup; +class toTreeWidget; +class toTreeWidgetItem; class toDebug : public toToolWidget { @@ -143,7 +145,8 @@ QMenu *ToolMenu; // Content pane - toTreeWidget *Objects; + QTreeView *Objects; + toCodeModel *CodeModel; toTreeWidget *Contents; // Debug pane @@ -263,7 +266,7 @@ void compile(void); void refresh(void); void changeSchema(int); - void changePackage(toTreeWidgetItem *); + void changePackage(const QModelIndex &, const QModelIndex &); void showDebug(bool); void prevError(void); void nextError(void); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |