From: <ibr...@us...> - 2012-01-07 23:36:31
|
Revision: 4219 http://tora.svn.sourceforge.net/tora/?rev=4219&view=rev Author: ibre5041 Date: 2012-01-07 23:36:24 +0000 (Sat, 07 Jan 2012) Log Message: ----------- Linux compile fixes Modified Paths: -------------- branches/tora3/src/connection/tooracleconnection.cpp branches/tora3/src/connection/toteradataprovider.cpp branches/tora3/src/core/toconnection.cpp branches/tora3/src/tools/toanalyze.h Modified: branches/tora3/src/connection/tooracleconnection.cpp =================================================================== --- branches/tora3/src/connection/tooracleconnection.cpp 2012-01-07 23:17:00 UTC (rev 4218) +++ branches/tora3/src/connection/tooracleconnection.cpp 2012-01-07 23:36:24 UTC (rev 4219) @@ -285,15 +285,15 @@ void toOracleConnectionSub::commit() { - throw toConnection::exception( (__HERE__ + "Not implemented yet").c_str() ); + throw toConnection::exception("void toOracleConnectionSub::commit Not implemented yet"); } void toOracleConnectionSub::rollback() { - throw toConnection::exception( (__HERE__ + "Not implemented yet").c_str() ); + throw toConnection::exception("void toOracleConnectionSub::rollback Not implemented yet"); } queryImpl * toOracleConnectionSub::createQuery(toQuery *query) { return new oracleQuery(query, this); -} \ No newline at end of file +} Modified: branches/tora3/src/connection/toteradataprovider.cpp =================================================================== --- branches/tora3/src/connection/toteradataprovider.cpp 2012-01-07 23:17:00 UTC (rev 4218) +++ branches/tora3/src/connection/toteradataprovider.cpp 2012-01-07 23:36:24 UTC (rev 4219) @@ -124,7 +124,7 @@ toConnection::connectionImpl* toTeradataProvider::createConnectionImpl(toConnection &con) { - throw toConnection::exception( (__HERE__ + "Not implemented yet").c_str()); + throw toConnection::exception("toTeradataProvider::createConnectionImpl Not implemented yet"); return NULL; } Modified: branches/tora3/src/core/toconnection.cpp =================================================================== --- branches/tora3/src/core/toconnection.cpp 2012-01-07 23:17:00 UTC (rev 4218) +++ branches/tora3/src/core/toconnection.cpp 2012-01-07 23:36:24 UTC (rev 4219) @@ -164,7 +164,7 @@ void toConnection::cancelAll(void) { - throw exception( (__HERE__ + "Not implemented yet").c_str()); + throw exception("void toConnection::cancelAll Not implemented yet"); //conn ConnectionPool->cancelAll(); } Modified: branches/tora3/src/tools/toanalyze.h =================================================================== --- branches/tora3/src/tools/toanalyze.h 2012-01-07 23:17:00 UTC (rev 4218) +++ branches/tora3/src/tools/toanalyze.h 2012-01-07 23:36:24 UTC (rev 4219) @@ -48,6 +48,7 @@ #include <QAction> #include <QLabel> +#include <QToolButton> class QComboBox; class QMenu; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2012-01-14 02:53:37
|
Revision: 4228 http://tora.svn.sourceforge.net/tora/?rev=4228&view=rev Author: ibre5041 Date: 2012-01-14 02:53:30 +0000 (Sat, 14 Jan 2012) Log Message: ----------- sync with tora trunk Modified Paths: -------------- branches/tora3/src/CMakeLists.txt branches/tora3/src/core/tohelp.cpp branches/tora3/src/core/tothread.cpp branches/tora3/src/core/tothread.h branches/tora3/src/toqsqlconnection.cpp Added Paths: ----------- branches/tora3/src/core/tohelpsetup.cpp branches/tora3/src/core/totaskrunner.cpp branches/tora3/src/core/totaskrunner.h Removed Paths: ------------- branches/tora3/src/core/tothread_p.h Modified: branches/tora3/src/CMakeLists.txt =================================================================== --- branches/tora3/src/CMakeLists.txt 2012-01-14 02:51:47 UTC (rev 4227) +++ branches/tora3/src/CMakeLists.txt 2012-01-14 02:53:30 UTC (rev 4228) @@ -155,7 +155,7 @@ core/topreferences.h core/topushbutton.h core/tosearchreplace.h - core/tothread_p.h + core/totaskrunner.h core/totreewidget.h core/utils.h core/tonewconnection.h @@ -425,7 +425,9 @@ core/topiechart.cpp core/toeditablemenu.cpp core/tosyntaxsetup.cpp - + core/tohelpsetup.cpp + core/totaskrunner.cpp + migratetool/sqldeveloper.cpp migratetool/squirrelsql.cpp migratetool/tora3.cpp Modified: branches/tora3/src/core/tohelp.cpp =================================================================== --- branches/tora3/src/core/tohelp.cpp 2012-01-14 02:51:47 UTC (rev 4227) +++ branches/tora3/src/core/tohelp.cpp 2012-01-14 02:53:30 UTC (rev 4228) @@ -54,152 +54,6 @@ toHelp *toHelp::Window; -toHelpAddFile::toHelpAddFile(QWidget *parent, const char *name) - : QDialog(parent) -{ - - if (name) - setObjectName(name); - - setupUi(this); - OkButton->setEnabled(false); - toHelp::connectDialog(this); -} - - -void toHelpAddFile::browse() -{ - QString filename = Utils::toOpenFilename(Filename->text(), QString::fromLatin1("toc.htm*"), this); - if (!filename.isEmpty()) - Filename->setText(filename); -} - - -void toHelpAddFile::valid() -{ - if (Filename->text().isEmpty() || Root->text().isEmpty()) - OkButton->setEnabled(false); - else - OkButton->setEnabled(true); -} - - -toHelpPrefs::toHelpPrefs(toTool *tool, QWidget *parent, const char *name) - : QWidget(parent), toSettingTab("additionalhelp.html"), Tool(tool) -{ - - if (name) - setObjectName(name); - - setupUi(this); - -// int tot = Tool->config("Number", "-1").toInt(); -// if (tot != -1) -// { -// for (int i = 0;i < tot;i++) -// { -// QString num = QString::number(i); -// QString root = Tool->config(num.toLatin1(), ""); -// num += QString::fromLatin1("file"); -// QString file = Tool->config(num.toLatin1(), ""); -// new toTreeWidgetItem(FileList, root, file); -// } -// } - HelpsMapIterator i(toConfigurationSingle::Instance().additionalHelp()); - while (i.hasNext()) - { - i.next(); - new toTreeWidgetItem(FileList, i.key(), i.value()); - } -} - - -void toHelpPrefs::saveSetting() -{ -// int i = 0; - HelpsMap h; - for (toTreeWidgetItem *item = FileList->firstChild();item;item = item->nextSibling()) - { -// QString nam = QString::number(i); -// Tool->setConfig(nam.toLatin1(), item->text(0)); -// nam += QString::fromLatin1("file"); -// Tool->setConfig(nam.toLatin1(), item->text(1)); -// i++; - h[item->text(0)] = item->text(1); - } -// Tool->setConfig("Number", QString::number(i)); - toConfigurationSingle::Instance().setAdditionalHelp(h); - delete toHelp::Window; -} - - -void toHelpPrefs::addFile() -{ - toHelpAddFile file(this); - if (file.exec()) - new toTreeWidgetItem(FileList, file.Root->text(), file.Filename->text()); -} - - -void toHelpPrefs::delFile() -{ - delete FileList->selectedItem(); -} - - -void toHelpPrefs::oracleManuals() -{ - // For Oracle 11g look for a file /nav/portal_3.htm which contains a list of all books - QString filename = Utils::toOpenFilename(QString::null, QString::fromLatin1("*index.htm*"), this); - try - { - toHtml file(Utils::toReadFile(filename)); - QString dsc; - bool inDsc = false; - QRegExp isToc(QString::fromLatin1("toc\\.htm?$")); - while (!file.eof()) - { - file.nextToken(); - if (file.isTag()) - { - if (file.open() && file.tag() == "a") - { - QString href = toHelp::path(filename); - href += file.value("href"); - if (!href.isEmpty() && - !dsc.isEmpty() && - href.indexOf(isToc) >= 0 && - !file.value("title").isNull()) - { - new toTreeWidgetItem(FileList, dsc.simplified(), href); - inDsc = false; - dsc.clear(); - } - } - // This one is for oracle manuals with version 11 - else if ((file.open() && file.tag() == "td") && !file.value("id").isNull()) - { - dsc.clear(); - inDsc = true; - } - // This one is for old version of oracle manuals - else if ((file.open() && file.tag() == "dd") || file.tag() == "book") - { - dsc.clear(); - inDsc = true; - } - } - else if (inDsc) - dsc += file.text(); - } - } - catch (const QString &str) - { - TOMessageBox::warning(toMainWidget(), qApp->translate("toHelpPrefs", "File error"), str); - } -} - - QWidget *toHelpTool::configurationTab(QWidget *parent) { return new toHelpPrefs(this, parent); Copied: branches/tora3/src/core/tohelpsetup.cpp (from rev 4226, trunk/tora/src/tohelpsetup.cpp) =================================================================== --- branches/tora3/src/core/tohelpsetup.cpp (rev 0) +++ branches/tora3/src/core/tohelpsetup.cpp 2012-01-14 02:53:30 UTC (rev 4228) @@ -0,0 +1,198 @@ + +/* 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/tohelpsetup.h" +#include "core/tohelp.h" +#include "core/utils.h" +#include "core/toconf.h" +#include "core/tohtml.h" +#include "core/tomain.h" +#include "core/toresultview.h" +#include "core/totool.h" + +#include <QMessageBox> +#include <QSettings> + + +toHelpAddFile::toHelpAddFile(QWidget *parent, const char *name) + : QDialog(parent) +{ + + if (name) + setObjectName(name); + + setupUi(this); + OkButton->setEnabled(false); + toHelp::connectDialog(this); +} + + +void toHelpAddFile::browse() +{ + QString filename = Utils::toOpenFilename(Filename->text(), QString::fromLatin1("toc.htm*"), this); + if (!filename.isEmpty()) + Filename->setText(filename); +} + + +void toHelpAddFile::valid() +{ + if (Filename->text().isEmpty() || Root->text().isEmpty()) + OkButton->setEnabled(false); + else + OkButton->setEnabled(true); +} + + +toHelpPrefs::toHelpPrefs(toTool *tool, QWidget *parent, const char *name) + : QWidget(parent), toSettingTab("additionalhelp.html"), Tool(tool) +{ + + if (name) + setObjectName(name); + + setupUi(this); + +// int tot = Tool->config("Number", "-1").toInt(); +// if (tot != -1) +// { +// for (int i = 0;i < tot;i++) +// { +// QString num = QString::number(i); +// QString root = Tool->config(num.toLatin1(), ""); +// num += QString::fromLatin1("file"); +// QString file = Tool->config(num.toLatin1(), ""); +// new toTreeWidgetItem(FileList, root, file); +// } +// } + HelpsMapIterator i(toConfigurationSingle::Instance().additionalHelp()); + while (i.hasNext()) + { + i.next(); + new toTreeWidgetItem(FileList, i.key(), i.value()); + } +} + + +void toHelpPrefs::saveSetting() +{ +// int i = 0; + HelpsMap h; + for (toTreeWidgetItem *item = FileList->firstChild();item;item = item->nextSibling()) + { +// QString nam = QString::number(i); +// Tool->setConfig(nam.toLatin1(), item->text(0)); +// nam += QString::fromLatin1("file"); +// Tool->setConfig(nam.toLatin1(), item->text(1)); +// i++; + h[item->text(0)] = item->text(1); + } +// Tool->setConfig("Number", QString::number(i)); + toConfigurationSingle::Instance().setAdditionalHelp(h); + delete toHelp::Window; +} + + +void toHelpPrefs::addFile() +{ + toHelpAddFile file(this); + if (file.exec()) + new toTreeWidgetItem(FileList, file.Root->text(), file.Filename->text()); +} + + +void toHelpPrefs::delFile() +{ + delete FileList->selectedItem(); +} + + +void toHelpPrefs::oracleManuals() +{ + // For Oracle 11g look for a file /nav/portal_3.htm which contains a list of all books + QString filename = Utils::toOpenFilename(QString::null, QString::fromLatin1("*index.htm*"), this); + try + { + toHtml file(Utils::toReadFile(filename)); + QString dsc; + bool inDsc = false; + QRegExp isToc(QString::fromLatin1("toc\\.htm?$")); + while (!file.eof()) + { + file.nextToken(); + if (file.isTag()) + { + if (file.open() && file.tag() == "a") + { + QString href = toHelp::path(filename); + href += file.value("href"); + if (!href.isEmpty() && + !dsc.isEmpty() && + href.indexOf(isToc) >= 0 && + !file.value("title").isNull()) + { + new toTreeWidgetItem(FileList, dsc.simplified(), href); + inDsc = false; + dsc.clear(); + } + } + // This one is for oracle manuals with version 11 + else if ((file.open() && file.tag() == "td") && !file.value("id").isNull()) + { + dsc.clear(); + inDsc = true; + } + // This one is for old version of oracle manuals + else if ((file.open() && file.tag() == "dd") || file.tag() == "book") + { + dsc.clear(); + inDsc = true; + } + } + else if (inDsc) + dsc += file.text(); + } + } + catch (const QString &str) + { + TOMessageBox::warning(toMainWidget(), qApp->translate("toHelpPrefs", "File error"), str); + } +} Copied: branches/tora3/src/core/totaskrunner.cpp (from rev 4226, trunk/tora/src/totaskrunner.cpp) =================================================================== --- branches/tora3/src/core/totaskrunner.cpp (rev 0) +++ branches/tora3/src/core/totaskrunner.cpp 2012-01-14 02:53:30 UTC (rev 4228) @@ -0,0 +1,93 @@ + +/* 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 "totaskrunner.h" +#include <stdio.h> + +toTaskRunner::toTaskRunner(toTask *task) + : Task(task) +{} + +void toTaskRunner::run(void) +{ + try + { + toThread::Lock->lock () + ; + toThread::toThreadInfoStorage.setLocalData(new toThreadInfo(++toThread::lastThreadNumber)); + StartSemaphore.up(); + toThread::mainThread(); + toThread::Lock->unlock(); + Task->run(); + toThread::Lock->lock () + ; + delete Task; + Task = NULL; + toThread::Lock->unlock(); + } + catch (const QString &exc) + { + fprintf(stderr, "Unhandled exception in thread:\n%s\n", exc.toAscii().constData()); + } + catch (...) + { + fprintf(stderr, "Unhandled exception in thread:\nUnknown type\n"); + } + + + // This is a cludge to clean up finnished threads, there won't be many hanging at least + + toThread::Lock->lock () + ; + for (std::list<toThread *>::iterator i = toThread::Threads->begin(); + i != toThread::Threads->end();) + { + if ((*i)->Thread->isFinished()) + { + delete (*i); + toThread::Threads->erase(i); + i = toThread::Threads->begin(); + } + else + i++; + } + toThread::Lock->unlock(); +} Copied: branches/tora3/src/core/totaskrunner.h (from rev 4226, trunk/tora/src/totaskrunner.h) =================================================================== --- branches/tora3/src/core/totaskrunner.h (rev 0) +++ branches/tora3/src/core/totaskrunner.h 2012-01-14 02:53:30 UTC (rev 4228) @@ -0,0 +1,61 @@ + +/* 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 TOTASKRUNNER_H +#define TOTASKRUNNER_H + +#include "config.h" +#include "tothread.h" + +#include <QThread> + +class toTaskRunner : public QThread +{ + Q_OBJECT +public: + toSemaphore StartSemaphore; + toTask *Task; + toTaskRunner(toTask *); + virtual void run(void); + friend class toThread; +}; + +#endif Modified: branches/tora3/src/core/tothread.cpp =================================================================== --- branches/tora3/src/core/tothread.cpp 2012-01-14 02:51:47 UTC (rev 4227) +++ branches/tora3/src/core/tothread.cpp 2012-01-14 02:53:30 UTC (rev 4228) @@ -40,7 +40,7 @@ * END_COMMON_COPYRIGHT_HEADER */ #include "core/tothread.h" -#include "core/tothread_p.h" +#include "core/totaskrunner.h" #include "core/tomain.h" #include "core/utils.h" @@ -99,7 +99,7 @@ toThread::toThread(toTask *task) { - Thread = new taskRunner(task); + Thread = new toTaskRunner(task); if (!Threads) Threads = new std::list<toThread *>; if (!Lock) @@ -132,64 +132,14 @@ void toThread::msleep(int msec) { - taskRunner::msleep(msec); + toTaskRunner::msleep(msec); } void toThread::sleep(int sec) { - taskRunner::sleep(sec); + toTaskRunner::sleep(sec); } -taskRunner::taskRunner(toTask *task) - : Task(task) -{} - -void taskRunner::run(void) -{ - try - { - toThread::Lock->lock () - ; - toThread::toThreadInfoStorage.setLocalData(new toThreadInfo(++toThread::lastThreadNumber)); - StartSemaphore.up(); - toThread::mainThread(); - toThread::Lock->unlock(); - Task->run(); - toThread::Lock->lock () - ; - delete Task; - Task = NULL; - toThread::Lock->unlock(); - } - catch (const QString &exc) - { - fprintf(stderr, "Unhandled exception in thread:\n%s\n", exc.toAscii().constData()); - } - catch (...) - { - fprintf(stderr, "Unhandled exception in thread:\nUnknown type\n"); - } - - - // This is a cludge to clean up finnished threads, there won't be many hanging at least - - toThread::Lock->lock () - ; - for (std::list<toThread *>::iterator i = toThread::Threads->begin(); - i != toThread::Threads->end();) - { - if ((*i)->Thread->isFinished()) - { - delete (*i); - toThread::Threads->erase(i); - i = toThread::Threads->begin(); - } - else - i++; - } - toThread::Lock->unlock(); -} - toThreadInfo::toThreadInfo(unsigned number) :threadNumber(number), threadTask("") { #ifdef DEBUG Modified: branches/tora3/src/core/tothread.h =================================================================== --- branches/tora3/src/core/tothread.h 2012-01-14 02:51:47 UTC (rev 4227) +++ branches/tora3/src/core/tothread.h 2012-01-14 02:53:30 UTC (rev 4228) @@ -172,7 +172,7 @@ }; void *toThreadStartWrapper(void*); -class taskRunner; +class toTaskRunner; class toThreadInfo; class TORA_EXPORT toThread @@ -183,7 +183,7 @@ static QThreadStorage<toThreadInfo*> toThreadInfoStorage; volatile static unsigned lastThreadNumber; - taskRunner *Thread; + toTaskRunner *Thread; static std::list<toThread *> *Threads; static toLock *Lock; static QThread *MainThread; @@ -206,7 +206,7 @@ */ static void setMainThread(QThread *main); - friend class taskRunner; + friend class toTaskRunner; friend class toThreadInfo; friend class toConnectionPoolTest; friend class toConnectionPoolExec; Deleted: branches/tora3/src/core/tothread_p.h =================================================================== --- branches/tora3/src/core/tothread_p.h 2012-01-14 02:51:47 UTC (rev 4227) +++ branches/tora3/src/core/tothread_p.h 2012-01-14 02:53:30 UTC (rev 4228) @@ -1,61 +0,0 @@ - -/* 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 TOTHREAD_P_H -#define TOTHREAD_P_H - -#include "config.h" -#include "core/tothread.h" - -#include <QThread> - -class taskRunner : public QThread -{ - Q_OBJECT -public: - toSemaphore StartSemaphore; - toTask *Task; - taskRunner(toTask *); - virtual void run(void); - friend class toThread; -}; - -#endif Modified: branches/tora3/src/toqsqlconnection.cpp =================================================================== --- branches/tora3/src/toqsqlconnection.cpp 2012-01-14 02:51:47 UTC (rev 4227) +++ branches/tora3/src/toqsqlconnection.cpp 2012-01-14 02:53:30 UTC (rev 4228) @@ -69,16 +69,8 @@ #include <QString> #ifdef HAVE_POSTGRESQL_LIBPQ_FE_H -#ifdef CMAKE_BUILD - // There is different location of pgsql includes sometimes - // E.g. /usr/include/pgsql on suse etc. Cmake hadles it - // easily for us. #include <libpq-fe.h> -#else - // This is for autotools - #include <postgresql/libpq-fe.h> #endif -#endif static toSQL SQLVersion("toQSqlConnection:Version", "SHOW VARIABLES LIKE 'version'", This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2012-01-14 20:18:48
|
Revision: 4229 http://tora.svn.sourceforge.net/tora/?rev=4229&view=rev Author: ibre5041 Date: 2012-01-14 20:18:41 +0000 (Sat, 14 Jan 2012) Log Message: ----------- fix library loading on Linux Modified Paths: -------------- branches/tora3/src/CMakeLists.txt branches/tora3/src/connection/tooraclefind.cpp branches/tora3/src/core/utils.cpp Modified: branches/tora3/src/CMakeLists.txt =================================================================== --- branches/tora3/src/CMakeLists.txt 2012-01-14 02:53:30 UTC (rev 4228) +++ branches/tora3/src/CMakeLists.txt 2012-01-14 20:18:41 UTC (rev 4229) @@ -684,6 +684,8 @@ ENDIF (MINGW) ENDIF (WIN32) +SET(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) +SET(CMAKE_INSTALL_RPATH "$ORIGIN/:$$ORIGIN/") ADD_EXECUTABLE(${EXE_NAME} ${GUI_TYPE} core/main.cpp ${TORA_UI_SOURCES} Modified: branches/tora3/src/connection/tooraclefind.cpp =================================================================== --- branches/tora3/src/connection/tooraclefind.cpp 2012-01-14 02:53:30 UTC (rev 4228) +++ branches/tora3/src/connection/tooraclefind.cpp 2012-01-14 20:18:41 UTC (rev 4229) @@ -53,7 +53,7 @@ #include <oci.h> #if defined(Q_OS_LINUX) -# define PROVIDER_LIB "libporacle.so" +# define PROVIDER_LIB "./libporacle.so" # define TROTL_LIB "libtrotl.so" #elif defined(Q_OS_WIN32) # define PROVIDER_LIB "poracle.dll" Modified: branches/tora3/src/core/utils.cpp =================================================================== --- branches/tora3/src/core/utils.cpp 2012-01-14 02:53:30 UTC (rev 4228) +++ branches/tora3/src/core/utils.cpp 2012-01-14 20:18:41 UTC (rev 4229) @@ -1530,7 +1530,8 @@ QString oldDir = QDir::currentPath(); QDir::setCurrent(path.absolutePath()); #ifndef Q_OS_WIN32 - handle = dlopen(path.fileName().toStdString().c_str(), RTLD_NOW | RTLD_GLOBAL); + QString libFilename = path.absoluteFilePath(); + handle = dlopen(libFilename.toStdString().c_str(), RTLD_NOW | RTLD_GLOBAL); if( !handle) { QDir::setCurrent(oldDir); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2012-03-30 23:31:44
|
Revision: 4256 http://tora.svn.sourceforge.net/tora/?rev=4256&view=rev Author: ibre5041 Date: 2012-03-30 23:31:37 +0000 (Fri, 30 Mar 2012) Log Message: ----------- Sync with tora trunk Modified Paths: -------------- branches/tora3/src/connection/tooraclefind.cpp branches/tora3/src/core/tohighlightedtext.cpp branches/tora3/src/core/toresultplan.cpp branches/tora3/src/core/toresultplan.h branches/tora3/src/core/toresulttableviewedit.cpp branches/tora3/src/core/tosql.h branches/tora3/src/core/totreewidget.cpp branches/tora3/src/core/totreewidget.h branches/tora3/src/tools/tosession.cpp Modified: branches/tora3/src/connection/tooraclefind.cpp =================================================================== --- branches/tora3/src/connection/tooraclefind.cpp 2012-03-30 19:46:41 UTC (rev 4255) +++ branches/tora3/src/connection/tooraclefind.cpp 2012-03-30 23:31:37 UTC (rev 4256) @@ -53,7 +53,7 @@ #include <oci.h> #if defined(Q_OS_LINUX) -# define PROVIDER_LIB "./libporacle.so" +# define PROVIDER_LIB "libporacle.so" # define TROTL_LIB "libtrotl.so" #elif defined(Q_OS_WIN32) # define PROVIDER_LIB "poracle.dll" Modified: branches/tora3/src/core/tohighlightedtext.cpp =================================================================== --- branches/tora3/src/core/tohighlightedtext.cpp 2012-03-30 19:46:41 UTC (rev 4255) +++ branches/tora3/src/core/tohighlightedtext.cpp 2012-03-30 23:31:37 UTC (rev 4256) @@ -1036,7 +1036,7 @@ /// } ///} } - catch (QString e) + catch (QString const &e) { TLOG(2,toDecorator,__HERE__) << "toHighlightedText::getCompletionList:" << e << std::endl; } Modified: branches/tora3/src/core/toresultplan.cpp =================================================================== --- branches/tora3/src/core/toresultplan.cpp 2012-03-30 19:46:41 UTC (rev 4255) +++ branches/tora3/src/core/toresultplan.cpp 2012-03-30 23:31:37 UTC (rev 4256) @@ -50,6 +50,7 @@ #include "core/toeventquery.h" #include "core/tosql.h" #include "core/totool.h" +#include "core/toresultcombo.h" #include <time.h> @@ -65,45 +66,59 @@ oracleSetup(); } +static toSQL SQLVSQLChildSel("toResultPlan:VSQLChildSel", + "SELECT distinct to_char(child_number)||' ('||to_char(plan_hash_value)||')' cn_disp, child_number, sql_id, plan_hash_value\n" + "FROM V$SQL_PLAN WHERE Address||':'||Hash_Value = '%1'\n" + "ORDER BY child_number", + "Get list of child plans for cursor", + "1000"); + +static toSQL SQLVSQLChildSel9("toResultPlan:VSQLChildSel", + "SELECT distinct to_char(child_number) cn_disp, child_number, null sql_id, null plan_hash_value\n" + "FROM V$SQL_PLAN WHERE Address||':'||Hash_Value = '%1'\n" + "ORDER BY child_number", + "", + "0900"); + static toSQL SQLViewVSQLPlan("toResultPlan:ViewVSQLPlan", "SELECT ID,NVL(Parent_ID,0),Operation, Options, Object_Name, Optimizer,cost,\n" - " io_cost,Bytes,Cardinality,\n" - " partition_start,partition_stop,temp_space,time\n" - "FROM V$SQL_PLAN WHERE Address||':'||Hash_Value = '%1' and child_number = 0" - "ORDER BY NVL(Parent_ID,0),ID", + " io_cost,Bytes,Cardinality,partition_start,partition_stop,\n" + " temp_space,time,access_predicates,filter_predicates\n" + "FROM V$SQL_PLAN WHERE Address||':'||Hash_Value = '%1' and child_number = %2\n" + "ORDER BY NVL(Parent_ID,0),ID", "Get the contents of SQL plan from V$SQL_PLAN.", "1000"); static toSQL SQLViewVSQLPlan92("toResultPlan:ViewVSQLPlan", "SELECT ID,NVL(Parent_ID,0),Operation, Options, Object_Name, Optimizer,cost,\n" - " io_cost,Bytes,Cardinality,\n" - " partition_start,partition_stop,temp_space,null time\n" - "FROM V$SQL_PLAN WHERE Address||':'||Hash_Value = '%1' and child_number = 0" + " io_cost,Bytes,Cardinality,partition_start,partition_stop,\n" + " temp_space,null time,access_predicates,filter_predicates\n" + "FROM V$SQL_PLAN WHERE Address||':'||Hash_Value = '%1' and child_number = %2\n" "ORDER BY NVL(Parent_ID,0),ID", "", "0902"); static toSQL SQLViewVSQLPlan9("toResultPlan:ViewVSQLPlan", "SELECT ID,NVL(Parent_ID,0),Operation, Options, Object_Name, Optimizer,cost,\n" - " io_cost,Bytes,Cardinality,\n" - " partition_start,partition_stop,null temp_space,null time\n" - "FROM V$SQL_PLAN WHERE Address||':'||Hash_Value = '%1' and child_number = 0" + " io_cost,Bytes,Cardinality,partition_start,partition_stop,\n" + " null temp_space,null time,access_predicates,filter_predicates\n" + "FROM V$SQL_PLAN WHERE Address||':'||Hash_Value = '%1' and child_number = %2\n" "ORDER BY NVL(Parent_ID,0),ID", "", "0900"); static toSQL SQLViewPlan("toResultPlan:ViewPlan", "SELECT ID,NVL(Parent_ID,0),Operation, Options, Object_Name, Optimizer,cost,\n" - " io_cost,Bytes,Cardinality,\n" - " partition_start,partition_stop,temp_space,time\n" + " io_cost,Bytes,Cardinality,partition_start,partition_stop,\n" + " temp_space,time,access_predicates,filter_predicates\n" " FROM %1 WHERE Statement_ID = '%2' ORDER BY NVL(Parent_ID,0),ID", "Get the contents of a plan table. Observe the %1 and %2 which must be present. Must return same columns", "1000"); static toSQL SQLViewPlan8("toResultPlan:ViewPlan", "SELECT ID,NVL(Parent_ID,0),Operation, Options, Object_Name, Optimizer,cost,\n" - " io_cost,Bytes,Cardinality,\n" - " partition_start,partition_stop,' ',' '\n" + " io_cost,Bytes,Cardinality,partition_start,partition_stop,\n" + " ' ',' ',' 'access_predicates,' 'filter_predicates\n" " FROM %1 WHERE Statement_ID = '%2' ORDER BY NVL(Parent_ID,0),ID", "", "0800"); @@ -128,27 +143,24 @@ setAllColumnsShowFocus(true); setSorting( -1); setRootIsDecorated(true); - addColumn(QString::fromLatin1("#")); - addColumn(tr("Operation")); - addColumn(tr("Options")); - addColumn(tr("Object name")); - addColumn(tr("Mode")); - addColumn(tr("Cost")); - addColumn(tr("%CPU")); - addColumn(tr("Bytes")); - addColumn(tr("Rows")); - addColumn(tr("TEMP Space")); - addColumn(tr("Time")); - addColumn(tr("Startpartition")); - addColumn(tr("Endpartition")); - setColumnAlignment(5, Qt::AlignRight); - setColumnAlignment(6, Qt::AlignRight); - setColumnAlignment(7, Qt::AlignRight); - setColumnAlignment(8, Qt::AlignRight); - setColumnAlignment(9, Qt::AlignRight); - setColumnAlignment(10, Qt::AlignRight); - setColumnAlignment(11, Qt::AlignRight); - setColumnAlignment(12, Qt::AlignRight); + + QTreeWidgetItem *header = new QTreeWidgetItem(); + header->setText(0, QString::fromLatin1("#")); + header->setText(1,tr("Operation")); + header->setText(2,tr("Options")); + header->setText(3,tr("Object name")); + header->setText(4,tr("Mode")); + header->setText(5,tr("Cost")); + header->setText(6,tr("%CPU")); + header->setText(7,tr("Bytes")); + header->setText(8,tr("Rows")); + header->setText(9,tr("Time")); + header->setText(10,tr("Access pred.")); + header->setText(11,tr("Filter pred.")); + header->setText(12,tr("TEMP Space")); + header->setText(13,tr("Startpartition")); + header->setText(14,tr("Endpartition")); + setHeaderItem(header); } // Connects query signals to appropriate slots. Created just in order not to repeat code... @@ -341,20 +353,26 @@ } else if (sql.startsWith(QString::fromLatin1("SGA:"))) { - QString Address = sql.mid(4); + Ident = sql.mid(4); toConnection &conn = connection(); - toQueryParams par; - Query = new toEventQuery(conn, - //toQuery::Background, - toSQL::string(SQLViewVSQLPlan, conn).arg(Address), - par); - connectSlotsAndStart(); - Reading = true; - LastTop = NULL; + + LastTop = NULL; Parents.clear(); Last.clear(); TopItem = new toResultViewItem(this, NULL, QString::fromLatin1("V$SQL_PLAN:")); - TopItem->setText(1, Utils::toSQLString(conn, Address).left(50).trimmed()); + QString queryText = Utils::toSQLString(conn, Ident); + TopItem->setText(1, queryText.left(50).trimmed()); + TopItem->setToolTip(1, queryText); + + CursorChildSel = new toResultCombo(this, "toResultPlan"); + CursorChildSel->setSelectionPolicy(toResultCombo::First); + try + { + CursorChildSel->query(toSQL::string(SQLVSQLChildSel, conn).arg(Ident)); + } + TOCATCH; + setItemWidget(TopItem, 3, CursorChildSel); + connect(CursorChildSel, SIGNAL(done()), this, SLOT(ChildComboReady())); //Wait for cursor children combo to fill } else { @@ -393,6 +411,8 @@ QString endpartition = Query->readValue(); QString tempspace = Query->readValue().toSIsize(); QString time = Query->readValue(); + QString accesspred = Query->readValue(); + QString filterpred = Query->readValue(); toResultViewItem *item; if (!parentid.isNull() && Parents[parentid]) @@ -438,13 +458,24 @@ item->setText(3, object); item->setText(4, optimizer); item->setText(5, cost); + item->setTextAlignment (5,Qt::AlignRight); item->setText(6, cpupct); + item->setTextAlignment (6,Qt::AlignRight); item->setText(7, bytes); + item->setTextAlignment (7,Qt::AlignRight); item->setText(8, cardinality); - item->setText(9, tempspace); - item->setText(10, time); - item->setText(11, startpartition); - item->setText(12, endpartition); + item->setTextAlignment (8,Qt::AlignRight); + item->setText(9, time); + item->setText(10, accesspred); + item->setToolTip(10, accesspred); + item->setSizeHint(10, QSize(120,0)); + item->setText(11, filterpred); + item->setToolTip(11, filterpred); + item->setSizeHint(11, QSize(120,0)); + item->setText(12, tempspace); + item->setTextAlignment (12,Qt::AlignRight); + item->setText(13, startpartition); + item->setText(14, endpartition); Parents[id] = item; } expandAll(); @@ -458,6 +489,51 @@ } } +void toResultPlan::ChildComboReady() +{ + toConnection &conn = connection(); + QStringList cur_sel = CursorChildSel->itemData(0).toStringList(); + QString ChildNumber = cur_sel.at(0); + QString SInfo = QString::fromLatin1("V$SQL_PLAN: %1\nChild: %2 SQL_ID: %3").arg(cur_sel.at(2)).arg(ChildNumber).arg(cur_sel.at(1)); + TopItem->setText(0,SInfo); + connect(CursorChildSel, SIGNAL(currentIndexChanged (int) ), this, SLOT(ChildComboChanged(int))); + + toQueryParams par; + Query = new toEventQuery(conn, //toQuery::Background, + toSQL::string(SQLViewVSQLPlan, conn).arg(Ident).arg(ChildNumber), + par); + connectSlotsAndStart(); + Reading = true; +} + +void toResultPlan::ChildComboChanged(int NewIndex) +{ + if (NewIndex > -1 ) + { + toConnection &conn = connection(); + QStringList cur_sel = CursorChildSel->itemData(NewIndex).toStringList(); + QString ChildNumber = cur_sel.at(0); + QString SInfo = QString::fromLatin1("V$SQL_PLAN: %1\nChild: %2 SQL_ID: %3").arg(cur_sel.at(2)).arg(ChildNumber).arg(cur_sel.at(1)); + TopItem->setText(0,SInfo); + + /* + std::map <QString, toTreeWidgetItem *>::reverse_iterator it; + for (it=Parents.rbegin(); it!=Parents.rend(); it++) {printf("Aqq %s\n",it->first.toAscii().constData()); delete it->second;} + */ + TopItem->deleteChildren(); + LastTop = NULL; + Parents.clear(); + Last.clear(); + toQueryParams par; + Query = new toEventQuery(conn, //toQuery::Background, + toSQL::string(SQLViewVSQLPlan, conn).arg(Ident).arg(ChildNumber), + par); + connectSlotsAndStart(); + Reading = true; + } +} + + void toResultPlan::queryDone() { delete Query; @@ -478,6 +554,10 @@ connectSlotsAndStart(); Reading = true; } + else if (sql().startsWith(QString::fromLatin1("SGA:"))) + { + return; + } else { QString chkPoint(toConfigurationSingle::Instance().planCheckpoint()); Modified: branches/tora3/src/core/toresultplan.h =================================================================== --- branches/tora3/src/core/toresultplan.h 2012-03-30 19:46:41 UTC (rev 4255) +++ branches/tora3/src/core/toresultplan.h 2012-03-30 23:31:37 UTC (rev 4256) @@ -51,6 +51,7 @@ #include <stdio.h> class toEventQuery; +class toResultCombo; /** This widget displays the execution plan of a statement. The statement * is identified by the first parameter which should be the address as gotten @@ -70,6 +71,7 @@ bool Reading; // true when reading the plan, false when setting up the plan toEventQuery *Query; QString User; + toResultCombo *CursorChildSel; //Used for Oracle for V$SQL_PLAN to choose plans among cursor children void checkException(const QString &); void oracleSetup(void); @@ -89,6 +91,7 @@ /** Reimplemented for internal reasons. If you prepend "SAVED:" a saved plan is read * with the identified_by set to the string following the initial "SAVED:" string. + * If you prepend SGA: the rest is interpreted as cursor address:hash_value in V$SQL_PLAN. */ virtual void query(const QString &sql, toQueryParams const& param); /** Reimplemented for internal reasons. @@ -104,6 +107,8 @@ private slots: void poll(); void queryDone(); + void ChildComboReady(); + void ChildComboChanged(int NewIndex); }; #endif Modified: branches/tora3/src/core/toresulttableviewedit.cpp =================================================================== --- branches/tora3/src/core/toresulttableviewedit.cpp 2012-03-30 19:46:41 UTC (rev 4255) +++ branches/tora3/src/core/toresulttableviewedit.cpp 2012-03-30 23:31:37 UTC (rev 4256) @@ -80,9 +80,7 @@ { revertChanges(); - if (params.size() != 2) - ; // assume it's a refresh - else + if (params.size() == 2) { toQueryParams::const_iterator par = params.begin(); Owner = *par; Modified: branches/tora3/src/core/tosql.h =================================================================== --- branches/tora3/src/core/tosql.h 2012-03-30 19:46:41 UTC (rev 4255) +++ branches/tora3/src/core/tosql.h 2012-03-30 23:31:37 UTC (rev 4256) @@ -169,7 +169,7 @@ static bool updateSQL(const QString &name, const QString &sql, const QString &description, - const QString &ver = "8.1", + const QString &ver = "0801", const QString &provider = "Oracle", bool modified = true); @@ -302,7 +302,7 @@ toSQL(const QString &name, const QString &sql, const QString &description = "", - const QString &ver = "8.1", + const QString &ver = "0801", const QString &provider = "Oracle"); }; Modified: branches/tora3/src/core/totreewidget.cpp =================================================================== --- branches/tora3/src/core/totreewidget.cpp 2012-03-30 19:46:41 UTC (rev 4255) +++ branches/tora3/src/core/totreewidget.cpp 2012-03-30 23:31:37 UTC (rev 4256) @@ -654,7 +654,19 @@ QTreeWidgetItem::setFlags(fl); } +void toTreeWidgetItem::deleteChildren() +{ + QList<QTreeWidgetItem*> c_list = takeChildren(); + toTreeWidgetItem* it; + while (!c_list.isEmpty()) + { + it = (toTreeWidgetItem*)c_list.takeFirst(); + it->deleteChildren(); + delete it; + } +} + void toTreeWidgetItem::moveItem(toTreeWidgetItem *after) { return; // todo Modified: branches/tora3/src/core/totreewidget.h =================================================================== --- branches/tora3/src/core/totreewidget.h 2012-03-30 19:46:41 UTC (rev 4255) +++ branches/tora3/src/core/totreewidget.h 2012-03-30 23:31:37 UTC (rev 4256) @@ -765,6 +765,11 @@ * */ virtual void moveItem(toTreeWidgetItem *after); + + /** + * Delete all item children + */ + virtual void deleteChildren(); /** Modified: branches/tora3/src/tools/tosession.cpp =================================================================== --- branches/tora3/src/tools/tosession.cpp 2012-03-30 19:46:41 UTC (rev 4255) +++ branches/tora3/src/tools/tosession.cpp 2012-03-30 23:31:37 UTC (rev 4256) @@ -692,17 +692,22 @@ if (toIsOracle(connection())) { QString extra; - if (Select->currentIndex() == 0) + switch(Select->currentIndex()) + { + case 0: extra = " AND a.Type != 'BACKGROUND' AND a.Status != 'INACTIVE'\n"; - else if (Select->currentIndex() == 1) - ; // Do nothing - else if (Select->currentIndex() == 2) + break; + case 1: + break; + case 2: extra = " AND a.Type != 'BACKGROUND'\n"; - else if (Select->currentIndex() == 3) + break; + case 3: extra = " AND a.SchemaName NOT IN ('SYS','SYSTEM')\n"; - else + break; + default: extra = " AND a.SchemaName = '" + Select->currentText() + "'\n"; - + } sql = sql.arg(extra); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2012-04-20 19:01:37
|
Revision: 4269 http://tora.svn.sourceforge.net/tora/?rev=4269&view=rev Author: ibre5041 Date: 2012-04-20 19:01:30 +0000 (Fri, 20 Apr 2012) Log Message: ----------- sync with tora trunk Modified Paths: -------------- branches/tora3/src/core/tomodeleditor.cpp branches/tora3/src/docklets/toquerymodel.cpp branches/tora3/src/tools/tobrowserfilterui.ui branches/tora3/src/toreport.cpp branches/tora3/src/toreport.h Modified: branches/tora3/src/core/tomodeleditor.cpp =================================================================== --- branches/tora3/src/core/tomodeleditor.cpp 2012-04-20 18:55:22 UTC (rev 4268) +++ branches/tora3/src/core/tomodeleditor.cpp 2012-04-20 19:01:30 UTC (rev 4269) @@ -369,7 +369,7 @@ { Current = index; QVariant const &data = Model->data(Current, Qt::UserRole); - if(data.type() == QVariant::UserType) + if(data.type() == QVariant::UserType && data.canConvert<toQValue::complexType*>() ) { toQValue::complexType *i = data.value<toQValue::complexType*>(); setText(i->editData()); Modified: branches/tora3/src/docklets/toquerymodel.cpp =================================================================== --- branches/tora3/src/docklets/toquerymodel.cpp 2012-04-20 18:55:22 UTC (rev 4268) +++ branches/tora3/src/docklets/toquerymodel.cpp 2012-04-20 19:01:30 UTC (rev 4269) @@ -170,6 +170,9 @@ toDocklet::timerEvent(e); } + if( !isVisible()) + return; + if( m_currentEditor->m_current == NULL) return; Modified: branches/tora3/src/tools/tobrowserfilterui.ui =================================================================== --- branches/tora3/src/tools/tobrowserfilterui.ui 2012-04-20 18:55:22 UTC (rev 4268) +++ branches/tora3/src/tools/tobrowserfilterui.ui 2012-04-20 19:01:30 UTC (rev 4269) @@ -422,5 +422,85 @@ </hint> </hints> </connection> + <connection> + <sender>StartWith</sender> + <signal>toggled(bool)</signal> + <receiver>String</receiver> + <slot>setFocus()</slot> + <hints> + <hint type="sourcelabel"> + <x>370</x> + <y>77</y> + </hint> + <hint type="destinationlabel"> + <x>326</x> + <y>109</y> + </hint> + </hints> + </connection> + <connection> + <sender>EndWith</sender> + <signal>toggled(bool)</signal> + <receiver>String</receiver> + <slot>setFocus()</slot> + <hints> + <hint type="sourcelabel"> + <x>370</x> + <y>77</y> + </hint> + <hint type="destinationlabel"> + <x>326</x> + <y>109</y> + </hint> + </hints> + </connection> + <connection> + <sender>Contains</sender> + <signal>toggled(bool)</signal> + <receiver>String</receiver> + <slot>setFocus()</slot> + <hints> + <hint type="sourcelabel"> + <x>370</x> + <y>77</y> + </hint> + <hint type="destinationlabel"> + <x>326</x> + <y>109</y> + </hint> + </hints> + </connection> + <connection> + <sender>CommaSeparate</sender> + <signal>toggled(bool)</signal> + <receiver>String</receiver> + <slot>setFocus()</slot> + <hints> + <hint type="sourcelabel"> + <x>370</x> + <y>77</y> + </hint> + <hint type="destinationlabel"> + <x>326</x> + <y>109</y> + </hint> + </hints> + </connection> + <connection> + <sender>RegExp</sender> + <signal>toggled(bool)</signal> + <receiver>String</receiver> + <slot>setFocus()</slot> + <hints> + <hint type="sourcelabel"> + <x>370</x> + <y>77</y> + </hint> + <hint type="destinationlabel"> + <x>326</x> + <y>109</y> + </hint> + </hints> + </connection> </connections> </ui> Modified: branches/tora3/src/toreport.cpp =================================================================== --- branches/tora3/src/toreport.cpp 2012-04-20 18:55:22 UTC (rev 4268) +++ branches/tora3/src/toreport.cpp 2012-04-20 19:01:30 UTC (rev 4269) @@ -39,21 +39,17 @@ * * END_COMMON_COPYRIGHT_HEADER */ +#include "toreport.h" #include "utils.h" - #include "toconf.h" -#include "toconnection.h" + #include "tohtml.h" #include "toextract.h" -#include "toreport.h" -#include <qapplication.h> -#include <qdatetime.h> -#ifdef Q_OS_WIN32 -#include <winsock2.h> -#endif +#include <QApplication> +#include <QDateTime> +#include <QHostInfo> - static bool SameContext(const QString &str, const QString &str2) { if (str.startsWith(str2)) @@ -367,9 +363,6 @@ QString toGenerateReport(toConnection &conn, std::list<QString> &desc) { - char host[1024]; - gethostname(host, 1024); - QString db = conn.host(); if (db.length() && db != QString::fromLatin1("*")) db += QString::fromLatin1(":"); @@ -386,7 +379,7 @@ "<TR><TD VALIGN=top>On:</TD><TD VALIGN=top>%6</TD></TR>\n" "</TABLE>\n"). arg(QString::fromLatin1(TOVERSION)). - arg(QString::fromLatin1(host)). + arg(QHostInfo::localHostName()). arg(db). arg(QString(conn.provider())). arg(QString(conn.version())). Modified: branches/tora3/src/toreport.h =================================================================== --- branches/tora3/src/toreport.h 2012-04-20 18:55:22 UTC (rev 4268) +++ branches/tora3/src/toreport.h 2012-04-20 19:01:30 UTC (rev 4269) @@ -43,6 +43,7 @@ #define TOREPORT_H #include "config.h" +#include "toconnection.h" #include <list> #include <algorithm> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2012-05-03 15:26:39
|
Revision: 4299 http://tora.svn.sourceforge.net/tora/?rev=4299&view=rev Author: ibre5041 Date: 2012-05-03 15:26:23 +0000 (Thu, 03 May 2012) Log Message: ----------- astyle applied Modified Paths: -------------- branches/tora3/src/connection/tooracleconnection.cpp branches/tora3/src/connection/tooracleconnection.h branches/tora3/src/connection/tooracledatatype.h branches/tora3/src/connection/tooraclefind.cpp branches/tora3/src/connection/tooracleprovider.cpp branches/tora3/src/connection/tooraclequery.cpp branches/tora3/src/connection/tooraclequery.h branches/tora3/src/connection/tooraclesetting.cpp branches/tora3/src/connection/tooraclesetting.h branches/tora3/src/connection/tooracletraits.cpp branches/tora3/src/connection/tooracletraits.h branches/tora3/src/connection/toteradatafind.cpp branches/tora3/src/connection/toteradataprovider.cpp branches/tora3/src/connection/toteradatatraits.cpp branches/tora3/src/connection/toteradatatraits.h branches/tora3/src/core/COPYRIGHT.h branches/tora3/src/core/LICENSE.h branches/tora3/src/core/main.cpp branches/tora3/src/core/toabout.cpp branches/tora3/src/core/toabout.h branches/tora3/src/core/tobackground.cpp branches/tora3/src/core/tobackground.h branches/tora3/src/core/tobackgroundlabel.cpp branches/tora3/src/core/tobackgroundlabel.h branches/tora3/src/core/tobarchart.cpp branches/tora3/src/core/tobarchart.h branches/tora3/src/core/tocache.cpp branches/tora3/src/core/tochangeconnection.cpp branches/tora3/src/core/tochangeconnection.h branches/tora3/src/core/tocodemodel.cpp branches/tora3/src/core/tocodemodel.h branches/tora3/src/core/toconfiguration.cpp branches/tora3/src/core/toconfiguration.h branches/tora3/src/core/toconnection.cpp branches/tora3/src/core/toconnection.h branches/tora3/src/core/toconnectionimport.cpp branches/tora3/src/core/toconnectionimport.h branches/tora3/src/core/toconnectionmodel.cpp branches/tora3/src/core/toconnectionmodel.h branches/tora3/src/core/toconnectionprovider.cpp branches/tora3/src/core/toconnectionprovider.h branches/tora3/src/core/toconnectionsub.cpp branches/tora3/src/core/toconnectionsub.h branches/tora3/src/core/toconnectionsubloan.cpp branches/tora3/src/core/toconnectionsubloan.h branches/tora3/src/core/toconnectiontraits.h branches/tora3/src/core/todatatype.cpp branches/tora3/src/core/todatatype.h branches/tora3/src/core/todefaultkeywords.h branches/tora3/src/core/todescribe.cpp branches/tora3/src/core/todescribe.h branches/tora3/src/core/todockbar.cpp branches/tora3/src/core/todockbar.h branches/tora3/src/core/todocklet.cpp branches/tora3/src/core/todocklet.h branches/tora3/src/core/toeditablemenu.cpp branches/tora3/src/core/toeditablemenu.h branches/tora3/src/core/toeditwidget.cpp branches/tora3/src/core/toeditwidget.h branches/tora3/src/core/toeventquery.cpp branches/tora3/src/core/toeventquery.h branches/tora3/src/core/toeventquerytask.cpp branches/tora3/src/core/toeventquerytask.h branches/tora3/src/core/toextract.cpp branches/tora3/src/core/toextract.h branches/tora3/src/core/toglobalsetting.cpp branches/tora3/src/core/toglobalsetting.h branches/tora3/src/core/tohelp.cpp branches/tora3/src/core/tohelpsetup.cpp branches/tora3/src/core/tohelpsetup.h branches/tora3/src/core/tohighlightedtext.cpp branches/tora3/src/core/tohighlightedtext.h branches/tora3/src/core/tohtml.cpp branches/tora3/src/core/tohtml.h branches/tora3/src/core/tolinechart.cpp branches/tora3/src/core/tolinechart.h branches/tora3/src/core/tolistviewformatter.cpp branches/tora3/src/core/tolistviewformattercsv.cpp branches/tora3/src/core/tolistviewformattercsv.h branches/tora3/src/core/tolistviewformatterfactory.h branches/tora3/src/core/tolistviewformatterhtml.cpp branches/tora3/src/core/tolistviewformatterhtml.h branches/tora3/src/core/tolistviewformatteridentifier.h branches/tora3/src/core/tolistviewformattersql.h branches/tora3/src/core/tolistviewformattertabdel.cpp branches/tora3/src/core/tolistviewformattertabdel.h branches/tora3/src/core/tolistviewformattertext.cpp branches/tora3/src/core/tolistviewformattertext.h branches/tora3/src/core/tologger.h branches/tora3/src/core/tomain.cpp branches/tora3/src/core/tomain.h branches/tora3/src/core/tomainwindow.cpp branches/tora3/src/core/tomainwindow.h branches/tora3/src/core/tomarkedtext.cpp branches/tora3/src/core/tomarkedtext.h branches/tora3/src/core/tomemoeditor.cpp branches/tora3/src/core/tomemoeditor.h branches/tora3/src/core/tomessage.cpp branches/tora3/src/core/tomessage.h branches/tora3/src/core/tomodeleditor.cpp branches/tora3/src/core/tomodeleditor.h branches/tora3/src/core/tonewconnection.cpp branches/tora3/src/core/tonewconnection.h branches/tora3/src/core/toparamget.cpp branches/tora3/src/core/toparamget.h branches/tora3/src/core/topiechart.cpp branches/tora3/src/core/topiechart.h branches/tora3/src/core/topreferences.cpp branches/tora3/src/core/topreferences.h branches/tora3/src/core/topushbutton.cpp branches/tora3/src/core/topushbutton.h branches/tora3/src/core/toquery.cpp branches/tora3/src/core/toquery.h branches/tora3/src/core/toqvalue.cpp branches/tora3/src/core/toqvalue.h branches/tora3/src/core/tora_export.h branches/tora3/src/core/toraversion.h branches/tora3/src/core/toresult.cpp branches/tora3/src/core/toresult.h branches/tora3/src/core/toresultbar.cpp branches/tora3/src/core/toresultbar.h branches/tora3/src/core/toresultcols.cpp branches/tora3/src/core/toresultcols.h branches/tora3/src/core/toresultcolscomment.cpp branches/tora3/src/core/toresultcolscomment.h branches/tora3/src/core/toresultcombo.cpp branches/tora3/src/core/toresultcombo.h branches/tora3/src/core/toresultdata.cpp branches/tora3/src/core/toresultdata.h branches/tora3/src/core/toresultdatasingle.cpp branches/tora3/src/core/toresultdatasingle.h branches/tora3/src/core/toresultdepend.cpp branches/tora3/src/core/toresultdepend.h branches/tora3/src/core/toresultextract.cpp branches/tora3/src/core/toresultextract.h branches/tora3/src/core/toresultfield.cpp branches/tora3/src/core/toresultfield.h branches/tora3/src/core/toresultgrants.cpp branches/tora3/src/core/toresultgrants.h branches/tora3/src/core/toresultitem.cpp branches/tora3/src/core/toresultitem.h branches/tora3/src/core/toresultlistformat.cpp branches/tora3/src/core/toresultlistformat.h branches/tora3/src/core/toresultlong.cpp branches/tora3/src/core/toresultlong.h branches/tora3/src/core/toresultmodel.cpp branches/tora3/src/core/toresultmodel.h branches/tora3/src/core/toresultplan.cpp branches/tora3/src/core/toresultplan.h branches/tora3/src/core/toresultresources.h branches/tora3/src/core/toresultschema.cpp branches/tora3/src/core/toresultschema.h branches/tora3/src/core/toresultstats.cpp branches/tora3/src/core/toresultstats.h branches/tora3/src/core/toresulttableview.cpp branches/tora3/src/core/toresulttableview.h branches/tora3/src/core/toresulttableviewedit.cpp branches/tora3/src/core/toresulttableviewedit.h branches/tora3/src/core/toresultview.cpp branches/tora3/src/core/toresultview.h branches/tora3/src/core/torunnable.cpp branches/tora3/src/core/torunnable.h branches/tora3/src/core/tosearchreplace.cpp branches/tora3/src/core/tosearchreplace.h branches/tora3/src/core/tosplash.cpp branches/tora3/src/core/tosplash.h branches/tora3/src/core/tosql.cpp branches/tora3/src/core/tosql.h branches/tora3/src/core/tosqlparse.cpp branches/tora3/src/core/tosqlparse.h branches/tora3/src/core/tosyntaxsetup.cpp branches/tora3/src/core/tosyntaxsetup.h branches/tora3/src/core/totableselect.cpp branches/tora3/src/core/totabwidget.cpp branches/tora3/src/core/totabwidget.h branches/tora3/src/core/totaskrunner.cpp branches/tora3/src/core/totaskrunner.h branches/tora3/src/core/tothread.cpp branches/tora3/src/core/tothread.h branches/tora3/src/core/totimer.cpp branches/tora3/src/core/totool.cpp branches/tora3/src/core/totool.h branches/tora3/src/core/totreewidget.cpp branches/tora3/src/core/totreewidget.h branches/tora3/src/core/tovisualize.cpp branches/tora3/src/core/tovisualize.h branches/tora3/src/core/toworkingwidget.cpp branches/tora3/src/core/toworkingwidget.h branches/tora3/src/core/utils.cpp branches/tora3/src/core/utils.h branches/tora3/src/db2/db2connectionsub.cpp branches/tora3/src/db2/db2connectionsub.h branches/tora3/src/db2/db2provider.cpp branches/tora3/src/db2/db2provider.h branches/tora3/src/db2/db2query.cpp branches/tora3/src/db2/db2query.h branches/tora3/src/db2/todb2connection.cpp branches/tora3/src/db2/todb2connection.h branches/tora3/src/docklets/toastwalk.cpp branches/tora3/src/docklets/toastwalk.h branches/tora3/src/docklets/tocodeoutline.cpp branches/tora3/src/docklets/tocodeoutline.h branches/tora3/src/docklets/tologging.cpp branches/tora3/src/docklets/tologging.h branches/tora3/src/docklets/toquerymodel.cpp branches/tora3/src/docklets/toquerymodel.h branches/tora3/src/docklets/toviewconnections.cpp branches/tora3/src/docklets/toviewconnections.h branches/tora3/src/docklets/toviewdirectory.cpp branches/tora3/src/docklets/toviewdirectory.h branches/tora3/src/migratetool/sqldeveloper.cpp branches/tora3/src/migratetool/sqldeveloper.h branches/tora3/src/migratetool/squirrelsql.cpp branches/tora3/src/migratetool/squirrelsql.h branches/tora3/src/migratetool/tora3.cpp branches/tora3/src/migratetool/tora3.h branches/tora3/src/parsing/error_handler.c branches/tora3/src/parsing/error_handler.h branches/tora3/src/parsing/macros.h branches/tora3/src/parsing/tplsqlparseoracle.cpp branches/tora3/src/parsing/tsqllexer.h branches/tora3/src/parsing/tsqllexeroracle.cpp branches/tora3/src/parsing/tsqlparse.cpp branches/tora3/src/parsing/tsqlparse.h branches/tora3/src/parsing/tsqlparseoracle.cpp branches/tora3/src/shortcuteditor/shortcuteditordialog.cpp branches/tora3/src/shortcuteditor/shortcuteditordialog.h branches/tora3/src/shortcuteditor/shortcutmodel.cpp branches/tora3/src/shortcuteditor/shortcutmodel.h branches/tora3/src/toalert.cpp branches/tora3/src/toalert.h branches/tora3/src/toawr.cpp branches/tora3/src/toawr.h branches/tora3/src/tobackup.cpp branches/tora3/src/tobackup.h branches/tora3/src/tocache.cpp branches/tora3/src/tocachenew.h branches/tora3/src/tochartmanager.cpp branches/tora3/src/tochartmanager.h branches/tora3/src/toconnection.cpp branches/tora3/src/toconnection.h branches/tora3/src/toconnectionpool.cpp branches/tora3/src/toconnectionpool.h branches/tora3/src/todebug.cpp branches/tora3/src/todebugtext.cpp branches/tora3/src/todebugtext.h branches/tora3/src/toeditextensions.cpp branches/tora3/src/toeditextensions.h branches/tora3/src/toextratranslations.cpp branches/tora3/src/toinvalid.cpp branches/tora3/src/toinvalid.h branches/tora3/src/tolegendchart.cpp branches/tora3/src/tolegendchart.h branches/tora3/src/tomysqlkeywords.h branches/tora3/src/toociwrapper.h branches/tora3/src/tools/toanalyze.cpp branches/tora3/src/tools/toanalyze.h branches/tora3/src/tools/tobrowser.cpp branches/tora3/src/tools/tobrowser.h branches/tora3/src/tools/tobrowseraccesswidget.cpp branches/tora3/src/tools/tobrowseraccesswidget.h branches/tora3/src/tools/tobrowserbasewidget.cpp branches/tora3/src/tools/tobrowserbasewidget.h branches/tora3/src/tools/tobrowsercodewidget.cpp branches/tora3/src/tools/tobrowsercodewidget.h branches/tora3/src/tools/tobrowserconstraint.cpp branches/tora3/src/tools/tobrowserconstraint.h branches/tora3/src/tools/tobrowserdblinkswidget.cpp branches/tora3/src/tools/tobrowserdblinkswidget.h branches/tora3/src/tools/tobrowserdirectorieswidget.cpp branches/tora3/src/tools/tobrowserdirectorieswidget.h branches/tora3/src/tools/tobrowserindex.cpp branches/tora3/src/tools/tobrowserindex.h branches/tora3/src/tools/tobrowserindexwidget.cpp branches/tora3/src/tools/tobrowserindexwidget.h branches/tora3/src/tools/tobrowserschemawidget.cpp branches/tora3/src/tools/tobrowserschemawidget.h branches/tora3/src/tools/tobrowsersequencewidget.cpp branches/tora3/src/tools/tobrowsersequencewidget.h branches/tora3/src/tools/tobrowsersynonymwidget.cpp branches/tora3/src/tools/tobrowsersynonymwidget.h branches/tora3/src/tools/tobrowsertable.cpp branches/tora3/src/tools/tobrowsertable.h branches/tora3/src/tools/tobrowsertablewidget.cpp branches/tora3/src/tools/tobrowsertablewidget.h branches/tora3/src/tools/tobrowsertriggerwidget.cpp branches/tora3/src/tools/tobrowsertriggerwidget.h branches/tora3/src/tools/tobrowserviewwidget.cpp branches/tora3/src/tools/tocurrent.cpp branches/tora3/src/tools/tocurrent.h branches/tora3/src/tools/tofilesize.cpp branches/tora3/src/tools/tofilesize.h branches/tora3/src/tools/tooutput.cpp branches/tora3/src/tools/tooutput.h branches/tora3/src/tools/toresultstorage.cpp branches/tora3/src/tools/toresultstorage.h branches/tora3/src/tools/tosession.cpp branches/tora3/src/tools/tosession.h branches/tora3/src/tools/tosgastatement.cpp branches/tora3/src/tools/tosgastatement.h branches/tora3/src/tools/tosgatrace.cpp branches/tora3/src/tools/tosgatrace.h branches/tora3/src/tools/tostorage.cpp branches/tora3/src/tools/tostorage.h branches/tora3/src/tools/tostoragedefinition.cpp branches/tora3/src/tools/tostoragedefinition.h branches/tora3/src/tools/toworksheet.cpp branches/tora3/src/tools/toworksheet.h branches/tora3/src/tools/toworksheetstatistic.cpp branches/tora3/src/tools/toworksheetstatistic.h branches/tora3/src/tools/toworksheettext.cpp branches/tora3/src/tools/toworksheettext.h branches/tora3/src/tools/toworksheetwidget.cpp branches/tora3/src/tools/toworksheetwidget.h branches/tora3/src/tooracleconnection.cpp branches/tora3/src/tooracleconnection_trotl.cpp branches/tora3/src/tooracleextract.cpp branches/tora3/src/tooracleextract.h branches/tora3/src/tooraclepreload.cpp branches/tora3/src/topassword.cpp branches/tora3/src/toplsqleditor.cpp branches/tora3/src/toplsqltext.cpp branches/tora3/src/toprofiler.cpp branches/tora3/src/toprofiler.h branches/tora3/src/toproject.cpp branches/tora3/src/toproject.h branches/tora3/src/toqsqlconnection.cpp branches/tora3/src/tora.rc branches/tora3/src/toreport.cpp branches/tora3/src/toreport.h branches/tora3/src/toresultlabel.cpp branches/tora3/src/toresultlabel.h branches/tora3/src/toresultline.cpp branches/tora3/src/toresultline.h branches/tora3/src/toresultlock.cpp branches/tora3/src/toresultlock.h branches/tora3/src/toresultparam.cpp branches/tora3/src/toresultparam.h branches/tora3/src/toresultpie.cpp branches/tora3/src/toresultpie.h branches/tora3/src/torollback.cpp branches/tora3/src/torollback.h branches/tora3/src/toscript.cpp branches/tora3/src/toscript.h branches/tora3/src/toscriptschemawidget.cpp branches/tora3/src/toscriptschemawidget.h branches/tora3/src/toscripttreeitem.cpp branches/tora3/src/toscripttreeitem.h branches/tora3/src/toscripttreemodel.cpp branches/tora3/src/toscripttreemodel.h branches/tora3/src/tosecurity.cpp branches/tora3/src/tosecurity.h branches/tora3/src/tosecuritytreeitem.cpp branches/tora3/src/tosecuritytreeitem.h branches/tora3/src/tosecuritytreemodel.cpp branches/tora3/src/tosecuritytreemodel.h branches/tora3/src/tosmtp.cpp branches/tora3/src/tosmtp.h branches/tora3/src/tosqledit.cpp branches/tora3/src/tosqledit.h branches/tora3/src/totemplate.cpp branches/tora3/src/totemplate.h branches/tora3/src/totemplateprovider.cpp branches/tora3/src/totemporary.cpp branches/tora3/src/totemporary.h branches/tora3/src/totextview.cpp branches/tora3/src/totextview.h branches/tora3/src/totuning.cpp branches/tora3/src/totuning.h branches/tora3/src/tounittest.cpp branches/tora3/src/tounittest.h branches/tora3/src/towaitevents.cpp branches/tora3/src/towaitevents.h branches/tora3/src/ts_log/critical_section.h branches/tora3/src/ts_log/decorator.h branches/tora3/src/ts_log/message_handler_log.h branches/tora3/src/ts_log/thread_safe_log.h branches/tora3/src/ts_log/toostream.h branches/tora3/src/ts_log/ts_log_utils.h branches/tora3/src/windows/config.h Property Changed: ---------------- branches/tora3/src/parsing/OraclePLSQLLexer.c branches/tora3/src/parsing/OraclePLSQLLexer.h branches/tora3/src/parsing/OraclePLSQLParser.c branches/tora3/src/parsing/OraclePLSQLParser.h branches/tora3/src/parsing/OracleSQLLexer.c branches/tora3/src/parsing/OracleSQLLexer.h branches/tora3/src/parsing/OracleSQLParser.c branches/tora3/src/parsing/OracleSQLParser.h branches/tora3/src/parsing/error_handler.c branches/tora3/src/parsing/error_handler.h branches/tora3/src/parsing/macros.h branches/tora3/src/parsing/tsqllexer.h branches/tora3/src/parsing/tsqlparse.h branches/tora3/src/parsing/tsqlparser_export.h Modified: branches/tora3/src/connection/tooracleconnection.cpp =================================================================== --- branches/tora3/src/connection/tooracleconnection.cpp 2012-05-03 15:11:44 UTC (rev 4298) +++ branches/tora3/src/connection/tooracleconnection.cpp 2012-05-03 15:26:23 UTC (rev 4299) @@ -1,39 +1,39 @@ /* 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. - * + * these libraries. + * * You may link this product with any GPL'd Qt library. - * + * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ @@ -63,206 +63,208 @@ void ThrowException(const ::trotl::OciException &exc) { - TLOG(5,toDecorator,__HERE__) - << "Exception thrown, what:" << exc.what() << std::endl - << exc.get_sql() << std::endl - << "--------------------------------------------------------------------------------" - << std::endl; - - toConnection::exception ret(QString::fromUtf8(exc.get_mesg())); - throw ret; + TLOG(5, toDecorator, __HERE__) + << "Exception thrown, what:" << exc.what() << std::endl + << exc.get_sql() << std::endl + << "--------------------------------------------------------------------------------" + << std::endl; + + toConnection::exception ret(QString::fromUtf8(exc.get_mesg())); + throw ret; } toOracleConnectionImpl::toOracleConnectionImpl(toConnection &conn, ::trotl::OciEnv &env) - : toConnection::connectionImpl(conn) - , _env(env) + : toConnection::connectionImpl(conn) + , _env(env) { } toConnectionSub* toOracleConnectionImpl::createConnection(void) { - ::trotl::OciConnection *conn = NULL; - ::trotl::OciLogin *login = NULL; - QString oldSid; + ::trotl::OciConnection *conn = NULL; + ::trotl::OciLogin *login = NULL; + QString oldSid; - QSet<QString> options = connection().options(); + QSet<QString> options = connection().options(); - bool sqlNet = (options.find("SQL*Net") != options.end()); - if (!sqlNet) - { - oldSid = getenv("ORACLE_SID"); - Utils::toSetEnv("ORACLE_SID", connection().database()); - } - try - { - int session_mode = OCI_DEFAULT; - if (options.find("SYS_OPER") != options.end()) - session_mode = OCI_SYSOPER; - else if (options.find("SYS_DBA") != options.end()) - session_mode = OCI_SYSDBA; - else if (options.find("SYS_ASM") != options.end()) - session_mode = OCI_SYSASM; + bool sqlNet = (options.find("SQL*Net") != options.end()); + if (!sqlNet) + { + oldSid = getenv("ORACLE_SID"); + Utils::toSetEnv("ORACLE_SID", connection().database()); + } + try + { + int session_mode = OCI_DEFAULT; + if (options.find("SYS_OPER") != options.end()) + session_mode = OCI_SYSOPER; + else if (options.find("SYS_DBA") != options.end()) + session_mode = OCI_SYSDBA; + else if (options.find("SYS_ASM") != options.end()) + session_mode = OCI_SYSASM; - do - { - /* TODO - if (!sqlNet) - conn->server_attach(); - else - */ - QString user = connection().user(); - QString pass = connection().password(); + do + { + /* TODO + if (!sqlNet) + conn->server_attach(); + else + */ + QString user = connection().user(); + QString pass = connection().password(); - try - { - // TODO what does _login destructor? and where is it? - /*::trotl::OciLogin */ login = new ::trotl::OciLogin(_env, - ::trotl::LoginPara( - user.isEmpty() ? "" : user.toUtf8().constData(), - pass.isEmpty() ? "" : pass.toUtf8().constData(), - connection().database().toUtf8().constData() - ), - (ub4) session_mode); - conn = new ::trotl::OciConnection(_env, *login); + try + { + // TODO what does _login destructor? and where is it? + /*::trotl::OciLogin */ login = new ::trotl::OciLogin(_env, + ::trotl::LoginPara( + user.isEmpty() ? "" : user.toUtf8().constData(), + pass.isEmpty() ? "" : pass.toUtf8().constData(), + connection().database().toUtf8().constData() + ), + (ub4) session_mode); + conn = new ::trotl::OciConnection(_env, *login); - TLOG(5,toDecorator,__HERE__) << "Oracle database version: " - << ::std::hex << ::std::showbase << ::std::setw(10) - << ::std::setfill('0') << ::std::internal - << login->_server._version << ::std::endl - << login->_server._version_string << ::std::endl - << login->_server.versionNumber() << "." - << login->_server.releaseNumber() << "." - << login->_server.updateNumber() << "." - << login->_server.portReleaseNumber() << "." - << login->_server.portUpdateNumber() - << ::std::dec << ::std::endl; - } - catch (const ::trotl::OciException &exc) - { - TLOG(5,toDecorator,__HERE__) << "TODO: catch" << std::endl << __HERE__ << std::endl; - - if (toThread::mainThread() && exc.get_code() == 28001) - { - bool ok = false; - QString newpass = QInputDialog::getText( - toMainWidget(), - qApp->translate("toOracleConnection", "Password expired"), - qApp->translate("toOracleConnection", "Enter new password"), - QLineEdit::Password, - QString::null, - &ok); - if (!ok) - throw exc; - - QString newpass2 = QInputDialog::getText( - toMainWidget(), - qApp->translate("toOracleConnection", "Password expired"), - qApp->translate("toOracleConnection", "Enter password again for confirmation"), - QLineEdit::Password, - QString::null, - &ok); - - if (!ok) - throw exc; - - if (newpass2 != newpass) - throw qApp->translate("toOracleConnection", "The two passwords doesn't match"); - QString nputf = newpass; - if( login ) delete login; - login = new ::trotl::OciLogin(_env, - ::trotl::LoginAndPChangePara( - user.isEmpty() ? "" : user.toUtf8().constData(), - pass.isEmpty() ? "" : pass.toUtf8().constData(), - newpass.isEmpty() ? "" : newpass.toUtf8().constData(), - connection().database().toUtf8().constData() - ), - (ub4) session_mode); - conn = new ::trotl::OciConnection(_env, *login); - - connection().setPassword(newpass); - } else { - throw exc; - } // (toThread::mainThread() && exc.get_code() == 28001) - } // catch (const ::trotl::OciException &exc) - } - while (!conn); - } - catch (const ::trotl::OciException &exc) - { - if (!sqlNet) - { - if (oldSid.isNull()) - Utils::toUnSetEnv("ORACLE_SID"); - else - Utils::toSetEnv("ORACLE_SID", oldSid.toLatin1()); - } - delete conn; - ThrowException(exc); - } - if (!sqlNet) - { - if (oldSid.isNull()) - Utils::toUnSetEnv("ORACLE_SID"); - else - { - Utils::toSetEnv("ORACLE_SID", oldSid.toLatin1()); - } - } + TLOG(5, toDecorator, __HERE__) << "Oracle database version: " + << ::std::hex << ::std::showbase << ::std::setw(10) + << ::std::setfill('0') << ::std::internal + << login->_server._version << ::std::endl + << login->_server._version_string << ::std::endl + << login->_server.versionNumber() << "." + << login->_server.releaseNumber() << "." + << login->_server.updateNumber() << "." + << login->_server.portReleaseNumber() << "." + << login->_server.portUpdateNumber() + << ::std::dec << ::std::endl; + } + catch (const ::trotl::OciException &exc) + { + TLOG(5, toDecorator, __HERE__) << "TODO: catch" << std::endl << __HERE__ << std::endl; - try - { - QString str = QString::fromLatin1("ALTER SESSION SET NLS_DATE_FORMAT = '"); - str += toConfigurationSingle::Instance().dateFormat(); - str += QString::fromLatin1("'"); - ////query oracleQuery::trotlQuery date(*conn, ::std::string(str.toAscii().constData())); - } - catch (...) - { - TLOG(5,toDecorator,__HERE__) - << "Failed to set new default date format for session: " - << toConfigurationSingle::Instance().dateFormat() - << std::endl; - Utils::toStatusMessage(QObject::tr("Failed to set new default date format for session: %1") - .arg(toConfigurationSingle::Instance().dateFormat())); - } + if (toThread::mainThread() && exc.get_code() == 28001) + { + bool ok = false; + QString newpass = QInputDialog::getText( + toMainWidget(), + qApp->translate("toOracleConnection", "Password expired"), + qApp->translate("toOracleConnection", "Enter new password"), + QLineEdit::Password, + QString::null, + &ok); + if (!ok) + throw exc; - try - { - QString str = QString::fromLatin1("ALTER SESSION SET NLS_TIMESTAMP_FORMAT = '"); - str += toConfigurationSingle::Instance().timestampFormat(); - str += QString::fromLatin1("'"); - ////query oracleQuery::trotlQuery timestmp(*conn, ::std::string(str.toAscii().constData())); - } - catch (...) - { - TLOG(5,toDecorator,__HERE__) - << "Failed to set new default timestmp format for session: " - << toConfigurationSingle::Instance().timestampFormat() - << std::endl; - Utils::toStatusMessage(QObject::tr("Failed to set new default timestamp format for session: %1") - .arg(toConfigurationSingle::Instance().timestampFormat())); - } + QString newpass2 = QInputDialog::getText( + toMainWidget(), + qApp->translate("toOracleConnection", "Password expired"), + qApp->translate("toOracleConnection", "Enter password again for confirmation"), + QLineEdit::Password, + QString::null, + &ok); - try - { - //query oracleQuery::trotlQuery info(*conn, std::string( - // "BEGIN\n" - // " SYS.DBMS_APPLICATION_INFO.SET_CLIENT_INFO('" TOAPPNAME - // " (http://tora.sf.net)" - // "');\n" - // " SYS.DBMS_APPLICATION_INFO.SET_MODULE('" TOAPPNAME "','Access Database');\n" - // "END;")); - } - catch (::trotl::OciException const& e) - { - TLOG(5,toDecorator,__HERE__) << "Failed to set client info for session:\n" << e.what(); - } - catch (...) - { - TLOG(5,toDecorator,__HERE__) << "Failed to set client info for session\n"; - } + if (!ok) + throw exc; - return new toOracleConnectionSub(conn, login); + if (newpass2 != newpass) + throw qApp->translate("toOracleConnection", "The two passwords doesn't match"); + QString nputf = newpass; + if( login ) delete login; + login = new ::trotl::OciLogin(_env, + ::trotl::LoginAndPChangePara( + user.isEmpty() ? "" : user.toUtf8().constData(), + pass.isEmpty() ? "" : pass.toUtf8().constData(), + newpass.isEmpty() ? "" : newpass.toUtf8().constData(), + connection().database().toUtf8().constData() + ), + (ub4) session_mode); + conn = new ::trotl::OciConnection(_env, *login); + + connection().setPassword(newpass); + } + else + { + throw exc; + } // (toThread::mainThread() && exc.get_code() == 28001) + } // catch (const ::trotl::OciException &exc) + } + while (!conn); + } + catch (const ::trotl::OciException &exc) + { + if (!sqlNet) + { + if (oldSid.isNull()) + Utils::toUnSetEnv("ORACLE_SID"); + else + Utils::toSetEnv("ORACLE_SID", oldSid.toLatin1()); + } + delete conn; + ThrowException(exc); + } + if (!sqlNet) + { + if (oldSid.isNull()) + Utils::toUnSetEnv("ORACLE_SID"); + else + { + Utils::toSetEnv("ORACLE_SID", oldSid.toLatin1()); + } + } + + try + { + QString str = QString::fromLatin1("ALTER SESSION SET NLS_DATE_FORMAT = '"); + str += toConfigurationSingle::Instance().dateFormat(); + str += QString::fromLatin1("'"); + ////query oracleQuery::trotlQuery date(*conn, ::std::string(str.toAscii().constData())); + } + catch (...) + { + TLOG(5, toDecorator, __HERE__) + << "Failed to set new default date format for session: " + << toConfigurationSingle::Instance().dateFormat() + << std::endl; + Utils::toStatusMessage(QObject::tr("Failed to set new default date format for session: %1") + .arg(toConfigurationSingle::Instance().dateFormat())); + } + + try + { + QString str = QString::fromLatin1("ALTER SESSION SET NLS_TIMESTAMP_FORMAT = '"); + str += toConfigurationSingle::Instance().timestampFormat(); + str += QString::fromLatin1("'"); + ////query oracleQuery::trotlQuery timestmp(*conn, ::std::string(str.toAscii().constData())); + } + catch (...) + { + TLOG(5, toDecorator, __HERE__) + << "Failed to set new default timestmp format for session: " + << toConfigurationSingle::Instance().timestampFormat() + << std::endl; + Utils::toStatusMessage(QObject::tr("Failed to set new default timestamp format for session: %1") + .arg(toConfigurationSingle::Instance().timestampFormat())); + } + + try + { + //query oracleQuery::trotlQuery info(*conn, std::string( + // "BEGIN\n" + // " SYS.DBMS_APPLICATION_INFO.SET_CLIENT_INFO('" TOAPPNAME + // " (http://tora.sf.net)" + // "');\n" + // " SYS.DBMS_APPLICATION_INFO.SET_MODULE('" TOAPPNAME "','Access Database');\n" + // "END;")); + } + catch (::trotl::OciException const& e) + { + TLOG(5, toDecorator, __HERE__) << "Failed to set client info for session:\n" << e.what(); + } + catch (...) + { + TLOG(5, toDecorator, __HERE__) << "Failed to set client info for session\n"; + } + + return new toOracleConnectionSub(conn, login); } void toOracleConnectionImpl::closeConnection(toConnectionSub *) @@ -270,8 +272,8 @@ } toOracleConnectionSub::toOracleConnectionSub(::trotl::OciConnection *conn, ::trotl::OciLogin *login) - : _conn(conn) - , _login(login) + : _conn(conn) + , _login(login) { } @@ -285,15 +287,15 @@ void toOracleConnectionSub::commit() { - throw toConnection::exception("void toOracleConnectionSub::commit Not implemented yet"); + throw toConnection::exception("void toOracleConnectionSub::commit Not implemented yet"); } void toOracleConnectionSub::rollback() { - throw toConnection::exception("void toOracleConnectionSub::rollback Not implemented yet"); + throw toConnection::exception("void toOracleConnectionSub::rollback Not implemented yet"); } queryImpl * toOracleConnectionSub::createQuery(toQuery *query) { - return new oracleQuery(query, this); + return new oracleQuery(query, this); } Modified: branches/tora3/src/connection/tooracleconnection.h =================================================================== --- branches/tora3/src/connection/tooracleconnection.h 2012-05-03 15:11:44 UTC (rev 4298) +++ branches/tora3/src/connection/tooracleconnection.h 2012-05-03 15:26:23 UTC (rev 4299) @@ -1,39 +1,39 @@ /* 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. - * + * these libraries. + * * You may link this product with any GPL'd Qt library. - * + * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ @@ -54,49 +54,50 @@ class toOracleProvider; -namespace trotl { - struct OciEnv; - struct OciConnection; - struct OciLogin; - struct OciException; +namespace trotl +{ +struct OciEnv; +struct OciConnection; +struct OciLogin; +struct OciException; }; -/** re-throw an exception while converting it from @ref trotl::OciException +/** re-throw an exception while converting it from @ref trotl::OciException * into @ref toConnection::exception */ void ThrowException(const ::trotl::OciException &exc); class toOracleConnectionImpl: public toConnection::connectionImpl { - friend class toOracleProvider; - typedef toConnection::connectionImpl super; + friend class toOracleProvider; + typedef toConnection::connectionImpl super; protected: - toOracleConnectionImpl(toConnection &conn, ::trotl::OciEnv &env); + toOracleConnectionImpl(toConnection &conn, ::trotl::OciEnv &env); public: - /** Create a new connection to the database. */ - virtual toConnectionSub *createConnection(void); + /** Create a new connection to the database. */ + virtual toConnectionSub *createConnection(void); - /** Close a connection to the database. */ - virtual void closeConnection(toConnectionSub *); + /** Close a connection to the database. */ + virtual void closeConnection(toConnectionSub *); - ::trotl::OciEnv &_env; + ::trotl::OciEnv &_env; }; class toOracleConnectionSub: public toConnectionSub { - friend class oracleQuery; + friend class oracleQuery; public: - toOracleConnectionSub(::trotl::OciConnection *, ::trotl::OciLogin *); + toOracleConnectionSub(::trotl::OciConnection *, ::trotl::OciLogin *); - virtual ~toOracleConnectionSub(); - virtual void close(); - virtual void commit(); - virtual void rollback(); - virtual queryImpl* createQuery(toQuery *query); - + virtual ~toOracleConnectionSub(); + virtual void close(); + virtual void commit(); + virtual void rollback(); + virtual queryImpl* createQuery(toQuery *query); + private: - ::trotl::OciConnection *_conn; - ::trotl::OciLogin *_login; + ::trotl::OciConnection *_conn; + ::trotl::OciLogin *_login; }; Modified: branches/tora3/src/connection/tooracledatatype.h =================================================================== --- branches/tora3/src/connection/tooracledatatype.h 2012-05-03 15:11:44 UTC (rev 4298) +++ branches/tora3/src/connection/tooracledatatype.h 2012-05-03 15:26:23 UTC (rev 4299) @@ -55,367 +55,371 @@ class toOracleClob: public toQValue::complexType { public: - toOracleClob(trotl::OciConnection &_conn) - : toQValue::complexType() - , _data(_conn) - , _length(0) - , _displayData() - {}; - /* virtual */ bool isBinary() const - { - return false; - } - /* virtual */ bool isLarge() const - { - return true; - } + toOracleClob(trotl::OciConnection &_conn) + : toQValue::complexType() + , _data(_conn) + , _length(0) + , _displayData() + {}; + /* virtual */ + bool isBinary() const + { + return false; + } + /* virtual */ bool isLarge() const + { + return true; + } - /* virtual */ QString displayData() const throw() - { - if(!_displayData.isEmpty()) - return _displayData; - ::trotl::SqlOpenLob clob_open(_data, OCI_LOB_READONLY); - char buffer[MAXLOBSHOWN]; - oraub8 chars_read = 0; - unsigned bytes_read = _data.read(&buffer[0], sizeof(buffer), 1, sizeof(buffer), &chars_read); + /* virtual */ QString displayData() const throw() + { + if(!_displayData.isEmpty()) + return _displayData; + ::trotl::SqlOpenLob clob_open(_data, OCI_LOB_READONLY); + char buffer[MAXLOBSHOWN]; + oraub8 chars_read = 0; + unsigned bytes_read = _data.read(&buffer[0], sizeof(buffer), 1, sizeof(buffer), &chars_read); - TLOG(4,toDecorator,__HERE__) << "Just read CLOB: \"" << buffer << "\"" << std::endl; + TLOG(4, toDecorator, __HERE__) << "Just read CLOB: \"" << buffer << "\"" << std::endl; - QString _displayData = QString("{clob}"); - _displayData += QString::fromUtf8(buffer, bytes_read); - if(chars_read != _data.length()) - _displayData += "...<truncated>"; - return _displayData; - } - - /* virtual */ QString editData() const throw() - { - ::trotl::SqlOpenLob clob_open(_data, OCI_LOB_READONLY); - QString retval = QString("Datatype: Oracle [N]CLOB\nSize: %1 Chars\n").arg(getLength()); - char buffer[524288]; - unsigned offset = 0; - unsigned to_read = 16 * _data.getChunkSize(); - oraub8 bytes_read = 0, chars_read = 0; - - while(offset < MAXTOMAXLONG) - { - oraub8 cr = 0, br = 0; - br = _data.read(&buffer[0], sizeof(buffer), offset+1, to_read, &cr); - offset += cr; - chars_read += cr; - bytes_read += br; - if(br == 0) // end of LOB reached - break; - retval += QString::fromUtf8(buffer, br); - } - - if(offset != _data.length()) - retval += "\n...<TRUNCATED>"; - return retval; - } + QString _displayData = QString("{clob}"); + _displayData += QString::fromUtf8(buffer, bytes_read); + if(chars_read != _data.length()) + _displayData += "...<truncated>"; + return _displayData; + } - /* virtual */ QString userData() const throw() - { - return QString("Datape: Oracle [N]CLOB\nSize: %1B\n") - .arg(getLength()); - } + /* virtual */ QString editData() const throw() + { + ::trotl::SqlOpenLob clob_open(_data, OCI_LOB_READONLY); + QString retval = QString("Datatype: Oracle [N]CLOB\nSize: %1 Chars\n").arg(getLength()); + char buffer[524288]; + unsigned offset = 0; + unsigned to_read = 16 * _data.getChunkSize(); + oraub8 bytes_read = 0, chars_read = 0; - /* virtual */ QString tooltipData() const throw() - { - return QString("Datape: Oracle [N]CLOB\n" "Size: %1B\n") - .arg(getLength()); - } - - /* virtual */ QString dataTypeName() const - { - return QString("CLOB"); - } - /* virtual */ QByteArray read(unsigned offset) const - { - unsigned chunksize = _data.getChunkSize(); - char *buffer = (char*)malloc( chunksize ); // TODO use alloc here(or _alloc on MSVC) - unsigned int bytes_read; - { - ::trotl::SqlOpenLob clob_open(_data, OCI_LOB_READONLY); - bytes_read = _data.read(buffer, chunksize, offset+1, chunksize); - buffer[bytes_read] = '\0'; - } - QByteArray retval(buffer, bytes_read); - free(buffer); - return retval; - } - /* virtual */ void write(QByteArray const &data) - { - } - /* virtual */~toOracleClob() - { - TLOG(1,toDecorator,__HERE__) << "toOracleClob DELETED:" << this << std::endl; - } + while(offset < MAXTOMAXLONG) + { + oraub8 cr = 0, br = 0; + br = _data.read(&buffer[0], sizeof(buffer), offset + 1, to_read, &cr); + offset += cr; + chars_read += cr; + bytes_read += br; + if(br == 0) // end of LOB reached + break; + retval += QString::fromUtf8(buffer, br); + } - mutable trotl::SqlClob _data; + if(offset != _data.length()) + retval += "\n...<TRUNCATED>"; + return retval; + } + + /* virtual */ QString userData() const throw() + { + return QString("Datape: Oracle [N]CLOB\nSize: %1B\n") + .arg(getLength()); + } + + /* virtual */ QString tooltipData() const throw() + { + return QString("Datape: Oracle [N]CLOB\n" "Size: %1B\n") + .arg(getLength()); + } + + /* virtual */ QString dataTypeName() const + { + return QString("CLOB"); + } + /* virtual */ QByteArray read(unsigned offset) const + { + unsigned chunksize = _data.getChunkSize(); + char *buffer = (char*)malloc( chunksize ); // TODO use alloc here(or _alloc on MSVC) + unsigned int bytes_read; + { + ::trotl::SqlOpenLob clob_open(_data, OCI_LOB_READONLY); + bytes_read = _data.read(buffer, chunksize, offset + 1, chunksize); + buffer[bytes_read] = '\0'; + } + QByteArray retval(buffer, bytes_read); + free(buffer); + return retval; + } + /* virtual */ void write(QByteArray const &data) + { + } + /* virtual */~toOracleClob() + { + TLOG(1, toDecorator, __HERE__) << "toOracleClob DELETED:" << this << std::endl; + } + + mutable trotl::SqlClob _data; protected: - oraub8 getLength() const - { - if(!_length) - _length = _data.length(); - return _length; - }; - - mutable oraub8 _length; // NOTE: OCILobGetLength makes one roundtrip to the server - mutable QString _displayData; - toOracleClob(toOracleClob const&); - toOracleClob operator=(toOracleClob const&); - //TODO copying prohibited + oraub8 getLength() const + { + if(!_length) + _length = _data.length(); + return _length; + }; + + mutable oraub8 _length; // NOTE: OCILobGetLength makes one roundtrip to the server + mutable QString _displayData; + toOracleClob(toOracleClob const&); + toOracleClob operator=(toOracleClob const&); + //TODO copying prohibited }; //Q_DECLARE_METATYPE(toOracleClob*) class toOracleBlob: public toQValue::complexType { public: - toOracleBlob(trotl::OciConnection &_conn) - : toQValue::complexType() - , data(_conn) - , _length(0) - , _displayData() - {}; - /* virtual */ bool isBinary() const - { - return true; - } - /* virtual */ bool isLarge() const - { - return true; - } + toOracleBlob(trotl::OciConnection &_conn) + : toQValue::complexType() + , data(_conn) + , _length(0) + , _displayData() + {}; + /* virtual */ + bool isBinary() const + { + return true; + } + /* virtual */ bool isLarge() const + { + return true; + } - /* virtual */ QString displayData() const throw() - { - if(!_displayData.isEmpty()) - return _displayData; - ::trotl::SqlOpenLob blob_open(data, OCI_LOB_READONLY); - unsigned char buffer[MAXLOBSHOWN/2]; - _displayData = QString("{blob}"); - - unsigned bytes_read = data.read(&buffer[0], sizeof(buffer), 1, sizeof(buffer)); - - for(unsigned i=0; i<bytes_read; ++i) - { - char sbuff[4]; - snprintf(sbuff, sizeof(sbuff), " %.2X", buffer[i]); - _displayData += sbuff; - } - - if(bytes_read >= MAXLOBSHOWN/2) - _displayData += "...<truncated>"; - return _displayData; - } - - /* virtual */ QString editData() const throw() - { - ::trotl::SqlOpenLob clob_open(data, OCI_LOB_READONLY); - QString retval = QString("Datatyp pe: Oracle BLOB\nSize: %1B\n").arg(getLength()); - unsigned char buffer[MAXTOMAXLONG]; - ub4 chunk_size = data.getChunkSize(); - unsigned offset = 0; - - while(offset < MAXTOMAXLONG) - { - unsigned to_read = (std::min)(MAXTOMAXLONG - offset, chunk_size); - unsigned bytes_read = data.read(&buffer[offset], MAXTOMAXLONG - offset, offset+1, to_read); + /* virtual */ QString displayData() const throw() + { + if(!_displayData.isEmpty()) + return _displayData; + ::trotl::SqlOpenLob blob_open(data, OCI_LOB_READONLY); + unsigned char buffer[MAXLOBSHOWN / 2]; + _displayData = QString("{blob}"); - if(bytes_read == 0) // end of LOB reached - break; + unsigned bytes_read = data.read(&buffer[0], sizeof(buffer), 1, sizeof(buffer)); - for(unsigned i=0; i<bytes_read; ++i) - { - char sbuff[4]; - snprintf(sbuff, sizeof(sbuff), " %.2X", buffer[i]); - retval += sbuff; - if( (offset+i) % 32 == 31) - retval += "\n"; - } - - offset += bytes_read; - } - - if(offset == MAXTOMAXLONG) - retval += "\n...<TRUNCATED>"; - return retval; - } + for(unsigned i = 0; i < bytes_read; ++i) + { + char sbuff[4]; + snprintf(sbuff, sizeof(sbuff), " %.2X", buffer[i]); + _displayData += sbuff; + } - /* virtual */ QString userData() const throw() - { - return QString("Datape: Oracle BLOB\nSize: %1B\n") - .arg(data.length()); - } + if(bytes_read >= MAXLOBSHOWN / 2) + _displayData += "...<truncated>"; + return _displayData; + } - /* virtual */ QString tooltipData() const throw() - { - return QString("Datape: Oracle BLOB\nSize: %1B\n") - .arg(data.length()); - } - - /* virtual */ QString dataTypeName() const - { - return QString("blob"); - } - /* virtual */ QByteArray read(unsigned offset) const - { - unsigned chunksize = data.getChunkSize(); - char *buffer = (char*)malloc( chunksize ); // TODO use alloc here(or _alloc on MSVC) - unsigned int bytes_read; - { - ::trotl::SqlOpenLob blob_open(data, OCI_LOB_READONLY); - bytes_read = data.read(buffer, chunksize, offset+1, chunksize); - buffer[bytes_read] = '\0'; - } - QByteArray retval(buffer, bytes_read); - free(buffer); - return retval; - } - /* virtual */ void write(QByteArray const &data) - { - } - /* virtual */~toOracleBlob() - { - TLOG(1,toDecorator,__HERE__) << "toOracleBlob DELETED:" << this << std::endl; - } + /* virtual */ QString editData() const throw() + { + ::trotl::SqlOpenLob clob_open(data, OCI_LOB_READONLY); + QString retval = QString("Datatyp pe: Oracle BLOB\nSize: %1B\n").arg(getLength()); + unsigned char buffer[MAXTOMAXLONG]; + ub4 chunk_size = data.getChunkSize(); + unsigned offset = 0; - mutable trotl::SqlBlob data; + while(offset < MAXTOMAXLONG) + { + unsigned to_read = (std::min)(MAXTOMAXLONG - offset, chunk_size); + unsigned bytes_read = data.read(&buffer[offset], MAXTOMAXLONG - offset, offset + 1, to_read); + + if(bytes_read == 0) // end of LOB reached + break; + + for(unsigned i = 0; i < bytes_read; ++i) + { + char sbuff[4]; + snprintf(sbuff, sizeof(sbuff), " %.2X", buffer[i]); + retval += sbuff; + if( (offset + i) % 32 == 31) + retval += "\n"; + } + + offset += bytes_read; + } + + if(offset == MAXTOMAXLONG) + retval += "\n...<TRUNCATED>"; + return retval; + } + + /* virtual */ QString userData() const throw() + { + return QString("Datape: Oracle BLOB\nSize: %1B\n") + .arg(data.length()); + } + + /* virtual */ QString tooltipData() const throw() + { + return QString("Datape: Oracle BLOB\nSize: %1B\n") + .arg(data.length()); + } + + /* virtual */ QString dataTypeName() const + { + return QString("blob"); + } + /* virtual */ QByteArray read(unsigned offset) const + { + unsigned chunksize = data.getChunkSize(); + char *buffer = (char*)malloc( chunksize ); // TODO use alloc here(or _alloc on MSVC) + unsigned int bytes_read; + { + ::trotl::SqlOpenLob blob_open(data, OCI_LOB_READONLY); + bytes_read = data.read(buffer, chunksize, offset + 1, chunksize); + buffer[bytes_read] = '\0'; + } + QByteArray retval(buffer, bytes_read); + free(buffer); + return retval; + } + /* virtual */ void write(QByteArray const &data) + { + } + /* virtual */~toOracleBlob() + { + TLOG(1, toDecorator, __HERE__) << "toOracleBlob DELETED:" << this << std::endl; + } + + mutable trotl::SqlBlob data; protected: - oraub8 getLength() const - { - if(!_length) - _length = data.length(); - return _length; - }; - - mutable oraub8 _length; // NOTE: OCILobGetLength makes one roundtrip to the server - mutable QString _displayData; - toOracleBlob(toOracleBlob const&); - toOracleBlob operator=(toOracleBlob const&); - //TODO copying prohibited + oraub8 getLength() const + { + if(!_length) + _length = data.length(); + return _length; + }; + + mutable oraub8 _length; // NOTE: OCILobGetLength makes one roundtrip to the server + mutable QString _displayData; + toOracleBlob(toOracleBlob const&); + toOracleBlob operator=(toOracleBlob const&); + //TODO copying prohibited }; //Q_DECLARE_METATYPE(toOracleBlob*) class toOracleCollection: public toQValue::complexType { public: - toOracleCollection(trotl::OciConnection &_conn) - : toQValue::complexType() - , data(_conn) - {}; - /* virtual */ bool isBinary() const - { - return false; - } - /* virtual */ bool isLarge() const - { - return false; - } + toOracleCollection(trotl::OciConnection &_conn) + : toQValue::complexType() + , data(_conn) + {}; + /* virtual */ + bool isBinary() const + { + return false; + } + /* virtual */ bool isLarge() const + { + return false; + } - /* virtual */ QString displayData() const throw() - { - return QString("{collection}"); - } - - /* virtual */ QString editData() const throw() - { - return QString::fromUtf8(((::trotl::tstring)data).c_str()); - } + /* virtual */ QString displayData() const throw() + { + return QString("{collection}"); + } - /* virtual */ QString userData() const throw() - { - return QString("collection"); - } + /* virtual */ QString editData() const throw() + { + return QString::fromUtf8(((::trotl::tstring)data).c_str()); + } - /* virtual */ QString tooltipData() const throw() - { - return dataTypeName(); - } + /* virtual */ QString userData() const throw() + { + return QString("collection"); + } - /* virtual */ QString dataTypeName() const - { - return QString::fromUtf8(data._data_type_name.c_str()); - } - /* virtual */ QByteArray read(unsigned offset) const - { - return QByteArray(); - } - /* virtual */ void write(QByteArray const &data) - { - } - /* virtual */ ~toOracleCollection() - { - TLOG(1,toDecorator,__HERE__) << "toOracleCollection DELETED:" << this << std::endl; - } + /* virtual */ QString tooltipData() const throw() + { + return dataTypeName(); + } - mutable trotl::SqlCollection data; + /* virtual */ QString dataTypeName() const + { + return QString::fromUtf8(data._data_type_name.c_str()); + } + /* virtual */ QByteArray read(unsigned offset) const + { + return QByteArray(); + } + /* virtual */ void write(QByteArray const &data) + { + } + /* virtual */ ~toOracleCollection() + { + TLOG(1, toDecorator, __HERE__) << "toOracleCollection DELETED:" << this << std::endl; + } + + mutable trotl::SqlCollection data; protected: - toOracleCollection(toOracleCollection const&); - toOracleCollection operator=(toOracleCollection const&); - //TODO copying prohibited + toOracleCollection(toOracleCollection const&); + toOracleCollection operator=(toOracleCollection const&); + //TODO copying prohibited }; //Q_DECLARE_METATYPE(toOracleCollection*) class toOracleCursor: public toQValue::complexType { public: - toOracleCursor() {}; - - /* virtual */ bool isBinary() const - { - return false; - } - /* virtual */ bool isLarge() const - { - return true; - } + toOracleCursor() {}; + /* virtual */ + bool isBinary() const + { + return false; + } + /* virtual */ bool isLarge() const + { + return true; + } - /* virtual */ QString displayData() const throw() - { - return QString("{cursor}"); - } - - /* virtual */ QString editData() const throw() - { - std::string s; - data >> s; - return QString::fromUtf8(s.c_str()); - } - /* virtual */ QString userData() const throw() - { - return QString("cursor"); - } + /* virtual */ QString displayData() const throw() + { + return QString("{cursor}"); + } - /* virtual */ QString tooltipData() const throw() - { - return dataTypeName(); - } + /* virtual */ QString editData() const throw() + { + std::string s; + data >> s; + return QString::fromUtf8(s.c_str()); + } - /* virtual */ QString dataTypeName() const - { - return QString("cursor SQLT_RSET"); - } - /* virtual */ QByteArray read(unsigned offset) const - { - return QByteArray(); - } - /* virtual */ void write(QByteArray const &data) - { - } - /* virtual */ ~toOracleCursor() - { - TLOG(1,toDecorator,__HERE__) << "toOracleCursor DELETED:" << this << std::endl; - } + /* virtual */ QString userData() const throw() + { + return QString("cursor"); + } - mutable trotl::SqlCursor data; + /* virtual */ QString tooltipData() const throw() + { + return dataTypeName(); + } + + /* virtual */ QString dataTypeName() const + { + return QString("cursor SQLT_RSET"); + } + /* virtual */ QByteArray read(unsigned offset) const + { + return QByteArray(); + } + /* virtual */ void write(QByteArray const &data) + { + } + /* virtual */ ~toOracleCursor() + { + TLOG(1, toDecorator, __HERE__) << "toOracleCursor DELETED:" << this << std::endl; + } + + mutable trotl::SqlCursor data; protected: - toOracleCursor(toOracleCursor const&); - toOracleCursor operator=(toOracleCursor const&); - //TODO copying prohibited + toOracleCursor(toOracleCursor const&); + toOracleCursor operator=(toOracleCursor const&); + //TODO copying prohibited }; //Q_DECLARE_METATYPE(toOracleCursor*) Modified: branches/tora3/src/connection/tooraclefind.cpp =================================================================== --- branches/tora3/src/connection/tooraclefind.cpp 2012-05-03 15:11:44 UTC (rev 4298) +++ branches/tora3/src/connection/tooraclefind.cpp 2012-05-03 15:26:23 UTC (rev 4299) @@ -53,388 +53,391 @@ #include <oci.h> #if defined(Q_OS_LINUX) -# define PROVIDER_LIB "libporacle.so" -# define TROTL_LIB "libtrotl.so" +# define PROVIDER_LIB "libporacle.so" +# define TROTL_LIB "libtrotl.so" #elif defined(Q_OS_WIN32) -# define PROVIDER_LIB "poracle.dll" -# define TROTL_LIB "trotl.dll" +# define PROVIDER_LIB "poracle.dll" +# define TROTL_LIB "trotl.dll" #endif class toOracleInstantFinder : public toConnectionProviderFinder -{ +{ public: - inline toOracleInstantFinder(unsigned int i) : toConnectionProviderFinder(i) {}; + inline toOracleInstantFinder(unsigned int i) : toConnectionProviderFinder(i) {... [truncated message content] |
From: <ibr...@us...> - 2012-05-08 14:56:49
|
Revision: 4305 http://tora.svn.sourceforge.net/tora/?rev=4305&view=rev Author: ibre5041 Date: 2012-05-08 14:56:38 +0000 (Tue, 08 May 2012) Log Message: ----------- test Modified Paths: -------------- branches/tora3/src/CMakeLists.txt Added Paths: ----------- branches/tora3/src/tests/ branches/tora3/src/tests/test1.cpp Modified: branches/tora3/src/CMakeLists.txt =================================================================== --- branches/tora3/src/CMakeLists.txt 2012-05-07 23:14:18 UTC (rev 4304) +++ branches/tora3/src/CMakeLists.txt 2012-05-08 14:56:38 UTC (rev 4305) @@ -669,6 +669,8 @@ SET(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) SET(CMAKE_INSTALL_RPATH "$ORIGIN/:$$ORIGIN/") + +# The main executable ADD_EXECUTABLE(${EXE_NAME} ${GUI_TYPE} core/main.cpp ${TORA_UI_SOURCES} @@ -684,9 +686,28 @@ ADD_DEPENDENCIES(${EXE_NAME} revisiontag) IF(USE_PCH) - # ADD_PRECOMPILED_HEADER(${EXE_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/precompiled_msvc.h) + # ADD_PRECOMPILED_HEADER(${EXE_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/precompiled.h) ENDIF(USE_PCH) +# test1 +ADD_EXECUTABLE("test1" ${GUI_TYPE} + tests/test1.cpp + ${TORA_UI_SOURCES} + ${TORA_I18N_QM} + ${TORA_MOC_SOURCES} + ${TORA_SOURCES} + ${TORA_RCC_SRCS} + ${APPLE_BUNDLE_SOURCES} + ) +TARGET_LINK_LIBRARIES("test1" ${TORA_LIBS} ${TORA_MOC_LIB}) +SET_TARGET_PROPERTIES("test1" PROPERTIES ENABLE_EXPORTS ON) +# explicitly say that the executable depends on the svnheader +ADD_DEPENDENCIES("test1" revisiontag) + +IF(USE_PCH) + # ADD_PRECOMPILED_HEADER(${EXE_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/precompiled.h) +ENDIF(USE_PCH) + # Connection provider libraries # Oracle connection provider ADD_DEFINITIONS("-DTROTL_DLL") Added: branches/tora3/src/tests/test1.cpp =================================================================== --- branches/tora3/src/tests/test1.cpp (rev 0) +++ branches/tora3/src/tests/test1.cpp 2012-05-08 14:56:38 UTC (rev 4305) @@ -0,0 +1,115 @@ + +/* 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/utils.h" +#include "core/tologger.h" + +#include "core/toabout.h" +#include "core/toconf.h" +#include "core/tomain.h" +#include "core/tosql.h" +#include "core/toconfiguration.h" +#include "core/toqvalue.h" +#include "core/tomarkedtext.h" +#include "core/tosplash.h" +#include "core/toconnection.h" +#include "core/toeventquerytask.h" +#include "core/toraversion.h" + +#include "parsing/tsqlparse.h" +#include "parsing/tsqllexer.h" + +#include <QDateTime> +#include <QApplication> +#include <QMessageBox> +#include <QTextCodec> +#include <QString> +#include <QTranslator> +#include <QStyleFactory> + +#include <memory> + +int main(int argc, char **argv) +{ + toConfiguration::setQSettingsEnv(); + + /*! \warning: Keep the code before QApplication init as small + as possible. There could be serious display issues when + you construct some Qt classes before QApplication. + It's the same for global static stuff - some instances can + break it (e.g. qscintilla lexers etc.). + */ + QApplication app(argc, argv); + + QString style(toConfigurationSingle::Instance().style()); + if (!style.isEmpty()) + QApplication::setStyle(QStyleFactory::create(style)); + + // Set the default codec to use for QString + QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); + + try + { + toQValue::setNumberFormat( + toConfigurationSingle::Instance().numberFormat(), + toConfigurationSingle::Instance().numberDecimals()); + + toMarkedText::setDefaultTabWidth(toConfigurationSingle::Instance().tabStop()); + toMarkedText::setDefaultTabSpaces(toConfigurationSingle::Instance().tabSpaces()); + + qRegisterMetaType<toQColumnDescriptionList>("toQColumnDescriptionList&"); + qRegisterMetaType<ValuesList>("ValuesList&"); + qRegisterMetaType<toConnection::exception>("toConnection::exception"); + + //int ret = qApp->exec(); + //return ret; + std::auto_ptr <SQLParser::Lexer> lexer = LexerFactTwoParmSing::Instance().create("OracleSQL", "a b c", ""); + } + catch (const QString &str) + { + std::cerr << "Unhandled exception:"<< std::endl << std::endl << qPrintable(str) << std::endl; + TOMessageBox::critical(NULL, + qApp->translate("main", "Unhandled exception"), + str, + qApp->translate("main", "Exit")); + } + return 1; +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2012-05-08 17:24:33
|
Revision: 4306 http://tora.svn.sourceforge.net/tora/?rev=4306&view=rev Author: ibre5041 Date: 2012-05-08 17:24:26 +0000 (Tue, 08 May 2012) Log Message: ----------- Modified Paths: -------------- branches/tora3/src/CMakeLists.txt branches/tora3/src/core/tora_export.h Modified: branches/tora3/src/CMakeLists.txt =================================================================== --- branches/tora3/src/CMakeLists.txt 2012-05-08 14:56:38 UTC (rev 4305) +++ branches/tora3/src/CMakeLists.txt 2012-05-08 17:24:26 UTC (rev 4306) @@ -680,7 +680,7 @@ ${TORA_RCC_SRCS} ${APPLE_BUNDLE_SOURCES} ) -TARGET_LINK_LIBRARIES(${EXE_NAME} ${TORA_LIBS} ${TORA_MOC_LIB}) +TARGET_LINK_LIBRARIES(${EXE_NAME} ${TORA_LIBS}) SET_TARGET_PROPERTIES(${EXE_NAME} PROPERTIES ENABLE_EXPORTS ON) # explicitly say that the executable depends on the svnheader ADD_DEPENDENCIES(${EXE_NAME} revisiontag) @@ -699,13 +699,13 @@ ${TORA_RCC_SRCS} ${APPLE_BUNDLE_SOURCES} ) -TARGET_LINK_LIBRARIES("test1" ${TORA_LIBS} ${TORA_MOC_LIB}) +TARGET_LINK_LIBRARIES("test1" ${TORA_LIBS}) SET_TARGET_PROPERTIES("test1" PROPERTIES ENABLE_EXPORTS ON) # explicitly say that the executable depends on the svnheader ADD_DEPENDENCIES("test1" revisiontag) IF(USE_PCH) - # ADD_PRECOMPILED_HEADER(${EXE_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/precompiled.h) + # ADD_PRECOMPILED_HEADER("test1" ${CMAKE_CURRENT_SOURCE_DIR}/precompiled.h) ENDIF(USE_PCH) # Connection provider libraries Modified: branches/tora3/src/core/tora_export.h =================================================================== --- branches/tora3/src/core/tora_export.h 2012-05-08 14:56:38 UTC (rev 4305) +++ branches/tora3/src/core/tora_export.h 2012-05-08 17:24:26 UTC (rev 4306) @@ -17,6 +17,11 @@ #include "loki/LokiExport.h" +// Theat all the test programs the same way as the main .EXE file +#if defined(test1_EXPORTS) || defined(test2_EXPORTS) || defined(test3_EXPORTS) || defined(test4_EXPORTS) || defined(test5_EXPORTS) || defined(test6_EXPORTS) +#define tora_EXPORTS +#endif + // Note: please don't be confused. We do not make any tora.so. // On Windows we just need tora.lib to be generated. // This file is needed by connection provider plugins to refer undefined symbols This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2012-06-11 16:29:12
|
Revision: 4348 http://tora.svn.sourceforge.net/tora/?rev=4348&view=rev Author: ibre5041 Date: 2012-06-11 16:28:59 +0000 (Mon, 11 Jun 2012) Log Message: ----------- - sync with trunk - Do use toResultSchema for the user list in all the tools - toCache Modified Paths: -------------- branches/tora3/src/CMakeLists.txt branches/tora3/src/core/tocache.cpp branches/tora3/src/core/tocache.h branches/tora3/src/core/toglobalsetting.cpp branches/tora3/src/core/toresultcombo.cpp branches/tora3/src/core/toresultcombo.h branches/tora3/src/core/toresultplan.cpp branches/tora3/src/core/toresultschema.cpp branches/tora3/src/core/toresultschema.h branches/tora3/src/core/totableselect.cpp branches/tora3/src/core/totableselect.h branches/tora3/src/toawr.cpp branches/tora3/src/todebug.cpp branches/tora3/src/todebug.h branches/tora3/src/tools/toanalyze.cpp branches/tora3/src/tools/toanalyze.h branches/tora3/src/tools/tobrowser.cpp branches/tora3/src/tools/tobrowser.h branches/tora3/src/tools/tobrowsertable.cpp branches/tora3/src/tools/tobrowsertableui.ui branches/tora3/src/tools/tosession.cpp branches/tora3/src/tools/tosession.h branches/tora3/src/tools/tosgatrace.cpp branches/tora3/src/tools/tosgatrace.h branches/tora3/src/tools/toworksheet.cpp branches/tora3/src/toplsqleditor.cpp branches/tora3/src/toplsqleditor.h branches/tora3/src/tounittest.cpp Added Paths: ----------- branches/tora3/src/tocacheold.cpp branches/tora3/src/tocacheold.h Removed Paths: ------------- branches/tora3/src/tocache.cpp branches/tora3/src/tocache.h Modified: branches/tora3/src/CMakeLists.txt =================================================================== --- branches/tora3/src/CMakeLists.txt 2012-06-11 13:35:21 UTC (rev 4347) +++ branches/tora3/src/CMakeLists.txt 2012-06-11 16:28:59 UTC (rev 4348) @@ -203,6 +203,7 @@ core/topiechart.h core/toeditablemenu.h core/tosyntaxsetup.h + core/tocache.h ts_log/toostream.h @@ -249,7 +250,7 @@ # # tobrowserschemabasewidget.h # # toconf.h # # toconfiguration.h - # #tocache.h + # toconnectionpool.h # tocurrent.h Modified: branches/tora3/src/core/tocache.cpp =================================================================== --- branches/tora3/src/core/tocache.cpp 2012-06-11 13:35:21 UTC (rev 4347) +++ branches/tora3/src/core/tocache.cpp 2012-06-11 16:28:59 UTC (rev 4348) @@ -40,6 +40,7 @@ #include "core/tocache.h" #include "core/toconfiguration.h" +#include "core/toraversion.h" #include "core/utils.h" #include <QtDebug> @@ -47,11 +48,18 @@ #include <QDateTime> #include <QTextStream> #include <QProgressDialog> +#include <QDataStream> //#include <boost/preprocessor/iteration/detail/local.hpp> +// Forward declarations +// Allow cache entries to be serialized / de-serialized +QDataStream& operator<< (QDataStream& stream, const toCache::CacheEntry& e); +QDataStream& operator>> (QDataStream& stream, toCache::CacheEntry& e); + toCache::toCache( QString const &description) - : ConnectionDescription(description) - , refCount(1) // we assume that we were created from 1s toConnection + : QObject(NULL) + , ConnectionDescription(description) + , refCount(1) // we assume that we were created from 1st toConnection , state(NOT_STARTED) , ownersRead(false) , usersRead(false) @@ -100,6 +108,7 @@ if( !usersMap.contains(schema)) { usersMap.insert(schema, new toCacheEntryUser(schema)); + emit userListRefreshed(); } if( !ownersMap.contains(e->name.first)) @@ -335,16 +344,206 @@ return ; } - ///TODO /** delete cache file to force reload */ - //QString filename(cacheFile()); - //if (QFile::exists(filename)) - // QFile::remove(filename); + QFileInfo filename(cacheFile()); + if (filename.isFile()) + QFile::remove(filename.absoluteFilePath()); readObjects(t); } +QDir toCache::cacheDir() +{ + QString home(QDir::homePath()); + QString dirname(toConfigurationSingle::Instance().cacheDir()); + + if (dirname.isEmpty()) + { +#ifdef Q_OS_WIN32 + if (getenv("TEMP")) + dirname = QString(getenv("TEMP")); + else +#endif + dirname = QString(home); + dirname += "/.tora_cache"; + } + return dirname; +} // cacheDir + +QFileInfo toCache::cacheFile() +{ + QString ret (ConnectionDescription.trimmed()); + // using instantclient connectionstrins can result in file name like this: + // isepl_global_stage@//oraclexe11:1521/xe + // which is invalid. Just remove "/" or replace it with something safer. + ret = ret.replace("/", "_"); + ret = ret.replace(":", "~"); + ret += ".bin"; + + return QFileInfo(cacheDir(), ret); +} // cacheFile + +void toCache::writeDiskCache() +{ + QString text; + qint64 objCounter = 0; + qint64 synCounter = 0; + + if (!toConfigurationSingle::Instance().cacheDisk()) + return; + + QFileInfo fileInfo(cacheFile()); + QDir dir(cacheDir()); + + if (!dir.exists()) + dir.mkdir(dir.absolutePath()); + + QString version = QString::fromLatin1(TORAVERSION); + + QFile file(fileInfo.absoluteFilePath()); +//TODO #warn "throw something here" + if (!file.open(QIODevice::ReadWrite | QIODevice::Truncate)) + return; + + { + toSharedLocker lock(cacheLock); + + QDataStream out(&file); + out << version; // Tora version + out << (quint8)state; // cache state + out << ownersRead; + out << usersRead; + out << ConnectionDescription; + + // TODO Write a gap here. + // then write the whole cache, rewind, + + out << (quint32) entryMap.size(); + out << (quint32) synonymMap.size(); + out << (quint32) columnCache.size(); + out << (quint32) ownersMap.size(); + out << (quint32) usersMap.size(); + + QList<CacheEntry const*> vEntryMap = entryMap.values(); + Q_FOREACH(CacheEntry const*e, vEntryMap) + { + out << (*e); + } + // TODO this can be avoided + QList<CacheEntry const*> vSynonymMap = synonymMap.values(); + Q_FOREACH(CacheEntry const*e, vSynonymMap) + { + out << (*e); + } + + QList<CacheEntry const*> vColumnCache = columnCache.values(); + Q_FOREACH(CacheEntry const*e, vColumnCache) + { + out << (*e); + } + + QList<CacheEntry const*> vOwnersMap = ownersMap.values(); + Q_FOREACH(CacheEntry const*e, vOwnersMap) + { + out << (*e); + } + + QList<CacheEntry const*> vUsersMap = usersMap.values(); + Q_FOREACH(CacheEntry const*e, vUsersMap) + { + out << (*e); + } + + file.flush(); + file.close(); + } +} + +bool toCache::loadDiskCache() +{ + if (!toConfigurationSingle::Instance().cacheDisk()) + return false; + + QFileInfo fileInfo(cacheFile()); + QDir dir(cacheDir()); + + if (!dir.exists()) + dir.mkdir(dir.absolutePath()); + + QString version = QString::fromLatin1(TORAVERSION); + QDateTime today; + + if(!fileInfo.isReadable()) + return false; + + if (fileInfo.lastModified().addDays(toConfigurationSingle::Instance().cacheTimeout()) < today) + return false; + + clearCache(); + +//#warn TODO "throw something here + quint32 entryMapSize, synonymMapSize, columnCacheSize, ownersMapSize, usersMapSize; + QFile file(fileInfo.absoluteFilePath()); + file.open(QIODevice::ReadOnly); + QDataStream in(&file); + { + toExclusiveLocker lock(cacheLock); + quint8 s; + + in >> version; // Tora version + in >> s; state = (CacheState)s; // cache state + in >> ownersRead; + in >> usersRead; + in >> ConnectionDescription; + + in >> entryMapSize; + in >> synonymMapSize; + in >> columnCacheSize; + in >> ownersMapSize; + in >> usersMapSize; + } + for(int i = 0; i < entryMapSize; i++) + { + CacheEntry e, *clone; + in >> e; + clone = cloneCacheEntry(e); + if( clone != NULL) + addEntry(cloneCacheEntry(e)); + } + + // TODO this can be avoided (probably) + for(int i = 0; i < synonymMapSize; i++) + { + CacheEntry e, *clone; + in >> e; + } + for(int i = 0; i < columnCacheSize; i++) + { + CacheEntry e, *clone; + in >> e; + } + for(int i = 0; i < ownersMapSize; i++) + { + CacheEntry e, *clone; + in >> e; + clone = cloneCacheEntry(e); + if( clone != NULL) + addEntry(cloneCacheEntry(e)); + } + for(int i = 0; i < usersMapSize; i++) + { + CacheEntry e, *clone; + in >> e; + clone = cloneCacheEntry(e); + if( clone != NULL) + addEntry(cloneCacheEntry(e)); + } + + file.close(); + return true; +} + /** * private functions */ @@ -369,25 +568,6 @@ usersMap.clear(); }; -QString toCache::cacheDir() -{ - QString home(QDir::homePath()); - QString dirname(toConfigurationSingle::Instance().cacheDir()); - - if (dirname.isEmpty()) - { -#ifdef Q_OS_WIN32 - if (getenv("TEMP")) - dirname = QString(getenv("TEMP")); - else -#endif - dirname = QString(home); - dirname += "/.tora_cache"; - } - return dirname; -} // cacheDir - - /*static*/ toCache::CacheEntryType toCache::cacheEntryType(QString const& objType) { if( objType == "TABLE") @@ -416,44 +596,87 @@ return OTHER; } +/*static*/ QString toCache::cacheEntryTypeToString(toCache::CacheEntryType objType) +{ + switch(objType) + { + case TABLE: + return "TABLE"; + case VIEW: + return "VIEW"; + case SYNONYM: + return "SYNONYM"; + case PROCEDURE: + return "PROCEDURE"; + case FUNCTION: + return "FUNCTION"; + case PACKAGE: + return "PACKAGE"; + case PACKAGE_BODY: + return "PACKAGE BODY"; + case INDEX: + return "INDEX"; + case SEQUENCE: + return "SEQUENCE"; + case TRIGGER: + return "TRIGGER"; + case DATABASE: + return "DATABASE"; + default: + //return NULL; + throw QString("toCacheNew: Unknown object type %1").arg((quint32)objType); + } +} + bool toCache::cacheRefreshRunning() const { toSharedLocker lock(cacheLock); return state != NOT_STARTED && state != DONE && state != FAILED; } -toCache::CacheEntry* toCache::createCacheEntry(const QString &objOwner, const QString &objName, const QString &objType, const QString &comment) +toCache::CacheEntry* toCache::createCacheEntry(const QString &objOwner, const QString &objName, CacheEntryType objType, const QString &comment) { - switch(cacheEntryType(objType)) + switch(objType) { case TABLE: - return new toCacheEntryTable(objOwner, objName, objType, comment); + return new toCacheEntryTable(objOwner, objName, comment); case VIEW: - return new toCacheEntryView(objOwner, objName, objType, comment); + return new toCacheEntryView(objOwner, objName, comment); case SYNONYM: - return new toCacheEntrySynonym(objOwner, objName, objType, comment); + return new toCacheEntrySynonym(objOwner, objName, comment); case PROCEDURE: - return new toCacheEntryProcedure(objOwner, objName, objType, comment); + return new toCacheEntryProcedure(objOwner, objName, comment); case FUNCTION: - return new toCacheEntryFunction(objOwner, objName, objType, comment); + return new toCacheEntryFunction(objOwner, objName, comment); case PACKAGE: - return new toCacheEntryPackage(objOwner, objName, objType, comment); + return new toCacheEntryPackage(objOwner, objName, comment); case PACKAGE_BODY: - return new toCacheEntryPackageBody(objOwner, objName, objType, comment); + return new toCacheEntryPackageBody(objOwner, objName, comment); case INDEX: - return new toCacheEntryIndex(objOwner, objName, objType, comment); + return new toCacheEntryIndex(objOwner, objName, comment); case SEQUENCE: - return new toCacheEntrySequence(objOwner, objName, objType, comment); + return new toCacheEntrySequence(objOwner, objName, comment); case TRIGGER: - return new toCacheEntryTrigger(objOwner, objName, objType, comment); + return new toCacheEntryTrigger(objOwner, objName, comment); case DATABASE: - return new toCacheEntryDatabase(objOwner, objName, objType, comment); + return new toCacheEntryDatabase(objOwner, objName, comment); default: - return NULL; + return NULL; // Do ignore some object types, like DBLINK or CLUSTER for example ///throw QString("toCache: Unknown object type %1").arg(objType); } +} + +toCache::CacheEntry* toCache::createCacheEntry(const QString &objOwner, const QString &objName, const QString &objTypeStr, const QString &comment) +{ + CacheEntryType objType = cacheEntryType(objTypeStr); + return createCacheEntry(objOwner, objName, objType, comment); }; +toCache::CacheEntry* toCache::cloneCacheEntry(CacheEntry const& other) +{ + return createCacheEntry(other.name.first, other.name.second, other.type, other.comment); +} + toCache::CacheEntry::CacheEntry(const QString &owner, const QString &objName, const QString &objType, const QString &objComment) : name(ObjectRef(owner, objName)) , type(cacheEntryType(objType)) @@ -470,9 +693,11 @@ : name(ObjectRef(owner, objName)) , type(objType) , comment(objComment) + , timestamp(QDate::currentDate()) + , described(false) { if( type == OTHER) - throw QString("toCache: Unknown object type %1").arg(objType); + throw QString("toCache: Unknown object type %1").arg((quint8)objType); }; bool toCache::CacheEntry::operator < (const toCache::CacheEntry &other) const @@ -491,48 +716,65 @@ return type == other.type && name == other.name; }; -toCacheEntryTable::toCacheEntryTable(const QString &owner, const QString &name, const QString &type, const QString &comment) - : toCache::CacheEntry(owner, name, type, comment) +QDataStream& operator<< (QDataStream& stream, const toCache::CacheEntry& e) +{ + stream << e.name << (quint32)e.type << e.comment << e.timestamp << e.details; + return stream; +} + +QDataStream& operator>> (QDataStream& stream, toCache::CacheEntry& e) +{ + quint8 type; + + stream >> e.name >> type >> e.comment >> e.timestamp >> e.details; + + e.type = (toCache::CacheEntryType) type; + e.described = false; + return stream; +} + +toCacheEntryTable::toCacheEntryTable(const QString &owner, const QString &name, const QString &comment) + : toCache::CacheEntry(owner, name, toCache::TABLE, comment) {}; -toCacheEntryView::toCacheEntryView(const QString &owner, const QString &name, const QString &type, const QString &comment) - : toCache::CacheEntry(owner, name, type, comment) +toCacheEntryView::toCacheEntryView(const QString &owner, const QString &name, const QString &comment) + : toCache::CacheEntry(owner, name, toCache::VIEW, comment) {}; -toCacheEntrySynonym::toCacheEntrySynonym(const QString &owner, const QString &name, const QString &type, const QString &comment) - : toCache::CacheEntry(owner, name, type, comment) +toCacheEntrySynonym::toCacheEntrySynonym(const QString &owner, const QString &name, const QString &comment) + : toCache::CacheEntry(owner, name, toCache::SYNONYM, comment) {}; -toCacheEntryProcedure::toCacheEntryProcedure(const QString &owner, const QString &name, const QString &type, const QString &comment) - : toCache::CacheEntry(owner, name, type, comment) +toCacheEntryProcedure::toCacheEntryProcedure(const QString &owner, const QString &name, const QString &comment) + : toCache::CacheEntry(owner, name, toCache::PROCEDURE, comment) {}; -toCacheEntryFunction::toCacheEntryFunction(const QString &owner, const QString &name, const QString &type, const QString &comment) - : toCache::CacheEntry(owner, name, type, comment) +toCacheEntryFunction::toCacheEntryFunction(const QString &owner, const QString &name, const QString &comment) + : toCache::CacheEntry(owner, name, toCache::FUNCTION, comment) {}; -toCacheEntryPackage::toCacheEntryPackage(const QString &owner, const QString &name, const QString &type, const QString &comment) - : toCache::CacheEntry(owner, name, type, comment) +toCacheEntryPackage::toCacheEntryPackage(const QString &owner, const QString &name, const QString &comment) + : toCache::CacheEntry(owner, name, toCache::PACKAGE, comment) {}; -toCacheEntryPackageBody::toCacheEntryPackageBody(const QString &owner, const QString &name, const QString &type, const QString &comment) - : toCache::CacheEntry(owner, name, type, comment) +toCacheEntryPackageBody::toCacheEntryPackageBody(const QString &owner, const QString &name, const QString &comment) + : toCache::CacheEntry(owner, name, toCache::PACKAGE_BODY, comment) {}; -toCacheEntryIndex::toCacheEntryIndex(const QString &owner, const QString &name, const QString &type, const QString &comment) - : toCache::CacheEntry(owner, name, type, comment) +toCacheEntryIndex::toCacheEntryIndex(const QString &owner, const QString &name, const QString &comment) + : toCache::CacheEntry(owner, name, toCache::INDEX, comment) {}; -toCacheEntrySequence::toCacheEntrySequence(const QString &owner, const QString &name, const QString &type, const QString &comment) - : toCache::CacheEntry(owner, name, type, comment) +toCacheEntrySequence::toCacheEntrySequence(const QString &owner, const QString &name, const QString &comment) + : toCache::CacheEntry(owner, name, toCache::SEQUENCE, comment) {}; -toCacheEntryTrigger::toCacheEntryTrigger(const QString &owner, const QString &name, const QString &type, const QString &comment) - : toCache::CacheEntry(owner, name, type, comment) +toCacheEntryTrigger::toCacheEntryTrigger(const QString &owner, const QString &name, const QString &comment) + : toCache::CacheEntry(owner, name, toCache::TRIGGER, comment) {}; -toCacheEntryDatabase::toCacheEntryDatabase(const QString &owner, const QString &name, const QString &type, const QString &comment) - : toCache::CacheEntry(owner, name, type, comment) +toCacheEntryDatabase::toCacheEntryDatabase(const QString &owner, const QString &name, const QString &comment) + : toCache::CacheEntry(owner, name, toCache::DATABASE, comment) {}; toCacheEntryUser::toCacheEntryUser(const QString &schema) Modified: branches/tora3/src/core/tocache.h =================================================================== --- branches/tora3/src/core/tocache.h 2012-06-11 13:35:21 UTC (rev 4347) +++ branches/tora3/src/core/tocache.h 2012-06-11 16:28:59 UTC (rev 4348) @@ -67,8 +67,14 @@ class toGlobalSetting; -class toCache //: public QObject +class QDataStream; +class QFileInfo; +class QDir; + +class toCache : public QObject { + Q_OBJECT; + friend class toConnection; friend class toGlobalSetting; public: @@ -80,9 +86,9 @@ /** Nested class type */ - enum CacheEntryType + enum CacheEntryType : quint8 { - TABLE, + TABLE = 1, VIEW, SYNONYM, PROCEDURE, @@ -94,7 +100,7 @@ TRIGGER, DATABASE, // used by MySQL ANY, // used for querying purposes only - TORA_SCHEMA_LIST, // courious object type - used internaly by TORA, if present browser knows that that schma was read from DB + TORA_SCHEMA_LIST, // courious object type - used internaly by TORA, if present browser knows that that schema was read from DB //TORA_USER_LIST, // courious object type - used internaly by TORA purpose unknown so far. USER, OTHER @@ -148,8 +154,12 @@ */ virtual ~CacheEntry() {}; + /** Fetch additional information from the DB */ + virtual void describe() {}; + bool operator < (const CacheEntry &) const; bool operator == (const CacheEntry &) const; + }; // struct CacheEntry /** This structure is used to describe the resultset of a query. @@ -178,7 +188,7 @@ /** Objects state - updated by background threads */ - enum CacheState + enum CacheState : quint8 { NOT_STARTED = 0, READING_FROM_DISK, @@ -201,6 +211,8 @@ /** simple cacheEntry factory */ static CacheEntry* createCacheEntry(const QString &owner, const QString &name, const QString &type, const QString &comment); + static CacheEntry* createCacheEntry(const QString &owner, const QString &name, CacheEntryType type, const QString &comment); + static CacheEntry* cloneCacheEntry(CacheEntry const& other); /** add/update new entry into cache */ void addEntry(CacheEntry* e); @@ -262,12 +274,12 @@ /** Return the file used to store cache contents for this connection. * @return A string representing a full path and filename of cache file */ - QString cacheFile(); + QFileInfo cacheFile(); /** Return the directory storing files (caches) of all connections. * @return A string representing a full path to cache store directory */ - static QString cacheDir(); + static QDir cacheDir(); /** Load cache information for current connection from a file on disk * @return True if cache was loaded @@ -284,6 +296,9 @@ /** translate object type name QString("TABLE") => CacheEntryType::TABLE */ static CacheEntryType cacheEntryType(QString const& objTypeName); + /** translate object type CacheEntryType::TABLE => QString("TABLE") */ + static QString cacheEntryTypeToString(CacheEntryType objType); + /** Non-blocking version of cacheAvailable, used by toMain to update toBackgroundLabel */ bool cacheRefreshRunning() const; @@ -307,8 +322,11 @@ /** Multiple connections can point onto same toCache instance, the last connection should delete me. */ QAtomicInt refCount; -}; // toCache +signals: + void userListRefreshed(void); +}; // toCacheNew + /** A short representation of list<toCache::ColumnDescription> */ typedef QList<toCache::ColumnDescription> toQColumnDescriptionList; @@ -317,7 +335,7 @@ class toCacheEntryTable : public toCache::CacheEntry { public: - toCacheEntryTable(const QString &owner, const QString &name, const QString &type, const QString &comment = QString::null); + toCacheEntryTable(const QString &owner, const QString &name, const QString &comment = QString::null); private: }; @@ -325,7 +343,7 @@ class toCacheEntryView : public toCache::CacheEntry { public: - toCacheEntryView(const QString &owner, const QString &name, const QString &type, const QString &comment = QString::null); + toCacheEntryView(const QString &owner, const QString &name, const QString &comment = QString::null); private: }; @@ -333,7 +351,7 @@ class toCacheEntrySynonym : public toCache::CacheEntry { public: - toCacheEntrySynonym(const QString &owner, const QString &name, const QString &type, const QString &comment = QString::null); + toCacheEntrySynonym(const QString &owner, const QString &name, const QString &comment = QString::null); private: }; @@ -341,7 +359,7 @@ class toCacheEntryProcedure: public toCache::CacheEntry { public: - toCacheEntryProcedure(const QString &owner, const QString &name, const QString &type, const QString &comment = QString::null); + toCacheEntryProcedure(const QString &owner, const QString &name, const QString &comment = QString::null); private: }; @@ -349,7 +367,7 @@ class toCacheEntryFunction: public toCache::CacheEntry { public: - toCacheEntryFunction(const QString &owner, const QString &name, const QString &type, const QString &comment = QString::null); + toCacheEntryFunction(const QString &owner, const QString &name, const QString &comment = QString::null); private: }; @@ -357,7 +375,7 @@ class toCacheEntryPackage: public toCache::CacheEntry { public: - toCacheEntryPackage(const QString &owner, const QString &name, const QString &type, const QString &comment = QString::null); + toCacheEntryPackage(const QString &owner, const QString &name, const QString &comment = QString::null); private: }; @@ -365,7 +383,7 @@ class toCacheEntryPackageBody: public toCache::CacheEntry { public: - toCacheEntryPackageBody(const QString &owner, const QString &name, const QString &type, const QString &comment = QString::null); + toCacheEntryPackageBody(const QString &owner, const QString &name, const QString &comment = QString::null); private: }; @@ -373,7 +391,7 @@ class toCacheEntryIndex: public toCache::CacheEntry { public: - toCacheEntryIndex(const QString &owner, const QString &name, const QString &type, const QString &comment = QString::null); + toCacheEntryIndex(const QString &owner, const QString &name, const QString &comment = QString::null); private: }; @@ -381,7 +399,7 @@ class toCacheEntrySequence: public toCache::CacheEntry { public: - toCacheEntrySequence(const QString &owner, const QString &name, const QString &type, const QString &comment = QString::null); + toCacheEntrySequence(const QString &owner, const QString &name, const QString &comment = QString::null); private: }; @@ -389,7 +407,7 @@ class toCacheEntryTrigger: public toCache::CacheEntry { public: - toCacheEntryTrigger(const QString &owner, const QString &name, const QString &type, const QString &comment = QString::null); + toCacheEntryTrigger(const QString &owner, const QString &name, const QString &comment = QString::null); private: }; @@ -397,7 +415,7 @@ class toCacheEntryDatabase: public toCache::CacheEntry { public: - toCacheEntryDatabase(const QString &owner, const QString &name, const QString &type, const QString &comment = QString::null); + toCacheEntryDatabase(const QString &owner, const QString &name, const QString &comment = QString::null); private: }; Modified: branches/tora3/src/core/toglobalsetting.cpp =================================================================== --- branches/tora3/src/core/toglobalsetting.cpp 2012-06-11 13:35:21 UTC (rev 4347) +++ branches/tora3/src/core/toglobalsetting.cpp 2012-06-11 16:28:59 UTC (rev 4348) @@ -191,7 +191,7 @@ /** disk caching options */ - CacheDirectory->setText(toCache::cacheDir()); + CacheDirectory->setText(toCache::cacheDir().absolutePath()); DiskCaching->setChecked(toConfigurationSingle::Instance().cacheDisk()); CustomSQL->setText(toConfigurationSingle::Instance().sqlFile()); Modified: branches/tora3/src/core/toresultcombo.cpp =================================================================== --- branches/tora3/src/core/toresultcombo.cpp 2012-06-11 13:35:21 UTC (rev 4347) +++ branches/tora3/src/core/toresultcombo.cpp 2012-06-11 16:28:59 UTC (rev 4348) @@ -40,6 +40,7 @@ * END_COMMON_COPYRIGHT_HEADER */ #include "core/toresultcombo.h" +#include "core/toresultschema.h" #include "core/utils.h" #include "core/toconf.h" #include "core/toconnection.h" @@ -54,7 +55,9 @@ connect(this, SIGNAL(activated(int)), this, SLOT(changeSelected(void))); setSizeAdjustPolicy(QComboBox::AdjustToContents); - queryingUserlist = false; + //queryingUserlist = false; + + connect(&(connection().getCache()), SIGNAL(userListRefreshed()), this, SLOT(usersFromCache())); } toResultCombo::~toResultCombo() @@ -76,10 +79,22 @@ if (Additional[i] == Selected) setCurrentIndex(i); + // NOTE: delete this block. It is just a runtime check. + // It should find all the instances of toResultCombo who use q TOSQL_USERLIST. + // All those should be migrated into toResultSchema + toResultSchema* d = dynamic_cast<toResultSchema*>(this); + if ( d == NULL) + { + if (sql == toSQL::string(toSQL::TOSQL_USERLIST, connection())) + { + throw QString::fromLatin1("Illegal usage"); + } + } + if (sql != toSQL::string(toSQL::TOSQL_USERLIST, connection()) || !connection().getCache().userListExists(toCache::USERS)) { - queryingUserlist = true; + //queryingUserlist = true; userList.clear(); Query = new toEventQuery(connection(), /*toQuery::Background,*/ sql, param); connect(Query, SIGNAL(dataAvailable()), this, SLOT(poll())); @@ -89,20 +104,27 @@ } else { - QStringList users = connection().getCache().userList(toCache::USERS); - for (QStringList::iterator i = users.begin(); i != users.end(); i++) - { - QString t = (*i); - addItem(t); - if (t == Selected) - setCurrentIndex(count() - 1); - } - queryDone(); + usersFromCache(); } } TOCATCH } +// NOTE: this is nonsense too. This should be moved into toResultSchema +void toResultCombo::usersFromCache(void) +{ + QStringList users = connection().getCache().userList(toCache::USERS); + for (QStringList::iterator i = users.begin(); i != users.end(); i++) + { + QString t = (*i); + addItem(t); + if (t == Selected) + setCurrentIndex(count() - 1); + } + queryDone(); +} + + void toResultCombo::changeSelected(void) { Selected = currentText(); @@ -127,10 +149,10 @@ l.append(v); } addItem(t, QVariant(l)); - if (queryingUserlist) - { - userList.append(new toCacheEntryUser(t)); - } +// if (queryingUserlist) +// { +// userList.append(new toCacheEntryUser(t)); +// } if (t == Selected) setCurrentIndex(count() - 1); } @@ -166,11 +188,16 @@ updateGeometry(); // If we were querying user list - save it to cache - if (queryingUserlist) - { - connection().getCache().updateUserList(userList, toCache::USERS); - userList.clear(); - } +// if (queryingUserlist) +// { +// connection().getCache().updateUserList(userList, toCache::USERS); +// userList.clear(); +// } emit done(); } // queryDone + +void toResultCombo::refresh(void) +{ + toResult::refresh(); +} Modified: branches/tora3/src/core/toresultcombo.h =================================================================== --- branches/tora3/src/core/toresultcombo.h 2012-06-11 13:35:21 UTC (rev 4347) +++ branches/tora3/src/core/toresultcombo.h 2012-06-11 16:28:59 UTC (rev 4348) @@ -65,7 +65,7 @@ QString Selected; QStringList Additional; - bool queryingUserlist; + //bool queryingUserlist; QList<toCache::CacheEntry*> userList; public: @@ -85,7 +85,7 @@ toResultCombo(QWidget *parent, const char *name = NULL); /** Destruct object */ - ~toResultCombo(); + virtual ~toResultCombo(); /** Reimplemented for internal reasons. */ @@ -130,7 +130,7 @@ } // Why are these needed? -#if 1 +#if 0 /** Set the SQL statement of this list * @param sql String containing statement. */ @@ -177,10 +177,7 @@ public slots: /** Reimplemented for internal reasons. */ - virtual void refresh(void) - { - toResult::refresh(); - } + virtual void refresh(void); /** Reimplemented for internal reasons. */ virtual void changeParams(const QString &Param1) @@ -199,6 +196,8 @@ { toResult::changeParams(Param1, Param2, Param3); } + + void usersFromCache(void); private slots: void poll(void); void queryDone(void); Modified: branches/tora3/src/core/toresultplan.cpp =================================================================== --- branches/tora3/src/core/toresultplan.cpp 2012-06-11 13:35:21 UTC (rev 4347) +++ branches/tora3/src/core/toresultplan.cpp 2012-06-11 16:28:59 UTC (rev 4348) @@ -365,10 +365,11 @@ TopItem->setToolTip(1, queryText); CursorChildSel = new toResultCombo(this, "toResultPlan"); + CursorChildSel->setSQL(toSQL::string(SQLVSQLChildSel, conn).arg(Ident)); CursorChildSel->setSelectionPolicy(toResultCombo::First); try { - CursorChildSel->query(toSQL::string(SQLVSQLChildSel, conn).arg(Ident)); + CursorChildSel->refresh(); } TOCATCH; setItemWidget(TopItem, 3, CursorChildSel); Modified: branches/tora3/src/core/toresultschema.cpp =================================================================== --- branches/tora3/src/core/toresultschema.cpp 2012-06-11 13:35:21 UTC (rev 4347) +++ branches/tora3/src/core/toresultschema.cpp 2012-06-11 16:28:59 UTC (rev 4348) @@ -46,13 +46,13 @@ #include <QSettings> -toResultSchema::toResultSchema(toConnection &conn, - QWidget *parent, +toResultSchema::toResultSchema(QWidget *parent, const char *name) : toResultCombo(parent, name) { setSQL(toSQL::sql(toSQL::TOSQL_USERLIST)); + toConnection &conn = toConnection::currentConnection(parent); ConnectionKey = conn.provider() + "-" + conn.host() + "-" + @@ -145,3 +145,14 @@ QSettings s; s.setValue("schema/" + ConnectionKey, schema); } + +void toResultSchema::refresh(void) +{ + try { + toResultCombo::refresh(); + } + catch (...) + { + TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; + } +} Modified: branches/tora3/src/core/toresultschema.h =================================================================== --- branches/tora3/src/core/toresultschema.h 2012-06-11 13:35:21 UTC (rev 4347) +++ branches/tora3/src/core/toresultschema.h 2012-06-11 16:28:59 UTC (rev 4348) @@ -47,7 +47,6 @@ class toConnection; - /** * This widget displays a list of schemas * @@ -65,11 +64,13 @@ * * @param parent Parent widget. * @param name Name of widget. + * + * NOTE: this widget does not eneed any reference to toConnection, + * whenever queriyng it finds toCurrentConnection */ - toResultSchema(toConnection &conn, - QWidget *parent, - const char *name = NULL); + toResultSchema(QWidget *parent, const char *name = NULL); + virtual ~toResultSchema() {}; private slots: // stores last schema selected in qsettings @@ -89,6 +90,11 @@ * */ void update(void); + + virtual void refresh(void); + +private: + void init(toConnection &conn); }; #endif Modified: branches/tora3/src/core/totableselect.cpp =================================================================== --- branches/tora3/src/core/totableselect.cpp 2012-06-11 13:35:21 UTC (rev 4347) +++ branches/tora3/src/core/totableselect.cpp 2012-06-11 16:28:59 UTC (rev 4348) @@ -43,7 +43,7 @@ #include "core/tologger.h" #include "core/toconnection.h" #include "core/toconnectiontraits.h" -#include "core/toresultcombo.h" +#include "core/toresultschema.h" #include <QLabel> #include <QVBoxLayout> @@ -69,7 +69,7 @@ label->show(); vbox->addWidget(label); - Schema = new toResultCombo(this); + Schema = new toResultSchema(this); Schema->show(); Schema->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed)); vbox->addWidget(Schema); @@ -84,7 +84,7 @@ vbox->addWidget(Table); Schema->additionalItem(mysql ? tr("Select database") : tr("Select schema")); - Schema->query(toSQL::sql(toSQL::TOSQL_USERLIST)); + Schema->refresh(); Table->additionalItem(tr("Select table")); // petr vanek 03/01/07 bug #1180847 Error when creating referential constraint Table->setSQL(toSQL::sql("toBrowser:ListTableNames")); @@ -98,9 +98,10 @@ toTableSelect::toTableSelect(QWidget *parent, const char *name) : QGroupBox(parent) + , Schema(NULL) + , Table(NULL) { setObjectName(name); - Schema = Table = NULL; QTimer::singleShot(0, this, SLOT(setup())); } Modified: branches/tora3/src/core/totableselect.h =================================================================== --- branches/tora3/src/core/totableselect.h 2012-06-11 13:35:21 UTC (rev 4347) +++ branches/tora3/src/core/totableselect.h 2012-06-11 16:28:59 UTC (rev 4348) @@ -7,13 +7,14 @@ #include <QGroupBox> class toConnection; +class toResultSchema; class toResultCombo; class toTableSelect : public QGroupBox { Q_OBJECT - toResultCombo *Schema; + toResultSchema *Schema; toResultCombo *Table; QString SelectedTable; Modified: branches/tora3/src/toawr.cpp =================================================================== --- branches/tora3/src/toawr.cpp 2012-06-11 13:35:21 UTC (rev 4347) +++ branches/tora3/src/toawr.cpp 2012-06-11 16:28:59 UTC (rev 4348) @@ -273,6 +273,7 @@ toolbar->addWidget(new QLabel("Inst:", toolbar)); dbid = new toResultCombo(toolbar, "AWR toolbar"); + dbid->setSQL(toSQL::sql("toAWR:DBInstances", connection())); fsnap = new toResultCombo(toolbar, "AWR toolbar"); fsnap->setSelectionPolicy(toResultCombo::LastButOne); tsnap = new toResultCombo(toolbar, "AWR toolbar"); @@ -296,7 +297,7 @@ try { - dbid->query(toSQL::sql("toAWR:DBInstances", connection())); + dbid->refresh(); } TOCATCH; Deleted: branches/tora3/src/tocache.cpp =================================================================== --- branches/tora3/src/tocache.cpp 2012-06-11 13:35:21 UTC (rev 4347) +++ branches/tora3/src/tocache.cpp 2012-06-11 16:28:59 UTC (rev 4348) @@ -1,594 +0,0 @@ - -#include "tocache.h" -#include "toconfiguration.h" -#include "utils.h" -#include <QtDebug> -#include <QDir> -#include <QDateTime> -#include <QTextStream> -#include <QProgressDialog> -//#include <boost/preprocessor/iteration/detail/local.hpp> - -toCache::toCache(QString const &description) - : ConnectionDescription(description) - , state(NOT_STARTED) - , refCount(1) // we assume that we were created from toConnection -{ -} - -toCache::~toCache() -{ - /* toCache locked be parent toConnection */ - if(cacheRefreshRunning()) - ReadingThread.down(); -} - - -bool toCache::cacheAvailable(cacheEntryType type, bool block, toTask * t) -{ - toCacheState waitState = (type == SYNONYMS ? DONE : READING_SYNONYMS); - toCacheState currState = cacheState(); - - switch(toConfigurationSingle::Instance().objectCache()) - { - case toConfiguration::NEVER: - case toConfiguration::UNTIL_MANDATORY: //NOTE: this config option is not handled at all - return currState != FAILED && currState >= waitState; - case toConfiguration::ON_CONNECT: - case toConfiguration::WHEN_NEEDED: //NOTE: this config option is not handled at all - if (!block) - { - return currState != FAILED && currState >= waitState; - } - - if (t) - { - readObjects(t); - } - - if (block) - { - toBusy busy; - if (toThread::mainThread()) - { - QProgressDialog waiting(qApp->translate("toConnection", - "Waiting for object caching to be completed.\n" - "Canceling this dialog will probably leave some list of\n" - "database objects empty."), - qApp->translate("toConnection", "Cancel"), - 0, - 10, - toMainWidget()); - waiting.setWindowTitle(qApp->translate("toConnection", "Waiting for object cache")); - int num = 1; - - do - { - qApp->processEvents(); - toThread::msleep(100); - waiting.setValue((++num) % 10); - if (waiting.wasCanceled()) - return false; - currState = cacheState(); - } - while (currState < waitState); - toMainWidget()->checkCaching(); - } - - return currState != FAILED; - } - else - { - return currState != FAILED && cacheState() >= waitState; - } - default: - assert(0); - return true; // NEVER reached, just prevent MSVC warning - } //switch -} - -bool toCache::cacheRefreshRunning() const -{ - toLocker lock(cacheLock); - return state != NOT_STARTED && state != DONE; -} - -toCache::toCacheState toCache::cacheState() const -{ - toLocker lock(cacheLock); - return state; -} - -void toCache::setCacheState(toCache::toCacheState s) -{ - toLocker lock(cacheLock); - state = s; -} - -bool toCache::addIfNotExists(objectName &obj) -{ - if (!cacheAvailable(SYNONYMS, false)) - { - toStatusMessage(qApp->translate("toConnection", "Not done caching objects"), false, false); - return false; - } - std::list<objectName>::iterator i = ObjectNames.begin(); - while (i != ObjectNames.end() && (*i) < obj) - i++; - if (i != ObjectNames.end() && *i == obj) // Already exists, don't add - return false; - ObjectNames.insert(i, obj); - return true; -} - -void toCache::readObjects(toTask * t) -{ - if (toConfigurationSingle::Instance().objectCache() == toConfiguration::NEVER) - { - return ; - } - - { - try - { - (new toThread(t))->start(); - ReadingThread.down(); // Wait till child thread starts - toMainWidget()->checkCaching(); - } - catch (...) - { - state = FAILED; - } - } -} - -void toCache::rereadCache(toTask * t) -{ - - if (toConfigurationSingle::Instance().objectCache() == toConfiguration::NEVER) - { - ColumnCache.clear(); - return ; - } - - if (cacheRefreshRunning()) - { - toStatusMessage(qApp->translate("toConnection", - "Not done caching objects, can not clear unread cache")); - return ; - } - - ObjectNames.clear(); - ColumnCache.clear(); - SynonymMap.clear(); - - /** delete cache file to force reload - */ - - QString filename(cacheFile()); - - if (QFile::exists(filename)) - QFile::remove(filename); - - readObjects(t); -} - -const toCache::objectName &toCache::realName(const QString &object, - QString &synonym, - bool block, - QString user, - QString database) -{ - if (!cacheAvailable(SYNONYMS, block)) - throw qApp->translate("toConnection", "Not done caching synonyms"); - - QString name; - QString owner; - - QChar q('"'); - QChar c('.'); - - bool quote = false; - for (int pos = 0; pos < object.length(); pos++) - { - if (object.at(pos) == q) - { - quote = !quote; - } - else - { - if (!quote && object.at(pos) == c) - { - owner = name; - name = QString::null; - } - else - name += object.at(pos); - } - } - - QString uo = owner.toUpper(); - QString un = name.toUpper(); - - synonym = QString::null; - for (std::list<objectName>::iterator i = ObjectNames.begin(); i != ObjectNames.end(); i++) - { - if (owner.isEmpty()) - { - if (((*i).Name == un || (*i).Name == name) && - ((*i).Owner == user.toUpper() || (*i).Owner == database)) - return *i; - } - else if (((*i).Name == un || (*i).Name == name) && - ((*i).Owner == uo || (*i).Owner == owner)) - return *i; - } - if (owner.isEmpty()) - { - std::map<QString, objectName>::iterator i = SynonymMap.find(name); - if (i == SynonymMap.end() && un != name) - { - i = SynonymMap.find(un); - synonym = un; - } - else - synonym = name; - if (i != SynonymMap.end()) - { - return (*i).second; - } - } - throw qApp->translate( - "toConnection", - "Object %1 not available for %2").arg(object).arg(user); -} - -std::map<QString, toCache::objectName> &toCache::synonyms(bool block) -{ - if (!cacheAvailable(SYNONYMS, block)) - { - toStatusMessage(qApp->translate("toConnection", "Not done caching synonyms"), false, false); - static std::map<QString, objectName> ret; - return ret; - } - - return SynonymMap; -} - -std::list<toCache::objectName>& toCache::objects(bool block) -{ - if (!cacheAvailable(OBJECTS, block)) - { - toStatusMessage(qApp->translate("toConnection", "Not done caching objects"), false, false); - static std::list<objectName> ret; - return ret; - } - - return ObjectNames; -} - -toQDescList &toCache::columns(const objectName &object) -{ - return ColumnCache[object]; -} - -void toCache::addColumns(objectName object, toQDescList list) -{ - ColumnCache[object] = list; -} // addColumns - -const std::list<toCache::objectName> toCache::tables(const objectName &object, bool nocache) const -{ - std::list<objectName> ret; - - Q_FOREACH(objectName obj, ObjectNames) - { - if(obj.Owner == object.Name) - ret.insert(ret.end(), obj); - } - - return ret; -} - -bool toCache::objectName::operator < (const objectName &nam) const -{ - if (Owner < nam.Owner || (Owner.isNull() && !nam.Owner.isNull())) - return true; - if (Owner > nam.Owner || (!Owner.isNull() && nam.Owner.isNull())) - return false; - if (Name < nam.Name || (Name.isNull() && !nam.Name.isNull())) - return true; - if (Name > nam.Name || (!Name.isNull() && nam.Name.isNull())) - return false; - if (Type < nam.Type) - return true; - return false; -} - -bool toCache::objectName::operator == (const objectName &nam) const -{ - return Owner == nam.Owner && Name == nam.Name && Type == nam.Type; -} - -void toCache::setObjectList(const std::list<objectName> &list) -{ - ObjectNames = list; - // Set the date when information about this object was red. This will later - // be used to clean up an old information. - for (std::list<objectName>::iterator i = ObjectNames.begin(); i != ObjectNames.end(); i++) - (*i).Timestamp = QDate::currentDate(); - ObjectNames.sort(); -} // setObjectList - -void toCache::setSynonymList(const std::map<QString, objectName> &list) -{ - SynonymMap = list; -} // setSynonymList - -bool toCache::objectExists(const QString &owner, const QString &type, const QString &name) -{ - // TODO: ObjectList is sorted therefore going through all of it is not necessary! - for (std::list<objectName>::iterator i = ObjectNames.begin(); i != ObjectNames.end(); i++) - { - if (((*i).Owner == owner || owner == "%") && - (*i).Name == name && - (*i).Type == type) - return true; - } - - return false; -} // objectExists - -toCache::RowList toCache::getObjects(const QString &owner, const QString &type) -{ - Row r; - RowList rl; - for (std::list<objectName>::iterator i = ObjectNames.begin(); i != ObjectNames.end(); i++) - { - if (((*i).Owner == owner || owner == "%") && - (*i).Type == type) - { - r.append((*i).Name); - rl.append(r); - r.clear(); - } - } - - return rl; -} // getObjects - -void toCache::updateObjects(const QString &owner, const QString &type, const QList<objectName> rows) -{ - bool OwnerExists = false; - QList<objectName>::const_iterator newObjects = rows.begin(); - std::list<objectName>::iterator currentObjects = ObjectNames.begin(); - - if (ObjectNames.size() > 0) - { - // Find first object belonging to required owner/schema - while (currentObjects != ObjectNames.end() && - (*currentObjects).Owner < owner) - currentObjects++; - if (currentObjects != ObjectNames.end() && - (*currentObjects).Owner == owner) - OwnerExists = true; - } - - while (newObjects != rows.end()) - { - if (OwnerExists) - { - while (currentObjects != ObjectNames.end() && - (*currentObjects).Type != type) - currentObjects++; // skip cached objects of other types - - if (currentObjects != ObjectNames.end() && - (*currentObjects).Name == (*newObjects).Name) - { - //qDebug() << "Object is already in cache" << (*newObjects).Name; - currentObjects++; - newObjects++; - } - else if (currentObjects != ObjectNames.end() && - (*currentObjects).Name < (*newObjects).Name) - { - //qDebug() << "DELETE:" << (*currentObjects).Name; - currentObjects = ObjectNames.erase(currentObjects); - } - else - { - //qDebug() << "NEW:" << (*newObjects).Name; - ObjectNames.insert(currentObjects, (*newObjects)); - newObjects++; - } - } - else - { - //qDebug() << "NEW2:" << (*newObjects).Name; - ObjectNames.insert(currentObjects, (*newObjects)); - newObjects++; - } - } - // Delete any remaining objects - while (OwnerExists && - currentObjects != ObjectNames.end() && - (*currentObjects).Owner == owner) - { - //qDebug() << "iterating2 through" << (*currentObjects).Name; - if ((*currentObjects).Type == type) - { - //qDebug() << "DELETE2:" << (*currentObjects).Name; - currentObjects = ObjectNames.erase(currentObjects); - } - else - currentObjects++; - } -} // updateObjects - -QString toCache::cacheDir() -{ - QString home(QDir::homePath()); - QString dirname(toConfigurationSingle::Instance().cacheDir()); - - if (dirname.isEmpty()) - { -#ifdef Q_OS_WIN32 - if (getenv("TEMP")) - dirname = QString(getenv("TEMP")); - else -#endif - dirname = QString(home); - dirname += "/.tora_cache"; - } - return dirname; -} // cacheDir - -QString toCache::cacheFile() -{ - QString ret (ConnectionDescription.trimmed()); - // using instantclient connectionstrins can result in file name like this: - // isepl_global_stage@//oraclexe11:1521/xe - // which is invalid. Just remove "/" or replace it with something safer. - ret = ret.replace("/", "_"); - - return cacheDir() + "/" + ret; -} // cacheFile - -bool toCache::loadDiskCache() -{ - if (!toConfigurationSingle::Instance().cacheDisk()) - return false; - - objectName *cur = 0; - int objCounter = 0; - int synCounter = 0; - - QString filename = cacheFile(); - - QFile file(filename); - - if (!QFile::exists(filename)) - return false; - - QFileInfo fi(file); - QDateTime today; - if (fi.lastModified().addDays(toConfigurationSingle::Instance().cacheTimeout()) < today) - return false; - - /** read in all data - */ - - if (!file.open(QIODevice::ReadOnly)) - return false; - - QString data = file.readAll(); - - /** build cache lists - */ - - if(!data.isEmpty()) - { - QStringList records = data.split("\x1D", QString::KeepEmptyParts); - for (QStringList::Iterator i = records.begin(); i != records.end(); i++) - { - objCounter++; - QStringList record = (*i).split("\x1E", QString::KeepEmptyParts); - QStringList::Iterator rec = record.begin(); - cur = new objectName; - (*cur).Owner = (*rec); - rec++; - (*cur).Name = (*rec); - rec++; - (*cur).Type = (*rec); - rec++; - (*cur).Comment = (*rec); - rec++; - QStringList slist = (*rec).split("\x1F", QString::SkipEmptyParts); - for (QStringList::Iterator s = slist.begin(); s != slist.end(); s++) - { - SynonymMap[(*s)] = (*cur); - (*cur).Synonyms.insert((*cur).Synonyms.end(), (*s)); - synCounter++; - } - /** TODO: This "if" condition is added here for bakwards compatibility as timestamp - * parameter was not saved to disk before 2010-12-12. Therefore this condition can - * be removed after 2011-12-12 (one year for everybody to update). Another way to - * fix this is to delete the cache. - */ - if (record.count() >= 6) - { - rec++; - (*cur).Timestamp = QDate::fromString((*rec), "yyyy-MM-dd"); - } - else - (*cur).Timestamp = QDate::currentDate(); - ObjectNames.insert(ObjectNames.end(), (*cur)); - delete cur; - cur = 0; - } - } - - { - toLocker lock(cacheLock); - ObjectNames.sort(); - } - return true; -} - -void toCache::writeDiskCache() -{ - QString text; - long objCounter = 0; - long synCounter = 0; - - if (!toConfigurationSingle::Instance().cacheDisk()) - return ; - - QString filename(cacheFile()); - - /** check pathnames and create - */ - QString dirname(cacheDir()); - QDir dir; - dir.setPath(dirname); - - if (!dir.exists(dirname)) - dir.mkdir(dirname); - - /** build record to write out - */ - QStringList record; // information about one object - QStringList records; // all objects - QStringList recordSynonym; // all synonyms of one particular object - for (std::list<objectName>::iterator i = ObjectNames.begin(); i != ObjectNames.end(); i++) - { - record.clear(); - record.append((*i).Owner); - record.append((*i).Name); - record.append((*i).Type); - record.append((*i).Comment); - for (std::list<QString>::iterator s = (*i).Synonyms.begin(); s != (*i).Synonyms.end(); s++) - { - recordSynonym.append((*s)); - synCounter++; - } - record.append(recordSynonym.join("\x1F")); - record.append((*i).Timestamp.toString("yyyy-MM-dd")); - recordSynonym.clear(); - objCounter++; - records.append(record.join("\x1E")); - } - - /** Write all records to a file - */ - QFile file(filename); - if (file.open(QIODevice::ReadWrite | QIODevice::Truncate)) - { - QTextStream t(&file); - t << records.join("\x1D"); - file.flush(); - file.close(); - } - else - qDebug() << "Cannot open file" << filename << "!"; -} Deleted: branches/tora3/src/tocache.h =================================================================== --- branches/tora3/src/tocache.h 2012-06-11 13:35:21 UTC (rev 4347) +++ branches/tora3/src/tocache.h 2012-06-11 16:28:59 UTC (rev 4348) @@ -1,253 +0,0 @@ -#ifndef TOCACHE_H -#define TOCACHE_H - -#include "tothread.h" -#include <QMetaType> -#include <QDate> -#include <QList> -#include <QVariant> -#include <map> -#include <list> -#include <set> - -/** Object cache for a connection. This class is accessed only through toConnection - a could be a nested class of toConnection. - */ -class toConnection; - -class toCache : public QObject -{ - friend class toConnection; - /** Description of connection for which this instance of cache is used. - * This name is used as a filename to store cache content between TOra runs. - */ - QString ConnectionDescription; - unsigned refCount; // Multiple connections can point onto same toCache instance, the last connection should delete me. -public: - mutable toLock cacheLock; - - typedef QList<QVariant> Row; // NOTE: first (0th) value in a row is a row number (see variable currRowKey) - typedef QList<Row> RowList; - - enum toCacheState - { - - NOT_STARTED = 0, - READING_OBJECTS, - READING_SYNONYMS, - DONE, - FAILED - }; - - /* This enum is used to distingish parameter of cacheAvailable */ - enum cacheEntryType - { - SYNONYMS, - OBJECTS - }; - - /* This semaphore is used to synchronize with toConnection::cacheObjects::run() - is initialized in toConnection constructors to 2 - */ - toSemaphore ReadingThread; - - /** Contain information about a tablename. - */ - struct objectName - { - /** The object name - */ - QString Name; - /** The schema that owns it - */ - QString Owner; - /** Object type - */ - QString Type; - /** Comment about this object - */ - QString Comment; - /** synonyms (used for faster disk caching...) - */ - std::list <QString> Synonyms; - - /** A date when information about this particular object was last updated - */ - QDate Timestamp; - - /** Create an object name with filled in values. - */ - objectName(const QString &owner, const QString &name, const QString &type = QString("TABLE"), const QString &comment = QString::null) - : Name(name), Owner(owner), Type(type), Comment(comment) - { } - - /** Create an empty object name. - */ - objectName() - { } - bool operator < (const objectName &) const; - bool operator == (const objectName &) const; - }; - - /** This structure is used to describe the resultset of a query. - */ - struct queryDescribe - { - /** Column name - */ - QString Name; - /** Datatype of string. - */ - QString Datatype; - /** If column can contain null values. - */ - bool Null; - /** Preferred alignment of this kind of value. - */ - bool AlignRight; - /** Comment on column (Only filled out in column cache. - */ - QString Comment; - }; - -private: - std::list<objectName> ObjectNames; - std::map<QString, objectName> SynonymMap; - - toCacheState state; - void setCacheState(toCacheState); -public: - typedef queryDescribe toQDescribe; - typedef std::list<toQDescribe> toQDescList; - - std::map<objectName, toQDescList> ColumnCache; - - toCache(QString const &description); - ~toCache(); - - /** Load cache information for current connection from a file on disk - * @return True if cache was loaded - */ - bool loadDiskCache(void)... [truncated message content] |
From: <ibr...@us...> - 2012-06-12 15:31:49
|
Revision: 4351 http://tora.svn.sourceforge.net/tora/?rev=4351&view=rev Author: ibre5041 Date: 2012-06-12 15:31:39 +0000 (Tue, 12 Jun 2012) Log Message: ----------- test2 added Modified Paths: -------------- branches/tora3/src/CMakeLists.txt Added Paths: ----------- branches/tora3/src/tests/test2.cpp Modified: branches/tora3/src/CMakeLists.txt =================================================================== --- branches/tora3/src/CMakeLists.txt 2012-06-12 14:37:51 UTC (rev 4350) +++ branches/tora3/src/CMakeLists.txt 2012-06-12 15:31:39 UTC (rev 4351) @@ -700,11 +700,27 @@ # explicitly say that the executable depends on the svnheader ADD_DEPENDENCIES("test1" revisiontag) +# test2 +ADD_EXECUTABLE("test2" ${GUI_TYPE} + tests/test2.cpp + ${TORA_UI_SOURCES} + ${TORA_I18N_QM} + ${TORA_MOC_SOURCES} + ${TORA_SOURCES} + ${TORA_RCC_SRCS} + ${APPLE_BUNDLE_SOURCES} + ) +TARGET_LINK_LIBRARIES("test2" ${TORA_LIBS}) +SET_TARGET_PROPERTIES("test2" PROPERTIES ENABLE_EXPORTS ON) +# explicitly say that the executable depends on the svnheader +ADD_DEPENDENCIES("test2" revisiontag) + IF(USE_PCH) IF(CMAKE_GENERATOR MATCHES Visual*) # ADD_MSVC_PRECOMPILED_HEADERS( "stdafx.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/precompiled.h" ${EXE_NAME}) # only one target can use precompiled headers on windows - cmake is insane - ADD_MSVC_PRECOMPILED_HEADERS( "stdafx.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/precompiled.h" "test1") +# ADD_MSVC_PRECOMPILED_HEADERS( "stdafx.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/precompiled.h" "test1") +# ADD_MSVC_PRECOMPILED_HEADERS( "stdafx.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/precompiled.h" "test2") ELSE(CMAKE_GENERATOR MATCHES Visual*) ADD_PRECOMPILED_HEADER(${EXE_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/precompiled.h) ADD_PRECOMPILED_HEADER("test1" ${CMAKE_CURRENT_SOURCE_DIR}/precompiled.h) @@ -721,7 +737,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} ${TORA_LIB} "trotl") + TARGET_LINK_LIBRARIES(${PROVIDER_ORACLE} ${ORACLE_LIBRARIES} ${QT_LIBRARIES} test2 "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/tests/test2.cpp =================================================================== --- branches/tora3/src/tests/test2.cpp (rev 0) +++ branches/tora3/src/tests/test2.cpp 2012-06-12 15:31:39 UTC (rev 4351) @@ -0,0 +1,178 @@ + +/* 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/utils.h" +#include "core/tologger.h" + +#include "core/toabout.h" +#include "core/toconf.h" +#include "core/tomain.h" +#include "core/tosql.h" +#include "core/toconfiguration.h" +#include "core/toqvalue.h" +#include "core/tomarkedtext.h" +#include "core/tosplash.h" +#include "core/toconnection.h" +#include "core/toeventquerytask.h" +#include "core/toraversion.h" + +#include "core/toconnectionprovider.h" +#include "core/toconnection.h" + +#include <QDateTime> +#include <QApplication> +#include <QMessageBox> +#include <QTextCodec> +#include <QString> +#include <QTranslator> +#include <QStyleFactory> +#include <QLibrary> + +#include <memory> + +static void usage() +{ + printf("Usage:\n\n test2 [connectstring]\n\n"); + exit(2); +} + +int main(int argc, char **argv) +{ + toConfiguration::setQSettingsEnv(); + + /*! \warning: Keep the code before QApplication init as small + as possible. There could be serious display issues when + you construct some Qt classes before QApplication. + It's the same for global static stuff - some instances can + break it (e.g. qscintilla lexers etc.). + */ + QApplication app(argc, argv); + + QString style(toConfigurationSingle::Instance().style()); + if (!style.isEmpty()) + QApplication::setStyle(QStyleFactory::create(style)); + + // Set the default codec to use for QString + QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); + + try + { + toQValue::setNumberFormat( + toConfigurationSingle::Instance().numberFormat(), + toConfigurationSingle::Instance().numberDecimals()); + + toMarkedText::setDefaultTabWidth(toConfigurationSingle::Instance().tabStop()); + toMarkedText::setDefaultTabSpaces(toConfigurationSingle::Instance().tabSpaces()); + + qRegisterMetaType<toQColumnDescriptionList>("toQColumnDescriptionList&"); + qRegisterMetaType<ValuesList>("ValuesList&"); + qRegisterMetaType<toConnection::exception>("toConnection::exception"); + + if (qApp->argc() != 2) + usage(); + + QString connect = QString::fromLatin1(qApp->argv()[1]); + QString user, password, database; + + QStringList slashList, atList = connect.split("@", QString::SkipEmptyParts); + if( atList.size() == 1) + database = QString::fromLatin1(qgetenv("ORACLE_SID")); + if( atList.size() > 2) + usage(); + + if ( atList.at(0).contains("/")) + { + slashList = atList.at(0).split("/", QString::SkipEmptyParts); + user = slashList.at(0); + password = slashList.at(1); + database = atList.at(1); + } else { + slashList = atList.at(1).split("/", QString::SkipEmptyParts); + user = atList.at(0); + database = slashList.at(0); + password = slashList.at(1); + } + + // List of all connection provider finders + std::vector<std::string> finders = ConnectionProviderFinderFactory::Instance().keys(); + // Resulting list of all the providers found + QList<toConnectionProviderFinder::ConnectionProvirerParams> allProviders; + // Loop over all finders and all ther find method each of them can return more locations + for(std::vector<std::string>::const_iterator i = finders.begin(); i != finders.end(); ++i) + { + TLOG(5, toDecorator, __HERE__) << "Looking for client: " << *i << std::endl; + std::auto_ptr<toConnectionProviderFinder> finder = ConnectionProviderFinderFactory::Instance().create(*i, 0); + QList<toConnectionProviderFinder::ConnectionProvirerParams> l = finder->find(); + allProviders.append(l); + } + foreach(toConnectionProviderFinder::ConnectionProvirerParams p, allProviders) + { + QString providerName = p.value("PROVIDER").toString(); + if(providerName == "Oracle") + { + toConnectionProviderRegistrySing::Instance().load(p); + break; + } + } + + + QSet<QString> options; + toConnection *oraCon = new toConnection( + QString("Oracle"), + user, + password, + "", + database, + "", + "", + options); + TLOG(0,toDecorator,__HERE__) << "Version: " << oraCon->version() << std::endl; + } + catch (const QString &str) + { + std::cerr << "Unhandled exception:"<< std::endl << std::endl << qPrintable(str) << std::endl; + TOMessageBox::critical(NULL, + qApp->translate("main", "Unhandled exception"), + str, + qApp->translate("main", "Exit")); + } + return 1; +} Property changes on: branches/tora3/src/tests/test2.cpp ___________________________________________________________________ Added: svn:executable + * This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2012-06-13 14:09:21
|
Revision: 4352 http://tora.svn.sourceforge.net/tora/?rev=4352&view=rev Author: ibre5041 Date: 2012-06-13 14:09:10 +0000 (Wed, 13 Jun 2012) Log Message: ----------- Modified Paths: -------------- branches/tora3/src/CMakeLists.txt branches/tora3/src/connection/tooracleconnection.cpp branches/tora3/src/core/tocache.cpp branches/tora3/src/core/tocache.h branches/tora3/src/core/toconnection.cpp branches/tora3/src/core/toconnection.h branches/tora3/src/core/tologger.h branches/tora3/src/tests/test2.cpp branches/tora3/src/ts_log/ts_log_utils.h Added Paths: ----------- branches/tora3/src/connection/tooraclesql.cpp Modified: branches/tora3/src/CMakeLists.txt =================================================================== --- branches/tora3/src/CMakeLists.txt 2012-06-12 15:31:39 UTC (rev 4351) +++ branches/tora3/src/CMakeLists.txt 2012-06-13 14:09:10 UTC (rev 4352) @@ -435,6 +435,7 @@ migratetool/tora3.cpp connection/tooraclefind.cpp + connection/tooraclesql.cpp connection/toteradatafind.cpp docklets/toviewconnections.cpp Modified: branches/tora3/src/connection/tooracleconnection.cpp =================================================================== --- branches/tora3/src/connection/tooracleconnection.cpp 2012-06-12 15:31:39 UTC (rev 4351) +++ branches/tora3/src/connection/tooracleconnection.cpp 2012-06-13 14:09:10 UTC (rev 4352) @@ -85,13 +85,13 @@ ::trotl::OciLogin *login = NULL; QString oldSid; - QSet<QString> options = connection().options(); + QSet<QString> options = parentConnection().options(); bool sqlNet = (options.find("SQL*Net") != options.end()); if (!sqlNet) { oldSid = getenv("ORACLE_SID"); - Utils::toSetEnv("ORACLE_SID", connection().database()); + Utils::toSetEnv("ORACLE_SID", parentConnection().database()); } try { @@ -110,8 +110,8 @@ conn->server_attach(); else */ - QString user = connection().user(); - QString pass = connection().password(); + QString user = parentConnection().user(); + QString pass = parentConnection().password(); try { @@ -120,7 +120,7 @@ ::trotl::LoginPara( user.isEmpty() ? "" : user.toUtf8().constData(), pass.isEmpty() ? "" : pass.toUtf8().constData(), - connection().database().toUtf8().constData() + parentConnection().database().toUtf8().constData() ), (ub4) session_mode); conn = new ::trotl::OciConnection(_env, *login); @@ -174,12 +174,12 @@ user.isEmpty() ? "" : user.toUtf8().constData(), pass.isEmpty() ? "" : pass.toUtf8().constData(), newpass.isEmpty() ? "" : newpass.toUtf8().constData(), - connection().database().toUtf8().constData() + parentConnection().database().toUtf8().constData() ), (ub4) session_mode); conn = new ::trotl::OciConnection(_env, *login); - connection().setPassword(newpass); + parentConnection().setPassword(newpass); } else { Added: branches/tora3/src/connection/tooraclesql.cpp =================================================================== --- branches/tora3/src/connection/tooraclesql.cpp (rev 0) +++ branches/tora3/src/connection/tooraclesql.cpp 2012-06-13 14:09:10 UTC (rev 4352) @@ -0,0 +1,61 @@ + +/* 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/tosql.h" + +static toSQL SQLListObjectsInDatabase("toConnection:ListObjectsInDatabase", + "select a.owner,a.object_name,a.object_type,b.comments\n" + " from sys.all_objects a,\n" + " sys.all_tab_comments b\n" + " where a.owner = b.owner(+) and a.object_name = b.table_name(+)\n" + , "List all the objects to cache for a connection" + , "0800" + , "Oracle"); + +static toSQL SQLListObjectInSchema("toConnection:ListObjectsInSchema", + "select a.owner,a.object_name,a.object_type,b.comments\n" + " from sys.all_objects a,\n" + " sys.all_tab_comments b\n" + " where a.owner = b.owner(+) and a.object_name = b.table_name(+)\n" + " and a.owner = :owner<char[101]> \n" + , "List all the objects to cache for a connection" + , "0800" + , "Oracle"); Modified: branches/tora3/src/core/tocache.cpp =================================================================== --- branches/tora3/src/core/tocache.cpp 2012-06-12 15:31:39 UTC (rev 4351) +++ branches/tora3/src/core/tocache.cpp 2012-06-13 14:09:10 UTC (rev 4352) @@ -1,4 +1,4 @@ -/* BEGIN_COMMON_COPYRIGHT_HEADER +/* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers * @@ -311,17 +311,16 @@ void toCache::readObjects(toTask * t) { - if( toConfigurationSingle::Instance().objectCache() == toConfiguration::NEVER) - { - return; - } - try { (new toThread(t))->start(); ReadingThreadSemaphore.down(); // Wait till child thread starts /// TODO migrate this too, probably somewhere in toConnection - toMainWidget()->checkCaching(); // notify main window about the change of cache's state + toMainWindow *w = toMainWidget(); + if (w != NULL) + { + w->checkCaching(); // notify main window about the change of cache's state + } } catch (...) { @@ -503,7 +502,7 @@ in >> ownersMapSize; in >> usersMapSize; } - for(int i = 0; i < entryMapSize; i++) + for(quint32 i = 0; i < entryMapSize; i++) { CacheEntry e, *clone; in >> e; @@ -513,17 +512,17 @@ } // TODO this can be avoided (probably) - for(int i = 0; i < synonymMapSize; i++) + for(quint32 i = 0; i < synonymMapSize; i++) { CacheEntry e, *clone; in >> e; } - for(int i = 0; i < columnCacheSize; i++) + for(quint32 i = 0; i < columnCacheSize; i++) { CacheEntry e, *clone; in >> e; } - for(int i = 0; i < ownersMapSize; i++) + for(quint32 i = 0; i < ownersMapSize; i++) { CacheEntry e, *clone; in >> e; @@ -531,7 +530,7 @@ if( clone != NULL) addEntry(cloneCacheEntry(e)); } - for(int i = 0; i < usersMapSize; i++) + for(quint32 i = 0; i < usersMapSize; i++) { CacheEntry e, *clone; in >> e; Modified: branches/tora3/src/core/tocache.h =================================================================== --- branches/tora3/src/core/tocache.h 2012-06-12 15:31:39 UTC (rev 4351) +++ branches/tora3/src/core/tocache.h 2012-06-13 14:09:10 UTC (rev 4352) @@ -245,12 +245,12 @@ /** get list of the all the objects held in the cache */ QList<CacheEntry const*> objects(bool wait = false) const; - +private: /** * Starts a new thread which will read all objects and synonyms from the database. */ void readObjects(toTask * t); - +public: /** Reread the object and column cache. */ void rereadCache(toTask * t); Modified: branches/tora3/src/core/toconnection.cpp =================================================================== --- branches/tora3/src/core/toconnection.cpp 2012-06-12 15:31:39 UTC (rev 4351) +++ branches/tora3/src/core/toconnection.cpp 2012-06-13 14:09:10 UTC (rev 4352) @@ -46,6 +46,7 @@ #include "core/tologger.h" #include "core/toconf.h" #include "core/tocache.h" +#include "core/tosql.h" #include "core/totool.h" #include "core/toquery.h" #include "core/toqvalue.h" @@ -174,27 +175,16 @@ Utils::toBusy busy; Abort = true; - //unsigned cacheRefCnt; - //{ - // toLocker clock(Cache->cacheLock); - // cacheRefCnt = --Cache->refCount; - //} - //if(cacheRefCnt == 0) - //{ - // this->Cache->writeDiskCache(); - // // this will wait for cacheObjects thread to finish in toCache::~toCache - // delete this->Cache; - //} - unsigned cacheNewRefCnt; { - toExclusiveLocker clock(pCache->cacheLock); - cacheNewRefCnt = pCache->refCount.deref(); + toExclusiveLocker clock(getCache().cacheLock); + cacheNewRefCnt = getCache().refCount.deref(); } if(cacheNewRefCnt == 0) { ////TODO this->CacheNew->writeDiskCache(); // this will wait for cacheObjects thread to finish in toCache::~toCache + getCache().writeDiskCache(); delete this->pCache; } @@ -346,20 +336,40 @@ void toConnection::cacheObjects::run() { /* Increase the semaphore to "unlock" parent thread, it's waiting for our start */ - Connection->pCache->ReadingThreadSemaphore.up(); - Connection->pCache->setCacheState(toCache::READING_FROM_DB); + parentConnection().getCache().ReadingThreadSemaphore.up(); - //QList<toCache::CacheEntry*> objs = Connection->Connection->objectNamesNew(); - //if (!Connection->Abort) - //{ - // Q_FOREACH(toCache::CacheEntry* o, objs) - // { - // Connection->CacheNew->addEntry(o); - // } - //} + parentConnection().getCache().setCacheState(toCache::READING_FROM_DISK); + bool diskloaded = parentConnection().getCache().loadDiskCache(); + if (diskloaded) + { + // TODO: Check if really whole cache was loaded. + // the file image could contain only some schemas or part of the schema + parentConnection().getCache().setCacheState(toCache::DONE); + return; + } - Connection->pCache->ownersRead = true; - Connection->pCache->setCacheState(toCache::DONE); + parentConnection().getCache().setCacheState(toCache::READING_FROM_DB); + try { + toQuery objects(parentConnection(), toSQL::sql("toConnection:ListObjectsInDatabase", parentConnection()), toQueryParams()); + while (!objects.eof()) + { + // TODO #warning "check connection's parent Abort flag" + QString owner = objects.readValue(); + QString name = objects.readValue(); + QString type = objects.readValue(); + QString comment = objects.readValue(); + toCache::CacheEntry *e = toCache::createCacheEntry(owner, name, type, comment); + if(e) + parentConnection().getCache().addEntry(e); + } + }catch (toConnection::exception const &exc) { + parentConnection().getCache().setCacheState(toCache::FAILED); + throw exc; + return; + } + + parentConnection().getCache().ownersRead = true; + parentConnection().getCache().setCacheState(toCache::DONE); }; //void toConnection::cacheObjects::run() @@ -471,75 +481,21 @@ void toConnection::rereadCache(void) { - ///Cache->rereadCache(new cacheObjects(this)); - pCache->rereadCache(new cacheObjects(this)); + getCache().rereadCache(new cacheObjects(*this)); } -//const QList<toConnection::objectName> &toConnection::objects(bool block) const -//{ -// return Cache->objects(block); -//} -//tool QList<toCache::CacheEntry const*> toConnection::objects(bool block) const -//{ -// return CacheNew->objects(block); -//} - -//bool toConnection::rereadObjects(const QString &owner, -// const QString &type, -// const QString &name) -//{ -// bool added = false; // did we actually add at least one new object? -// -// ///QList<toConnection::objectName> objects = this->Connection->objectNames(owner, type, name); -// ///for (QList<toConnection::objectName>::iterator i = objects.begin(); i != objects.end(); i++) -// ///{ -// /// added = added || Cache->addIfNotExists(*i); -// ///} -// // TODO: If all objects of a particular type/owner are fetched we should delete all non -// // matching records from the cache! -// return added; -//} // rereadObjects bool toConnection::rereadObjectNew(const QString &owner, const QString &name) { bool added = false; return added; } -//bool toConnection::cacheAvailable(toCache::cacheEntryType type, bool block) -//{ -// return Cache->cacheAvailable(type, block, new cacheObjects(this)); -//} - bool toConnection::cacheRefreshRunning() const { //tool return CacheNew->cacheRefreshRunning(); return false; //tool must return value } -//const toConnection::objectName& toConnection::realName(const QString &object, QString &synonym, bool block) const -//{ -// return Cache->realName(object, synonym, block, user(), database()); -//} - -//const toConnection::objectName& toConnection::realName(const QString &object, bool block) const -//{ -// QString dummy; -// return Cache->realName(object, dummy, block, user(), database()); -//} - -//const std::list<toConnection::objectName> toConnection::tables(const objectName &object, bool nocache) const -//{ -// return Cache->tables(object, nocache); -//} - -//void toConnection::connectionImpl::parse(toConnectionSub *, -// const QString &) -//{ -// throw qApp->translate( -// "toConnection", -// "Parse only not implemented for this type of connection"); -//} - toConnectionSub* toConnection::borrowSub() { toLocker clock(ConnectionLock); Modified: branches/tora3/src/core/toconnection.h =================================================================== --- branches/tora3/src/core/toconnection.h 2012-06-12 15:31:39 UTC (rev 4351) +++ branches/tora3/src/core/toconnection.h 2012-06-13 14:09:10 UTC (rev 4352) @@ -333,18 +333,18 @@ */ class connectionImpl { - toConnection &Connection; + toConnection &_pConnection; public: /** Get the parent connection object of this connection. */ - toConnection& connection(void) + toConnection& parentConnection(void) { - return Connection; + return _pConnection; } /** Create a new connection implementation for a connection. * @param conn Connection to implement. */ - connectionImpl(toConnection &conn) : Connection(conn) {} + connectionImpl(toConnection &conn) : _pConnection(conn) {} /** Destructor. */ virtual ~connectionImpl() {} @@ -358,9 +358,16 @@ class cacheObjects: public toTask { - QPointer<toConnection> Connection; + toConnection &_pConnection; public: - cacheObjects(toConnection *conn) : Connection(conn) { } + cacheObjects(toConnection &conn) : _pConnection(conn) { } + + /** Get the parent connection object of this connection. */ + toConnection& parentConnection(void) + { + return _pConnection; + } + virtual void run(void); }; Modified: branches/tora3/src/core/tologger.h =================================================================== --- branches/tora3/src/core/tologger.h 2012-06-12 15:31:39 UTC (rev 4351) +++ branches/tora3/src/core/tologger.h 2012-06-13 14:09:10 UTC (rev 4352) @@ -27,15 +27,15 @@ #define TLOG(lognumber, decorator, where) get_log(lognumber).ts<decorator>( where) -#define DISABLE_LOG(lognumber) \ - template<> \ - inline thread_safe_log templ_get_log_ownthread(int_to_type<lognumber>*) \ - { \ - static s_null_sink nsink; \ - static std::ostream out(&nsink); \ - static internal_thread_safe_log_ownthread log( out ); \ - return thread_safe_log( log); \ - }; +#define DISABLE_LOG(lognumber) \ + template<> \ + inline thread_safe_log templ_get_log_ownthread(int_to_type<lognumber>*) \ + { \ + static s_null_sink nsink; \ + static std::ostream out(&nsink); \ + static internal_thread_safe_log_ownthread log( out ); \ + return thread_safe_log( log); \ + }; typedef Tdecorator < TSLOG_TYPELIST_6(dashDecorator<4>, @@ -50,15 +50,15 @@ TSLOG_TYPELIST_1(charDecorator < ' ' > ) > toNoDecorator; -/** Wrapper class for Boost's null_sink ostream +/** Wrapper class for Boost's null_sink ostream */ -struct s_null_sink : public boost::iostreams::stream_buffer<boost::iostreams::null_sink> -{ - s_null_sink() - { - open(boost::iostreams::null_sink() ); - } -}; +struct s_null_sink : public boost::iostreams::stream_buffer<boost::iostreams::null_sink> +{ + s_null_sink() + { + open(boost::iostreams::null_sink() ); + } +}; template< int idxLog> inline thread_safe_log templ_get_log_ownthread( int_to_type< idxLog> *i = NULL ) @@ -86,24 +86,24 @@ */ return thread_safe_log( log); } - -//DISABLE_LOG(0); // generic debug <0> -//DISABLE_LOG(1); // exceptions debug<1> -//DISABLE_LOG(2); -//DISABLE_LOG(3); // tonoblockquery<3> - debugging(disabled) -//DISABLE_LOG(4); // tonoblockquery<4> - data read(disabled) -//DISABLE_LOG(5); // tonoblockquery<5> -//DISABLE_LOG(6); // tonoblockquery<6> - -/* use this if you want output into the file -thread_safe_log templ_get_log_ownthread<1>( int_to_type< 1> * = NULL ) -{ - static std::ofstream out( get_out_name< idxLog>( false).c_str() ); - static internal_thread_safe_log_ownthread log( out); - return thread_safe_log( log); -} -*/ +//DISABLE_LOG(0); // generic debug <0> +//DISABLE_LOG(1); // exceptions debug<1> +//DISABLE_LOG(2); +DISABLE_LOG(3); // tonoblockquery<3> - debugging(disabled) +DISABLE_LOG(4); // tonoblockquery<4> - data read(disabled) +DISABLE_LOG(5); // tonoblockquery<5> +//DISABLE_LOG(6); // tonoblockquery<6> + +/* use this if you want output into the file +thread_safe_log templ_get_log_ownthread<1>( int_to_type< 1> * = NULL ) +{ + static std::ofstream out( get_out_name< idxLog>( false).c_str() ); + static internal_thread_safe_log_ownthread log( out); + return thread_safe_log( log); +} +*/ + inline thread_safe_log get_log( int idxLog) { switch( idxLog) @@ -114,9 +114,9 @@ case 3: return templ_get_log_ownthread< 3>(NULL); // tonoblockquery log case 4: return templ_get_log_ownthread< 4>(NULL); // data read log case 5: return templ_get_log_ownthread< 5>(NULL); // logger docket log - case 6: return templ_get_log_ownthread< 6>(NULL); // not used yet - case 7: return templ_get_log_ownthread< 7>(NULL); // not used yet - case 8: return templ_get_log_ownthread< 8>(NULL); // not used yet + case 6: return templ_get_log_ownthread< 6>(NULL); // not used yet + case 7: return templ_get_log_ownthread< 7>(NULL); // not used yet + case 8: return templ_get_log_ownthread< 8>(NULL); // not used yet case 9: return templ_get_log_ownthread< 9>(NULL); // not used yet default: assert( false); Modified: branches/tora3/src/tests/test2.cpp =================================================================== --- branches/tora3/src/tests/test2.cpp 2012-06-12 15:31:39 UTC (rev 4351) +++ branches/tora3/src/tests/test2.cpp 2012-06-13 14:09:10 UTC (rev 4352) @@ -69,10 +69,10 @@ #include <memory> static void usage() -{ - printf("Usage:\n\n test2 [connectstring]\n\n"); - exit(2); -} +{ + printf("Usage:\n\n test2 [connectstring]\n\n"); + exit(2); +} int main(int argc, char **argv) { @@ -106,31 +106,31 @@ qRegisterMetaType<ValuesList>("ValuesList&"); qRegisterMetaType<toConnection::exception>("toConnection::exception"); - if (qApp->argc() != 2) - usage(); - - QString connect = QString::fromLatin1(qApp->argv()[1]); - QString user, password, database; - - QStringList slashList, atList = connect.split("@", QString::SkipEmptyParts); - if( atList.size() == 1) - database = QString::fromLatin1(qgetenv("ORACLE_SID")); - if( atList.size() > 2) - usage(); - - if ( atList.at(0).contains("/")) - { - slashList = atList.at(0).split("/", QString::SkipEmptyParts); - user = slashList.at(0); - password = slashList.at(1); - database = atList.at(1); - } else { - slashList = atList.at(1).split("/", QString::SkipEmptyParts); - user = atList.at(0); - database = slashList.at(0); - password = slashList.at(1); - } - + if (qApp->argc() != 2) + usage(); + + QString connect = QString::fromLatin1(qApp->argv()[1]); + QString user, password, database; + + QStringList slashList, atList = connect.split("@", QString::SkipEmptyParts); + if( atList.size() == 1) + database = QString::fromLatin1(qgetenv("ORACLE_SID")); + if( atList.size() > 2) + usage(); + + if ( atList.at(0).contains("/")) + { + slashList = atList.at(0).split("/", QString::SkipEmptyParts); + user = slashList.at(0); + password = slashList.at(1); + database = atList.at(1); + } else { + slashList = atList.at(1).split("/", QString::SkipEmptyParts); + user = atList.at(0); + database = slashList.at(0); + password = slashList.at(1); + } + // List of all connection provider finders std::vector<std::string> finders = ConnectionProviderFinderFactory::Instance().keys(); // Resulting list of all the providers found @@ -142,7 +142,7 @@ std::auto_ptr<toConnectionProviderFinder> finder = ConnectionProviderFinderFactory::Instance().create(*i, 0); QList<toConnectionProviderFinder::ConnectionProvirerParams> l = finder->find(); allProviders.append(l); - } + } foreach(toConnectionProviderFinder::ConnectionProvirerParams p, allProviders) { QString providerName = p.value("PROVIDER").toString(); @@ -152,19 +152,21 @@ break; } } - - + + QSet<QString> options; - toConnection *oraCon = new toConnection( - QString("Oracle"), - user, - password, - "", - database, - "", - "", - options); + QPointer<toConnection> oraCon = new toConnection( + QString("Oracle"), + user, + password, + "", + database, + "", + "", + options); TLOG(0,toDecorator,__HERE__) << "Version: " << oraCon->version() << std::endl; + oraCon->rereadCache(); + delete oraCon; } catch (const QString &str) { Modified: branches/tora3/src/ts_log/ts_log_utils.h =================================================================== --- branches/tora3/src/ts_log/ts_log_utils.h 2012-06-12 15:31:39 UTC (rev 4351) +++ branches/tora3/src/ts_log/ts_log_utils.h 2012-06-13 14:09:10 UTC (rev 4352) @@ -16,7 +16,7 @@ #endif #else -#define __HERE__ "" +#define __HERE__ std::string() #endif #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2012-06-14 16:14:21
|
Revision: 4353 http://tora.svn.sourceforge.net/tora/?rev=4353&view=rev Author: ibre5041 Date: 2012-06-14 16:14:14 +0000 (Thu, 14 Jun 2012) Log Message: ----------- cache synch/asynch API cache disk write/load Modified Paths: -------------- branches/tora3/src/core/tocache.cpp branches/tora3/src/core/tocache.h branches/tora3/src/core/toconnection.cpp branches/tora3/src/core/toconnection.h branches/tora3/src/core/tomain.cpp branches/tora3/src/core/totaskrunner.cpp branches/tora3/src/tests/test2.cpp Modified: branches/tora3/src/core/tocache.cpp =================================================================== --- branches/tora3/src/core/tocache.cpp 2012-06-13 14:09:10 UTC (rev 4352) +++ branches/tora3/src/core/tocache.cpp 2012-06-14 16:14:14 UTC (rev 4353) @@ -40,6 +40,8 @@ #include "core/tocache.h" #include "core/toconfiguration.h" +#include "core/toconnection.h" +#include "core/tosql.h" #include "core/toraversion.h" #include "core/utils.h" @@ -56,27 +58,22 @@ QDataStream& operator<< (QDataStream& stream, const toCache::CacheEntry& e); QDataStream& operator>> (QDataStream& stream, toCache::CacheEntry& e); -toCache::toCache( QString const &description) +toCache::toCache(toConnection &parentConnection, QString const &description) : QObject(NULL) , ConnectionDescription(description) , refCount(1) // we assume that we were created from 1st toConnection , state(NOT_STARTED) , ownersRead(false) , usersRead(false) + , parentConn(parentConnection) { } toCache::~toCache() { - /* The parent toConnection is locked by this instance of toCache, - wail till background thread finishes - */ - //if(cacheRefreshRunning()) - // ReadingThread.down(); - { - toExclusiveLocker lock(cacheLock); - clearCache(); - } + toLocker bLock(backgroundThreadLock); // wait till the background thread finishes + toExclusiveLocker lock(cacheLock); + clearCache(); } void toCache::addEntry(toCache::CacheEntry* e) @@ -309,47 +306,95 @@ return state; } -void toCache::readObjects(toTask * t) -{ - try - { - (new toThread(t))->start(); - ReadingThreadSemaphore.down(); // Wait till child thread starts - /// TODO migrate this too, probably somewhere in toConnection - toMainWindow *w = toMainWidget(); - if (w != NULL) - { - w->checkCaching(); // notify main window about the change of cache's state - } - } - catch (...) - { - state = FAILED; - } +void toCache::rereadCache() { + /** delete cache file to force reload + */ + QFileInfo filename(cacheFile()); + if (filename.isFile()) + QFile::remove(filename.absoluteFilePath()); + + readCache(); } -void toCache::rereadCache(toTask * t) +void toCache::readCache() { + if (toConfigurationSingle::Instance().objectCache() == toConfiguration::NEVER) { + toExclusiveLocker lock(cacheLock); + clearCache(); + return; + } + + if (cacheRefreshRunning()) { + Utils::toStatusMessage(qApp->translate("toConnection", "Not done caching objects, can not clear unread cache")); + return; + } + + try { + toLocker bLock(backgroundThreadLock); + toTask *t = new cacheObjects(parentConn); + (new toThread(t))->start(); + } catch (...) { + state = FAILED; + return; + } + + /// TODO migrate this too, probably somewhere in toConnection + /// TODO turn this into emit + toMainWindow *w = toMainWidget(); + if (w != NULL) { + w->checkCaching(); // notify main window about the change of cache's state + } +} + +/* This method runs as a separate thread executed from: + toCache::readObjects(toTask * t) +*/ +void toCache::cacheObjects::run() { - if( toConfigurationSingle::Instance().objectCache() == toConfiguration::NEVER) - { - toExclusiveLocker lock(cacheLock); - clearCache(); - return; - } + toLocker bLock(parentConnection().getCache().backgroundThreadLock); - if( cacheRefreshRunning()) - { - Utils::toStatusMessage(qApp->translate("toConnection", "Not done caching objects, can not clear unread cache")); - return ; - } + parentConnection().getCache().setCacheState(toCache::READING_FROM_DISK); + bool diskloaded = parentConnection().getCache().loadDiskCache(); + if (diskloaded) + { + // TODO: Check if really whole cache was loaded. + // the file image could contain only some schemas or part of the schema + parentConnection().getCache().setCacheState(toCache::DONE); + return; + } - /** delete cache file to force reload - */ - QFileInfo filename(cacheFile()); - if (filename.isFile()) - QFile::remove(filename.absoluteFilePath()); + parentConnection().getCache().setCacheState(toCache::READING_FROM_DB); + try { + toQuery objects(parentConnection(), toSQL::sql("toConnection:ListObjectsInDatabase", parentConnection()), toQueryParams()); + while (!objects.eof()) + { + if (parentConnection().Abort) + { + parentConnection().getCache().setCacheState(toCache::FAILED); + return; + } + // TODO #warning "check connection's parent Abort flag" + QString owner = objects.readValue(); + QString name = objects.readValue(); + QString type = objects.readValue(); + QString comment = objects.readValue(); + toCache::CacheEntry *e = toCache::createCacheEntry(owner, name, type, comment); + if(e) + parentConnection().getCache().addEntry(e); + } + }catch (toConnection::exception const &exc) { + parentConnection().getCache().setCacheState(toCache::FAILED); + throw exc; + return; + } - readObjects(t); + parentConnection().getCache().ownersRead = true; + parentConnection().getCache().setCacheState(toCache::DONE); +}; + +void toCache::wait4BGThread() +{ + backgroundThreadLock.lock(); + backgroundThreadLock.unlock(); } QDir toCache::cacheDir() @@ -376,6 +421,7 @@ // using instantclient connectionstrins can result in file name like this: // isepl_global_stage@//oraclexe11:1521/xe // which is invalid. Just remove "/" or replace it with something safer. + // colon ":" is invalid char for filename on Windows ret = ret.replace("/", "_"); ret = ret.replace(":", "~"); ret += ".bin"; @@ -385,10 +431,13 @@ void toCache::writeDiskCache() { - QString text; - qint64 objCounter = 0; - qint64 synCounter = 0; + toLocker bLock(backgroundThreadLock); + if (cacheState() != toCache::DONE) + { + return; + } + if (!toConfigurationSingle::Instance().cacheDisk()) return; @@ -409,51 +458,31 @@ toSharedLocker lock(cacheLock); QDataStream out(&file); + out << (quint8) 0; out << version; // Tora version out << (quint8)state; // cache state out << ownersRead; out << usersRead; out << ConnectionDescription; + file.flush(); - // TODO Write a gap here. - // then write the whole cache, rewind, + out << (quint32) usersMap.size(); + out << (quint32) entryMap.size(); - out << (quint32) entryMap.size(); - out << (quint32) synonymMap.size(); - out << (quint32) columnCache.size(); - out << (quint32) ownersMap.size(); - out << (quint32) usersMap.size(); + QList<CacheEntry const*> vUsersMap = usersMap.values(); + Q_FOREACH(CacheEntry const*e, vUsersMap) + { + out << (*e); + } - QList<CacheEntry const*> vEntryMap = entryMap.values(); - Q_FOREACH(CacheEntry const*e, vEntryMap) - { - out << (*e); - } - // TODO this can be avoided - QList<CacheEntry const*> vSynonymMap = synonymMap.values(); - Q_FOREACH(CacheEntry const*e, vSynonymMap) - { - out << (*e); - } + QList<CacheEntry const*> vEntryMap = entryMap.values(); + Q_FOREACH(CacheEntry const*e, vEntryMap) + { + out << (*e); + } - QList<CacheEntry const*> vColumnCache = columnCache.values(); - Q_FOREACH(CacheEntry const*e, vColumnCache) - { - out << (*e); - } - - QList<CacheEntry const*> vOwnersMap = ownersMap.values(); - Q_FOREACH(CacheEntry const*e, vOwnersMap) - { - out << (*e); - } - - QList<CacheEntry const*> vUsersMap = usersMap.values(); - Q_FOREACH(CacheEntry const*e, vUsersMap) - { - out << (*e); - } - + file.seek(0L); + out << (quint8) 1; file.flush(); file.close(); } @@ -470,7 +499,6 @@ if (!dir.exists()) dir.mkdir(dir.absolutePath()); - QString version = QString::fromLatin1(TORAVERSION); QDateTime today; if(!fileInfo.isReadable()) @@ -482,63 +510,62 @@ clearCache(); //#warn TODO "throw something here - quint32 entryMapSize, synonymMapSize, columnCacheSize, ownersMapSize, usersMapSize; + quint32 usersMapSize,entryMapSize; QFile file(fileInfo.absoluteFilePath()); file.open(QIODevice::ReadOnly); + + quint8 s1, s2; + bool oRead, uRead; + QString version; + QDataStream in(&file); { toExclusiveLocker lock(cacheLock); - quint8 s; + in >> s1; in >> version; // Tora version - in >> s; state = (CacheState)s; // cache state - in >> ownersRead; - in >> usersRead; + in >> s2; // cache state + in >> oRead; + in >> uRead; in >> ConnectionDescription; + // Assume the cache file is corrupted if + // - 1st byte != 0x01 -- see writeDistCache() for details + // - application version differs + // - cache state != toCache::DONE + if (s1 != 1 || version != QString::fromLatin1(TORAVERSION) || s2 != toCache::DONE) + { + file.close(); + file.remove(); + return false; + } + + in >> usersMapSize; in >> entryMapSize; - in >> synonymMapSize; - in >> columnCacheSize; - in >> ownersMapSize; - in >> usersMapSize; } - for(quint32 i = 0; i < entryMapSize; i++) + + for(quint32 i = 0; i < usersMapSize; i++) { - CacheEntry e, *clone; + CacheEntry e, *cloned; in >> e; - clone = cloneCacheEntry(e); - if( clone != NULL) - addEntry(cloneCacheEntry(e)); + cloned = cloneCacheEntry(e); + if( cloned != NULL) + addEntry(cloned); } - // TODO this can be avoided (probably) - for(quint32 i = 0; i < synonymMapSize; i++) + for(quint32 i = 0; i < entryMapSize; i++) { - CacheEntry e, *clone; + CacheEntry e, *cloned; in >> e; + cloned = cloneCacheEntry(e); + if( cloned != NULL) + addEntry(cloned); } - for(quint32 i = 0; i < columnCacheSize; i++) - { - CacheEntry e, *clone; - in >> e; - } - for(quint32 i = 0; i < ownersMapSize; i++) - { - CacheEntry e, *clone; - in >> e; - clone = cloneCacheEntry(e); - if( clone != NULL) - addEntry(cloneCacheEntry(e)); - } - for(quint32 i = 0; i < usersMapSize; i++) - { - CacheEntry e, *clone; - in >> e; - clone = cloneCacheEntry(e); - if( clone != NULL) - addEntry(cloneCacheEntry(e)); - } + state = (CacheState)s2; + usersRead = uRead; + ownersRead = oRead; + file.close(); return true; } @@ -659,6 +686,8 @@ return new toCacheEntryTrigger(objOwner, objName, comment); case DATABASE: return new toCacheEntryDatabase(objOwner, objName, comment); + case USER: + return new toCacheEntryUser(objOwner); default: return NULL; // Do ignore some object types, like DBLINK or CLUSTER for example ///throw QString("toCache: Unknown object type %1").arg(objType); @@ -717,7 +746,7 @@ QDataStream& operator<< (QDataStream& stream, const toCache::CacheEntry& e) { - stream << e.name << (quint32)e.type << e.comment << e.timestamp << e.details; + stream << e.name << (quint8)e.type << e.comment << e.timestamp << e.details; return stream; } Modified: branches/tora3/src/core/tocache.h =================================================================== --- branches/tora3/src/core/tocache.h 2012-06-13 14:09:10 UTC (rev 4352) +++ branches/tora3/src/core/tocache.h 2012-06-14 16:14:14 UTC (rev 4353) @@ -73,7 +73,7 @@ class toCache : public QObject { - Q_OBJECT; + Q_OBJECT; friend class toConnection; friend class toGlobalSetting; @@ -203,9 +203,24 @@ OWNERS }; + class cacheObjects: public toTask + { + toConnection &_pConnection; + public: + cacheObjects(toConnection &conn) : _pConnection(conn) { } + + /** Get the parent connection object of this connection. */ + toConnection& parentConnection(void) + { + return _pConnection; + } + + virtual void run(void); + }; + /** Constructuctors, destructors */ - toCache(QString const &description); + toCache(toConnection &parentConnection, QString const &description); ~toCache(); @@ -245,16 +260,25 @@ /** get list of the all the objects held in the cache */ QList<CacheEntry const*> objects(bool wait = false) const; -private: - /** - * Starts a new thread which will read all objects and synonyms from the database. - */ - void readObjects(toTask * t); -public: + /** Reread the object and column cache. + * Tries to read the cache from the disk first + * Starts a new thread which will read all objects and synonyms from the database. */ - void rereadCache(toTask * t); + void readCache(); + /** Reread the object and column cache from database + * Starts a new thread which will read all objects and synonyms from the database. + * also: deletes disk cache file + */ + void rereadCache(); + + /** Non-blocking version of cacheAvailable, used by toMain to update toBackgroundLabel */ + bool cacheRefreshRunning() const; + + /** Note: this functions is not 100% correct and should be used for testing purposes only */ + void wait4BGThread(); + private: /** setter for cache state */ @@ -270,6 +294,7 @@ QMap<QString, CacheEntry const*> columnCache; QMap<QString, CacheEntry const*> ownersMap, usersMap; bool ownersRead, usersRead; + toConnection &parentConn; /** Return the file used to store cache contents for this connection. * @return A string representing a full path and filename of cache file @@ -299,20 +324,14 @@ /** translate object type CacheEntryType::TABLE => QString("TABLE") */ static QString cacheEntryTypeToString(CacheEntryType objType); - /** Non-blocking version of cacheAvailable, used by toMain to update toBackgroundLabel - */ - bool cacheRefreshRunning() const; - - /** This lock is used by all getters and setters an Instance of toCache is shared between multiple connections. */ mutable toSharedLock cacheLock; - /* This semaphore is used to synchronize toConnection's constructor/destructor with background thread. - see: toConnection::cacheObjectsNew::run() - */ - toSemaphore ReadingThreadSemaphore; + /** Instance of this lock is held while the backgound thread runs + */ + toLock backgroundThreadLock; /** Description of connection for which this instance of cache is used. * This name is used as a filename to store cache content between TOra runs. @@ -324,7 +343,7 @@ QAtomicInt refCount; signals: void userListRefreshed(void); -}; // toCacheNew +}; // toCache /** A short representation of list<toCache::ColumnDescription> Modified: branches/tora3/src/core/toconnection.cpp =================================================================== --- branches/tora3/src/core/toconnection.cpp 2012-06-13 14:09:10 UTC (rev 4352) +++ branches/tora3/src/core/toconnection.cpp 2012-06-14 16:14:14 UTC (rev 4353) @@ -46,10 +46,7 @@ #include "core/tologger.h" #include "core/toconf.h" #include "core/tocache.h" -#include "core/tosql.h" #include "core/totool.h" -#include "core/toquery.h" -#include "core/toqvalue.h" #include "core/toconfiguration.h" #include "core/toconnectionprovider.h" @@ -79,14 +76,13 @@ toConnectionSub* connSub = addConnection(); Connections.insert(connSub); - pCache = new toCache(description(false).trimmed()); + pCache = new toCache(*this, description(false).trimmed()); //Version = Connection->version(*sub); - { toLocker clock(ConnectionLock); // if (toConfigurationSingle::Instance().objectCache() == toConfiguration::ON_CONNECT) - // Cache->readObjects(new cacheObjectsNew(this)); + // pCache->readCache(); } } @@ -182,8 +178,6 @@ } if(cacheNewRefCnt == 0) { - ////TODO this->CacheNew->writeDiskCache(); - // this will wait for cacheObjects thread to finish in toCache::~toCache getCache().writeDiskCache(); delete this->pCache; } @@ -192,7 +186,6 @@ closeWidgets(); //ConnectionPool->cancelAll(true); - //delete ConnectionPool; //ConnectionPool = 0; @@ -330,93 +323,6 @@ throw qApp->translate("toConnection::currentConnection", "Couldn't find parent connection. Internal error."); } -/* This method runs as a separate thread executed from: - toCache::readObjects(toTask * t) -*/ -void toConnection::cacheObjects::run() -{ - /* Increase the semaphore to "unlock" parent thread, it's waiting for our start */ - parentConnection().getCache().ReadingThreadSemaphore.up(); - - parentConnection().getCache().setCacheState(toCache::READING_FROM_DISK); - bool diskloaded = parentConnection().getCache().loadDiskCache(); - if (diskloaded) - { - // TODO: Check if really whole cache was loaded. - // the file image could contain only some schemas or part of the schema - parentConnection().getCache().setCacheState(toCache::DONE); - return; - } - - parentConnection().getCache().setCacheState(toCache::READING_FROM_DB); - try { - toQuery objects(parentConnection(), toSQL::sql("toConnection:ListObjectsInDatabase", parentConnection()), toQueryParams()); - while (!objects.eof()) - { - // TODO #warning "check connection's parent Abort flag" - QString owner = objects.readValue(); - QString name = objects.readValue(); - QString type = objects.readValue(); - QString comment = objects.readValue(); - toCache::CacheEntry *e = toCache::createCacheEntry(owner, name, type, comment); - if(e) - parentConnection().getCache().addEntry(e); - } - }catch (toConnection::exception const &exc) { - parentConnection().getCache().setCacheState(toCache::FAILED); - throw exc; - return; - } - - parentConnection().getCache().ownersRead = true; - parentConnection().getCache().setCacheState(toCache::DONE); -}; - -//void toConnection::cacheObjects::run() -//{ -// bool diskloaded = false; -// -// ///try -// ///{ -// /// Connection->Cache->setCacheState(toCache::READING_OBJECTS); -// /// /* Increase the semaphore to "unlock" parent thread */ -// ///Connection->Cache->ReadingThread.up(); -// -// /// diskloaded = Connection->Cache->loadDiskCache(); -// /// if (!diskloaded && !Connection->Abort) -// /// { -// /// const QList<objectName> &n = Connection->Connection->objectNames(); -// /// if (!Connection->Abort) -// /// Connection->Cache->setObjectList(n); -// /// } -// -// /// if (!diskloaded && !Connection->Abort) -// /// { -// /// Connection->Cache->setCacheState(toCache::READING_SYNONYMS); -// /// /* NOTE: we cannot pass n as parameter of synonymMap because -// /// it's parameter needs to be sorted */ -// /// std::map<QString, objectName> m = -// /// Connection->Connection->synonymMap(Connection->Cache->objects(true)); -// /// if (!Connection->Abort) -// /// { -// /// Connection->Cache->setSynonymList(m); -// /// Connection->Cache->writeDiskCache(); -// /// } -// /// } -// /// /* Increase the semaphore to "unlock" parent thread destructor */ -// ///Connection->Cache->ReadingThread.up(); -// ///Connection->Cache->setCacheState(toCache::DONE); -// /// toMainWidget()->checkCaching(); -// ///} -// ///catch (...) -// ///{ -// /// Connection->Cache->ReadingThread.up(); -// /// Connection->Cache->setCacheState(toCache::FAILED); -// /// toMainWidget()->checkCaching(); -// ///} -// -//} - //QString toConnection::quote(const QString &name, const bool quoteLowercase) //{ // if (!name.isNull()) @@ -479,22 +385,22 @@ // return cols; //} -void toConnection::rereadCache(void) -{ - getCache().rereadCache(new cacheObjects(*this)); -} +//void toConnection::rereadCache(void) +//{ +// getCache().rereadCache(); +//} -bool toConnection::rereadObjectNew(const QString &owner, const QString &name) -{ - bool added = false; - return added; -} +//bool toConnection::rereadObjectNew(const QString &owner, const QString &name) +//{ +// bool added = false; +// return added; +//} -bool toConnection::cacheRefreshRunning() const -{ - //tool return CacheNew->cacheRefreshRunning(); - return false; //tool must return value -} +//bool toConnection::cacheRefreshRunning() const +//{ +// //tool return CacheNew->cacheRefreshRunning(); +// return false; //tool must return value +//} toConnectionSub* toConnection::borrowSub() { Modified: branches/tora3/src/core/toconnection.h =================================================================== --- branches/tora3/src/core/toconnection.h 2012-06-13 14:09:10 UTC (rev 4352) +++ branches/tora3/src/core/toconnection.h 2012-06-14 16:14:14 UTC (rev 4353) @@ -77,7 +77,7 @@ Q_OBJECT; friend class toQuery; - friend class cacheObjects; + friend class toCache; public: /** Create a new connection. @@ -182,10 +182,7 @@ return NeedCommit; } - /** Non-blocking version of cacheAvailable, used by @ref toMain to update @ref toBackgroundLabel */ - bool cacheRefreshRunning() const; - - /** Get a list of currently running SQL. */ + /** Get a list of currently running SQLs */ virtual QList<QString> running(void) const; /** Return the connection most closely associated with a widget. Currently connections are @@ -284,21 +281,9 @@ /** Remove a statement that was added using @ref addInit. */ void delInit(const QString &sql); - /** Reread the object and column cache. */ - void rereadCache(void); - /** Try to stop all running queries. */ void cancelAll(void); - /** - * Reread specified objects from database to the cache. If null is given as value of any - * parameter - then any value for that parameter is ok in database matches. - * @param owner only read object belonging to given schema - * @param name only read objects with given name. - * @return true if at least one new object was added to cache - */ - bool rereadObjectNew(const QString &owner = "", const QString &name = ""); - // NESTED CLASSES - types /** Class that could be used to throw exceptions in connection errors. Must use if you @@ -356,21 +341,6 @@ virtual void closeConnection(toConnectionSub *) = 0; }; - class cacheObjects: public toTask - { - toConnection &_pConnection; - public: - cacheObjects(toConnection &conn) : _pConnection(conn) { } - - /** Get the parent connection object of this connection. */ - toConnection& parentConnection(void) - { - return _pConnection; - } - - virtual void run(void); - }; - private: toConnectionSub* borrowSub(); void putBackSub(toConnectionSub*); Modified: branches/tora3/src/core/tomain.cpp =================================================================== --- branches/tora3/src/core/tomain.cpp 2012-06-13 14:09:10 UTC (rev 4352) +++ branches/tora3/src/core/tomain.cpp 2012-06-14 16:14:14 UTC (rev 4353) @@ -1106,7 +1106,7 @@ { try { - currentConnection().rereadCache(); + currentConnection().getCache().rereadCache(); } TOCATCH; toMainWidget()->checkCaching(); @@ -1776,7 +1776,7 @@ int num = 0; foreach(toConnection * conn, Connections) { - if (conn->cacheRefreshRunning()) + if (conn->getCache().cacheRefreshRunning()) num++; } if (num == 0) Modified: branches/tora3/src/core/totaskrunner.cpp =================================================================== --- branches/tora3/src/core/totaskrunner.cpp 2012-06-13 14:09:10 UTC (rev 4352) +++ branches/tora3/src/core/totaskrunner.cpp 2012-06-14 16:14:14 UTC (rev 4353) @@ -48,31 +48,33 @@ void toTaskRunner::run(void) { - try - { - toThread::Lock->lock () - ; - toThread::toThreadInfoStorage.setLocalData(new toThreadInfo(++toThread::lastThreadNumber)); - StartSemaphore.up(); - toThread::mainThread(); - toThread::Lock->unlock(); - Task->run(); - toThread::Lock->lock () - ; - delete Task; - Task = NULL; - toThread::Lock->unlock(); - } - catch (const QString &exc) - { - fprintf(stderr, "Unhandled exception in thread:\n%s\n", exc.toAscii().constData()); - } - catch (...) - { - fprintf(stderr, "Unhandled exception in thread:\nUnknown type\n"); - } + try { + toThread::Lock->lock(); + toThread::toThreadInfoStorage.setLocalData(new toThreadInfo(++toThread::lastThreadNumber)); + StartSemaphore.up(); + toThread::mainThread(); + toThread::Lock->unlock(); + // Any background thread must not end with any exception raised + // Note: TODO emit some kind of error into the main window here + try { + Task->run(); + } catch (const QString &exc) { + fprintf(stderr, "Unhandled exception in thread:\n%s\n", exc.toAscii().constData()); + } catch (...) { + fprintf(stderr, "Unhandled exception in thread:\nUnknown type\n"); + } + toThread::Lock->lock(); + delete Task; + Task = NULL; + toThread::Lock->unlock(); + } catch (const QString &exc) { + fprintf(stderr, "Unhandled exception in thread:\n%s\n", exc.toAscii().constData()); + } catch (...) { + fprintf(stderr, "Unhandled exception in thread:\nUnknown type\n"); + } + // This is a cludge to clean up finnished threads, there won't be many hanging at least toThread::Lock->lock () Modified: branches/tora3/src/tests/test2.cpp =================================================================== --- branches/tora3/src/tests/test2.cpp 2012-06-13 14:09:10 UTC (rev 4352) +++ branches/tora3/src/tests/test2.cpp 2012-06-14 16:14:14 UTC (rev 4353) @@ -165,7 +165,17 @@ "", options); TLOG(0,toDecorator,__HERE__) << "Version: " << oraCon->version() << std::endl; - oraCon->rereadCache(); + + // uncomment this if you want to run cache refresh in synchronous mode + // i.e. run it in the current main thread + //toCache::cacheObjects co(*oraCon); + //co.run(); + + // uncomment this if you want to run cache refresh in async mode + // i.e. run it the background thread + oraCon->getCache().readCache(); // rereadCache() + oraCon->getCache().wait4BGThread(); // wait for bg thread to finish. + delete oraCon; } catch (const QString &str) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2012-06-15 12:34:01
|
Revision: 4354 http://tora.svn.sourceforge.net/tora/?rev=4354&view=rev Author: ibre5041 Date: 2012-06-15 12:33:50 +0000 (Fri, 15 Jun 2012) Log Message: ----------- vg check Modified Paths: -------------- branches/tora3/src/connection/tooraclequery.cpp branches/tora3/src/core/main.cpp branches/tora3/src/core/tocache.cpp branches/tora3/src/core/tocache.h branches/tora3/src/core/tomain.cpp branches/tora3/src/core/tonewconnection.cpp branches/tora3/src/core/toresultmodel.cpp branches/tora3/src/core/utils.cpp branches/tora3/src/tests/test2.cpp Modified: branches/tora3/src/connection/tooraclequery.cpp =================================================================== --- branches/tora3/src/connection/tooraclequery.cpp 2012-06-14 16:14:14 UTC (rev 4353) +++ branches/tora3/src/connection/tooraclequery.cpp 2012-06-15 12:33:50 UTC (rev 4354) @@ -214,7 +214,7 @@ if(BP.is_null(_last_buff_row) && BP.dty != SQLT_NTY) { value = toQValue(); - TLOG(4, toDecorator, __HERE__) << "Just read: NULL" << std::endl; + //TLOG(4, toDecorator, __HERE__) << "Just read: NULL" << std::endl; } else { @@ -240,7 +240,7 @@ &i); oci_check_error(__HERE__, _errh, res); value = toQValue(i); - TLOG(4, toDecorator, __HERE__) << "Just read: '" << i << '\'' << std::endl; + //TLOG(4, toDecorator, __HERE__) << "Just read: '" << i << '\'' << std::endl; } else { @@ -251,7 +251,7 @@ &d); oci_check_error(__HERE__, _errh, res); value = toQValue(d); - TLOG(4, toDecorator, __HERE__) << "Just read: '" << d << '\'' << std::endl; + //TLOG(4, toDecorator, __HERE__) << "Just read: '" << d << '\'' << std::endl; } } catch(const ::trotl::OciException &e) @@ -282,13 +282,13 @@ if((xmlnode*)bpx->_xmlvaluep[_last_buff_row] == NULL) { value = toQValue(); - TLOG(4, toDecorator, __HERE__) << "Just read: NULL XML" << std::endl; + //TLOG(4, toDecorator, __HERE__) << "Just read: NULL XML" << std::endl; } else { std::string s(BP.get_string(_last_buff_row)); value = toQValue(QString::fromUtf8(s.c_str())); - TLOG(4, toDecorator, __HERE__) << "Just read: \"" << s << "\"" << std::endl; + //TLOG(4, toDecorator, __HERE__) << "Just read: \"" << s << "\"" << std::endl; } } #endif @@ -309,7 +309,7 @@ if( *(sb2*)(bpc->_collection_indp[_last_buff_row]) == OCI_IND_NULL) { value = toQValue(); - TLOG(4, toDecorator, __HERE__) << "Just read: NULL collection" << std::endl; + //TLOG(4, toDecorator, __HERE__) << "Just read: NULL collection" << std::endl; } else { @@ -319,9 +319,7 @@ QVariant v; v.setValue((toQValue::complexType*)i); value = toQValue::fromVariant(v); - TLOG(4, toDecorator, __HERE__) << "Just read: collection:" - << (::trotl::tstring)i->data - << std::endl; + //TLOG(4, toDecorator, __HERE__) << "Just read: collection:" << (::trotl::tstring)i->data << std::endl; } } else if( ::trotl::BindParCollectionTabVarchar const *bpc = dynamic_cast<const trotl::BindParCollectionTabVarchar *>(&BP)) @@ -329,7 +327,7 @@ if( *(sb2*)(bpc->_collection_indp[_last_buff_row]) == OCI_IND_NULL) { value = toQValue(); - TLOG(4, toDecorator, __HERE__) << "Just read: NULL collection" << std::endl; + //TLOG(4, toDecorator, __HERE__) << "Just read: NULL collection" << std::endl; } else { @@ -339,9 +337,7 @@ QVariant v; v.setValue((toQValue::complexType*)i); value = toQValue::fromVariant(v); - TLOG(4, toDecorator, __HERE__) << "Just read: collection:" - << (::trotl::tstring)i->data - << std::endl; + //TLOG(4, toDecorator, __HERE__) << "Just read: collection:" << (::trotl::tstring)i->data << std::endl; } } @@ -356,7 +352,7 @@ v.setValue((toQValue::complexType*)i); value = toQValue::fromVariant(v); //int id = qMetaTypeId<toQValue::complexType*>(); - TLOG(4, toDecorator, __HERE__) << "Just read: \"CLOB\"" << std::endl; + //TLOG(4, toDecorator, __HERE__) << "Just read: \"CLOB\"" << std::endl; } break; case SQLT_BLOB: @@ -367,7 +363,7 @@ QVariant v; v.setValue((toQValue::complexType*)i); value = toQValue::fromVariant(v); - TLOG(4, toDecorator, __HERE__) << "Just read: \"BLOB\"" << std::endl; + //TLOG(4, toDecorator, __HERE__) << "Just read: \"BLOB\"" << std::endl; } break; case SQLT_RSET: @@ -378,12 +374,12 @@ QVariant v; v.setValue((toQValue::complexType*)i); value = toQValue::fromVariant(v); - TLOG(4, toDecorator, __HERE__) << "Just read: \"CURSOR\"" << std::endl; + //TLOG(4, toDecorator, __HERE__) << "Just read: \"CURSOR\"" << std::endl; } default: std::string s(BP.get_string(_last_buff_row)); value = toQValue(QString::fromUtf8(s.c_str())); - TLOG(4, toDecorator, __HERE__) << "Just read: \"" << s << "\"" << std::endl; + //TLOG(4, toDecorator, __HERE__) << "Just read: \"" << s << "\"" << std::endl; } } Modified: branches/tora3/src/core/main.cpp =================================================================== --- branches/tora3/src/core/main.cpp 2012-06-14 16:14:14 UTC (rev 4353) +++ branches/tora3/src/core/main.cpp 2012-06-15 12:33:50 UTC (rev 4354) @@ -209,6 +209,9 @@ { toSQL::loadSQL(toConfigurationSingle::Instance().sqlFile()); } + catch (QString const& e) { + TLOG(1, toDecorator, __HERE__) << " Ignored exception:" << e << std::endl; + } catch (...) { TLOG(1, toDecorator, __HERE__) << " Ignored exception." << std::endl; Modified: branches/tora3/src/core/tocache.cpp =================================================================== --- branches/tora3/src/core/tocache.cpp 2012-06-14 16:14:14 UTC (rev 4353) +++ branches/tora3/src/core/tocache.cpp 2012-06-15 12:33:50 UTC (rev 4354) @@ -197,28 +197,28 @@ } }; -QList<toCache::CacheEntry const*> toCache::getObjectsInSchema(QString const& schema, CacheEntryType type) const +QList<toCache::CacheEntry*> toCache::getObjectsInSchema(QString const& schema, CacheEntryType type) const { toSharedLocker lock(cacheLock); - QList<toCache::CacheEntry const*> retval; + QList<toCache::CacheEntry*> retval; QList<ObjectRef> objs = entryMap.keys(); // TODO there must be a better way of searching QMap (do not copy keys) Q_FOREACH(ObjectRef const & o, objs) { - if( o.first == schema && (entryMap.value(o)->type == type || type == toCache::ANY)) - retval.append(entryMap.value(o)); + if( (entryMap.value(o)->type == type || type == toCache::ANY) && o.first == schema ) + retval.append(const_cast<toCache::CacheEntry*>(entryMap.value(o))); } return retval; }; -QList<toCache::CacheEntry const*> toCache::getObjectsInSchema(QString const& schema, QString const& type) const +QList<toCache::CacheEntry*> toCache::getObjectsInSchema(QString const& schema, QString const& type) const { CacheEntryType t = cacheEntryType(type); if(t != toCache::OTHER) return getObjectsInSchema(schema, t); else - return QList<toCache::CacheEntry const*>(); + return QList<toCache::CacheEntry*>(); }; /** Clear current list of users and generate a new one */ @@ -329,6 +329,7 @@ } try { + setCacheState(toCache::READING_STARTED); toLocker bLock(backgroundThreadLock); toTask *t = new cacheObjects(parentConn); (new toThread(t))->start(); @@ -393,8 +394,15 @@ void toCache::wait4BGThread() { - backgroundThreadLock.lock(); - backgroundThreadLock.unlock(); + CacheState s = cacheState(); + while ( s == toCache::READING_STARTED) // This state is set for a short period of time till the bg thread really starts + { + QThread::yieldCurrentThread(); + s = CacheState(); + } + { + toLocker bLock(backgroundThreadLock); + } } QDir toCache::cacheDir() Modified: branches/tora3/src/core/tocache.h =================================================================== --- branches/tora3/src/core/tocache.h 2012-06-14 16:14:14 UTC (rev 4353) +++ branches/tora3/src/core/tocache.h 2012-06-15 12:33:50 UTC (rev 4354) @@ -191,6 +191,7 @@ enum CacheState : quint8 { NOT_STARTED = 0, + READING_STARTED, READING_FROM_DISK, READING_FROM_DB, DONE, @@ -244,8 +245,8 @@ */ void updateSchemaObjects(QString const& schema, QString const& objType, QList<CacheEntry*> const& r); - QList<CacheEntry const*> getObjectsInSchema(QString const& schema, CacheEntryType type = ANY) const; - QList<CacheEntry const*> getObjectsInSchema(QString const& schema, QString const& type) const; + QList<CacheEntry*> getObjectsInSchema(QString const& schema, CacheEntryType type = ANY) const; + QList<CacheEntry*> getObjectsInSchema(QString const& schema, QString const& type) const; bool entryExists(QString const& schema, QString& name, CacheEntryType entryType = ANY) const; Modified: branches/tora3/src/core/tomain.cpp =================================================================== --- branches/tora3/src/core/tomain.cpp 2012-06-14 16:14:14 UTC (rev 4353) +++ branches/tora3/src/core/tomain.cpp 2012-06-15 12:33:50 UTC (rev 4354) @@ -1505,8 +1505,10 @@ { conn = ¤tConnection(); } - catch(...) - { + catch(QString const& e) { + TLOG(1, toDecorator, __HERE__) << " Ignored exception." << e << std::endl; + } + catch(...) { TLOG(1, toDecorator, __HERE__) << " Ignored exception." << std::endl; } Modified: branches/tora3/src/core/tonewconnection.cpp =================================================================== --- branches/tora3/src/core/tonewconnection.cpp 2012-06-14 16:14:14 UTC (rev 4353) +++ branches/tora3/src/core/tonewconnection.cpp 2012-06-15 12:33:50 UTC (rev 4354) @@ -98,7 +98,7 @@ if (Provider->count() < 1) { TOMessageBox::information( - this, + NULL, tr("No connection provider"), tr("No available connection provider")); Modified: branches/tora3/src/core/toresultmodel.cpp =================================================================== --- branches/tora3/src/core/toresultmodel.cpp 2012-06-14 16:14:14 UTC (rev 4353) +++ branches/tora3/src/core/toresultmodel.cpp 2012-06-15 12:33:50 UTC (rev 4354) @@ -132,13 +132,13 @@ HeadersRead = true; // Fetch list of objects from the cache - QList<toCache::CacheEntry const*> tmp = toConnection::currentConnection(this).getCache().getObjectsInSchema(owner, type); + QList<toCache::CacheEntry*> tmp = toConnection::currentConnection(this).getCache().getObjectsInSchema(owner, type); beginInsertRows(QModelIndex(), 0, tmp.count()); // Convert list of objects to appropriate type toResultModel::Row row; int counter = 1; - for (QList<toCache::CacheEntry const*>::iterator i = tmp.begin(); i != tmp.end(); i++) + for (QList<toCache::CacheEntry *>::iterator i = tmp.begin(); i != tmp.end(); i++) { // For each row a mandatory rownumber integer should be added toRowDesc rowDesc; Modified: branches/tora3/src/core/utils.cpp =================================================================== --- branches/tora3/src/core/utils.cpp 2012-06-14 16:14:14 UTC (rev 4353) +++ branches/tora3/src/core/utils.cpp 2012-06-15 12:33:50 UTC (rev 4354) @@ -1250,10 +1250,9 @@ { db = toConnection::currentConnection(parent).description(false); } - catch (QString &s) + catch (QString const& e) { - QByteArray sb(s.toLatin1()); - TLOG(1, toDecorator, __HERE__) << " Ignored exception: " << sb.constData() << std::endl; + TLOG(1, toDecorator, __HERE__) << " Ignored exception: " << e << std::endl; } catch (...) { Modified: branches/tora3/src/tests/test2.cpp =================================================================== --- branches/tora3/src/tests/test2.cpp 2012-06-14 16:14:14 UTC (rev 4353) +++ branches/tora3/src/tests/test2.cpp 2012-06-15 12:33:50 UTC (rev 4354) @@ -70,8 +70,8 @@ static void usage() { - printf("Usage:\n\n test2 [connectstring]\n\n"); - exit(2); + printf("Usage:\n\n test2 connectstring [dbschema]\n\n"); + exit(2); } int main(int argc, char **argv) @@ -106,11 +106,11 @@ qRegisterMetaType<ValuesList>("ValuesList&"); qRegisterMetaType<toConnection::exception>("toConnection::exception"); - if (qApp->argc() != 2) + if (qApp->argc() != 2 && qApp->argc() != 3) usage(); QString connect = QString::fromLatin1(qApp->argv()[1]); - QString user, password, database; + QString user, password, database, schema; QStringList slashList, atList = connect.split("@", QString::SkipEmptyParts); if( atList.size() == 1) @@ -118,7 +118,7 @@ if( atList.size() > 2) usage(); - if ( atList.at(0).contains("/")) + if( atList.at(0).contains("/")) { slashList = atList.at(0).split("/", QString::SkipEmptyParts); user = slashList.at(0); @@ -130,6 +130,12 @@ database = slashList.at(0); password = slashList.at(1); } + if( qApp->argc() == 2) + { + schema = user; + } else { + schema = QString::fromLatin1(qApp->argv()[2]); + } // List of all connection provider finders std::vector<std::string> finders = ConnectionProviderFinderFactory::Instance().keys(); @@ -176,6 +182,13 @@ oraCon->getCache().readCache(); // rereadCache() oraCon->getCache().wait4BGThread(); // wait for bg thread to finish. + QList<toCache::CacheEntry*> tables = oraCon->getCache().getObjectsInSchema(schema, toCache::TABLE); + Q_FOREACH(toCache::CacheEntry*e, tables) + { + toCacheEntryTable *f = static_cast<toCacheEntryTable *>(e); + f->describe(); + } + delete oraCon; } catch (const QString &str) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2012-06-18 21:56:58
|
Revision: 4355 http://tora.svn.sourceforge.net/tora/?rev=4355&view=rev Author: ibre5041 Date: 2012-06-18 21:56:51 +0000 (Mon, 18 Jun 2012) Log Message: ----------- toResulCols Modified Paths: -------------- branches/tora3/src/connection/tooracletraits.h branches/tora3/src/connection/toteradatatraits.h branches/tora3/src/core/toconnectiontraits.h branches/tora3/src/core/toresultcols.cpp Modified: branches/tora3/src/connection/tooracletraits.h =================================================================== --- branches/tora3/src/connection/tooracletraits.h 2012-06-15 12:33:50 UTC (rev 4354) +++ branches/tora3/src/connection/tooracletraits.h 2012-06-18 21:56:51 UTC (rev 4355) @@ -55,4 +55,13 @@ * @return String addressing table. */ virtual QString unQuote(const QString &name); -}; \ No newline at end of file + + /** Check if connection provider supports table level comments. + * @return bool return true if database supports table level comments + * See toSQL: toResultCols:TableComment + */ + virtual bool hasTableComments() + { + return true; + } +}; Modified: branches/tora3/src/connection/toteradatatraits.h =================================================================== --- branches/tora3/src/connection/toteradatatraits.h 2012-06-15 12:33:50 UTC (rev 4354) +++ branches/tora3/src/connection/toteradatatraits.h 2012-06-18 21:56:51 UTC (rev 4355) @@ -55,4 +55,13 @@ * @return String addressing table. */ virtual QString unQuote(const QString &name); -}; \ No newline at end of file + + /** Check if connection provider supports table level comments. + * @return bool return true if database supports table level comments + * See toSQL: toResultCols:TableComment + */ + virtual bool hasTableComments() + { + return true; + } +}; Modified: branches/tora3/src/core/toconnectiontraits.h =================================================================== --- branches/tora3/src/core/toconnectiontraits.h 2012-06-15 12:33:50 UTC (rev 4354) +++ branches/tora3/src/core/toconnectiontraits.h 2012-06-18 21:56:51 UTC (rev 4355) @@ -55,4 +55,10 @@ * @return String addressing table. */ virtual QString unQuote(const QString &name) = 0; -}; \ No newline at end of file + + /** Check if connection provider supports table level comments. + * @return bool return true if database supports table level comments + * See toSQL: toResultCols:TableComment + */ + virtual bool hasTableComments() = 0; +}; Modified: branches/tora3/src/core/toresultcols.cpp =================================================================== --- branches/tora3/src/core/toresultcols.cpp 2012-06-15 12:33:50 UTC (rev 4354) +++ branches/tora3/src/core/toresultcols.cpp 2012-06-18 21:56:51 UTC (rev 4355) @@ -504,94 +504,89 @@ try { - toQList subp; - - toQueryParams::const_iterator cp = param.begin(); - if (cp != param.end()) - { - object = conn.getTraits().quote(*cp); - Owner = *cp; - } - cp++; - if (cp != param.end()) - { - object += QString::fromLatin1("."); - object += conn.getTraits().quote(*cp); - Name = *cp; - } - else - { - Name = Owner; - if(conn.providerIs("MySQL")) - Owner = connection().database(); - else - Owner = connection().user().toUpper(); - } - + switch(param.size()) + { + case 1: + if(conn.providerIs("MySQL")) + Owner = connection().database(); + else + Owner = connection().user().toUpper(); + Name = param.at(0); + object = conn.getTraits().quote(param.at(0)); + break; + case 2: + Owner = param.at(0); + Name = param.at(1); + object = conn.getTraits().quote(param.at(0)) + + QString::fromLatin1(".") + + conn.getTraits().quote(param.at(1)); + break; + default: + Q_ASSERT_X(false, (__HERE__).c_str(), "Invalid size for params"); + } + TableName = conn.getTraits().quote(Owner) + "." + conn.getTraits().quote(Name); Columns->changeParams(Owner, Name); } TOCATCH; - try - { - QString synonym; - ///const toConnection::objectName &name = conn.realName( - /// object, - /// synonym, - /// false); + // try + // { + // QString synonym; + // ///const toConnection::objectName &name = conn.realName( + // /// object, + // /// synonym, + // /// false); + // + // QString label = QString::fromLatin1("<B>"); + // if (!synonym.isEmpty()) + // { + // label += conn.getTraits().quote(synonym); + // label += tr("</B> synonym for <B>"); + // } + // //label += conn.quote(name.Owner); + // QPair<QString, QString> syn = conn.getCache().translateName(QPair<QString, QString>(Owner, Name)); + // ///label += conn.Cache->translateName(QPair(Owner, Name)); + // label += syn.first + '.' + syn.second; + // if (label != QString::fromLatin1("<B>")) + // label += QString::fromLatin1("."); + // ///label += conn.quote(name.Name); + // + // label += QString::fromLatin1("</B>"); + // ///if (!name.Comment.isNull()) + // ///{ + // /// Comment->setText(name.Comment); + // /// EditComment->setComment( + // /// true, + // /// conn.quote(name.Owner) + "." + conn.quote(name.Name), + // /// const_cast<QString &>(name.Comment)); + // ///} + // ///else + // { + // Comment->setText(QString::null); + // ///EditComment->setComment( + // /// true, + // /// conn.quote(name.Owner) + "." + conn.quote(name.Name), + // /// const_cast<QString &>(name.Comment)); + // } + // + // Title->setText(label); + // } + // catch (const QString &) + // { + // // expected for databases that don't support synonyms + // ; + // } - QString label = QString::fromLatin1("<B>"); - if (!synonym.isEmpty()) - { - label += conn.getTraits().quote(synonym); - label += tr("</B> synonym for <B>"); - } - //label += conn.quote(name.Owner); - QPair<QString, QString> syn = conn.getCache().translateName(QPair<QString, QString>(Owner, Name)); - ///label += conn.Cache->translateName(QPair(Owner, Name)); - label += syn.first + '.' + syn.second; - if (label != QString::fromLatin1("<B>")) - label += QString::fromLatin1("."); - ///label += conn.quote(name.Name); - - label += QString::fromLatin1("</B>"); - ///if (!name.Comment.isNull()) - ///{ - /// Comment->setText(name.Comment); - /// EditComment->setComment( - /// true, - /// conn.quote(name.Owner) + "." + conn.quote(name.Name), - /// const_cast<QString &>(name.Comment)); - ///} - ///else - { - Comment->setText(QString::null); - ///EditComment->setComment( - /// true, - /// conn.quote(name.Owner) + "." + conn.quote(name.Name), - /// const_cast<QString &>(name.Comment)); - } - - Title->setText(label); - } - catch (const QString &) - { - // expected for databases that don't support synonyms - ; - } - + /* table label, including the comment */ + QString label = QString::fromLatin1("<B>"); + label += object; + label += QString::fromLatin1("</B>"); + Title->setText(label); try - { - QString label = QString::fromLatin1("<B>"); - label += object; - label += QString::fromLatin1("</B>"); - - if (connection().provider() == "Oracle" || - connection().provider() == "MySQL" || - connection().provider() == "PostgreSQL" || - connection().provider() == "Teradata") + { + if (connection().getTraits().hasTableComments()) { toConnection &conn = connection(); toQuery query(conn, SQLTableComment, toQueryParams() << Owner << Name); @@ -610,12 +605,9 @@ editComment(false); Edit->setEnabled(false); } - - Title->setText(label); } catch (const QString &str) { - Title->setText(str); Utils::toStatusMessage(str); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2012-06-18 23:36:49
|
Revision: 4356 http://tora.svn.sourceforge.net/tora/?rev=4356&view=rev Author: ibre5041 Date: 2012-06-18 23:36:42 +0000 (Mon, 18 Jun 2012) Log Message: ----------- Modified Paths: -------------- branches/tora3/src/connection/tooracleconnection.cpp branches/tora3/src/core/toresult.cpp branches/tora3/src/core/toresultcols.cpp Modified: branches/tora3/src/connection/tooracleconnection.cpp =================================================================== --- branches/tora3/src/connection/tooracleconnection.cpp 2012-06-18 21:56:51 UTC (rev 4355) +++ branches/tora3/src/connection/tooracleconnection.cpp 2012-06-18 23:36:42 UTC (rev 4356) @@ -50,6 +50,8 @@ #include "connection/tooraclequery.h" #include "core/utils.h" +#include "core/toconf.h" // TOAPPNAME +#include "core/toraversion.h" #include "core/tologger.h" #include "core/toconfiguration.h" @@ -213,10 +215,10 @@ try { - QString str = QString::fromLatin1("ALTER SESSION SET NLS_DATE_FORMAT = '"); - str += toConfigurationSingle::Instance().dateFormat(); - str += QString::fromLatin1("'"); - ////query oracleQuery::trotlQuery date(*conn, ::std::string(str.toAscii().constData())); + QString alterSessionSQL = QString::fromLatin1("ALTER SESSION SET NLS_DATE_FORMAT = '"); + alterSessionSQL += toConfigurationSingle::Instance().dateFormat(); + alterSessionSQL += QString::fromLatin1("'"); + oracleQuery::trotlQuery date(*conn, qPrintable(alterSessionSQL)); } catch (...) { @@ -230,30 +232,40 @@ try { - QString str = QString::fromLatin1("ALTER SESSION SET NLS_TIMESTAMP_FORMAT = '"); - str += toConfigurationSingle::Instance().timestampFormat(); - str += QString::fromLatin1("'"); - ////query oracleQuery::trotlQuery timestmp(*conn, ::std::string(str.toAscii().constData())); + QString alterSessionSQL = QString::fromLatin1("ALTER SESSION SET NLS_TIMESTAMP_FORMAT = '"); + alterSessionSQL += toConfigurationSingle::Instance().timestampFormat(); + alterSessionSQL += QString::fromLatin1("'"); + oracleQuery::trotlQuery timestmp(*conn, qPrintable(alterSessionSQL)); } + catch (::trotl::OciException const& e) + { + TLOG(5, toDecorator, __HERE__) + << "Failed to set new default timestmp format for session: " + << toConfigurationSingle::Instance().timestampFormat() + << std::endl + << e.what(); + Utils::toStatusMessage(QObject::tr("Failed to set new default timestamp format for session: %1") + .arg(toConfigurationSingle::Instance().timestampFormat())); + } catch (...) { - TLOG(5, toDecorator, __HERE__) - << "Failed to set new default timestmp format for session: " - << toConfigurationSingle::Instance().timestampFormat() - << std::endl; - Utils::toStatusMessage(QObject::tr("Failed to set new default timestamp format for session: %1") - .arg(toConfigurationSingle::Instance().timestampFormat())); + TLOG(5, toDecorator, __HERE__) + << "Failed to set new default timestmp format for session: " + << toConfigurationSingle::Instance().timestampFormat() + << std::endl; + Utils::toStatusMessage(QObject::tr("Failed to set new default timestamp format for session: %1") + .arg(toConfigurationSingle::Instance().timestampFormat())); } try { - //query oracleQuery::trotlQuery info(*conn, std::string( - // "BEGIN\n" - // " SYS.DBMS_APPLICATION_INFO.SET_CLIENT_INFO('" TOAPPNAME - // " (http://tora.sf.net)" - // "');\n" - // " SYS.DBMS_APPLICATION_INFO.SET_MODULE('" TOAPPNAME "','Access Database');\n" - // "END;")); + oracleQuery::trotlQuery info(*conn, + "BEGIN\n" + " SYS.DBMS_APPLICATION_INFO.SET_CLIENT_INFO('" TOAPPNAME " " TORAVERSION + " (http://tora.sf.net)" + "');\n" + " SYS.DBMS_APPLICATION_INFO.SET_MODULE('" TOAPPNAME "','Access Database');\n" + "END;"); } catch (::trotl::OciException const& e) { Modified: branches/tora3/src/core/toresult.cpp =================================================================== --- branches/tora3/src/core/toresult.cpp 2012-06-18 21:56:51 UTC (rev 4355) +++ branches/tora3/src/core/toresult.cpp 2012-06-18 23:36:42 UTC (rev 4356) @@ -83,9 +83,8 @@ QWidget *parent = widget; while (parent && parent->metaObject()->className() != QString("toTabWidget")) parent = parent->parentWidget(); - toTabWidget *tw = dynamic_cast<toTabWidget *>(parent); - if (tw) + if (toTabWidget *tw = dynamic_cast<toTabWidget *>(parent)) tw->setTabShown(widget, handled()); } @@ -183,26 +182,20 @@ setHandle(false); } } -// #include <QtDebug> + void toResult::setSQL(const toSQL &sql) { -// TLOG(2,toDecorator,__HERE__) << "setSQL"; -// TLOG(2,toDecorator,__HERE__) << "setSQL" << sql.name(); setSQLName(sql.name()); FromSQL = true; try { -// TLOG(2,toDecorator,__HERE__) << "setSQL 1"; Params.clear(); -// TLOG(2,toDecorator,__HERE__) << "setSQL 2"; setSQL(toSQL::string(sql, connection())); -// TLOG(2,toDecorator,__HERE__) << "setSQL 3"; setHandle(true); } catch (...) { TLOG(1, toDecorator, __HERE__) << " Ignored exception." << std::endl; -// TLOG(2,toDecorator,__HERE__) << "setSQL failed:" << sql.name(); setHandle(false); } } Modified: branches/tora3/src/core/toresultcols.cpp =================================================================== --- branches/tora3/src/core/toresultcols.cpp 2012-06-18 21:56:51 UTC (rev 4355) +++ branches/tora3/src/core/toresultcols.cpp 2012-06-18 23:36:42 UTC (rev 4356) @@ -413,6 +413,7 @@ "", "3.23", "MySQL"); + static toSQL SQLTableColumnsMySql( "toResultCols:ListCols", "SELECT * FROM information_schema.columns WHERE table_schema = :f1<char[101]> AND table_name = :f2<char[101]>", @@ -523,6 +524,7 @@ break; default: Q_ASSERT_X(false, (__HERE__).c_str(), "Invalid size for params"); + break; } TableName = conn.getTraits().quote(Owner) + "." + conn.getTraits().quote(Name); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2012-06-20 17:09:29
|
Revision: 4358 http://tora.svn.sourceforge.net/tora/?rev=4358&view=rev Author: ibre5041 Date: 2012-06-20 17:09:21 +0000 (Wed, 20 Jun 2012) Log Message: ----------- CacheEntry details - haraaa Modified Paths: -------------- branches/tora3/src/connection/tooracleconnection.cpp branches/tora3/src/connection/tooracleconnection.h branches/tora3/src/core/tocache.cpp branches/tora3/src/core/tocache.h branches/tora3/src/core/toconnectionsub.h branches/tora3/src/core/toresultcols.cpp branches/tora3/src/core/toresultmodel.cpp branches/tora3/src/tests/test2.cpp branches/tora3/src/tools/tobrowserschemawidget.cpp Modified: branches/tora3/src/connection/tooracleconnection.cpp =================================================================== --- branches/tora3/src/connection/tooracleconnection.cpp 2012-06-19 18:23:21 UTC (rev 4357) +++ branches/tora3/src/connection/tooracleconnection.cpp 2012-06-20 17:09:21 UTC (rev 4358) @@ -313,9 +313,9 @@ return new oracleQuery(query, this); } -toQColumnDescriptionList* toOracleConnectionSub::decribe(toCache::ObjectRef const& objectName) +toQAdditionalDescriptions* toOracleConnectionSub::decribe(toCache::ObjectRef const& objectName) { - toQColumnDescriptionList *retval = new toQColumnDescriptionList(); + toQAdditionalDescriptions *retval = new toQAdditionalDescriptions(); ::trotl::Describe *d = ::trotl::Describe::createDescription(*_conn, qPrintable(objectName.toString())); switch (d->whatIsThis()) { @@ -330,12 +330,13 @@ case ::trotl::Describe::O_TABLE: { trotl::DescribeTable *t = static_cast<trotl::DescribeTable*>(d); + retval->insert("TOOLTIP", QString(t->toString().c_str())); foreach(::trotl::DescribeColumn *dc, t->_columns) { toCache::ColumnDescription *c = new toCache::ColumnDescription(); c->Name = dc->_name.c_str(); c->Null = dc->_is_null; - c->Datatype = dc->_type_name.c_str(); + c->Datatype = dc->typeName().c_str(); c->ToolTip = dc->toString().c_str(); } } @@ -361,6 +362,7 @@ default: break; } - + if(d != NULL) + delete d; return retval; } Modified: branches/tora3/src/connection/tooracleconnection.h =================================================================== --- branches/tora3/src/connection/tooracleconnection.h 2012-06-19 18:23:21 UTC (rev 4357) +++ branches/tora3/src/connection/tooracleconnection.h 2012-06-20 17:09:21 UTC (rev 4358) @@ -95,7 +95,7 @@ virtual void rollback(); virtual queryImpl* createQuery(toQuery *query); - virtual toQColumnDescriptionList* decribe(toCache::ObjectRef const&); + virtual toQAdditionalDescriptions* decribe(toCache::ObjectRef const&); private: ::trotl::OciConnection *_conn; Modified: branches/tora3/src/core/tocache.cpp =================================================================== --- branches/tora3/src/core/tocache.cpp 2012-06-19 18:23:21 UTC (rev 4357) +++ branches/tora3/src/core/tocache.cpp 2012-06-20 17:09:21 UTC (rev 4358) @@ -41,6 +41,8 @@ #include "core/tocache.h" #include "core/toconfiguration.h" #include "core/toconnection.h" +#include "core/toconnectionsub.h" +#include "core/toconnectionsubloan.h" #include "core/tosql.h" #include "core/toraversion.h" #include "core/utils.h" @@ -55,283 +57,347 @@ // Forward declarations // Allow cache entries to be serialized / de-serialized -QDataStream& operator<< (QDataStream& stream, const toCache::CacheEntry& e); -QDataStream& operator>> (QDataStream& stream, toCache::CacheEntry& e); +QDataStream& operator<<(QDataStream& stream, const toCache::CacheEntry& e); +QDataStream& operator>>(QDataStream& stream, toCache::CacheEntry& e); -QString toCache::ObjectRef::toString() const -{ - if( first.isEmpty()) +QString toCache::ObjectRef::toString() const { + if (first.isEmpty()) return second; return QString(first) + '.' + second; } -toCache::toCache(toConnection &parentConnection, QString const &description) - : QObject(NULL) - , ConnectionDescription(description) - , refCount(1) // we assume that we were created from 1st toConnection - , state(NOT_STARTED) - , ownersRead(false) - , usersRead(false) - , parentConn(parentConnection) -{ +toCache::toCache(toConnection &parentConnection, QString const &description) : + QObject(NULL), ConnectionDescription(description), refCount(1) // we assume that we were created from 1st toConnection + , state(NOT_STARTED), ownersRead(false), usersRead(false), parentConn( + parentConnection) { } -toCache::~toCache() -{ +toCache::~toCache() { toLocker bLock(backgroundThreadLock); // wait till the background thread finishes toExclusiveLocker lock(cacheLock); clearCache(); } -void toCache::addEntry(toCache::CacheEntry* e) +// Static methods + +toCache::CacheEntry* toCache::createCacheEntry(const QString &objOwner, const QString &objName, CacheEntryType objType, const QString &comment) { + switch (objType) { + case TABLE: + return new toCacheEntryTable(objOwner, objName, comment); + case VIEW: + return new toCacheEntryView(objOwner, objName, comment); + case SYNONYM: + return new toCacheEntrySynonym(objOwner, objName, comment); + case PROCEDURE: + return new toCacheEntryProcedure(objOwner, objName, comment); + case FUNCTION: + return new toCacheEntryFunction(objOwner, objName, comment); + case PACKAGE: + return new toCacheEntryPackage(objOwner, objName, comment); + case PACKAGE_BODY: + return new toCacheEntryPackageBody(objOwner, objName, comment); + case INDEX: + return new toCacheEntryIndex(objOwner, objName, comment); + case SEQUENCE: + return new toCacheEntrySequence(objOwner, objName, comment); + case TRIGGER: + return new toCacheEntryTrigger(objOwner, objName, comment); + case DATABASE: + return new toCacheEntryDatabase(objOwner, objName, comment); + case USER: + return new toCacheEntryUser(objOwner); + default: + return NULL; // Do ignore some object types, like DBLINK or CLUSTER for example + ///throw QString("toCache: Unknown object type %1").arg(objType); + } +} + +toCache::CacheEntry* toCache::createCacheEntry(const QString &objOwner, const QString &objName, const QString &objTypeStr, const QString &comment) { - toExclusiveLocker lock(cacheLock); - switch(e->type) - { - case SYNONYM: - synonymMap.insert(e->name, e); - case TABLE: - case VIEW: - case PROCEDURE: - case FUNCTION: - case PACKAGE: - case PACKAGE_BODY: - case INDEX: - case SEQUENCE: - case TRIGGER: - case DATABASE: - case TORA_SCHEMA_LIST: - { - QString const& schema = e->name.first; + CacheEntryType objType = cacheEntryType(objTypeStr); + return createCacheEntry(objOwner, objName, objType, comment); +} +; - CacheEntry const* oldValue = entryMap.value(e->name, NULL); - if( oldValue) - delete oldValue; - entryMap.insert(e->name, e); +toCache::CacheEntry* toCache::cloneCacheEntry(CacheEntry const& other) +{ + return createCacheEntry(other.name.first, other.name.second, other.type, other.comment); +} - if( !usersMap.contains(schema)) - { - usersMap.insert(schema, new toCacheEntryUser(schema)); - emit userListRefreshed(); - } +// Getters - const methods - if( !ownersMap.contains(e->name.first)) - { - ownersMap.insert(schema, usersMap.value(schema)); - } - } - break; - case USER: - { - CacheEntry const* oldValue = usersMap.value(e->name.first, NULL); - if( oldValue == NULL) - { - usersMap.insert(e->name.first, e); - } - else - { - delete e; - } - } - break; - default: - ;; // HERE we ignore directories, dblinks, ... - } -}; +toCache::ObjectRef toCache::translateName(ObjectRef const& n) const +{ + // TODO: it is not transitive + toSharedLocker lock(cacheLock); + if (synonymMap.contains(n)) + return ObjectRef(synonymMap.value(n)->name); + else + return ObjectRef(n); + //return ObjectRef("", ""); +} toCache::CacheEntry const* toCache::findEntry(toCache::ObjectRef const& o) const { - toSharedLocker lock(cacheLock); - return entryMap.value(o, NULL); + toSharedLocker lock(cacheLock); + return entryMap.value(o, NULL); } -toCache::ObjectRef toCache::translateName(ObjectRef const& n) const +QList<toCache::CacheEntry const*> toCache::getEntriesInSchema(QString const& schema, CacheEntryType type) const { - toSharedLocker lock(cacheLock); - if( synonymMap.contains(n)) - return ObjectRef(synonymMap.value(n)->name); - else - return ObjectRef("", ""); + toSharedLocker lock(cacheLock); + QString schemaU = schema.toUpper(); + QList<toCache::CacheEntry const*> retval; + + QList<ObjectRef> objs = entryMap.keys(); // TODO there must be a better way of searching QMap (do not copy keys) + Q_FOREACH(ObjectRef const & o, objs) + { + if ((entryMap.value(o)->type == type || type == toCache::ANY) && o.first == schemaU) + retval.append(entryMap.value(o)); + } + return retval; } -void toCache::updateSchemaObjects(QString const& schema, QString const& objType, QList<toCache::CacheEntry*> const& rows) +QList<toCache::CacheEntry const*> toCache::getEntriesInSchema(QString const& schema, QString const& type) const { - toExclusiveLocker lock(cacheLock); - CacheEntryType type = cacheEntryType(objType); - if( type == OTHER) - throw QString("toCache: Unknown object type %1").arg(objType); + // No lock here. the 2nd call to getEntriesInSchema will lock this. + CacheEntryType t = cacheEntryType(type); + if (t != toCache::OTHER) + return getEntriesInSchema(schema, t); + else + return QList<toCache::CacheEntry const*>(); +} - // Clear whole schema - QList<ObjectRef> objs = entryMap.keys(); // TODO there must be a better way of deleting from QMap - Q_FOREACH(ObjectRef const & o, objs) - { - if( o.first == schema && entryMap.value(o)->type == type) - entryMap.remove(o); - } +bool toCache::entryExists(ObjectRef const&e, toCache::CacheEntryType entryType) const +{ + toSharedLocker lock(cacheLock); + if (entryMap.contains(e)&& (entryType == ANY || entryMap.value(e)->type == entryType)) + return true; + return false; +} - // Add new entries in the schema - Q_FOREACH(CacheEntry * e, rows) - { - entryMap.insert(e->name, e); - } +QList<toCache::CacheEntry const*> toCache::entries(bool wait) const +{ + toSharedLocker lock(cacheLock); + return entryMap.values(); +} - // Check if user/owner exists - { - if( !usersMap.contains(schema)) - { - usersMap.insert(schema, new toCacheEntryUser(schema)); - } +bool toCache::userListExists(UserListType listType) const { + if (listType == USERS) + return usersRead; + else + return ownersRead; +} - if( !rows.empty() && !ownersMap.contains(schema)) - { - ownersMap.insert(schema, usersMap.value(schema)); - } - } +/** List of database users / database object owners */ +QStringList toCache::userList(UserListType listType) const +{ + toSharedLocker lock(cacheLock); + QStringList retval; + QMap<QString, CacheEntry const*> const& map = (listType == USERS ? usersMap : ownersMap); + Q_FOREACH(CacheEntry const * e, map) { + retval.append(e->name.first); + } + return retval; +} - if( type == SYNONYM) - { - QList<ObjectRef> objs = synonymMap.keys(); // TODO there must be a better way of deleting from QMap - Q_FOREACH(ObjectRef const & o, objs) - { - if( o.first == schema) - synonymMap.remove(o); - } +// Setters - non-const methods +toCache::CacheEntry const* toCache::describeEntry(toCache::CacheEntry const*e) +{ + // 1st check if the entry exists in the cache + { + if (! entryExists(e->name)) + throw QString("Entry not found in toCache: %1").arg(e->name.toString()); + } - Q_FOREACH(CacheEntry * e, rows) - { - synonymMap.insert(e->name, e); - } - } -}; + toCache::CacheEntry *entry = const_cast<toCache::CacheEntry*>(e); -QList<toCache::CacheEntry*> toCache::getObjectsInSchema(QString const& schema, CacheEntryType type) const -{ - toSharedLocker lock(cacheLock); - QList<toCache::CacheEntry*> retval; + try { + toExclusiveLocker lock(cacheLock); + toConnectionSubLoan conn(parentConn); - QList<ObjectRef> objs = entryMap.keys(); // TODO there must be a better way of searching QMap (do not copy keys) - Q_FOREACH(ObjectRef const & o, objs) - { - if( (entryMap.value(o)->type == type || type == toCache::ANY) && o.first == schema ) - retval.append(const_cast<toCache::CacheEntry*>(entryMap.value(o))); - } - return retval; -}; + toQAdditionalDescriptions* l = conn->decribe(e->name); + entry->description.clear(); + entry->description = *l; -QList<toCache::CacheEntry*> toCache::getObjectsInSchema(QString const& schema, QString const& type) const -{ - CacheEntryType t = cacheEntryType(type); - if(t != toCache::OTHER) - return getObjectsInSchema(schema, t); - else - return QList<toCache::CacheEntry*>(); -}; + delete l; + } catch (...) { + return NULL; + } + return entry; +} -/** Clear current list of users and generate a new one */ -void toCache::updateUserList(QList<CacheEntry*> const& r, UserListType listType) +void toCache::upsertEntry(toCache::CacheEntry* e) { - toExclusiveLocker lock(cacheLock); - QString username; - if( listType == USERS) - { - Q_FOREACH(CacheEntry const * e, r) - { - username = e->name.first; - if(usersMap.contains(username)) // Do not replace existing entry - delete e; - else - usersMap.insert(username, e); - } - } - else - { - Q_FOREACH(CacheEntry const * e, r) - { - username = e->name.first; - if(ownersMap.contains(username)) - { - delete e; - } - else - { - CacheEntry const* userPointer = usersMap.value(username, NULL); - if( userPointer) - { - ownersMap.insert(username, userPointer); - delete e; - } - else - ownersMap.insert(username, e); - } - } - } + toExclusiveLocker lock(cacheLock); + switch (e->type) { + case SYNONYM: + synonymMap.insert(e->name, e); + case TABLE: + case VIEW: + case PROCEDURE: + case FUNCTION: + case PACKAGE: + case PACKAGE_BODY: + case INDEX: + case SEQUENCE: + case TRIGGER: + case DATABASE: + case TORA_SCHEMA_LIST: { + QString const& schema = e->name.first; - if( listType == USERS) - usersRead = true; - else - ownersRead = true; -}; + CacheEntry const* oldValue = entryMap.value(e->name, NULL); + if (oldValue) + delete oldValue; + entryMap.insert(e->name, e); -/** List of database users / database onject owners */ -QStringList toCache::userList(UserListType listType) const -{ - toSharedLocker lock(cacheLock); - QStringList retval; - QMap<QString, CacheEntry const*> const& map = (listType == USERS ? usersMap : ownersMap); - unsigned s = map.size(); - Q_FOREACH(CacheEntry const * e, map) - { - retval.append(e->name.first); - } - return retval; -}; + if (!usersMap.contains(schema)) { + usersMap.insert(schema, new toCacheEntryUser(schema)); + emit userListRefreshed(); + } -bool toCache::userListExists(UserListType listType) const -{ - if( listType == USERS) - return usersRead; - else - return ownersRead; + if (!ownersMap.contains(e->name.first)) { + ownersMap.insert(schema, usersMap.value(schema)); + } + } + break; + case USER: { + CacheEntry const* oldValue = usersMap.value(e->name.first, NULL); + if (oldValue == NULL) { + usersMap.insert(e->name.first, e); + } else { + delete e; + } + } + break; + default: + // HERE we ignore directories, dblinks, ... OTHER + break; + } } -QList<toCache::CacheEntry const*> toCache::objects(bool wait) const +void toCache::upsertSchemaEntries(QString const& schema, QString const& objType, QList<toCache::CacheEntry*> const& rows) { - toSharedLocker lock(cacheLock); - return entryMap.values(); -}; + toExclusiveLocker lock(cacheLock); + CacheEntryType type = cacheEntryType(objType); + if (type == OTHER) + throw QString("toCache: Unknown object type OTHER"); + if (type == ANY) + throw QString("toCache: Unsupported object type ANY"); -void toCache::setCacheState(CacheState c) + // Clear whole schema + QList<ObjectRef> objs = entryMap.keys(); // TODO there must be a better way of deleting from QMap + Q_FOREACH(ObjectRef const & o, objs) + { + if (o.first == schema && entryMap.value(o)->type == type) + entryMap.remove(o); + } + + // Add new entries in the schema + Q_FOREACH(CacheEntry * e, rows) + { + entryMap.insert(e->name, e); + } + + // Check if user/owner exists + { + if (!usersMap.contains(schema)) { + usersMap.insert(schema, new toCacheEntryUser(schema)); + } + + if (!rows.empty() && !ownersMap.contains(schema)) { + ownersMap.insert(schema, usersMap.value(schema)); + } + } + + if (type == SYNONYM) { + QList<ObjectRef> objs = synonymMap.keys(); // TODO there must be a better way of deleting from QMap + Q_FOREACH(ObjectRef const & o, objs) + { + if (o.first == schema) + synonymMap.remove(o); + } + + Q_FOREACH(CacheEntry * e, rows) + { + synonymMap.insert(e->name, e); + } + } +} + +/** Clear current list of users and generate a new one */ +void toCache::upsertUserList(QList<CacheEntry*> const& r, UserListType listType) { - toExclusiveLocker lock(cacheLock); - state = c; -}; + toExclusiveLocker lock(cacheLock); + QString username; + if (listType == USERS) + { + Q_FOREACH(CacheEntry const * e, r) + { + username = e->name.first; + if (usersMap.contains(username)) // Do not replace existing entry + delete e; + else + usersMap.insert(username, e); + } + } else { // listType == OWNERS + Q_FOREACH(CacheEntry const * e, r) + { + username = e->name.first; + if (ownersMap.contains(username)) + { + delete e; + } else { + CacheEntry const* userPointer = usersMap.value(username, NULL); + if (userPointer) { + ownersMap.insert(username, userPointer); + delete e; + } else + ownersMap.insert(username, e); + } + } + } -toCache::CacheState toCache::cacheState() const -{ - toSharedLocker lock(cacheLock); - return state; + if (listType == USERS) + usersRead = true; + else + ownersRead = true; } +void toCache::setCacheState(CacheState c) { + toExclusiveLocker lock(cacheLock); + state = c; +} +; + +toCache::CacheState toCache::cacheState() const { + toSharedLocker lock(cacheLock); + return state; +} + void toCache::rereadCache() { /** delete cache file to force reload - */ + */ QFileInfo filename(cacheFile()); if (filename.isFile()) QFile::remove(filename.absoluteFilePath()); - + readCache(); } void toCache::readCache() { - if (toConfigurationSingle::Instance().objectCache() == toConfiguration::NEVER) { + if (toConfigurationSingle::Instance().objectCache() + == toConfiguration::NEVER) { toExclusiveLocker lock(cacheLock); clearCache(); return; } if (cacheRefreshRunning()) { - Utils::toStatusMessage(qApp->translate("toConnection", "Not done caching objects, can not clear unread cache")); + Utils::toStatusMessage( + qApp->translate("toConnection", + "Not done caching objects, can not clear unread cache")); return; } @@ -354,29 +420,27 @@ } /* This method runs as a separate thread executed from: - toCache::readObjects(toTask * t) -*/ -void toCache::cacheObjects::run() -{ + toCache::readObjects(toTask * t) + */ +void toCache::cacheObjects::run() { toLocker bLock(parentConnection().getCache().backgroundThreadLock); parentConnection().getCache().setCacheState(toCache::READING_FROM_DISK); bool diskloaded = parentConnection().getCache().loadDiskCache(); - if (diskloaded) - { + if (diskloaded) { // TODO: Check if really whole cache was loaded. // the file image could contain only some schemas or part of the schema parentConnection().getCache().setCacheState(toCache::DONE); return; } - parentConnection().getCache().setCacheState(toCache::READING_FROM_DB); + parentConnection().getCache().setCacheState(toCache::READING_FROM_DB); try { - toQuery objects(parentConnection(), toSQL::sql("toConnection:ListObjectsInDatabase", parentConnection()), toQueryParams()); - while (!objects.eof()) - { - if (parentConnection().Abort) - { + toQuery objects(parentConnection(), + toSQL::sql("toConnection:ListObjectsInDatabase", + parentConnection()), toQueryParams()); + while (!objects.eof()) { + if (parentConnection().Abort) { parentConnection().getCache().setCacheState(toCache::FAILED); return; } @@ -385,11 +449,12 @@ QString name = objects.readValue(); QString type = objects.readValue(); QString comment = objects.readValue(); - toCache::CacheEntry *e = toCache::createCacheEntry(owner, name, type, comment); - if(e) - parentConnection().getCache().addEntry(e); + toCache::CacheEntry *e = toCache::createCacheEntry(owner, name, + type, comment); + if (e) + parentConnection().getCache().upsertEntry(e); } - }catch (toConnection::exception const &exc) { + } catch (toConnection::exception const &exc) { parentConnection().getCache().setCacheState(toCache::FAILED); throw exc; return; @@ -397,12 +462,12 @@ parentConnection().getCache().ownersRead = true; parentConnection().getCache().setCacheState(toCache::DONE); -}; +} +; -void toCache::wait4BGThread() -{ +void toCache::wait4BGThread() { CacheState s = cacheState(); - while ( s == toCache::READING_STARTED) // This state is set for a short period of time till the bg thread really starts + while (s == toCache::READING_STARTED) // This state is set for a short period of time till the bg thread really starts { QThread::yieldCurrentThread(); s = CacheState(); @@ -412,414 +477,385 @@ } } -QDir toCache::cacheDir() -{ - QString home(QDir::homePath()); - QString dirname(toConfigurationSingle::Instance().cacheDir()); +//toResultModel* toCache::describeDBObjectReturnModel(ObjectRef const&) +//{ +// return NULL; +//} +// +//toCache::CacheEntry* toCache::describeDBObjectReturnEntry(ObjectRef const&) +//{ +// return NULL; +//} - if (dirname.isEmpty()) - { +QDir toCache::cacheDir() { + QString home(QDir::homePath()); + QString dirname(toConfigurationSingle::Instance().cacheDir()); + + if (dirname.isEmpty()) { #ifdef Q_OS_WIN32 - if (getenv("TEMP")) - dirname = QString(getenv("TEMP")); - else + if (getenv("TEMP")) + dirname = QString(getenv("TEMP")); + else #endif - dirname = QString(home); - dirname += "/.tora_cache"; - } - return dirname; + dirname = QString(home); + dirname += "/.tora_cache"; + } + return dirname; } // cacheDir -QFileInfo toCache::cacheFile() -{ - QString ret (ConnectionDescription.trimmed()); - // using instantclient connectionstrins can result in file name like this: - // isepl_global_stage@//oraclexe11:1521/xe - // which is invalid. Just remove "/" or replace it with something safer. - // colon ":" is invalid char for filename on Windows - ret = ret.replace("/", "_"); - ret = ret.replace(":", "~"); - ret += ".bin"; +QFileInfo toCache::cacheFile() { + QString ret(ConnectionDescription.trimmed()); + // using instantclient connectionstrins can result in file name like this: + // isepl_global_stage@//oraclexe11:1521/xe + // which is invalid. Just remove "/" or replace it with something safer. + // colon ":" is invalid char for filename on Windows + ret = ret.replace("/", "_"); + ret = ret.replace(":", "~"); + ret += ".bin"; - return QFileInfo(cacheDir(), ret); + return QFileInfo(cacheDir(), ret); } // cacheFile -void toCache::writeDiskCache() -{ - toLocker bLock(backgroundThreadLock); +void toCache::writeDiskCache() { + toLocker bLock(backgroundThreadLock); - if (cacheState() != toCache::DONE) - { - return; - } + if (cacheState() != toCache::DONE) { + return; + } - if (!toConfigurationSingle::Instance().cacheDisk()) - return; + if (!toConfigurationSingle::Instance().cacheDisk()) + return; - QFileInfo fileInfo(cacheFile()); - QDir dir(cacheDir()); + QFileInfo fileInfo(cacheFile()); + QDir dir(cacheDir()); - if (!dir.exists()) - dir.mkdir(dir.absolutePath()); + if (!dir.exists()) + dir.mkdir(dir.absolutePath()); - QString version = QString::fromLatin1(TORAVERSION); + QString version = QString::fromLatin1(TORAVERSION); - QFile file(fileInfo.absoluteFilePath()); + QFile file(fileInfo.absoluteFilePath()); //TODO #warn "throw something here" - if (!file.open(QIODevice::ReadWrite | QIODevice::Truncate)) - return; + if (!file.open(QIODevice::ReadWrite | QIODevice::Truncate)) + return; - { - toSharedLocker lock(cacheLock); + { + toSharedLocker lock(cacheLock); - QDataStream out(&file); - out << (quint8) 0; - out << version; // Tora version - out << (quint8)state; // cache state - out << ownersRead; - out << usersRead; - out << ConnectionDescription; - file.flush(); + QDataStream out(&file); + out << (quint8) 0; + out << version; // Tora version + out << (quint8) state; // cache state + out << ownersRead; + out << usersRead; + out << ConnectionDescription; + file.flush(); - out << (quint32) usersMap.size(); - out << (quint32) entryMap.size(); + out << (quint32) usersMap.size(); + out << (quint32) entryMap.size(); - QList<CacheEntry const*> vUsersMap = usersMap.values(); - Q_FOREACH(CacheEntry const*e, vUsersMap) - { - out << (*e); - } + QList<CacheEntry const*> vUsersMap = usersMap.values(); + Q_FOREACH(CacheEntry const*e, vUsersMap) { + out << (*e); + } - QList<CacheEntry const*> vEntryMap = entryMap.values(); - Q_FOREACH(CacheEntry const*e, vEntryMap) - { - out << (*e); - } + QList<CacheEntry const*> vEntryMap = entryMap.values(); + Q_FOREACH(CacheEntry const*e, vEntryMap) { + out << (*e); + } - file.seek(0L); - out << (quint8) 1; - file.flush(); - file.close(); - } + file.seek(0L); + out << (quint8) 1; + file.flush(); + file.close(); + } } -bool toCache::loadDiskCache() -{ - if (!toConfigurationSingle::Instance().cacheDisk()) - return false; +bool toCache::loadDiskCache() { + if (!toConfigurationSingle::Instance().cacheDisk()) + return false; - QFileInfo fileInfo(cacheFile()); - QDir dir(cacheDir()); + QFileInfo fileInfo(cacheFile()); + QDir dir(cacheDir()); - if (!dir.exists()) - dir.mkdir(dir.absolutePath()); + if (!dir.exists()) + dir.mkdir(dir.absolutePath()); - QDateTime today; + QDateTime today; - if(!fileInfo.isReadable()) - return false; + if (!fileInfo.isReadable()) + return false; - if (fileInfo.lastModified().addDays(toConfigurationSingle::Instance().cacheTimeout()) < today) - return false; + if (fileInfo.lastModified().addDays( + toConfigurationSingle::Instance().cacheTimeout()) < today) + return false; - clearCache(); + clearCache(); //#warn TODO "throw something here - quint32 usersMapSize,entryMapSize; - QFile file(fileInfo.absoluteFilePath()); - file.open(QIODevice::ReadOnly); + quint32 usersMapSize, entryMapSize; + QFile file(fileInfo.absoluteFilePath()); + file.open(QIODevice::ReadOnly); - quint8 s1, s2; - bool oRead, uRead; - QString version; + quint8 s1, s2; + bool oRead, uRead; + QString version; - QDataStream in(&file); - { - toExclusiveLocker lock(cacheLock); + QDataStream in(&file); + { + toExclusiveLocker lock(cacheLock); - in >> s1; - in >> version; // Tora version - in >> s2; // cache state - in >> oRead; - in >> uRead; - in >> ConnectionDescription; + in >> s1; + in >> version; // Tora version + in >> s2; // cache state + in >> oRead; + in >> uRead; + in >> ConnectionDescription; - // Assume the cache file is corrupted if - // - 1st byte != 0x01 -- see writeDistCache() for details - // - application version differs - // - cache state != toCache::DONE - if (s1 != 1 || version != QString::fromLatin1(TORAVERSION) || s2 != toCache::DONE) - { - file.close(); - file.remove(); - return false; - } + // Assume the cache file is corrupted if + // - 1st byte != 0x01 -- see writeDistCache() for details + // - application version differs + // - cache state != toCache::DONE + if (s1 != 1 || version != QString::fromLatin1(TORAVERSION) + || s2 != toCache::DONE) { + file.close(); + file.remove(); + return false; + } - in >> usersMapSize; - in >> entryMapSize; - } + in >> usersMapSize; + in >> entryMapSize; + } - for(quint32 i = 0; i < usersMapSize; i++) - { - CacheEntry e, *cloned; - in >> e; - cloned = cloneCacheEntry(e); - if( cloned != NULL) - addEntry(cloned); - } + for (quint32 i = 0; i < usersMapSize; i++) { + CacheEntry e, *cloned; + in >> e; + cloned = cloneCacheEntry(e); + if (cloned != NULL) + upsertEntry(cloned); + } - for(quint32 i = 0; i < entryMapSize; i++) - { - CacheEntry e, *cloned; - in >> e; - cloned = cloneCacheEntry(e); - if( cloned != NULL) - addEntry(cloned); - } + for (quint32 i = 0; i < entryMapSize; i++) { + CacheEntry e, *cloned; + in >> e; + cloned = cloneCacheEntry(e); + if (cloned != NULL) + upsertEntry(cloned); + } - state = (CacheState)s2; - usersRead = uRead; - ownersRead = oRead; + state = (CacheState) s2; + usersRead = uRead; + ownersRead = oRead; - file.close(); - return true; + file.close(); + return true; } /** * private functions */ -void toCache::clearCache() -{ - QList<CacheEntry const*> v = entryMap.values(); - Q_FOREACH(CacheEntry const * e, v) - { - delete e; - } +void toCache::clearCache() { + QList<CacheEntry const*> v = entryMap.values(); + Q_FOREACH(CacheEntry const * e, v) { + delete e; + } - entryMap.clear(); - synonymMap.clear(); - columnCache.clear(); + entryMap.clear(); + synonymMap.clear(); + columnCache.clear(); - QList<CacheEntry const*> u = usersMap.values(); - Q_FOREACH(CacheEntry const * e, u) - { - delete e; - } - ownersMap.clear(); - usersMap.clear(); -}; - -/*static*/ toCache::CacheEntryType toCache::cacheEntryType(QString const& objType) -{ - if( objType == "TABLE") - return TABLE; - else if( objType == "VIEW") - return VIEW; - else if( objType == "SYNONYM") - return SYNONYM; - else if( objType == "PROCEDURE") - return PROCEDURE; - else if( objType == "FUNCTION") - return FUNCTION; - else if( objType == "PACKAGE") - return PACKAGE; - else if( objType == "PACKAGE BODY") - return PACKAGE_BODY; - else if( objType == "INDEX") - return INDEX; - else if( objType == "SEQUENCE") - return SEQUENCE; - else if( objType == "TRIGGER") - return TRIGGER; - else if( objType == "DATABASE") - return DATABASE; - else - return OTHER; + QList<CacheEntry const*> u = usersMap.values(); + Q_FOREACH(CacheEntry const * e, u) { + delete e; + } + ownersMap.clear(); + usersMap.clear(); } +; -/*static*/ QString toCache::cacheEntryTypeToString(toCache::CacheEntryType objType) -{ - switch(objType) - { - case TABLE: - return "TABLE"; - case VIEW: - return "VIEW"; - case SYNONYM: - return "SYNONYM"; - case PROCEDURE: - return "PROCEDURE"; - case FUNCTION: - return "FUNCTION"; - case PACKAGE: - return "PACKAGE"; - case PACKAGE_BODY: - return "PACKAGE BODY"; - case INDEX: - return "INDEX"; - case SEQUENCE: - return "SEQUENCE"; - case TRIGGER: - return "TRIGGER"; - case DATABASE: - return "DATABASE"; - default: - //return NULL; - throw QString("toCacheNew: Unknown object type %1").arg((quint32)objType); - } +/*static*/toCache::CacheEntryType toCache::cacheEntryType( + QString const& objType) { + if (objType == "TABLE") + return TABLE; + else if (objType == "VIEW") + return VIEW; + else if (objType == "SYNONYM") + return SYNONYM; + else if (objType == "PROCEDURE") + return PROCEDURE; + else if (objType == "FUNCTION") + return FUNCTION; + else if (objType == "PACKAGE") + return PACKAGE; + else if (objType == "PACKAGE BODY") + return PACKAGE_BODY; + else if (objType == "INDEX") + return INDEX; + else if (objType == "SEQUENCE") + return SEQUENCE; + else if (objType == "TRIGGER") + return TRIGGER; + else if (objType == "DATABASE") + return DATABASE; + else + return OTHER; } -bool toCache::cacheRefreshRunning() const -{ - toSharedLocker lock(cacheLock); - return state != NOT_STARTED && state != DONE && state != FAILED; +/*static*/QString toCache::cacheEntryTypeToString( + toCache::CacheEntryType objType) { + switch (objType) { + case TABLE: + return "TABLE"; + case VIEW: + return "VIEW"; + case SYNONYM: + return "SYNONYM"; + case PROCEDURE: + return "PROCEDURE"; + case FUNCTION: + return "FUNCTION"; + case PACKAGE: + return "PACKAGE"; + case PACKAGE_BODY: + return "PACKAGE BODY"; + case INDEX: + return "INDEX"; + case SEQUENCE: + return "SEQUENCE"; + case TRIGGER: + return "TRIGGER"; + case DATABASE: + return "DATABASE"; + default: + //return NULL; + throw QString("toCacheNew: Unknown object type %1").arg( + (quint32) objType); + } } -toCache::CacheEntry* toCache::createCacheEntry(const QString &objOwner, const QString &objName, CacheEntryType objType, const QString &comment) -{ - switch(objType) - { - case TABLE: - return new toCacheEntryTable(objOwner, objName, comment); - case VIEW: - return new toCacheEntryView(objOwner, objName, comment); - case SYNONYM: - return new toCacheEntrySynonym(objOwner, objName, comment); - case PROCEDURE: - return new toCacheEntryProcedure(objOwner, objName, comment); - case FUNCTION: - return new toCacheEntryFunction(objOwner, objName, comment); - case PACKAGE: - return new toCacheEntryPackage(objOwner, objName, comment); - case PACKAGE_BODY: - return new toCacheEntryPackageBody(objOwner, objName, comment); - case INDEX: - return new toCacheEntryIndex(objOwner, objName, comment); - case SEQUENCE: - return new toCacheEntrySequence(objOwner, objName, comment); - case TRIGGER: - return new toCacheEntryTrigger(objOwner, objName, comment); - case DATABASE: - return new toCacheEntryDatabase(objOwner, objName, comment); - case USER: - return new toCacheEntryUser(objOwner); - default: - return NULL; // Do ignore some object types, like DBLINK or CLUSTER for example - ///throw QString("toCache: Unknown object type %1").arg(objType); - } +bool toCache::cacheRefreshRunning() const { + return cacheState() & ( READING_STARTED | READING_FROM_DISK | READING_FROM_DB); } -toCache::CacheEntry* toCache::createCacheEntry(const QString &objOwner, const QString &objName, const QString &objTypeStr, const QString &comment) -{ - CacheEntryType objType = cacheEntryType(objTypeStr); - return createCacheEntry(objOwner, objName, objType, comment); -}; - -toCache::CacheEntry* toCache::cloneCacheEntry(CacheEntry const& other) -{ - return createCacheEntry(other.name.first, other.name.second, other.type, other.comment); +toCache::CacheEntry::CacheEntry(const QString &owner, const QString &objName, + const QString &objType, const QString &objComment) : + name(ObjectRef(owner, objName)), type(cacheEntryType(objType)), comment( + objComment), timestamp(QDate::currentDate()), described(false) { + if (type == OTHER) + throw QString("toCache: Unknown object type %1").arg(objType); } +; -toCache::CacheEntry::CacheEntry(const QString &owner, const QString &objName, const QString &objType, const QString &objComment) - : name(ObjectRef(owner, objName)) - , type(cacheEntryType(objType)) - , comment(objComment) - , timestamp(QDate::currentDate()) - , described(false) -{ - if( type == OTHER) - throw QString("toCache: Unknown object type %1").arg(objType); -}; - /** TODO delete this - this is courious constructor used to hold TORAs internal cache intries */ -toCache::CacheEntry::CacheEntry(const QString &owner, const QString &objName, toCache::CacheEntryType objType, const QString &objComment) - : name(ObjectRef(owner, objName)) - , type(objType) - , comment(objComment) - , timestamp(QDate::currentDate()) - , described(false) -{ - if( type == OTHER) - throw QString("toCache: Unknown object type %1").arg((quint8)objType); -}; +toCache::CacheEntry::CacheEntry(const QString &owner, const QString &objName, + toCache::CacheEntryType objType, const QString &objComment) : + name(ObjectRef(owner, objName)), type(objType), comment(objComment), timestamp( + QDate::currentDate()), described(false) { + if (type == OTHER) + throw QString("toCache: Unknown object type %1").arg((quint8) objType); +} +; -bool toCache::CacheEntry::operator < (const toCache::CacheEntry &other) const -{ - if( type < other.type) - return true; - if( type == other.type && name.first < other.name.first) - return true; - if( type == other.type && name.first == other.name.first && name.second < other.name.second) - return true; - return false; -}; +bool toCache::CacheEntry::operator <(const toCache::CacheEntry &other) const { + if (type < other.type) + return true; + if (type == other.type && name.first < other.name.first) + return true; + if (type == other.type && name.first == other.name.first + && name.second < other.name.second) + return true; + return false; +} +; -bool toCache::CacheEntry::operator == (const toCache::CacheEntry &other) const -{ - return type == other.type && name == other.name; -}; +bool toCache::CacheEntry::operator ==(const toCache::CacheEntry &other) const { + return type == other.type && name == other.name; +} +; -QDataStream& operator<< (QDataStream& stream, const toCache::CacheEntry& e) -{ - stream << e.name << (quint8)e.type << e.comment << e.timestamp << e.details; - return stream; +QDataStream& operator<<(QDataStream& stream, const toCache::CacheEntry& e) { + stream << e.name << (quint8) e.type << e.comment << e.timestamp + << e.details; + return stream; } -QDataStream& operator>> (QDataStream& stream, toCache::CacheEntry& e) -{ - quint8 type; +QDataStream& operator>>(QDataStream& stream, toCache::CacheEntry& e) { + quint8 type; - stream >> e.name >> type >> e.comment >> e.timestamp >> e.details; + stream >> e.name >> type >> e.comment >> e.timestamp >> e.details; - e.type = (toCache::CacheEntryType) type; - e.described = false; - return stream; + e.type = (toCache::CacheEntryType) type; + e.described = false; + return stream; } -toCacheEntryTable::toCacheEntryTable(const QString &owner, const QString &name, const QString &comment) - : toCache::CacheEntry(owner, name, toCache::TABLE, comment) -{}; +toCacheEntryTable::toCacheEntryTable(const QString &owner, const QString &name, + const QString &comment) : + toCache::CacheEntry(owner, name, toCache::TABLE, comment) { +} +; -toCacheEntryView::toCacheEntryView(const QString &owner, const QString &name, const QString &comment) - : toCache::CacheEntry(owner, name, toCache::VIEW, comment) -{}; +toCacheEntryView::toCacheEntryView(const QString &owner, const QString &name, + const QString &comment) : + toCache::CacheEntry(owner, name, toCache::VIEW, comment) { +} +; -toCacheEntrySynonym::toCacheEntrySynonym(const QString &owner, const QString &name, const QString &comment) - : toCache::CacheEntry(owner, name, toCache::SYNONYM, comment) -{}; +toCacheEntrySynonym::toCacheEntrySynonym(const QString &owner, + const QString &name, const QString &comment) : + toCache::CacheEntry(owner, name, toCache::SYNONYM, comment) { +} +; -toCacheEntryProcedure::toCacheEntryProcedure(const QString &owner, const QString &name, const QString &comment) - : toCache::CacheEntry(owner, name, toCache::PROCEDURE, comment) -{}; +toCacheEntryProcedure::toCacheEntryProcedure(const QString &owner, + const QString &name, const QString &comment) : + toCache::CacheEntry(owner, name, toCache::PROCEDURE, comment) { +} +; -toCacheEntryFunction::toCacheEntryFunction(const QString &owner, const QString &name, const QString &comment) - : toCache::CacheEntry(owner, name, toCache::FUNCTION, comment) -{}; +toCacheEntryFunction::toCacheEntryFunction(const QString &owner, + const QString &name, const QString &comment) : + toCache::CacheEntry(owner, name, toCache::FUNCTION, comment) { +} +; -toCacheEntryPackage::toCacheEntryPackage(const QString &owner, const QString &name, const QString &comment) - : toCache::CacheEntry(owner, name, toCache::PACKAGE, comment) -{}; +toCacheEntryPackage::toCacheEntryPackage(const QString &owner, + const QString &name, const QString &comment) : + toCache::CacheEntry(owner, name, toCache::PACKAGE, comment) { +} +; -toCacheEntryPackageBody::toCacheEntryPackageBody(const QString &owner, const QString &name, const QString &comment) - : toCache::CacheEntry(owner, name, toCache::PACKAGE_BODY, comment) -{}; +toCacheEntryPackageBody::toCacheEntryPackageBody(const QString &owner, + const QString &name, const QString &comment) : + toCache::CacheEntry(owner, name, toCache::PACKAGE_BODY, comment) { +} +; -toCacheEntryIndex::toCacheEntryIndex(const QString &owner, const QString &name, const QString &comment) - : toCache::CacheEntry(owner, name, toCache::INDEX, comment) -{}; +toCacheEntryIndex::toCacheEntryIndex(const QString &owner, const QString &name, + const QString &comment) : + toCache::CacheEntry(owner, name, toCache::INDEX, comment) { +} +; -toCacheEntrySequence::toCacheEntrySequence(const QString &owner, const QString &name, const QString &comment) - : toCache::CacheEntry(owner, name, toCache::SEQUENCE, comment) -{}; +toCacheEntrySequence::toCacheEntrySequence(const QString &owner, + const QString &name, const QString &comment) : + toCache::CacheEntry(owner, name, toCache::SEQUENCE, comment) { +} +; -toCacheEntryTrigger::toCacheEntryTrigger(const QString &owner, const QString &name, const QString &comment) - : toCache::CacheEntry(owner, name, toCache::TRIGGER, comment) -{}; +toCacheEntryTrigger::toCacheEntryTrigger(const QString &owner, + const QString &name, const QString &comment) : + toCache::CacheEntry(owner, name, toCache::TRIGGER, comment) { +} +; -toCacheEntryDatabase::toCacheEntryDatabase(const QString &owner, const QString &name, const QString &comment) - : toCache::CacheEntry(owner, name, toCache::DATABASE, comment) -{}; +toCacheEntryDatabase::toCacheEntryDatabase(const QString &owner, + const QString &name, const QString &comment) : + toCache::CacheEntry(owner, name, toCache::DATABASE, comment) { +} +; -toCacheEntryUser::toCacheEntryUser(const QString &schema) - : toCache::CacheEntry(schema, schema, toCache::USER, "") -{}; +toCacheEntryUser::toCacheEntryUser(const QString &schema) : + toCache::CacheEntry(schema, schema, toCache::USER, "") { +} +; Modified: branches/tora3/src/core/tocache.h =================================================================== --- branches/tora3/src/core/tocache.h 2012-06-19 18:23:21 UTC (rev 4357) +++ branches/tora3/src/core/tocache.h 2012-06-20 17:09:21 UTC (rev 4358) @@ -52,7 +52,12 @@ #include <QList> #include <QPair> #include <QSet> +#include <QPointer> +#include <QMap> +#include <QVariant> +#include <QString> + /** Object cache for a connection. This class is accessed only through toConnection a could be a nested class of toConnection. */ @@ -69,10 +74,15 @@ class toGlobalSetting; +class toResultModel; + class QDataStream; class QFileInfo; class QDir; +typedef QMap<QString, QVariant> toQAdditionalDescriptions; +Q_DECLARE_METATYPE(toQAdditionalDescriptions); + class TORA_EXPORT toCache : public QObject { Q_OBJECT; @@ -150,11 +160,13 @@ */ bool described; + toQAdditionalDescriptions description; + /** Create an object name with filled in values. */ CacheEntry(const QString &owner, const QString &name, const QString &type, const QString &comment = QString::null); - /** TODO delete this - this is courious constructor used to hold TORAs internal cache intries */ + /** TODO delete this - this is courious constructor used to hold TORAs internal cache entries */ CacheEntry(const QString &owner, const QString &objName, toCache::CacheEntryType objType, const QString &objComment); CacheEntry(CacheEntry const& other) @@ -202,19 +214,16 @@ QString ToolTip; }; // struct ColumnDescription - //typedef QList<QVariant> Row; // NOTE: first (0th) value in a row is a row number (see variable currRowKey) - //typedef QList<Row> RowList; - /** Objects state - updated by background threads */ enum CacheState : quint8 { - NOT_STARTED = 0, - READING_STARTED, - READING_FROM_DISK, - READING_FROM_DB, - DONE, - FAILED + NOT_STARTED = 1, + READING_STARTED = 2, + READING_FROM_DISK = 4, + READING_FROM_DB = 8, + DONE = 16, + FAILED = 32 }; enum UserListType @@ -249,38 +258,63 @@ static CacheEntry* createCacheEntry(const QString &owner, const QString &name, CacheEntryType type, const QString &comment); static CacheEntry* cloneCacheEntry(CacheEntry const& other); - /** add/update new entry into cache */ - void addEntry(CacheEntry* e); + // + // Cache querying - getters + // - /** Perform direct lookup on object cache - no synonym translation is made */ - CacheEntry const* findEntry(ObjectRef const&) const; - /** Use synonymMap to resolve object name */ ObjectRef translateName(ObjectRef const&) const; - /** add/update a list of objects in cache. - * This should add any new object to the list as well as remove no longer - * existing ones. - */ - void updateSchemaObjects(QString const& schema, QString const& objType, QList<CacheEntry*> const& r); + /** Perform direct lookup on object cache - no synonym translation is made + * no db lookup is performed + */ + CacheEntry const* findEntry(ObjectRef const&) const; - QList<CacheEntry*> getObjectsInSchema(QString const& schema, CacheEntryType type = ANY) const; - QList<CacheEntry*> getObjectsInSchema(QString const& schema, QString const& type) const; + /** Query the cache for entries of particular type + */ + QList<CacheEntry const *> getEntriesInSchema(QString const& schema, CacheEntryType type = ANY) const; + QList<CacheEntry const *> getEntriesInSchema(QString const& schema, QString const& type) const; - bool entryExists(QString const& schema, QString& name, CacheEntryType entryType = ANY) const; + /** Cbeck presence of entry in the DB + */ + bool entryExists(ObjectRef const&e, CacheEntryType entryType = ANY) const; - /** Clear current list of users and generate a new one */ - void updateUserList(QList<CacheEntry*> const&r, UserListType listType = USERS); + /** get list of the all the objects held in the cache */ + QList<CacheEntry const*> entries(bool wait = false) const; - /** List of database users / database onject owners */ + /** Check for presence of the special type entry - userList + * listType can be either "users" (all db users) or owners(database objects owners) + */ + bool userListExists(UserListType listType = USERS) const; + + /** List of database users / database object owners */ QStringList userList(UserListType listType = USERS) const; - bool userListExists(UserListType listType = USERS) const; + // + // Cache update - setters + // + /** Query additional information about the entry from the DB + * calls toConnectionSub::describe + */ + CacheEntry const* describeEntry(CacheEntry const*); - /** get list of the all the objects held in the cache */ - QList<CacheEntry const*> objects(bool wait = false) const; + /** add/update new entry into cache */ + void upsertEntry(CacheEntry* e); + /** add/update a list of objects in cache. + * This should add any new object to the list as well as remove no longer + * existing ones - within defined schema + */ + void upsertSchemaEntries(QString const& schema, QString const& objType, QList<CacheEntry*> const& r); + + /** Clear current list of users and generate a new one */ + void upsertUserList(QList<CacheEntry*> const&r, UserListType listType = USERS); + + // + // Cache manipulation + // + /** Reread the object and column cache. * Tries to read the cache from the disk first * Starts a new thread which will read all objects and synonyms from the database. @@ -293,12 +327,14 @@ */ void rereadCache(); - /** Non-blocking version of cacheAvailable, used by toMain to update toBackgroundLabel */ - bool cacheRefreshRunning() const; - /** Note: this functions is not 100% correct and should be used for testing purposes only */ void wait4BGThread(); + /** returns true if the background thread is running - non-blocking + * used by toMain to update toBackgroundLabel + */ + bool cacheRefreshRunning() const; + private: /** setter for cache state */ Modified: branches/tora3/src/core/toconnectionsub.h =================================================================== --- branches/tora3/src/core/toconnectionsub.h 2012-06-19 18:23:21 UTC (rev 4357) +++ branches/tora3/src/core/toconnectionsub.h 2012-06-20 17:09:21 UTC (rev 4358) @@ -61,7 +61,7 @@ virtual queryImpl* createQuery(toQuery *query) = 0; - virtual toQColumnDescriptionList* decribe(toCache::ObjectRef const&) = 0; + virtual toQAdditionalDescriptions* decribe(toCache::ObjectRef const&) = 0; void execute(QString const& SQL); Modified: branches/tora3/src/core/toresultcols.cpp =================================================================== --- branches/tora3/src/core/toresultcols.cpp 2012-06-19 18:23:21 UTC (rev 4357) +++ branches/tora3/src/core/toresultcols.cpp 2012-06-20 17:09:21 UTC (rev 4358) @@ -529,6 +529,7 @@ TableName = conn.getTraits().quote(Owner) + "." + conn.getTraits().quote(Name); + // TODO call is only if cache entry is not "described" Columns->changeParams(Owner, Name); } TOCATCH; @@ -581,6 +582,18 @@ // ; // } + Title->setToolTip(""); // Clear previous tooltip 1st + toCache::CacheEntry const*e = connection().getCache().findEntry(toCache::ObjectRef(Owner, Name)); + if(e && e->type == toCache::TABLE) // TODO This is just a test + { + toCacheEntryTable const* f = static_cast<toCacheEntryTable const*>(e); + + // TODO this is sync db request evaluated in the main (UI) thread - no async approach yet + connection().getCache().describeEntry(f); + if ( f->description.contains("TOOLTIP")) + Title->setToolTip(f->description.value("TOOLTIP").toString()); + } + /* table label, including the comment */ QString label = QString::fromLatin1("<B>"); label += object; @@ -590,8 +603,7 @@ { if (connection().getTraits().hasTableComments()) { - toConnection &conn = connection(); - toQuery query(conn, SQLTableComment, toQueryParams() << Owner << Name); + toQuery query(connection(), SQLTableComment, toQueryParams() << Owner << Name); QString t; if (!query.eof()) { Modified: branches/tora3/src/core/toresultmodel.cpp =================================================================== --- branches/tora3/src/core/toresultmodel.cpp 2012-06-19 18:23:21 UTC (rev 4357) +++ branches/tora3/src/core/toresultmodel.cpp 2012-06-20 17:09:21 UTC (rev 4358) @@ -132,13 +132,13 @@ HeadersRead = true; // Fetch list of objects from the cache - QList<toCache::CacheEntry*> tmp = toConnection::currentConnection(this).getCache().getObjectsInSchema(owner, type); + QList<toCache::CacheEntry const*> tmp = toConnection::currentConnection(this).getCache().getEntriesInSchema(owner, type); beginInsertRows(QModelIndex(), 0, tmp.count()); // Convert list of objects to appropriate type toResultModel::Row row; int counter = 1; - for (QList<toCache::CacheEntry *>::iterator i = tmp.begin(); i != tmp.end(); i++) + for (QList<toCache::CacheEntry const*>::iterator i = tmp.begin(); i != tmp.end(); i++) { // For each row a mandatory rownumber integer should be added toRowDesc rowDesc; Modified: branches/tora3/src/tests/test2.cpp =================================================================== --- branches/tora3/src/tests/test2.cpp 2012-06-19 18:23:21 UTC (rev 4357) +++ branches/tora3/src/tests/test2.cpp 2012-06-20 17:09:21 UTC (rev 4358) @@ -174,19 +174,19 @@ // uncomment this if you want to run cache refresh in synchronous mode // i.e. run it in the current main thread - //toCache::cacheObjects co(*oraCon); - //co.run(); + toCache::cacheObjects co(*oraCon); + co.run(); // uncomment this if you want to run cache refresh in async mode // i.e. run it the background thread - oraCon->getCache().readCache(); // rereadCache() - oraCon->getCache().wait4BGThread(); // wait for bg thread to finish. + //oraCon->getCache().readCache(); // rereadCache() + //oraCon->getCache().wait4BGThread(); // wait for bg thread to finish. - QList<toCache::CacheEntry*> tables = oraCon->getCache().getObjectsInSchema(schema, toCache::TABLE); - Q_FOREACH(toCache::CacheEntry*e, tables) + QList<toCache::CacheEntry const*> tables = oraCon->getCache().getEntriesInSchema(schema, toCache::TABLE); + Q_FOREACH(toCache::CacheEntry const*e, tables) { - toCacheEntryTable *f = static_cast<toCacheEntryTable *>(e); - f->describe(); + toCacheEntryTable const* f = static_cast<toCacheEntryTable const*>(e); + oraCon->getCache().describeEntry(f); } delete oraCon; Modified: branches/tora3/src/tools/tobrowserschemawidget.cpp =================================================================== --- branches/tora3/src/tools/tobrowserschemawidget.cpp 2012-06-19 18:23:21 UTC (rev 4357) +++ branches/tora3/src/tools/tobrowserschemawidget.cpp 2012-06-20 17:09:21 UTC (rev 4358) @@ -111,12 +111,12 @@ if (ObjectType == "DIRECTORY") Schema = "SYS"; - toConnection::currentConnection(this).getCache().updateSchemaObjects(Schema, ObjectType, rows); + toConnection::currentConnection(this).getCache().upsertSchemaEntries(Schema, ObjectType, rows); // Update information when list of this type of objects in this schema was updated // NOTE: Type is placed in the name field in order not to // mix this meta-information with actual list of objects. - toConnection::currentConnection(this).getCache().addEntry(new toCache::CacheEntry(Schema, ObjectType, toCache::TORA_SCHEMA_LIST, "")); + toConnection::currentConnection(this).getCache().upsertEntry(new toCache::CacheEntry(Schema, ObjectType, toCache::TORA_SCHEMA_LIST, "")); } // updateCache toBrowserSchemaCodeBrowser::toBrowserSchemaCodeBrowser(QWidget * parent) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2012-06-22 15:25:01
|
Revision: 4360 http://tora.svn.sourceforge.net/tora/?rev=4360&view=rev Author: ibre5041 Date: 2012-06-22 15:24:48 +0000 (Fri, 22 Jun 2012) Log Message: ----------- BIG CLEANUP Modified Paths: -------------- branches/tora3/src/core/toresult.cpp branches/tora3/src/core/toresult.h branches/tora3/src/core/toresultbar.cpp branches/tora3/src/core/toresultbar.h branches/tora3/src/core/toresultcols.cpp branches/tora3/src/core/toresultcols.h branches/tora3/src/core/toresultcombo.cpp branches/tora3/src/core/toresultcombo.h branches/tora3/src/core/toresultdata.cpp branches/tora3/src/core/toresultdata.h branches/tora3/src/core/toresultdepend.cpp branches/tora3/src/core/toresultextract.cpp branches/tora3/src/core/toresultextract.h branches/tora3/src/core/toresultfield.cpp branches/tora3/src/core/toresultfield.h branches/tora3/src/core/toresultitem.cpp branches/tora3/src/core/toresultitem.h branches/tora3/src/core/toresultplan.cpp branches/tora3/src/core/toresulttableview.cpp branches/tora3/src/core/toresulttableview.h branches/tora3/src/core/toresultview.cpp branches/tora3/src/core/toresultview.h branches/tora3/src/core/totableselect.cpp branches/tora3/src/toinvalid.cpp branches/tora3/src/tools/toanalyze.cpp branches/tora3/src/tools/tobrowser.cpp branches/tora3/src/tools/tobrowserbasewidget.cpp branches/tora3/src/tools/tobrowserconstraint.cpp branches/tora3/src/tools/tobrowserindex.cpp branches/tora3/src/tools/tobrowserschemawidget.cpp branches/tora3/src/tools/tobrowserschemawidget.h branches/tora3/src/tools/tooutput.cpp branches/tora3/src/tools/tooutput.h branches/tora3/src/tools/toresultstorage.cpp branches/tora3/src/tools/tosession.cpp branches/tora3/src/tools/tosgastatement.cpp branches/tora3/src/tools/tosgatrace.cpp branches/tora3/src/tools/toworksheet.cpp branches/tora3/src/toprofiler.cpp branches/tora3/src/toresultlabel.h branches/tora3/src/toresultline.h branches/tora3/src/toresultparam.h branches/tora3/src/toresultpie.h branches/tora3/src/tounittest.cpp Modified: branches/tora3/src/core/toresult.cpp =================================================================== --- branches/tora3/src/core/toresult.cpp 2012-06-21 13:42:37 UTC (rev 4359) +++ branches/tora3/src/core/toresult.cpp 2012-06-22 15:24:48 UTC (rev 4360) @@ -57,7 +57,7 @@ Handled(true), Tabs(0), TabWidget(0), - ForceRefresh(false), + NeedsRefresh(false), QueryReady(false), FromSQL(false), DisableTab(true) @@ -109,7 +109,7 @@ void toResult::connectionChanged(void) { - ForceRefresh = true; + NeedsRefresh = true; if (FromSQL) { try @@ -141,48 +141,50 @@ return toConnection::currentConnection(dynamic_cast<QWidget *>(this)); } -void toResult::query(const QString &sql) -{ - toQueryParams params; - query(sql, params); -} +//void toResult::query(const QString &sql) +//{ +// toQueryParams params; +// query(sql, params); +//} -void toResult::query(const toSQL &sql) -{ - setSQLName(sql.name()); - FromSQL = true; - try - { - toQueryParams params; - query((const QString)toSQL::string(sql, connection()), params); - setHandle(true); - } - catch (...) - { - TLOG(1, toDecorator, __HERE__) << " Ignored exception." << std::endl; - setHandle(false); - } -} -void toResult::query(const toSQL &sql, toQueryParams const& par) -{ - query(sql, par, std::list<QString>() ); -} -void toResult::query(const toSQL &sql, toQueryParams const& par, const std::list<QString> priKeys) -{ - setSQLName(sql.name()); - FromSQL = true; - try - { - query((const QString)toSQL::string(sql, connection()), par); - setHandle(true); - } - catch (...) - { - TLOG(1, toDecorator, __HERE__) << " Ignored exception." << std::endl; - setHandle(false); - } -} +//void toResult::query(const toSQL &sql) +//{ +// setSQLName(sql.name()); +// FromSQL = true; +// try +// { +// toQueryParams params; +// query((const QString)toSQL::string(sql, connection()), params); +// setHandle(true); +// } +// catch (...) +// { +// TLOG(1, toDecorator, __HERE__) << " Ignored exception." << std::endl; +// setHandle(false); +// } +//} +//void toResult::query(const toSQL &sql, toQueryParams const& par) +//{ +// query(sql, par, std::list<QString>() ); +//} + +//void toResult::query(const toSQL &sql, toQueryParams const& par, const std::list<QString> priKeys) +//{ +// setSQLName(sql.name()); +// FromSQL = true; +// try +// { +// query((const QString)toSQL::string(sql, connection()), par); +// setHandle(true); +// } +// catch (...) +// { +// TLOG(1, toDecorator, __HERE__) << " Ignored exception." << std::endl; +// setHandle(false); +// } +//} + void toResult::setSQL(const toSQL &sql) { setSQLName(sql.name()); @@ -200,24 +202,31 @@ } } -void toResult::changeParams(const QString &Param1, const QString &Param2, const QString &Param3) +void toResult::removeSQL() { - toQueryParams params; - params << Param1 << Param2 << Param3; - query((const QString)SQL, params); + setSQLName(""); + SQL = ""; + FromSQL = false; + Params.clear(); + setHandle(false); } -void toResult::changeParams(const QString &Param1, const QString &Param2) -{ - toQueryParams params; - params << Param1 << Param2; - query((const QString)SQL, params); -} +//void toResult::executeWithParams(const QString &Param1, const QString &Param2, const QString &Param3) +//{ +// toQueryParams params; +// params << Param1 << Param2 << Param3; +// query((const QString)SQL, params); +//} -void toResult::changeParams(const QString &Param1) +//void toResult::executeWithParams(const QString &Param1, const QString &Param2) +//{ +// toQueryParams params; +// params << Param1 << Param2; +// query((const QString)SQL, params); +//} + +void toResult::executeWithParams(toQueryParams const& params) { - toQueryParams params; - params << Param1; query((const QString)SQL, params); } @@ -256,11 +265,13 @@ Result->changeHandle(); } -bool toResult::setSQLParams(const QString &sql, toQueryParams const& par) +bool toResult::setSqlAndParams(const QString &sql, toQueryParams const& par) { - bool force = ForceRefresh; - ForceRefresh = false; - if (toConfigurationSingle::Instance().dontReread()) + bool force = NeedsRefresh; + NeedsRefresh = false; + + // Enter the inner loop if and only if the NeedsRefresh was false + if (toConfigurationSingle::Instance().dontReread() && force == false) { if (SQL == sql && par.size() == Params.size()) { @@ -285,6 +296,6 @@ void toResult::refresh() { - ForceRefresh = true; + NeedsRefresh = true; query((const QString &)SQL, Params); } Modified: branches/tora3/src/core/toresult.h =================================================================== --- branches/tora3/src/core/toresult.h 2012-06-21 13:42:37 UTC (rev 4359) +++ branches/tora3/src/core/toresult.h 2012-06-22 15:24:48 UTC (rev 4360) @@ -91,38 +91,26 @@ QWidget *TabWidget; QString SQL; - bool ForceRefresh; + + // Is set to true, if connection was changed + // This value is returned from setSqlAndParams + bool NeedsRefresh; + bool QueryReady; toQueryParams Params; bool FromSQL; QString Name; bool DisableTab; -protected: - std::list<QString> PriKeys; - /** Set parameters of last query. - */ - void setParams(toQueryParams const& par) - { - Params = par; - QueryReady = true; - } - /** Set SQL and parameters and return false if query shouldn't be reexecuted. It is - * important that all descendants call this function in the beginning of the implementation - * of the query function to determine if the query should be reexecuted or not. - */ - bool setSQLParams(const QString &sql, toQueryParams const& par); public: - /** Get the current connection from the closest tool. - * @return Reference to connection. - */ - toConnection &connection(void); + /** Get the timer associated with the closest tool. * @return Pointer to tool timer. */ toTimer *timer(void); toResult(void); + virtual ~toResult() { } @@ -133,36 +121,22 @@ Params.clear(); QueryReady = false; } + /** Re execute last query */ virtual void refresh(void); - /** Perform a query. - * @param sql Execute an SQL statement. - * @param params Parameters needed as input to execute statement. - */ - virtual void query(const QString &sql, toQueryParams const& params) = 0; + /** Reexecute with changed parameters. - * @param Param1 First parameter. + * @param list of query parameters */ - virtual void changeParams(const QString &Param1); - /** Reexecute with changed parameters. - * @param Param1 First parameter. - * @param Param1 Second parameter. - */ - virtual void changeParams(const QString &Param1, const QString &Param2); - /** Reexecute with changed parameters. - * @param Param1 First parameter. - * @param Param2 Second parameter. - * @param Param3 Third parameter. - */ - virtual void changeParams(const QString &Param1, const QString &Param2, const QString &Param3); + virtual void executeWithParams(toQueryParams const& params); /** Clear result pane. When used in Schema Browser this method will be called when nothing is selected in object list. */ virtual void clearData() {} - /** Reimplemented for internal reasons. + /** To be reimplemented for internal reasons. */ virtual bool canHandle(toConnection &) { @@ -207,30 +181,32 @@ { SQL = sql; } + void removeSQL(); + /** Set the SQL statement of this list. This will also affect @ref Name. * @param sql SQL containing statement. */ void setSQL(const toSQL &sql); - /** Set new SQL and run query. - * @param sql New sql. - * @see setSQL - */ - void query(const QString &sql); - /** Set new SQL and run query. - * @param sql New sql. - * @see setSQL - */ - void query(const toSQL &sql); - /** Set new SQL and run query. - * @param sql New sql. - * @see setSQL - */ - void query(const toSQL &sql, toQueryParams const& par, const std::list<QString> priKeys); - /** Set new SQL and run query. - * @param sql New sql. - * @see setSQL - */ - void query(const toSQL &sql, toQueryParams const& par); +// /** Set new SQL and run query. +// * @param sql New sql. +// * @see setSQL +// */ +// void query(const QString &sql); +// /** Set new SQL and run query. +// * @param sql New sql. +// * @see setSQL +// */ +// void query(const toSQL &sql); +// /** Set new SQL and run query. +// * @param sql New sql. +// * @see setSQL +// */ +// void query(const toSQL &sql, toQueryParams const& par, const std::list<QString> priKeys); +// /** Set new SQL and run query. +// * @param sql New sql. +// * @see setSQL +// */ +// void query(const toSQL &sql, toQueryParams const& par); /** Get SQL to execute */ QString sql(void) @@ -253,11 +229,39 @@ friend class toResultObject; protected: + // Used only in toResultTableViewEdit + std::list<QString> PriKeys; + /** Called when connection is changed. Be sure to call the parent if you reimplement this. */ virtual void connectionChanged(void); + + /** Set parameters of last query. + */ + void setParams(toQueryParams const& par) + { + Params = par; + QueryReady = true; + } + /** Set SQL and parameters and return false if query shouldn't be reexecuted. It is + * important that all descendants call this function in the beginning of the implementation + * of the query function to determine if the query should be reexecuted or not. + */ + bool setSqlAndParams(const QString &sql, toQueryParams const& par); + + /** Get the current connection from the closest tool. + * @return Reference to connection. + * NOTE: can be used only in subclasses who also inherit from QWidget + */ + toConnection &connection(void); private: void changeHandle(void); + + /** Perform a query - abstract method, must be re-implemented by subclasses + * @param sql Execute an SQL statement. + * @param params Parameters needed as input to execute statement. + */ + virtual void query(const QString &sql, toQueryParams const& params) = 0; }; #endif Modified: branches/tora3/src/core/toresultbar.cpp =================================================================== --- branches/tora3/src/core/toresultbar.cpp 2012-06-21 13:42:37 UTC (rev 4359) +++ branches/tora3/src/core/toresultbar.cpp 2012-06-22 15:24:48 UTC (rev 4360) @@ -97,7 +97,7 @@ return ; start(); - setSQLParams(sql, param); + setSqlAndParams(sql, param); try { Modified: branches/tora3/src/core/toresultbar.h =================================================================== --- branches/tora3/src/core/toresultbar.h 2012-06-21 13:42:37 UTC (rev 4359) +++ branches/tora3/src/core/toresultbar.h 2012-06-22 15:24:48 UTC (rev 4360) @@ -61,6 +61,7 @@ class toResultBar : public toBarChart, public toResult { +private: Q_OBJECT /** Display flow in change per second instead of actual values. */ @@ -109,7 +110,7 @@ return Flow; } - /** Reimplemented for internal reasons. + /** Reimplemented abstract method */ virtual void query(const QString &sql, toQueryParams const& param) { @@ -123,6 +124,7 @@ LastValues.clear(); toBarChart::clear(); } + /** Transform valueset. Make it possible to perform more complex transformation. * called directly before adding the valueset to the chart. After flow transformation. * Default is passthrough. @@ -137,47 +139,6 @@ return true; } - // Why are these needed? -#if 1 - /** Set the SQL statement of this list - * @param sql String containing statement. - */ - void setSQL(const QString &sql) - { - toResult::setSQL(sql); - } - /** Set the SQL statement of this list. This will also affect @ref Name. - * @param sql SQL containing statement. - */ - void setSQL(const toSQL &sql) - { - toResult::setSQL(sql); - } - /** Set new SQL and run query. - * @param sql New sql. - * @see setSQL - */ - void query(const QString &sql) - { - toResult::query(sql); - } - /** Set new SQL and run query. - * @param sql New sql. - * @see setSQL - */ - void query(const toSQL &sql) - { - toResult::query(sql); - } - /** Set new SQL and run query. - * @param sql New sql. - * @see setSQL - */ - void query(const toSQL &sql, toQueryParams &par) - { - toResult::query(sql, par); - } -#endif public slots: /** Reimplemented for internal reasons. */ @@ -185,24 +146,7 @@ { query(sql(), params(), false); } - /** Reimplemented for internal reasons. - */ - virtual void changeParams(const QString &Param1) - { - toResult::changeParams(Param1); - } - /** Reimplemented For internal reasons. - */ - virtual void changeParams(const QString &Param1, const QString &Param2) - { - toResult::changeParams(Param1, Param2); - } - /** Reimplemented for internal reasons. - */ - virtual void changeParams(const QString &Param1, const QString &Param2, const QString &Param3) - { - toResult::changeParams(Param1, Param2, Param3); - } + protected slots: /** Reimplemented for internal reasons. */ Modified: branches/tora3/src/core/toresultcols.cpp =================================================================== --- branches/tora3/src/core/toresultcols.cpp 2012-06-21 13:42:37 UTC (rev 4359) +++ branches/tora3/src/core/toresultcols.cpp 2012-06-22 15:24:48 UTC (rev 4360) @@ -423,6 +423,7 @@ toResultCols::toResultCols(QWidget *parent, const char *name, Qt::WFlags f) : QWidget(parent, f) + , SQL(SQLTableColumns) { if (name) @@ -494,7 +495,7 @@ QString Name; QString object; - toConnection &conn = connection(); + toConnection &conn = toConnection::currentConnection(this); if (ColumnComments) { @@ -509,9 +510,9 @@ { case 1: if(conn.providerIs("MySQL")) - Owner = connection().database(); + Owner = conn.database(); else - Owner = connection().user().toUpper(); + Owner = conn.user().toUpper(); Name = param.at(0); object = conn.getTraits().quote(param.at(0)); break; @@ -527,10 +528,10 @@ break; } - TableName = conn.getTraits().quote(Owner) + "." + conn.getTraits().quote(Name); + //TableName = conn.getTraits().quote(Owner) + "." + conn.getTraits().quote(Name); // TODO call is only if cache entry is not "described" - Columns->changeParams(Owner, Name); + Columns->executeWithParams(toQueryParams() << Owner << Name); } TOCATCH; @@ -583,15 +584,13 @@ // } Title->setToolTip(""); // Clear previous tooltip 1st - toCache::CacheEntry const*e = connection().getCache().findEntry(toCache::ObjectRef(Owner, Name)); - if(e && e->type == toCache::TABLE) // TODO This is just a test + toCache::CacheEntry const*e = conn.getCache().findEntry(toCache::ObjectRef(Owner, Name)); + if(e) { - toCacheEntryTable const* f = static_cast<toCacheEntryTable const*>(e); - // TODO this is sync db request evaluated in the main (UI) thread - no async approach yet - connection().getCache().describeEntry(f); - if ( f->description.contains("TOOLTIP")) - Title->setToolTip(f->description.value("TOOLTIP").toString()); + conn.getCache().describeEntry(e); + if ( e->description.contains("TOOLTIP")) + Title->setToolTip(e->description.value("TOOLTIP").toString()); } /* table label, including the comment */ @@ -601,14 +600,14 @@ Title->setText(label); try { - if (connection().getTraits().hasTableComments()) + if (conn.getTraits().hasTableComments()) { - toQuery query(connection(), SQLTableComment, toQueryParams() << Owner << Name); + toQuery query(conn, SQLTableComment, toQueryParams() << Owner << Name); QString t; if (!query.eof()) { t = query.readValue(); - EditComment->setComment(true, TableName, t); + EditComment->setComment(true, Object.toString()/*TableName*/, t); } Comment->setText(t); editComment(Edit->isChecked()); @@ -643,6 +642,7 @@ void toResultCols::editComment(bool val) { + toConnection &conn = toConnection::currentConnection(this); setUpdatesEnabled(false); // setup the comments @@ -671,7 +671,8 @@ toResultColsComment *com = new toResultColsComment(container); com->setComment(false, - TableName + "." + connection().getTraits().quote(column), + //TableName + "." + conn.getTraits().quote(column), + Object.toString() + "." + conn.getTraits().quote(column), comment); grid->addWidget(new QLabel(column)); grid->addWidget(com, row, 1); Modified: branches/tora3/src/core/toresultcols.h =================================================================== --- branches/tora3/src/core/toresultcols.h 2012-06-21 13:42:37 UTC (rev 4359) +++ branches/tora3/src/core/toresultcols.h 2012-06-22 15:24:48 UTC (rev 4360) @@ -60,6 +60,7 @@ */ class toResultCols : public QWidget, public toResult { +private: Q_OBJECT; QLabel *Title; @@ -70,8 +71,9 @@ bool Header; QScrollArea *ColumnComments; /* container for column * comment widgets */ - QString TableName; /* quoted owner and table */ - + //QString TableName; /* quoted owner and table */ + toCache::ObjectRef Object; + toSQL &SQL; public: /** * Create the widget. @@ -82,9 +84,8 @@ */ toResultCols(QWidget *parent, const char *name = NULL, Qt::WFlags f = 0); - /** - * Reimplemented from toResult + * Reimplemented abstract method */ virtual void query(const QString &sql, toQueryParams const& param); @@ -100,7 +101,21 @@ return true; } + /** Set the SQL statement of this list. This will also affect @ref Name. + * @param sql SQL containing statement. + */ + void setSQL(toSQL const& sql) + { + toResult::setSQL(sql); + SQL = sql; + } + + void changeObject(toCache::ObjectRef const&o) + { + Object = o; + } + /** * Display header of column view * Modified: branches/tora3/src/core/toresultcombo.cpp =================================================================== --- branches/tora3/src/core/toresultcombo.cpp 2012-06-21 13:42:37 UTC (rev 4359) +++ branches/tora3/src/core/toresultcombo.cpp 2012-06-22 15:24:48 UTC (rev 4360) @@ -68,7 +68,7 @@ void toResultCombo::query(const QString &sql, toQueryParams const& param) { - if (!setSQLParams(sql, param)) + if (!setSqlAndParams(sql, param)) return ; try Modified: branches/tora3/src/core/toresultcombo.h =================================================================== --- branches/tora3/src/core/toresultcombo.h 2012-06-21 13:42:37 UTC (rev 4359) +++ branches/tora3/src/core/toresultcombo.h 2012-06-22 15:24:48 UTC (rev 4360) @@ -59,6 +59,7 @@ class toResultCombo : public QComboBox, public toResult { +private: Q_OBJECT QPointer<toEventQuery> Query; @@ -87,7 +88,7 @@ */ virtual ~toResultCombo(); - /** Reimplemented for internal reasons. + /** Reimplemented abstract method */ virtual void query(const QString &sql, toQueryParams const& param); @@ -129,47 +130,6 @@ SelectionPolicy = pol; } - // Why are these needed? -#if 0 - /** Set the SQL statement of this list - * @param sql String containing statement. - */ - void setSQL(const QString &sql) - { - toResult::setSQL(sql); - } - /** Set the SQL statement of this list. This will also affect @ref Name. - * @param sql SQL containing statement. - */ - void setSQL(const toSQL &sql) - { - toResult::setSQL(sql); - } - /** Set new SQL and run query. - * @param sql New sql. - * @see setSQL - */ - void query(const QString &sql) - { - toResult::query(sql); - } - /** Set new SQL and run query. - * @param sql New sql. - * @see setSQL - */ - void query(const toSQL &sql) - { - toResult::query(sql); - } - /** Set new SQL and run query. - * @param sql New sql. - * @see setSQL - */ - void query(const toSQL &sql, toQueryParams const& par) - { - toResult::query(sql, par); - } -#endif signals: /** Done reading the query. */ @@ -178,24 +138,6 @@ /** Reimplemented for internal reasons. */ virtual void refresh(void); - /** Reimplemented for internal reasons. - */ - virtual void changeParams(const QString &Param1) - { - toResult::changeParams(Param1); - } - /** Reimplemented For internal reasons. - */ - virtual void changeParams(const QString &Param1, const QString &Param2) - { - toResult::changeParams(Param1, Param2); - } - /** Reimplemented for internal reasons. - */ - virtual void changeParams(const QString &Param1, const QString &Param2, const QString &Param3) - { - toResult::changeParams(Param1, Param2, Param3); - } void usersFromCache(void); private slots: Modified: branches/tora3/src/core/toresultdata.cpp =================================================================== --- branches/tora3/src/core/toresultdata.cpp 2012-06-21 13:42:37 UTC (rev 4359) +++ branches/tora3/src/core/toresultdata.cpp 2012-06-22 15:24:48 UTC (rev 4360) @@ -364,7 +364,7 @@ filter.Order->setText(Order[FilterName]); filter.Criteria->setText(Criteria[FilterName]); - filter.Columns->changeParams(Owner, Table); + filter.Columns->changeObject(toCache::ObjectRef(Owner, Table)); if (dialog.exec()) { Modified: branches/tora3/src/core/toresultdata.h =================================================================== --- branches/tora3/src/core/toresultdata.h 2012-06-21 13:42:37 UTC (rev 4359) +++ branches/tora3/src/core/toresultdata.h 2012-06-22 15:24:48 UTC (rev 4360) @@ -60,6 +60,7 @@ class toResultData : public QWidget, public toResult { +private: Q_OBJECT; // toolbar actions Modified: branches/tora3/src/core/toresultdepend.cpp =================================================================== --- branches/tora3/src/core/toresultdepend.cpp 2012-06-21 13:42:37 UTC (rev 4359) +++ branches/tora3/src/core/toresultdepend.cpp 2012-06-22 15:24:48 UTC (rev 4360) @@ -132,7 +132,7 @@ Query = NULL; Current = NULL; - if (!setSQLParams(sql, param)) + if (!setSqlAndParams(sql, param)) return ; clear(); Modified: branches/tora3/src/core/toresultextract.cpp =================================================================== --- branches/tora3/src/core/toresultextract.cpp 2012-06-21 13:42:37 UTC (rev 4359) +++ branches/tora3/src/core/toresultextract.cpp 2012-06-22 15:24:48 UTC (rev 4360) @@ -79,7 +79,7 @@ void toResultExtract::query(const QString &sql, toQueryParams const& param) { - if (!setSQLParams(sql, param)) + if (!setSqlAndParams(sql, param)) return ; try Modified: branches/tora3/src/core/toresultextract.h =================================================================== --- branches/tora3/src/core/toresultextract.h 2012-06-21 13:42:37 UTC (rev 4359) +++ branches/tora3/src/core/toresultextract.h 2012-06-22 15:24:48 UTC (rev 4360) @@ -54,6 +54,7 @@ class toResultExtract : public toWorksheetWidget, public toResult { +private: Q_OBJECT bool Prompt; @@ -89,31 +90,6 @@ /** Support Oracle */ virtual bool canHandle(toConnection &conn); -public slots: - /** Reimplemented for internal reasons. - */ - virtual void refresh(void) - { - toResult::refresh(); - } - /** Reimplemented for internal reasons. - */ - virtual void changeParams(const QString &Param1) - { - toResult::changeParams(Param1); - } - /** Reimplemented For internal reasons. - */ - virtual void changeParams(const QString &Param1, const QString &Param2) - { - toResult::changeParams(Param1, Param2); - } - /** Reimplemented for internal reasons. - */ - virtual void changeParams(const QString &Param1, const QString &Param2, const QString &Param3) - { - toResult::changeParams(Param1, Param2, Param3); - } }; #endif Modified: branches/tora3/src/core/toresultfield.cpp =================================================================== --- branches/tora3/src/core/toresultfield.cpp 2012-06-21 13:42:37 UTC (rev 4359) +++ branches/tora3/src/core/toresultfield.cpp 2012-06-22 15:24:48 UTC (rev 4360) @@ -66,7 +66,7 @@ void toResultField::query(const QString &sql, toQueryParams const& param) { - if (!setSQLParams(sql, param)) + if (!setSqlAndParams(sql, param)) return ; setFilename(QString::null); Modified: branches/tora3/src/core/toresultfield.h =================================================================== --- branches/tora3/src/core/toresultfield.h 2012-06-21 13:42:37 UTC (rev 4359) +++ branches/tora3/src/core/toresultfield.h 2012-06-22 15:24:48 UTC (rev 4360) @@ -55,6 +55,7 @@ class toResultField : public toHighlightedText, public toResult { +private: Q_OBJECT QString Unapplied; @@ -89,72 +90,6 @@ return true; } - // Why are these needed? -#if 1 - /** Set the SQL statement of this list - * @param sql String containing statement. - */ - void setSQL(const QString &sql) - { - toResult::setSQL(sql); - } - /** Set the SQL statement of this list. This will also affect @ref Name. - * @param sql SQL containing statement. - */ - void setSQL(const toSQL &sql) - { - toResult::setSQL(sql); - } - /** Set new SQL and run query. - * @param sql New sql. - * @see setSQL - */ - void query(const QString &sql) - { - toResult::query(sql); - } - /** Set new SQL and run query. - * @param sql New sql. - * @see setSQL - */ - void query(const toSQL &sql) - { - toResult::query(sql); - } - /** Set new SQL and run query. - * @param sql New sql. - * @see setSQL - */ - void query(const toSQL &sql, toQueryParams &par) - { - toResult::query(sql, par); - } -#endif -public slots: - /** Reimplemented for internal reasons. - */ - virtual void refresh(void) - { - toResult::refresh(); - } - /** Reimplemented for internal reasons. - */ - virtual void changeParams(const QString &Param1) - { - toResult::changeParams(Param1); - } - /** Reimplemented For internal reasons. - */ - virtual void changeParams(const QString &Param1, const QString &Param2) - { - toResult::changeParams(Param1, Param2); - } - /** Reimplemented for internal reasons. - */ - virtual void changeParams(const QString &Param1, const QString &Param2, const QString &Param3) - { - toResult::changeParams(Param1, Param2, Param3); - } private slots: void poll(void); void queryDone(void); Modified: branches/tora3/src/core/toresultitem.cpp =================================================================== --- branches/tora3/src/core/toresultitem.cpp 2012-06-21 13:42:37 UTC (rev 4359) +++ branches/tora3/src/core/toresultitem.cpp 2012-06-22 15:24:48 UTC (rev 4360) @@ -326,7 +326,7 @@ void toResultItem::query(const QString &sql, toQueryParams const& param) { - if (!setSQLParams(sql, param)) + if (!setSqlAndParams(sql, param)) return ; start(); Modified: branches/tora3/src/core/toresultitem.h =================================================================== --- branches/tora3/src/core/toresultitem.h 2012-06-21 13:42:37 UTC (rev 4359) +++ branches/tora3/src/core/toresultitem.h 2012-06-22 15:24:48 UTC (rev 4360) @@ -60,6 +60,7 @@ class toResultItem : public QScrollArea, public toResult { +private: Q_OBJECT /** Result widget. @@ -190,72 +191,6 @@ return true; } - // Why are these needed? -#if 1 - /** Set the SQL statement of this list - * @param sql String containing statement. - */ - void setSQL(const QString &sql) - { - toResult::setSQL(sql); - } - /** Set the SQL statement of this list. This will also affect @ref Name. - * @param sql SQL containing statement. - */ - void setSQL(const toSQL &sql) - { - toResult::setSQL(sql); - } - /** Set new SQL and run query. - * @param sql New sql. - * @see setSQL - */ - void query(const QString &sql) - { - toResult::query(sql); - } - /** Set new SQL and run query. - * @param sql New sql. - * @see setSQL - */ - void query(const toSQL &sql) - { - toResult::query(sql); - } - /** Set new SQL and run query. - * @param sql New sql. - * @see setSQL - */ - void query(const toSQL &sql, toQueryParams const& par) - { - toResult::query(sql, par); - } -#endif -public slots: - /** Reimplemented for internal reasons. - */ - virtual void refresh(void) - { - toResult::refresh(); - } - /** Reimplemented for internal reasons. - */ - virtual void changeParams(const QString &Param1) - { - toResult::changeParams(Param1); - } - /** Reimplemented For internal reasons. - */ - virtual void changeParams(const QString &Param1, const QString &Param2) - { - toResult::changeParams(Param1, Param2); - } - /** Reimplemented for internal reasons. - */ - virtual void changeParams(const QString &Param1, const QString &Param2, const QString &Param3) - { - toResult::changeParams(Param1, Param2, Param3); - } private slots: void poll(void); void queryDone(void); Modified: branches/tora3/src/core/toresultplan.cpp =================================================================== --- branches/tora3/src/core/toresultplan.cpp 2012-06-21 13:42:37 UTC (rev 4359) +++ branches/tora3/src/core/toresultplan.cpp 2012-06-22 15:24:48 UTC (rev 4360) @@ -68,14 +68,14 @@ static toSQL SQLVSQLChildSel("toResultPlan:VSQLChildSel", "SELECT distinct to_char(child_number)||' ('||to_char(plan_hash_value)||')' cn_disp, child_number, sql_id, plan_hash_value\n" - "FROM V$SQL_PLAN WHERE Address||':'||Hash_Value = '%1'\n" + "FROM V$SQL_PLAN WHERE Address||':'||Hash_Value = :addr \n" "ORDER BY child_number", "Get list of child plans for cursor", "1000"); static toSQL SQLVSQLChildSel9("toResultPlan:VSQLChildSel", "SELECT distinct to_char(child_number) cn_disp, child_number, null sql_id, null plan_hash_value\n" - "FROM V$SQL_PLAN WHERE Address||':'||Hash_Value = '%1'\n" + "FROM V$SQL_PLAN WHERE Address||':'||Hash_Value = :addr \n" "ORDER BY child_number", "", "0900"); @@ -84,7 +84,7 @@ "SELECT ID,NVL(Parent_ID,0),Operation, Options, Object_Name, Optimizer,cost,\n" " io_cost,Bytes,Cardinality,partition_start,partition_stop,\n" " temp_space,time,access_predicates,filter_predicates\n" - "FROM V$SQL_PLAN WHERE Address||':'||Hash_Value = '%1' and child_number = %2\n" + "FROM V$SQL_PLAN WHERE Address||':'||Hash_Value = :addr and child_number = :chld \n" "ORDER BY NVL(Parent_ID,0),ID", "Get the contents of SQL plan from V$SQL_PLAN.", "1000"); @@ -93,7 +93,7 @@ "SELECT ID,NVL(Parent_ID,0),Operation, Options, Object_Name, Optimizer,cost,\n" " io_cost,Bytes,Cardinality,partition_start,partition_stop,\n" " temp_space,null time,access_predicates,filter_predicates\n" - "FROM V$SQL_PLAN WHERE Address||':'||Hash_Value = '%1' and child_number = %2\n" + "FROM V$SQL_PLAN WHERE Address||':'||Hash_Value = :addr and child_number = :chld\n" "ORDER BY NVL(Parent_ID,0),ID", "", "0902"); @@ -102,7 +102,7 @@ "SELECT ID,NVL(Parent_ID,0),Operation, Options, Object_Name, Optimizer,cost,\n" " io_cost,Bytes,Cardinality,partition_start,partition_stop,\n" " null temp_space,null time,access_predicates,filter_predicates\n" - "FROM V$SQL_PLAN WHERE Address||':'||Hash_Value = '%1' and child_number = %2\n" + "FROM V$SQL_PLAN WHERE Address||':'||Hash_Value = :addr and child_number = :chld\n" "ORDER BY NVL(Parent_ID,0),ID", "", "0900"); @@ -307,7 +307,7 @@ try { - if (!setSQLParams(sql, param)) + if (!setSqlAndParams(sql, param)) return ; if (Query) @@ -340,6 +340,7 @@ toQueryParams par; Query = new toEventQuery(connection(), //toQuery::Background, + // NOTE: this is special case - plan table is defined as %1. table name can not use bind variable place holder toSQL::string(SQLViewPlan, connection()). arg(planTable).arg(Ident), par); @@ -365,11 +366,12 @@ TopItem->setToolTip(1, queryText); CursorChildSel = new toResultCombo(this, "toResultPlan"); - CursorChildSel->setSQL(toSQL::string(SQLVSQLChildSel, conn).arg(Ident)); + CursorChildSel->setSQL(SQLVSQLChildSel); CursorChildSel->setSelectionPolicy(toResultCombo::First); try { - CursorChildSel->refresh(); + CursorChildSel->executeWithParams(toQueryParams() << Ident); + // CursorChildSel->refresh(); } TOCATCH; setItemWidget(TopItem, 3, CursorChildSel); @@ -499,10 +501,9 @@ TopItem->setText(0, SInfo); connect(CursorChildSel, SIGNAL(currentIndexChanged (int) ), this, SLOT(ChildComboChanged(int))); - toQueryParams par; - Query = new toEventQuery(conn, //toQuery::Background, - toSQL::string(SQLViewVSQLPlan, conn).arg(Ident).arg(ChildNumber), - par); + Query = new toEventQuery(conn, //toQuery::Background + toSQL::string(SQLViewVSQLPlan, connection()), + toQueryParams() << Ident << ChildNumber); connectSlotsAndStart(); Reading = true; } @@ -525,10 +526,9 @@ LastTop = NULL; Parents.clear(); Last.clear(); - toQueryParams par; Query = new toEventQuery(conn, //toQuery::Background, - toSQL::string(SQLViewVSQLPlan, conn).arg(Ident).arg(ChildNumber), - par); + toSQL::string(SQLViewVSQLPlan, connection()), + toQueryParams() << Ident << ChildNumber); connectSlotsAndStart(); Reading = true; } @@ -602,9 +602,9 @@ throw toConnection::exception("Not implemented yet toResultPlan::checkException"); //connection().execute(toSQL::string(toSQL::TOSQL_CREATEPLAN, // connection()).arg(planTable)); - QString t = sql(); - setSQL(QString::null); - query(t, params()); + //QString t = sql(); + //setSQL(QString::null); + //query(t, params()); } } } Modified: branches/tora3/src/core/toresulttableview.cpp =================================================================== --- branches/tora3/src/core/toresulttableview.cpp 2012-06-21 13:42:37 UTC (rev 4359) +++ branches/tora3/src/core/toresulttableview.cpp 2012-06-22 15:24:48 UTC (rev 4360) @@ -184,7 +184,7 @@ void toResultTableView::query(const QString &sql, toQueryParams const& param, const std::list<QString> priKeys) { - setSQLParams(sql, param); + setSqlAndParams(sql, param); toEventQuery *query = NULL; qDebug("Query from toResultTableView::query :%s", sql.toUtf8().constData()); Modified: branches/tora3/src/core/toresulttableview.h =================================================================== --- branches/tora3/src/core/toresulttableview.h 2012-06-21 13:42:37 UTC (rev 4359) +++ branches/tora3/src/core/toresulttableview.h 2012-06-22 15:24:48 UTC (rev 4360) @@ -67,10 +67,9 @@ class toWorkingWidget; class toExportSettings; -class toResultTableView : public QTableView, - public toResult, - public toEditWidget +class toResultTableView : public QTableView, public toResult, public toEditWidget { +private: Q_OBJECT; // Widget to store query statistics to. Modified: branches/tora3/src/core/toresultview.cpp =================================================================== --- branches/tora3/src/core/toresultview.cpp 2012-06-21 13:42:37 UTC (rev 4359) +++ branches/tora3/src/core/toresultview.cpp 2012-06-22 15:24:48 UTC (rev 4360) @@ -1321,7 +1321,7 @@ if (!handled()) return ; - if (!setSQLParams(sql, param)) + if (!setSqlAndParams(sql, param)) return ; delete Query; Modified: branches/tora3/src/core/toresultview.h =================================================================== --- branches/tora3/src/core/toresultview.h 2012-06-21 13:42:37 UTC (rev 4359) +++ branches/tora3/src/core/toresultview.h 2012-06-22 15:24:48 UTC (rev 4360) @@ -744,6 +744,7 @@ class toResultView : public toListView, public toResult { +private: Q_OBJECT; int SortColumn; @@ -901,7 +902,7 @@ virtual toTreeWidgetItem *createItem(toTreeWidgetItem *last, const QString &str); - /** Reimplemented for internal reasons. + /** Reimplemented abstract methoid */ virtual void query(const QString &sql, toQueryParams const& param); @@ -915,50 +916,11 @@ */ virtual void setSQLName(const QString &name) { + toResult::setSQLName(name); toListView::setSQLName(name); } - // Why are these needed? -#if 1 - /** Set the SQL statement of this list - * @param sql String containing statement. - */ - void setSQL(const QString &sql) - { - toResult::setSQL(sql); - } - /** Set the SQL statement of this list. This will also affect @ref Name. - * @param sql SQL containing statement. - */ - void setSQL(const toSQL &sql) - { - toResult::setSQL(sql); - } - /** Set new SQL and run query. - * @param sql New sql. - * @see setSQL - */ - void query(const QString &sql) - { - toResult::query(sql); - } - /** Set new SQL and run query. - * @param sql New sql. - * @see setSQL - */ - void query(const toSQL &sql) - { - toResult::query(sql); - } - /** Set new SQL and run query. - * @param sql New sql. - * @see setSQL - */ - void query(const toSQL &sql, toQueryParams const& par) - { - toResult::query(sql, par); - } -#endif + // Why are these needed? - See C++ lang ref Section 10.2/2. local method decl for query shadows those from toResult /** Reimplemented for internal reasons. */ @@ -988,27 +950,6 @@ /** Reimplemented for internal reasons. */ virtual void refresh(void); - /** Reimplemented for internal reasons. - */ - virtual void changeParams(const QString &Param1) - { - toResult::changeParams(Param1); - } - /** Reimplemented For internal reasons. - */ - virtual void changeParams(const QString &Param1, - const QString &Param2) - { - toResult::changeParams(Param1, Param2); - } - /** Reimplemented for internal reasons. - */ - virtual void changeParams(const QString &Param1, - const QString &Param2, - const QString &Param3) - { - toResult::changeParams(Param1, Param2, Param3); - } /** Try to add an item to the list if available. */ virtual void addItem(void); Modified: branches/tora3/src/core/totableselect.cpp =================================================================== --- branches/tora3/src/core/totableselect.cpp 2012-06-21 13:42:37 UTC (rev 4359) +++ branches/tora3/src/core/totableselect.cpp 2012-06-22 15:24:48 UTC (rev 4360) @@ -120,14 +120,14 @@ } else Schema->setSelected(conn.getTraits().unQuote(table)); - Table->changeParams(Schema->selected()); + Table->executeWithParams(toQueryParams() << Schema->selected()); } } void toTableSelect::changeSchema(void) { if (Schema->currentIndex() != 0) - Table->changeParams(Schema->selected()); + Table->executeWithParams(toQueryParams() << Schema->selected()); } void toTableSelect::changeTable(void) Modified: branches/tora3/src/toinvalid.cpp =================================================================== --- branches/tora3/src/toinvalid.cpp 2012-06-21 13:42:37 UTC (rev 4359) +++ branches/tora3/src/toinvalid.cpp 2012-06-22 15:24:48 UTC (rev 4360) @@ -280,7 +280,7 @@ QModelIndex item = Objects->selectedIndex(); if (item.isValid()) { - Source->changeParams(Objects->model()->data(item.row(), 1).toString(), + Source->executeWithParams(Objects->model()->data(item.row(), 1).toString(), Objects->model()->data(item.row(), 2).toString(), Objects->model()->data(item.row(), 3).toString()); QMap<int, QString> Errors; Modified: branches/tora3/src/tools/toanalyze.cpp =================================================================== --- branches/tora3/src/tools/toanalyze.cpp 2012-06-21 13:42:37 UTC (rev 4359) +++ branches/tora3/src/tools/toanalyze.cpp 2012-06-22 15:24:48 UTC (rev 4360) @@ -471,7 +471,7 @@ { try { - Statistics->setSQL(QString::null); + Statistics->removeSQL(); toQueryParams par; QString sql; if (!Type || Type->currentIndex() == 0) Modified: branches/tora3/src/tools/tobrowser.cpp =================================================================== --- branches/tora3/src/tools/tobrowser.cpp 2012-06-21 13:42:37 UTC (rev 4359) +++ branches/tora3/src/tools/tobrowser.cpp 2012-06-22 15:24:48 UTC (rev 4360) @@ -491,11 +491,15 @@ OnlyOwnSchema->hide(); Tablespaces->setNumberColumn(false); Tablespaces->setReadableColumns(true); + Tablespaces->setSQL(SQLListTablespaces); try { - toConnection &conn = toConnection::currentConnection(this); - toQuery query(conn, toSQL::string(SQLListTablespaces, conn), toQueryParams()); - Tablespaces->query(SQLListTablespaces); + // TODO: WTF is this? the query is executed twice? + //toConnection &conn = toConnection::currentConnection(this); + //toQuery query(conn, toSQL::string(SQLListTablespaces, conn), toQueryParams()); + //Tablespaces->query(SQLListTablespaces); + + Tablespaces->refresh(); } catch (...) { @@ -1316,7 +1320,7 @@ { if (caching == NO_USE_CACHE) m_objectsMap[ix]->forceRequery(); - m_objectsMap[ix]->changeParams(schema(), Filter ? Filter->wildCard() : "%"); + m_objectsMap[ix]->refreshWithParams(schema(), Filter ? Filter->wildCard() : "%"); changeItem(); } else Modified: branches/tora3/src/tools/tobrowserbasewidget.cpp =================================================================== --- branches/tora3/src/tools/tobrowserbasewidget.cpp 2012-06-21 13:42:37 UTC (rev 4359) +++ branches/tora3/src/tools/tobrowserbasewidget.cpp 2012-06-22 15:24:48 UTC (rev 4360) @@ -154,7 +154,7 @@ // object (when the same object name is used for objects of different types). if (currentWidget()->objectName() == "extractView") { - m_tabs[ix]->changeParams(schema(), object(), type()); + m_tabs[ix]->executeWithParams(toQueryParams() << schema() << object() << type()); } else { @@ -166,11 +166,11 @@ // MySQL requires additional parameter to fetch routine (procedure/function) creation script // Parameter type must be passed first because it is not possible to rearrange parameters // used in SQL. - m_tabs[ix]->changeParams(type(), schema(), object()); + m_tabs[ix]->executeWithParams(toQueryParams() << type() << schema() << object()); } else { - m_tabs[ix]->changeParams(schema(), object()); + m_tabs[ix]->executeWithParams(toQueryParams() << schema() << object()); } } } Modified: branches/tora3/src/tools/tobrowserconstraint.cpp =================================================================== --- branches/tora3/src/tools/tobrowserconstraint.cpp 2012-06-21 13:42:37 UTC (rev 4359) +++ branches/tora3/src/tools/tobrowserconstraint.cpp 2012-06-22 15:24:48 UTC (rev 4360) @@ -180,9 +180,9 @@ for (std::map<QString, QString>::iterator i = Constraints.begin(); i != Constraints.end(); i++) Name->addItem((*i).first); - SourceColList->changeParams(Owner, Table); - UniqueColList->changeParams(Owner, Table); - CheckColumn->changeParams(Owner, Table); + SourceColList->changeObject(toCache::ObjectRef(Owner, Table)); + UniqueColList->changeObject(toCache::ObjectRef(Owner, Table)); + CheckColumn->changeObject(toCache::ObjectRef(Owner, Table)); ReferTable->clear(); //cache QList<toCache::CacheEntry const*> objects = connection().objects(false); @@ -412,9 +412,9 @@ { QStringList parts = ReferTable->currentText().split("."); if (parts.size() > 1) - ReferColList->changeParams(parts[0], parts[1]); + ReferColList->changeObject(toCache::ObjectRef(parts[0], parts[1])); else - ReferColList->changeParams(ReferTable->currentText()); + ReferColList->changeObject(toCache::ObjectRef(toConnection::currentConnection(this).schema() ,ReferTable->currentText())); } void toBrowserConstraint::changeType(int type) Modified: branches/tora3/src/tools/tobrowserindex.cpp =================================================================== --- branches/tora3/src/tools/tobrowserindex.cpp 2012-06-21 13:42:37 UTC (rev 4359) +++ branches/tora3/src/tools/tobrowserindex.cpp 2012-06-22 15:24:48 UTC (rev 4360) @@ -236,7 +236,7 @@ Name->addItem((*i).first); ColList->displayHeader(false); - ColList->changeParams(Owner, Table); + ColList->changeObject(toCache::ObjectRef(Owner, Table)); show(); changeIndex(); Modified: branches/tora3/src/tools/tobrowserschemawidget.cpp =================================================================== --- branches/tora3/src/tools/tobrowserschemawidget.cpp 2012-06-21 13:42:37 UTC (rev 4359) +++ branches/tora3/src/tools/tobrowserschemawidget.cpp 2012-06-22 15:24:48 UTC (rev 4360) @@ -62,7 +62,7 @@ return selectedIndex(1).data(Qt::EditRole).toString(); } -void toBrowserSchemaTableView::changeParams(const QString & schema, const QString & filter) +void toBrowserSchemaTableView::refreshWithParams(const QString & schema, const QString & filter) { // If all objects of a specific type are to be displayed, try displaying them from the cache // This cannot work for filtered objects yet as we do not want to re-impelement the "like" operator. @@ -90,7 +90,7 @@ ForceRequery = false; Schema = schema; - toResultTableView::changeParams(schema, filter); + toResultTableView::executeWithParams(toQueryParams() << schema << filter); } void toBrowserSchemaTableView::updateCache(void) @@ -165,7 +165,7 @@ return ""; } -void toBrowserSchemaCodeBrowser::changeParams(const QString & schema, const QString & filter) +void toBrowserSchemaCodeBrowser::refreshWithParams(const QString & schema, const QString & filter) { // WARNING: QCoreApplication::processEvents() is mandatory here // to prevent random crashing on parent-tab widget switching Modified: branches/tora3/src/tools/tobrowserschemawidget.h =================================================================== --- branches/tora3/src/tools/tobrowserschemawidget.h 2012-06-21 13:42:37 UTC (rev 4359) +++ branches/tora3/src/tools/tobrowserschemawidget.h 2012-06-22 15:24:48 UTC (rev 4360) @@ -65,10 +65,13 @@ public: toBrowserSchemaBase() {}; virtual ~toBrowserSchemaBase() {}; + //! \brief Return currently selected object name. virtual QString objectName() = 0; + //! \brief Reset widget data depending on new schema and/or filter. - virtual void changeParams(const QString & schema, const QString & filter) = 0; + virtual void refreshWithParams(const QString & schema, const QString & filter) = 0; + void forceRequery(void) { ForceRequery = true; @@ -90,9 +93,11 @@ public: toBrowserSchemaTableView(QWidget * parent = 0, const QString &type = 0); + QString objectName(); - void changeParams(const QString & schema, const QString & filter); + void refreshWithParams(const QString & schema, const QString & filter); + private slots: void updateCache(void); }; @@ -114,7 +119,7 @@ QString objectName(); //! \brief Returns uppercased item's db object type. QString objectType(); - void changeParams(const QString & schema, const QString & filter); + void refreshWithParams(const QString & schema, const QString & filter); private: toCodeModel * m_model; Modified: branches/tora3/src/tools/tooutput.cpp =================================================================== --- branches/tora3/src/tools/tooutput.cpp 2012-06-21 13:42:37 UTC (rev 4359) +++ branches/tora3/src/tools/tooutput.cpp 2012-06-22 15:24:48 UTC (rev 4360) @@ -437,6 +437,7 @@ toLogOutput::toLogOutput(QWidget *parent, toConnection &connection) : toOutput(parent, connection) + , customizedLogSQL(SQLLog) { Type = new QComboBox(toolBar()); Type->addItem(tr("SQL Output")); @@ -453,8 +454,20 @@ { if (Type->currentIndex() == 1) { - Log->setSQL(QString::null); - Log->query(SQLLog(connection()).arg(toConfigurationSingle::Instance().logUser())); + toConnection &con = connection(); + + Log->removeSQL(); + + // Ugly woodo to replace %1 with the configured logging table name + customizedLogSQL.updateSQL( + SQLLog.name(), // "toLogOutput:Poll" + toSQL::string(SQLLog.name(), connection()).arg( toConfigurationSingle::Instance().logUser()), + toSQL::description(SQLLog.name()), + connection().version(), + connection().provider(), + true); + Log->setSQL(customizedLogSQL); + Log->refresh(); } toOutput::refresh(); } Modified: branches/tora3/src/tools/tooutput.h =================================================================== --- branches/tora3/src/tools/tooutput.h 2012-06-21 13:42:37 UTC (rev 4359) +++ branches/tora3/src/tools/tooutput.h 2012-06-22 15:24:48 UTC (rev 4360) @@ -45,6 +45,7 @@ #include "core/totool.h" #include "core/tomarkedtext.h" +#include "core/tosql.h" #include <QCloseEvent> #include <QAction> @@ -108,6 +109,7 @@ QComboBox *Type; toResultView *Log; + toSQL customizedLogSQL; public: toLogOutput(QWidget *parent, toConnection &connection); Modified: branches/tora3/src/tools/toresultstorage.cpp =================================================================== --- branches/tora3/src/tools/toresultstorage.cpp 2012-06-21 13:42:37 UTC (rev 4359) +++ branches/tora3/src/tools/toresultstorage.cpp 2012-06-22 15:24:48 UTC (rev 4360) @@ -1262,7 +1262,7 @@ if (!handled()) return ; - if (!setSQLParams(sql, params)) + if (!setSqlAndParams(sql, params)) return ; toQueryParams::const_iterator i = params.begin(); @@ -1275,7 +1275,7 @@ return ; QString table = (*i); - List->changeParams(owner, table); + List->executeWithParams(toQueryParams() << owner << table); toQList res = toQuery::readQuery(connection(), SQLTableTablespace, toQueryParams() << owner << table); Modified: branches/tora3/src/tools/tosession.cpp =================================================================== --- branches/tora3/src/tools/tosession.cpp 2012-06-21 13:42:37 UTC (rev 4359) +++ branches/tora3/src/tools/tosession.cpp 2012-06-22 15:24:48 UTC (rev 4360) @@ -794,12 +794,12 @@ else if (CurrentTab == ConnectInfo) { ConnectInfo->clearParams(); - ConnectInfo->changeParams(connectionId); + ConnectInfo->executeWithParams(connectionId); } else if (CurrentTab == LongOps) { LongOps->clearParams(); - LongOps->changeParams(connectionId, serial); + LongOps->executeWithParams(connectionId, serial); } else if (CurrentTab == PendingLocks) { @@ -813,7 +813,7 @@ if(openitem.isValid()) address = openitem.data().toString(); OpenCursors->clearParams(); - OpenCursors->changeParams(connectionId); + OpenCursors->executeWithParams(connectionId); if (!address.isEmpty()) { for (toResultTableView::iterator it(OpenCursors); (*it).isValid(); it++) @@ -839,12 +839,12 @@ else if (CurrentTab == AccessedObjects) { AccessedObjects->clearParams(); - AccessedObjects->changeParams(connectionId); + AccessedObjects->executeWithParams(connectionId); } else if (CurrentTab == LockedObjects) { LockedObjects->clearParams(); - LockedObjects->changeParams(connectionId); + LockedObjects->executeWithParams(connectionId); } else if (CurrentTab == PreviousStatement) { @@ -973,9 +973,9 @@ if (!item.isEmpty()) { if (WaitBar) - WaitBar->changeParams(item); + WaitBar->executeWithParams(item); if (IOBar) - IOBar->changeParams(item); + IOBar->executeWithParams(item); if (Waits) Waits->setSession(item.toInt()); } Modified: branches/tora3/src/tools/tosgastatement.cpp =================================================================== --- branches/tora3/src/tools/tosgastatement.cpp 2012-06-21 13:42:37 UTC (rev 4359) +++ branches/tora3/src/tools/tosgastatement.cpp 2012-06-22 15:24:48 UTC (rev 4360) @@ -57,7 +57,7 @@ { try { - Resources->changeParams(Address); + Resources->executeWithParams(toQueryParams() << Address); } catch (...) { Modified: branches/tora3/src/tools/tosgatrace.cpp =================================================================== --- branches/tora3/src/tools/tosgatrace.cpp 2012-06-21 13:42:37 UTC (rev 4359) +++ branches/tora3/src/tools/tosgatrace.cpp 2012-06-22 15:24:48 UTC (rev 4360) @@ -395,7 +395,7 @@ select = QString("SELECT * FROM (\n") + select + QString("\n ORDER BY " + order + " DESC)\n WHERE ROWNUM < 20"); - Trace->setSQL(QString::null); + Trace->removeSQL(); if (!CurrentSchema.isEmpty()) { toQueryParams p; Modified: branches/tora3/src/tools/toworksheet.cpp =================================================================== --- branches/tora3/src/tools/toworksheet.cpp 2012-06-21 13:42:37 UTC (rev 4359) +++ branches/tora3/src/tools/toworksheet.cpp 2012-06-22 15:24:48 UTC (rev 4360) @@ -892,11 +892,11 @@ { if (part.count() == 2) { - Columns->changeParams(unQuote(part[1])); + Columns->changeObject(toCache::ObjectRef(Schema->selected(), unQuote(part[1]))); } else if (part.count() == 3) { - Columns->changeParams(unQuote(part[1]), unQuote(part[2])); + Columns->changeObject(toCache::ObjectRef(unQuote(part[1]), unQuote(part[2]))); } else throw tr("Wrong number of parameters for describe"); @@ -905,7 +905,7 @@ ... [truncated message content] |
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. |
From: <ibr...@us...> - 2012-06-27 14:58:01
|
Revision: 4373 http://tora.svn.sourceforge.net/tora/?rev=4373&view=rev Author: ibre5041 Date: 2012-06-27 14:57:51 +0000 (Wed, 27 Jun 2012) Log Message: ----------- toawr Modified Paths: -------------- branches/tora3/src/CMakeLists.txt Added Paths: ----------- branches/tora3/src/tools/toawr.cpp branches/tora3/src/tools/toawr.h Removed Paths: ------------- branches/tora3/src/toawr.cpp branches/tora3/src/toawr.h Modified: branches/tora3/src/CMakeLists.txt =================================================================== --- branches/tora3/src/CMakeLists.txt 2012-06-27 14:56:57 UTC (rev 4372) +++ branches/tora3/src/CMakeLists.txt 2012-06-27 14:57:51 UTC (rev 4373) @@ -242,6 +242,7 @@ tools/toresultstorage.h tools/tofilesize.h tools/toanalyze.h + tools/toawr.h # toalert.h @@ -477,6 +478,7 @@ tools/tofilesize.cpp tools/toresultstorage.cpp tools/toanalyze.cpp + tools/toawr.cpp # # main.cpp # totemplateprovider.cpp Deleted: branches/tora3/src/toawr.cpp =================================================================== --- branches/tora3/src/toawr.cpp 2012-06-27 14:56:57 UTC (rev 4372) +++ branches/tora3/src/toawr.cpp 2012-06-27 14:57:51 UTC (rev 4373) @@ -1,510 +0,0 @@ - -/* 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 <iostream> - -#include <list> -#include <sstream> -#include "tologger.h" - - -#include <QToolBar> -#include <QLabel> -//#include <qtoolbutton.h> -#include <QLineEdit> -#include <QDateEdit> -#include <QMessageBox> //TODO see utis.h define TOMessageBox QMessageBox(QMessageBox should be included there) -#include <toresultcombo.h> - -#include "utils.h" -#include "totool.h" -#include "toawr.h" -#include "toresultview.h" -#include "toparamget.h" -#include "tochangeconnection.h" -#include "toquery.h" - -//#include "tosimplequery.moc" - -#include "icons/execute.xpm" -#include "icons/awrtool.xpm" - -// -- Instances in this Workload Repository schema -// => instnum -// => dbid -static toSQL SQLDBInstances("toAWR:DBInstances", - "select distinct \n" - " (case when cd.dbid = wr.dbid and \n" - " cd.name = wr.db_name and \n" - " ci.instance_number = wr.instance_number and \n" - " ci.instance_name = wr.instance_name and \n" - " ci.host_name = wr.host_name \n" - " then '* '||wr.dbid||':'||wr.instance_name \n" - " else ' '||wr.dbid||':'||wr.instance_name \n" - " end) disp_dbdbid \n" - " , wr.dbid dbbid \n" - " , wr.instance_number instt_num \n" - " , wr.db_name dbb_name \n" - " , wr.instance_name instt_name \n" - " , wr.host_name host \n" - " from dba_hist_database_instance wr, v$database cd, v$instance ci" - " order by 1 desc", -// " order by wr.startup_time desc", - "Instances in this Workload Repository schema"); - - -// -- -// -- Error reporting -// -- Plus query max_snap_time - -// whenever sqlerror exit; -// variable max_snap_time char(10); -// declare -// cursor cidnum is -// select 'X' -// from dba_hist_database_instance -// where instance_number = :instnum -// and dbid = :dbid; -// cursor csnapid is -// select to_char(max(end_interval_time),'dd/mm/yyyy') -// from dba_hist_snapshot -// where instance_number = :instnum -// and dbid = :dbid; -// vx char(1); -// begin -// -- Check Database Id/Instance Number is a valid pair -// open cidnum; -// fetch cidnum into vx; -// if cidnum%notfound then -// raise_application_error(-20200, -// 'Database/Instance ' || :dbid || '/' || :instnum || -// ' does not exist in DBA_HIST_DATABASE_INSTANCE'); -// end if; -// close cidnum; -// -- Check Snapshots exist for Database Id/Instance Number -// open csnapid; -// fetch csnapid into :max_snap_time; -// if csnapid%notfound then -// raise_application_error(-20200, -// 'No snapshots exist for Database/Instance '||:dbid||'/'||:instnum); -// end if; -// close csnapid; -// end; -// / -// whenever sqlerror continue; - -// tohle asi muzu preskocit -// - validni kombinace <instnum,dbid> je uz znama -// - <snapid,end_interval_time> nactu do komboboxu (anebo tam bude "No snaps") - - -// -- List available snapshots -static toSQL SQLSnaps("toAWR:Snaps", - " select to_char(s.end_interval_time,'HH24:mi') snapdat \n" - " , di.instance_name inst_name \n" - " , di.db_name db_name \n" - " , s.snap_id snap_id \n" - " , s.snap_level lvl \n" - " , to_char(s.startup_time,'dd Mon \"at\" HH24:mi:ss') instart_fmt \n" - "from dba_hist_snapshot s \n" - " , dba_hist_database_instance di \n" - "where s.dbid = :db_id<char[40],in> \n" - " and di.dbid = s.dbid \n" - " and s.instance_number = :instnum<char[40],in> \n" - " and di.instance_number = s.instance_number \n" - " and di.dbid = s.dbid \n" - " and di.instance_number = s.instance_number \n" - " and di.startup_time = s.startup_time \n" - " and s.end_interval_time between trunc(to_date(:sdate<char[11],in>, 'YYYY:MM:DD')) \n" - " and trunc(to_date(:edate<char[11],in>, 'YYYY:MM:DD')+1) \n" -// " and s.end_interval_time >= decode( &num_days " -// " , 0 , to_date('31-JAN-9999','DD-MON-YYYY') " -// " , 3.14, s.end_interval_time " -// " , to_date(:max_snap_time,'dd/mm/yyyy') - (&num_days-1)) " - " order by db_name, instance_name, snap_id \n" - , - "List availanble snapshots"); - - -// -- -// -- Error reporting -// whenever sqlerror exit; -static toSQL SQLCheckSnaps("toAWR:CheckSnaps", - " declare \n" - " cursor cspid(vspid dba_hist_snapshot.snap_id%type) is \n" - " select end_interval_time \n" - " , startup_time \n" - " from dba_hist_snapshot \n" - " where snap_id = vspid \n" - " and dbid = :dbid<char[40],in> \n" - " and instance_number = :inst<char[40],in>; \n" - " bsnapt dba_hist_snapshot.end_interval_time%type; \n" - " bstart dba_hist_snapshot.startup_time%type; \n" - " esnapt dba_hist_snapshot.end_interval_time%type; \n" - " estart dba_hist_snapshot.startup_time%type; \n" - " begin \n" - " -- Check Begin Snapshot id is valid, get corresponding instance startup time \n" - " open cspid(:fsnap<char[40],in>); \n" - " fetch cspid into bsnapt, bstart; \n" - " if cspid%notfound then \n" - " raise_application_error(-20200, \n" - " 'Begin Snapshot Id '||:fsnap<char[40],in>||' does not exist for this database/instance'); \n" - " end if; \n" - " close cspid; \n" - " -- Check End Snapshot id is valid and get corresponding instance startup time \n" - " open cspid(:tsnap<char[40],in>); \n" - " fetch cspid into esnapt, estart; \n" - " if cspid%notfound then \n" - " raise_application_error(-20200, \n" - " 'End Snapshot Id '||:tsnap<char[40],in>||' does not exist for this database/instance'); \n" - " end if; \n" - " if esnapt <= bsnapt then \n" - " raise_application_error(-20200, \n" - " 'End Snapshot Id '||:tsnap<char[40],in>||' must be greater than Begin Snapshot Id '||:fsnap<char[40],in>); \n" - " end if; \n" - " close cspid; \n" - " -- Check startup time is same for begin and end snapshot ids \n" - " if ( bstart != estart) then \n" - " raise_application_error(-20200, \n" - " 'The instance was shutdown between snapshots '||:fsnap<char[40],in>||' and '||:tsnap<char[40],in>); \n" - " end if; \n" - " end; \n", - "Check if the pair of snap ids is valid" ); - - -class toAWRTool : public toTool -{ -protected: - std::map<toConnection *, QWidget *> Windows; - - virtual const char **pictureXPM(void); -public: - toAWRTool() - : toTool(10003, "AWR") - { } - - virtual const char *menuItem() - { - return "AWR Report"; - } - - virtual bool canHandle(toConnection &conn) - { - return toIsOracle(conn); - } - - virtual QWidget *toolWindow(QWidget *parent, toConnection &connection) - { - std::map<toConnection *, QWidget *>::iterator i = Windows.find(&connection); - if (i != Windows.end()) - { - (*i).second->raise(); - (*i).second->setFocus(); - return NULL; - } - else - { - QWidget *window = new toAWR(parent, connection); - Windows[&connection] = window; - return window; - } - } - virtual void closeWindow(toConnection &connection) - { - std::map<toConnection *, QWidget *>::iterator i = Windows.find(&connection); - if (i != Windows.end()) - { - std::cerr << "Window deleted:" << std::endl; - Windows.erase(i); - } - } -}; - -const char **toAWRTool::pictureXPM(void) -{ - return const_cast<const char**>(awrtool_xpm); -} - -static toAWRTool AWRTool; - -toAWR::toAWR(/*toTool *tool,*/ QWidget *parent, toConnection &_connection) - : toToolWidget(AWRTool, "simplequery.html", parent, _connection, "toAWR") -{ - QToolBar *toolbar = toAllocBar(this, tr("Simple Query")); - layout()->addWidget(toolbar); - - toolbar->addWidget(new QLabel("Inst:", toolbar)); - dbid = new toResultCombo(toolbar, "AWR toolbar"); - dbid->setSQL(toSQL::sql("toAWR:DBInstances", connection())); - fsnap = new toResultCombo(toolbar, "AWR toolbar"); - fsnap->setSelectionPolicy(toResultCombo::LastButOne); - tsnap = new toResultCombo(toolbar, "AWR toolbar"); - tsnap->setSelectionPolicy(toResultCombo::Last); - - startdate = new QDateTimeEdit(QDate::currentDate()); - startdate->setCalendarPopup(true); - enddate = new QDateTimeEdit(QDate::currentDate()); - enddate->setCalendarPopup(true); - - connect(dbid, SIGNAL(activated(int)), this, SLOT(instanceChanged(int))); - connect(dbid, SIGNAL(done()), this, SLOT(instanceRead())); - connect(startdate, SIGNAL(dateChanged(QDate)), this, SLOT(startDateChanged(QDate))); - connect(enddate, SIGNAL(dateChanged(QDate)), this, SLOT(endDateChanged(QDate))); - - toolbar->addWidget(dbid); - toolbar->addWidget(startdate); - toolbar->addWidget(fsnap); - toolbar->addWidget(enddate); - toolbar->addWidget(tsnap); - - try - { - dbid->refresh(); - } - TOCATCH; - - toolbar->addAction(QIcon(QPixmap(const_cast<const char**>(execute_xpm))), - tr("Generate report"), - this, - SLOT(execute())); - toolbar->addWidget(new toSpacer()); - - QAction *executeAct = new QAction(QPixmap(execute_xpm), tr("Execute_ current statement"), this); - executeAct->setShortcut(QKeySequence::Refresh); - connect(executeAct, SIGNAL(triggered()), this, SLOT(refresh(void))); - - new toChangeConnection(toolbar); - - Tabs = new QTabWidget(this); - layout()->addWidget(Tabs); -} - -void toAWR::execute(void) -{ - try - { - //QString sql=Statement->text(); - //toQList params=toParamGet::getParam(this,sql); - //Result->query(sql,params); - //Result->query(sql,toQList()); - - QVariant vdbid = dbid->itemData(dbid->currentIndex()); - QString dbids( vdbid.toStringList().at(0) ); - QString insts( vdbid.toStringList().at(1) ); - - QVariant vf = fsnap->itemData(fsnap->currentIndex()); - QVariant vt = tsnap->itemData(tsnap->currentIndex()); - QString fsnaps( vf.toStringList().at(2) ); - QString tsnaps( vt.toStringList().at(2) ); -// toQList params; -// params.push_back(fsnaps); -// params.push_back(tsnaps); - TLOG(0, toDecorator, __HERE__) - << "Dbid:" << dbids.toAscii().constData() << ' ' - << "Inst:" << insts.toAscii().constData() << ' ' - << "fsnap:" << fsnaps.toAscii().constData() << ' ' - << "tsnap:" << tsnaps.toAscii().constData() << std::endl; - - try - { - toQuery checkSnaps(connection(), SQLCheckSnaps, dbids, insts, fsnaps, tsnaps); - - toQuery report(connection(), - "select NVL(output,' ') \n" - //"from table(dbms_workload_repository.awr_report_text( \n" - "from table(dbms_workload_repository.awr_report_html( \n" - " :dbid<char[40],in>, \n" - " :inst<char[40],in>, \n" - " :f<char[40],in>, \n" - " :t<char[40],in>, 0))", - dbids, insts, fsnaps, tsnaps); - - QString reports; - while (!report.eof()) - { - QString line = report.readValue(); - reports += line; - reports += '\n'; - } - std::cerr << reports.toAscii().constData() << std::endl; - - QWidget *box = new QWidget(Tabs); - QVBoxLayout *vbox = new QVBoxLayout; - vbox->setSpacing(0); - vbox->setContentsMargins(0, 0, 0, 0); - box->setLayout(vbox); - - vbox->addWidget(new QLabel(tr("AWR report"), box)); - QTextBrowser *tb = new QTextBrowser(box); - tb->setFontFamily("monospace"); - tb->setReadOnly(true); - tb->setText(reports); - //tb->setFontFamily("Courier"); - - vbox->addWidget(tb); - Tabs->addTab(box, tr("AWR Report")); - - } - catch (const toConnection::exception &t ) - { - TOMessageBox::information(this, t, t); - } - - } - TOCATCH -} - -toAWR::~toAWR() -{ - delete dbid; - delete fsnap; - delete tsnap; - delete startdate; - delete enddate; -} - -void toAWR::closeEvent(QCloseEvent *event) -{ - try - { - AWRTool.closeWindow(connection()); - } - TOCATCH; - - event->accept(); -} - -void toAWR::startDateChanged(QDate date) -{ - std::cerr << "startDateChanged:" << date.toString() << std::endl; - - int pos = dbid->currentIndex(); - QVariant d = dbid->itemData(pos); - QStringList l = d.toStringList(); - std::stringstream s; - for(QList<QString>::iterator i = l.begin(); i != l.end(); ++i) - { - s << ":\'" << (*i).toAscii().constData() << '\''; - } - TLOG(0, toDecorator, __HERE__) << "start date changed:" << date.toString("YYYY:MM:DD") << std::endl; - QString dbid = l.at(0); - QString inst = l.at(1); - try - { - toQList params; - params.push_back(dbid); - params.push_back(inst); - params.push_back(date.toString("yyyy:MM:dd")); - params.push_back(date.toString("yyyy:MM:dd")); - fsnap->setSelectionPolicy(toResultCombo::None); - fsnap->query(toSQL::sql("toAWR:Snaps", connection()), const_cast<const toQList&>(params ) ); - fsnap->refresh(); - } - TOCATCH; -} - -void toAWR::endDateChanged(QDate date) -{ - std::cerr << "endDateChanged:" << date.toString() << std::endl; - - int pos = dbid->currentIndex(); - QVariant d = dbid->itemData(pos); - QStringList l = d.toStringList(); - std::stringstream s; - for(QList<QString>::iterator i = l.begin(); i != l.end(); ++i) - { - s << ":\'" << (*i).toAscii().constData() << '\''; - } - TLOG(0, toDecorator, __HERE__) << "end date changed:" << date.toString("YYYY:MM:DD") << std::endl; - QString dbid = l.at(0); - QString inst = l.at(1); - try - { - toQList params; - params.push_back(dbid); - params.push_back(inst); - params.push_back(date.toString("yyyy:MM:dd")); - params.push_back(date.toString("yyyy:MM:dd")); - fsnap->setSelectionPolicy(toResultCombo::None); - tsnap->query(toSQL::sql("toAWR:Snaps", connection()), const_cast<const toQList&>(params ) ); - tsnap->refresh(); - } - TOCATCH; - -} - -void toAWR::instanceChanged(int pos) -{ - QVariant d = dbid->itemData(pos); - QStringList l = d.toStringList(); - std::stringstream s; - for(QList<QString>::iterator i = l.begin(); i != l.end(); ++i) - { - s << ":\'" << (*i).toAscii().constData() << '\''; - } - TLOG(0, toDecorator, __HERE__) << "Instance changed:" << pos << s.str() << std::endl; - QString dbid = l.at(0); - QString inst = l.at(1); - try - { - toQList sparams, eparams; - sparams.push_back(dbid); - sparams.push_back(inst); - sparams.push_back(startdate->date().toString("yyyy:MM:dd")); - sparams.push_back(startdate->date().toString("yyyy:MM:dd")); - TLOG(1, toDecorator, __HERE__) << "FSNAP: (" << sparams.size() << ")" << std::endl; - fsnap->query(toSQL::sql("toAWR:Snaps", connection()), const_cast<const toQList&>(sparams ) ); - fsnap->refresh(); - eparams.push_back(dbid); - eparams.push_back(inst); - eparams.push_back(enddate->date().toString("yyyy:MM:dd")); - eparams.push_back(enddate->date().toString("yyyy:MM:dd")); - TLOG(1, toDecorator, __HERE__) << "TSNAP: (" << eparams.size() << ")" << std::endl; - tsnap->query(toSQL::sql("toAWR:Snaps", connection()), const_cast<const toQList&>(eparams ) ); - tsnap->refresh(); - } - TOCATCH; -}; - -void toAWR::instanceRead(void) -{ - dbid->setCurrentIndex(0); -}; Deleted: branches/tora3/src/toawr.h =================================================================== --- branches/tora3/src/toawr.h 2012-06-27 14:56:57 UTC (rev 4372) +++ branches/tora3/src/toawr.h 2012-06-27 14:57:51 UTC (rev 4373) @@ -1,85 +0,0 @@ - -/* 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 TOAWR_H -#define TOAWR_H - -#include <iostream> - -#include "totool.h" - -#include <QDate> - -class toResultView; -class QLineEdit; -class toConnection; - -class toResultCombo; - -class toAWR : public toToolWidget -{ - Q_OBJECT; - - toResultView *Result; - QAction *updateAct; - - QTabWidget *Tabs; - QTextBrowser *tb; - - toResultCombo *dbid, *fsnap, *tsnap; - QDateTimeEdit *startdate, *enddate; -public: - toAWR(/*toTool *tool,*/ QWidget *parent, toConnection &connection); - virtual ~toAWR(); - -protected: - void closeEvent(QCloseEvent *event); - -private slots: - void execute(void); - void instanceChanged(int); - void instanceRead(void); - void startDateChanged(QDate); - void endDateChanged(QDate); -}; - -#endif - Copied: branches/tora3/src/tools/toawr.cpp (from rev 4370, branches/tora3/src/toawr.cpp) =================================================================== --- branches/tora3/src/tools/toawr.cpp (rev 0) +++ branches/tora3/src/tools/toawr.cpp 2012-06-27 14:57:51 UTC (rev 4373) @@ -0,0 +1,507 @@ + +/* 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 "tools/toer.h" +#include "core/tologger.h" +#include "core/toresultcombo.h" +#include "core/utils.h" +#include "core/totool.h" +#include "core/toresultview.h" +#include "core/toparamget.h" +#include "core/tochangeconnection.h" +#include "core/toquery.h" + +#include "icons/execute.xpm" +#include "icons/awrtool.xpm" + +#include <QLineEdit> +#include <QDateEdit> +#include <QMessageBox> //TODO see utis.h define TOMessageBox QMessageBox(QMessageBox should be included there) +#include <QToolBar> +#include <QLabel> +#include <iostream> +#include <list> +#include <sstream> + +// -- Instances in this Workload Repository schema +// => instnum +// => dbid +static toSQL SQLDBInstances("toAWR:DBInstances", + "select distinct \n" + " (case when cd.dbid = wr.dbid and \n" + " cd.name = wr.db_name and \n" + " ci.instance_number = wr.instance_number and \n" + " ci.instance_name = wr.instance_name and \n" + " ci.host_name = wr.host_name \n" + " then '* '||wr.dbid||':'||wr.instance_name \n" + " else ' '||wr.dbid||':'||wr.instance_name \n" + " end) disp_dbdbid \n" + " , wr.dbid dbbid \n" + " , wr.instance_number instt_num \n" + " , wr.db_name dbb_name \n" + " , wr.instance_name instt_name \n" + " , wr.host_name host \n" + " from dba_hist_database_instance wr, v$database cd, v$instance ci" + " order by 1 desc", +// " order by wr.startup_time desc", + "Instances in this Workload Repository schema"); + + +// -- +// -- Error reporting +// -- Plus query max_snap_time + +// whenever sqlerror exit; +// variable max_snap_time char(10); +// declare +// cursor cidnum is +// select 'X' +// from dba_hist_database_instance +// where instance_number = :instnum +// and dbid = :dbid; +// cursor csnapid is +// select to_char(max(end_interval_time),'dd/mm/yyyy') +// from dba_hist_snapshot +// where instance_number = :instnum +// and dbid = :dbid; +// vx char(1); +// begin +// -- Check Database Id/Instance Number is a valid pair +// open cidnum; +// fetch cidnum into vx; +// if cidnum%notfound then +// raise_application_error(-20200, +// 'Database/Instance ' || :dbid || '/' || :instnum || +// ' does not exist in DBA_HIST_DATABASE_INSTANCE'); +// end if; +// close cidnum; +// -- Check Snapshots exist for Database Id/Instance Number +// open csnapid; +// fetch csnapid into :max_snap_time; +// if csnapid%notfound then +// raise_application_error(-20200, +// 'No snapshots exist for Database/Instance '||:dbid||'/'||:instnum); +// end if; +// close csnapid; +// end; +// / +// whenever sqlerror continue; + +// tohle asi muzu preskocit +// - validni kombinace <instnum,dbid> je uz znama +// - <snapid,end_interval_time> nactu do komboboxu (anebo tam bude "No snaps") + + +// -- List available snapshots +static toSQL SQLSnaps("toAWR:Snaps", + " select to_char(s.end_interval_time,'HH24:mi') snapdat \n" + " , di.instance_name inst_name \n" + " , di.db_name db_name \n" + " , s.snap_id snap_id \n" + " , s.snap_level lvl \n" + " , to_char(s.startup_time,'dd Mon \"at\" HH24:mi:ss') instart_fmt \n" + "from dba_hist_snapshot s \n" + " , dba_hist_database_instance di \n" + "where s.dbid = :db_id<char[40],in> \n" + " and di.dbid = s.dbid \n" + " and s.instance_number = :instnum<char[40],in> \n" + " and di.instance_number = s.instance_number \n" + " and di.dbid = s.dbid \n" + " and di.instance_number = s.instance_number \n" + " and di.startup_time = s.startup_time \n" + " and s.end_interval_time between trunc(to_date(:sdate<char[11],in>, 'YYYY:MM:DD')) \n" + " and trunc(to_date(:edate<char[11],in>, 'YYYY:MM:DD')+1) \n" +// " and s.end_interval_time >= decode( &num_days " +// " , 0 , to_date('31-JAN-9999','DD-MON-YYYY') " +// " , 3.14, s.end_interval_time " +// " , to_date(:max_snap_time,'dd/mm/yyyy') - (&num_days-1)) " + " order by db_name, instance_name, snap_id \n" + , + "List availanble snapshots"); + + +// -- +// -- Error reporting +// whenever sqlerror exit; +static toSQL SQLCheckSnaps("toAWR:CheckSnaps", + " declare \n" + " cursor cspid(vspid dba_hist_snapshot.snap_id%type) is \n" + " select end_interval_time \n" + " , startup_time \n" + " from dba_hist_snapshot \n" + " where snap_id = vspid \n" + " and dbid = :dbid<char[40],in> \n" + " and instance_number = :inst<char[40],in>; \n" + " bsnapt dba_hist_snapshot.end_interval_time%type; \n" + " bstart dba_hist_snapshot.startup_time%type; \n" + " esnapt dba_hist_snapshot.end_interval_time%type; \n" + " estart dba_hist_snapshot.startup_time%type; \n" + " begin \n" + " -- Check Begin Snapshot id is valid, get corresponding instance startup time \n" + " open cspid(:fsnap<char[40],in>); \n" + " fetch cspid into bsnapt, bstart; \n" + " if cspid%notfound then \n" + " raise_application_error(-20200, \n" + " 'Begin Snapshot Id '||:fsnap<char[40],in>||' does not exist for this database/instance'); \n" + " end if; \n" + " close cspid; \n" + " -- Check End Snapshot id is valid and get corresponding instance startup time \n" + " open cspid(:tsnap<char[40],in>); \n" + " fetch cspid into esnapt, estart; \n" + " if cspid%notfound then \n" + " raise_application_error(-20200, \n" + " 'End Snapshot Id '||:tsnap<char[40],in>||' does not exist for this database/instance'); \n" + " end if; \n" + " if esnapt <= bsnapt then \n" + " raise_application_error(-20200, \n" + " 'End Snapshot Id '||:tsnap<char[40],in>||' must be greater than Begin Snapshot Id '||:fsnap<char[40],in>); \n" + " end if; \n" + " close cspid; \n" + " -- Check startup time is same for begin and end snapshot ids \n" + " if ( bstart != estart) then \n" + " raise_application_error(-20200, \n" + " 'The instance was shutdown between snapshots '||:fsnap<char[40],in>||' and '||:tsnap<char[40],in>); \n" + " end if; \n" + " end; \n", + "Check if the pair of snap ids is valid" ); + + +class toAWRTool : public toTool +{ +protected: + std::map<toConnection *, QWidget *> Windows; + + virtual const char **pictureXPM(void); +public: + toAWRTool() + : toTool(10003, "AWR") + { } + + virtual const char *menuItem() + { + return "AWR Report"; + } + + virtual bool canHandle(toConnection &conn) + { + return conn.providerIs("Oracle"); + } + + virtual QWidget *toolWindow(QWidget *parent, toConnection &connection) + { + std::map<toConnection *, QWidget *>::iterator i = Windows.find(&connection); + if (i != Windows.end()) + { + (*i).second->raise(); + (*i).second->setFocus(); + return NULL; + } + else + { + QWidget *window = new toAWR(parent, connection); + Windows[&connection] = window; + return window; + } + } + virtual void closeWindow(toConnection &connection) + { + std::map<toConnection *, QWidget *>::iterator i = Windows.find(&connection); + if (i != Windows.end()) + { + std::cerr << "Window deleted:" << std::endl; + Windows.erase(i); + } + } +}; + +const char **toAWRTool::pictureXPM(void) +{ + return const_cast<const char**>(awrtool_xpm); +} + +static toAWRTool AWRTool; + +toAWR::toAWR(/*toTool *tool,*/ QWidget *parent, toConnection &_connection) + : toToolWidget(AWRTool, "simplequery.html", parent, _connection, "toAWR") +{ + QToolBar *toolbar = Utils::toAllocBar(this, tr("Simple Query")); + layout()->addWidget(toolbar); + + toolbar->addWidget(new QLabel("Inst:", toolbar)); + dbid = new toResultCombo(toolbar, "AWR toolbar"); + dbid->setSQL(toSQL::sql("toAWR:DBInstances", connection())); + fsnap = new toResultCombo(toolbar, "AWR toolbar"); + fsnap->setSelectionPolicy(toResultCombo::LastButOne); + fsnap->setSQL(SQLSnaps); + tsnap = new toResultCombo(toolbar, "AWR toolbar"); + tsnap->setSelectionPolicy(toResultCombo::Last); + tsnap->setSQL(SQLSnaps); + + startdate = new QDateTimeEdit(QDate::currentDate()); + startdate->setCalendarPopup(true); + enddate = new QDateTimeEdit(QDate::currentDate()); + enddate->setCalendarPopup(true); + + connect(dbid, SIGNAL(activated(int)), this, SLOT(instanceChanged(int))); + connect(dbid, SIGNAL(done()), this, SLOT(instanceRead())); + connect(startdate, SIGNAL(dateChanged(QDate)), this, SLOT(startDateChanged(QDate))); + connect(enddate, SIGNAL(dateChanged(QDate)), this, SLOT(endDateChanged(QDate))); + + toolbar->addWidget(dbid); + toolbar->addWidget(startdate); + toolbar->addWidget(fsnap); + toolbar->addWidget(enddate); + toolbar->addWidget(tsnap); + + try + { + dbid->refresh(); + } + TOCATCH; + + toolbar->addAction(QIcon(QPixmap(const_cast<const char**>(execute_xpm))), + tr("Generate report"), + this, + SLOT(execute())); + toolbar->addWidget(new Utils::toSpacer()); + + QAction *executeAct = new QAction(QPixmap(execute_xpm), tr("Execute_ current statement"), this); + executeAct->setShortcut(QKeySequence::Refresh); + connect(executeAct, SIGNAL(triggered()), this, SLOT(refresh(void))); + + new toChangeConnection(toolbar); + + Tabs = new QTabWidget(this); + layout()->addWidget(Tabs); +} + +void toAWR::execute(void) +{ + try + { + //QString sql=Statement->text(); + //toQList params=toParamGet::getParam(this,sql); + //Result->query(sql,params); + //Result->query(sql,toQList()); + + QVariant vdbid = dbid->itemData(dbid->currentIndex()); + QString dbids( vdbid.toStringList().at(0) ); + QString insts( vdbid.toStringList().at(1) ); + + QVariant vf = fsnap->itemData(fsnap->currentIndex()); + QVariant vt = tsnap->itemData(tsnap->currentIndex()); + QString fsnaps( vf.toStringList().at(2) ); + QString tsnaps( vt.toStringList().at(2) ); +// toQList params; +// params.push_back(fsnaps); +// params.push_back(tsnaps); + TLOG(0, toDecorator, __HERE__) + << "Dbid:" << dbids.toAscii().constData() << ' ' + << "Inst:" << insts.toAscii().constData() << ' ' + << "fsnap:" << fsnaps.toAscii().constData() << ' ' + << "tsnap:" << tsnaps.toAscii().constData() << std::endl; + + try + { + toQuery checkSnaps(connection(), SQLCheckSnaps, toQueryParams() << dbids << insts << fsnaps << tsnaps); + + toQuery report(connection(), + "select NVL(output,' ') \n" + //"from table(dbms_workload_repository.awr_report_text( \n" + "from table(dbms_workload_repository.awr_report_html( \n" + " :dbid<char[40],in>, \n" + " :inst<char[40],in>, \n" + " :f<char[40],in>, \n" + " :t<char[40],in>, 0))", + toQueryParams() << dbids << insts << fsnaps << tsnaps); + + QString reports; + while (!report.eof()) + { + QString line = report.readValue(); + reports += line; + reports += '\n'; + } + std::cerr << reports.toAscii().constData() << std::endl; + + QWidget *box = new QWidget(Tabs); + QVBoxLayout *vbox = new QVBoxLayout; + vbox->setSpacing(0); + vbox->setContentsMargins(0, 0, 0, 0); + box->setLayout(vbox); + + vbox->addWidget(new QLabel(tr("AWR report"), box)); + QTextBrowser *tb = new QTextBrowser(box); + tb->setFontFamily("monospace"); + tb->setReadOnly(true); + tb->setText(reports); + //tb->setFontFamily("Courier"); + + vbox->addWidget(tb); + Tabs->addTab(box, tr("AWR Report")); + + } + catch (const toConnection::exception &t ) + { + TOMessageBox::information(this, t, t); + } + + } + TOCATCH +} + +toAWR::~toAWR() +{ + delete dbid; + delete fsnap; + delete tsnap; + delete startdate; + delete enddate; +} + +void toAWR::closeEvent(QCloseEvent *event) +{ + try + { + AWRTool.closeWindow(connection()); + } + TOCATCH; + + event->accept(); +} + +void toAWR::startDateChanged(QDate date) +{ + std::cerr << "startDateChanged:" << date.toString() << std::endl; + + int pos = dbid->currentIndex(); + QVariant d = dbid->itemData(pos); + QStringList l = d.toStringList(); + std::stringstream s; + for(QList<QString>::iterator i = l.begin(); i != l.end(); ++i) + { + s << ":\'" << (*i).toAscii().constData() << '\''; + } + TLOG(0, toDecorator, __HERE__) << "start date changed:" << date.toString("YYYY:MM:DD") << std::endl; + QString dbid = l.at(0); + QString inst = l.at(1); + try + { + toQueryParams params; + params << dbid << inst << date.toString("yyyy:MM:dd") << date.toString("yyyy:MM:dd"); + fsnap->setSelectionPolicy(toResultCombo::None); + fsnap->executeWithParams(params); + } + TOCATCH; +} + +void toAWR::endDateChanged(QDate date) +{ + std::cerr << "endDateChanged:" << date.toString() << std::endl; + + int pos = dbid->currentIndex(); + QVariant d = dbid->itemData(pos); + QStringList l = d.toStringList(); + std::stringstream s; + for(QList<QString>::iterator i = l.begin(); i != l.end(); ++i) + { + s << ":\'" << (*i).toAscii().constData() << '\''; + } + TLOG(0, toDecorator, __HERE__) << "end date changed:" << date.toString("YYYY:MM:DD") << std::endl; + QString dbid = l.at(0); + QString inst = l.at(1); + try + { + toQueryParams params; + params << dbid << inst << date.toString("yyyy:MM:dd") << date.toString("yyyy:MM:dd"); + tsnap->setSelectionPolicy(toResultCombo::None); + tsnap->executeWithParams(params); + } + TOCATCH; + +} + +void toAWR::instanceChanged(int pos) +{ + QVariant d = dbid->itemData(pos); + QStringList l = d.toStringList(); + std::stringstream s; + for(QList<QString>::iterator i = l.begin(); i != l.end(); ++i) + { + s << ":\'" << (*i).toAscii().constData() << '\''; + } + TLOG(0, toDecorator, __HERE__) << "Instance changed:" << pos << s.str() << std::endl; + QString dbid = l.at(0); + QString inst = l.at(1); + try + { + toQueryParams sparams, eparams; + sparams << dbid << inst << startdate->date().toString("yyyy:MM:dd") << startdate->date().toString("yyyy:MM:dd"); + TLOG(1, toDecorator, __HERE__) << "FSNAP: (" << sparams.size() << ")" << std::endl; + fsnap->executeWithParams(sparams); + + + eparams << dbid << inst << enddate->date().toString("yyyy:MM:dd") << enddate->date().toString("yyyy:MM:dd"); + TLOG(1, toDecorator, __HERE__) << "TSNAP: (" << eparams.size() << ")" << std::endl; + tsnap->executeWithParams(eparams); + } + TOCATCH; +}; + +void toAWR::instanceRead(void) +{ + dbid->setCurrentIndex(0); + + try + { + QVariant vdbid = dbid->itemData(dbid->currentIndex()); + QString dbids( vdbid.toStringList().at(0) ); + QString insts( vdbid.toStringList().at(1) ); + + toQueryParams params; + params << dbids << insts << QDate::currentDate().toString("yyyy:MM:dd") << QDate::currentDate().toString("yyyy:MM:dd"); + //fsnap->setSelectionPolicy(toResultCombo::None); + fsnap->executeWithParams(params); + tsnap->executeWithParams(params); + } + TOCATCH; + +}; Copied: branches/tora3/src/tools/toawr.h (from rev 4370, branches/tora3/src/toawr.h) =================================================================== --- branches/tora3/src/tools/toawr.h (rev 0) +++ branches/tora3/src/tools/toawr.h 2012-06-27 14:57:51 UTC (rev 4373) @@ -0,0 +1,85 @@ + +/* 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 TOER_H +#define TOER_H + +#include "core/totool.h" + +#include <iostream> +#include <QDate> + +class toResultView; +class toConnection; +class toResultCombo; + +class QTextBrowser; +class QLineEdit; + +class toAWR : public toToolWidget +{ + Q_OBJECT; + + toResultView *Result; + QAction *updateAct; + + QTabWidget *Tabs; + QTextBrowser *tb; + + toResultCombo *dbid, *fsnap, *tsnap; + QDateTimeEdit *startdate, *enddate; +public: + toAWR(/*toTool *tool,*/ QWidget *parent, toConnection &connection); + virtual ~toAWR(); + +protected: + void closeEvent(QCloseEvent *event); + +private slots: + void execute(void); + void instanceChanged(int); + void instanceRead(void); + void startDateChanged(QDate); + void endDateChanged(QDate); +}; + +#endif + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2012-06-27 22:08:35
|
Revision: 4374 http://tora.svn.sourceforge.net/tora/?rev=4374&view=rev Author: ibre5041 Date: 2012-06-27 22:08:28 +0000 (Wed, 27 Jun 2012) Log Message: ----------- new tool added Modified Paths: -------------- branches/tora3/src/CMakeLists.txt branches/tora3/src/core/toresultdrawing.cpp branches/tora3/src/tools/toawr.cpp branches/tora3/src/tools/toawr.h Modified: branches/tora3/src/CMakeLists.txt =================================================================== --- branches/tora3/src/CMakeLists.txt 2012-06-27 14:57:51 UTC (rev 4373) +++ branches/tora3/src/CMakeLists.txt 2012-06-27 22:08:28 UTC (rev 4374) @@ -246,7 +246,6 @@ # toalert.h - # toawr.h # tobackup.h # # tobackuptool.h @@ -344,6 +343,10 @@ # ENDIF(graphviz_FOUND) ENDIF (USE_EXPERIMENTAL) +IF(graphviz_FOUND) + LIST(APPEND TORA_MOC_CLASSES tools/toer.h) +ENDIF(graphviz_FOUND) + # sources SET(TORA_SOURCES stdafx.cpp # NOTE(MSVC) the there is NO way how to force /Yc option fot this file only @@ -485,7 +488,6 @@ # #tosqlparsetest.cpp # toalert.cpp - # toawr.cpp # tobackup.cpp # tobackuptool.cpp @@ -576,6 +578,10 @@ # ENDIF(graphviz_FOUND) ENDIF (USE_EXPERIMENTAL) +IF(graphviz_FOUND) + LIST (APPEND TORA_SOURCES tools/toer.cpp) +ENDIF(graphviz_FOUND) + IF (POPPLER_QT4_FOUND) # LIST(APPEND TORA_SOURCES pdfview/pdfviewwidget.cpp pdfview/documentwidget.cpp) ENDIF (POPPLER_QT4_FOUND) Modified: branches/tora3/src/core/toresultdrawing.cpp =================================================================== --- branches/tora3/src/core/toresultdrawing.cpp 2012-06-27 14:57:51 UTC (rev 4373) +++ branches/tora3/src/core/toresultdrawing.cpp 2012-06-27 22:08:28 UTC (rev 4374) @@ -42,32 +42,6 @@ #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"); - // BIG FAT WARNING - this query causes ORA-07445: exception encountered: core dump [lnxmin()+2384] [SIGSEGV] // on 11gR1. Use "alter session set OPTIMIZER_FEATURES_ENABLE='10.2.0.4';" as workaround // Note: the query is not bi-directional @@ -130,59 +104,6 @@ "100000", "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"); -// -//static toSQL SQLALLRef ( -// "toResultDrawing:ALLREFConstraints", -// " WITH REFS \n" -// " AS \n" -// " ( \n" -// " SELECT DISTINCT \n" -// " c.constraint_name \n" // c1 -// " , c.owner as owner \n" // c2 -// " , c.table_name as table_name \n" // c3 -// " , r.owner as r_owner \n" // c4 -// " , r.table_name as r_table_name \n" // c5 -// " FROM \n" -// " 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 = 'T_ROOT_1' \n" -// " AND a.constraint_type = 'R' \n" -// " ) \n" -// " SELECT REFS.* \n" -// " -- , SYS_CONNECT_BY_PATH(table_name, '/') Path, CONNECT_BY_ISCYCLE CYCLE, LEVEL \n" -// " FROM REFS \n" -// " CONNECT BY NOCYCLE PRIOR r_owner = owner AND PRIOR r_table_name = table_name \n", -// "Get list of all references", -// "8000", -// "Oracle"); toResultDrawing::toResultDrawing(QWidget *parent, const char *name, Qt::WindowFlags f) : DotGraphView(NULL, parent) Modified: branches/tora3/src/tools/toawr.cpp =================================================================== --- branches/tora3/src/tools/toawr.cpp 2012-06-27 14:57:51 UTC (rev 4373) +++ branches/tora3/src/tools/toawr.cpp 2012-06-27 22:08:28 UTC (rev 4374) @@ -39,7 +39,7 @@ * * END_COMMON_COPYRIGHT_HEADER */ -#include "tools/toer.h" +#include "tools/toawr.h" #include "core/tologger.h" #include "core/toresultcombo.h" #include "core/utils.h" Modified: branches/tora3/src/tools/toawr.h =================================================================== --- branches/tora3/src/tools/toawr.h 2012-06-27 14:57:51 UTC (rev 4373) +++ branches/tora3/src/tools/toawr.h 2012-06-27 22:08:28 UTC (rev 4374) @@ -39,8 +39,8 @@ * * END_COMMON_COPYRIGHT_HEADER */ -#ifndef TOER_H -#define TOER_H +#ifndef TOAWR_H +#define TOAWR_H #include "core/totool.h" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2012-06-28 12:44:00
|
Revision: 4376 http://tora.svn.sourceforge.net/tora/?rev=4376&view=rev Author: ibre5041 Date: 2012-06-28 12:43:53 +0000 (Thu, 28 Jun 2012) Log Message: ----------- toResult refactoring toERSchema Modified Paths: -------------- branches/tora3/src/core/toresult.cpp branches/tora3/src/core/toresult.h branches/tora3/src/core/toresultbar.h branches/tora3/src/core/toresultcols.cpp branches/tora3/src/core/toresultdrawing.cpp branches/tora3/src/core/toresultdrawing.h branches/tora3/src/core/toresultplan.cpp branches/tora3/src/core/totableselect.cpp branches/tora3/src/tools/toawr.cpp branches/tora3/src/tools/tobrowserbasewidget.cpp branches/tora3/src/tools/tobrowserschemawidget.cpp branches/tora3/src/tools/toer.cpp branches/tora3/src/tools/toer.h branches/tora3/src/tools/toresultstorage.cpp branches/tora3/src/tools/tosgastatement.cpp Modified: branches/tora3/src/core/toresult.cpp =================================================================== --- branches/tora3/src/core/toresult.cpp 2012-06-28 08:36:43 UTC (rev 4375) +++ branches/tora3/src/core/toresult.cpp 2012-06-28 12:43:53 UTC (rev 4376) @@ -225,8 +225,9 @@ // query((const QString)SQL, params); //} -void toResult::executeWithParams(toQueryParams const& params) +void toResult::refreshWithParams(toQueryParams const& params) { + Params = params; query((const QString)SQL, params); } Modified: branches/tora3/src/core/toresult.h =================================================================== --- branches/tora3/src/core/toresult.h 2012-06-28 08:36:43 UTC (rev 4375) +++ branches/tora3/src/core/toresult.h 2012-06-28 12:43:53 UTC (rev 4376) @@ -103,12 +103,6 @@ bool DisableTab; public: - - /** Get the timer associated with the closest tool. - * @return Pointer to tool timer. - */ - toTimer *timer(void); - toResult(void); virtual ~toResult() @@ -129,7 +123,7 @@ /** Reexecute with changed parameters. * @param list of query parameters */ - virtual void executeWithParams(toQueryParams const& params); + virtual void refreshWithParams(toQueryParams const& params); /** Clear result pane. When used in Schema Browser this method will be called when nothing is selected in object list. @@ -246,6 +240,18 @@ /** Set SQL and parameters and return false if query shouldn't be reexecuted. It is * important that all descendants call this function in the beginning of the implementation * of the query function to determine if the query should be reexecuted or not. + * + * So far used only in: + * toresultview.cpp + * toresulttableview.cpp + * toresultbar.cpp + * toresultcombo.cpp + * toresultplan.cpp + * toresultitem.cpp + * toresultextract.cpp + * toresultfield.cpp + * toresultdepend.cpp + * toresultstorage.cpp */ bool setSqlAndParams(const QString &sql, toQueryParams const& par); @@ -254,6 +260,13 @@ * NOTE: can be used only in subclasses who also inherit from QWidget */ toConnection &connection(void); + + /** Get the timer associated with the closest tool. + * @return Pointer to tool timer. + * NOTE: can be used only in subclasses who also inherit from QWidget + */ + toTimer *timer(void); + private: void changeHandle(void); Modified: branches/tora3/src/core/toresultbar.h =================================================================== --- branches/tora3/src/core/toresultbar.h 2012-06-28 08:36:43 UTC (rev 4375) +++ branches/tora3/src/core/toresultbar.h 2012-06-28 12:43:53 UTC (rev 4376) @@ -76,7 +76,9 @@ bool First; toEventQuery *Query; unsigned int Columns; + void query(const QString &sql, toQueryParams const& param, bool first); + public: /** Create widget. * @param parent Parent of list. Modified: branches/tora3/src/core/toresultcols.cpp =================================================================== --- branches/tora3/src/core/toresultcols.cpp 2012-06-28 08:36:43 UTC (rev 4375) +++ branches/tora3/src/core/toresultcols.cpp 2012-06-28 12:43:53 UTC (rev 4376) @@ -531,7 +531,7 @@ //TableName = conn.getTraits().quote(Owner) + "." + conn.getTraits().quote(Name); // TODO call is only if cache entry is not "described" - Columns->executeWithParams(toQueryParams() << Owner << Name); + Columns->refreshWithParams(toQueryParams() << Owner << Name); } TOCATCH; Modified: branches/tora3/src/core/toresultdrawing.cpp =================================================================== --- branches/tora3/src/core/toresultdrawing.cpp 2012-06-28 08:36:43 UTC (rev 4375) +++ branches/tora3/src/core/toresultdrawing.cpp 2012-06-28 12:43:53 UTC (rev 4376) @@ -41,6 +41,7 @@ #include "core/toresultdrawing.h" #include "dotgraph.h" +#include "dotgraphview.h" // BIG FAT WARNING - this query causes ORA-07445: exception encountered: core dump [lnxmin()+2384] [SIGSEGV] // on 11gR1. Use "alter session set OPTIMIZER_FEATURES_ENABLE='10.2.0.4';" as workaround @@ -106,12 +107,22 @@ toResultDrawing::toResultDrawing(QWidget *parent, const char *name, Qt::WindowFlags f) - : DotGraphView(NULL, parent) + : QWidget(parent, f) , toResult() { - initEmpty(); - setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding); - parent->setFocusProxy(this); + if (name) + setObjectName(name); + + QVBoxLayout *vbox = new QVBoxLayout; + + m_dotGraphView = new DotGraphView(NULL, this); + m_dotGraphView ->initEmpty(); + m_dotGraphView->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding); + vbox->addWidget(m_dotGraphView); + this->setFocusProxy(m_dotGraphView); + vbox->setContentsMargins(0, 0, 0, 0); + vbox->setSpacing(0); + this->setLayout(vbox); }; @@ -120,7 +131,7 @@ typedef QPair<QString, QString> Reference; toConnection &conn = connection(); - initEmpty(); + m_dotGraphView->initEmpty(); QString schema(params.at(0)), table(params.at(1)); QSet<QString> tables; QSet<Reference> references; @@ -183,12 +194,12 @@ newGraph.addNewEdge(r.first, r.second, ea); } - graph()->updateWithGraph(newGraph); - graph()->update(); + m_dotGraphView->graph()->updateWithGraph(newGraph); + m_dotGraphView->graph()->update(); } /** Clear result widget */ void toResultDrawing::clearData() { - initEmpty(); + m_dotGraphView->initEmpty(); } Modified: branches/tora3/src/core/toresultdrawing.h =================================================================== --- branches/tora3/src/core/toresultdrawing.h 2012-06-28 08:36:43 UTC (rev 4375) +++ branches/tora3/src/core/toresultdrawing.h 2012-06-28 12:43:53 UTC (rev 4376) @@ -43,13 +43,15 @@ #define TORESULTDRAWING_H #include "core/toresult.h" -#include "dotgraphview.h" -class toResultDrawing : public DotGraphView, public toResult +class DotGraphView; + +class toResultDrawing : public QWidget, public toResult { private: Q_OBJECT; + DotGraphView *m_dotGraphView; public: toResultDrawing(QWidget *parent = 0, const char *name = 0, Modified: branches/tora3/src/core/toresultplan.cpp =================================================================== --- branches/tora3/src/core/toresultplan.cpp 2012-06-28 08:36:43 UTC (rev 4375) +++ branches/tora3/src/core/toresultplan.cpp 2012-06-28 12:43:53 UTC (rev 4376) @@ -370,7 +370,7 @@ CursorChildSel->setSelectionPolicy(toResultCombo::First); try { - CursorChildSel->executeWithParams(toQueryParams() << Ident); + CursorChildSel->refreshWithParams(toQueryParams() << Ident); // CursorChildSel->refresh(); } TOCATCH; Modified: branches/tora3/src/core/totableselect.cpp =================================================================== --- branches/tora3/src/core/totableselect.cpp 2012-06-28 08:36:43 UTC (rev 4375) +++ branches/tora3/src/core/totableselect.cpp 2012-06-28 12:43:53 UTC (rev 4376) @@ -120,14 +120,14 @@ } else Schema->setSelected(conn.getTraits().unQuote(table)); - Table->executeWithParams(toQueryParams() << Schema->selected()); + Table->refreshWithParams(toQueryParams() << Schema->selected()); } } void toTableSelect::changeSchema(void) { if (Schema->currentIndex() != 0) - Table->executeWithParams(toQueryParams() << Schema->selected()); + Table->refreshWithParams(toQueryParams() << Schema->selected()); } void toTableSelect::changeTable(void) Modified: branches/tora3/src/tools/toawr.cpp =================================================================== --- branches/tora3/src/tools/toawr.cpp 2012-06-28 08:36:43 UTC (rev 4375) +++ branches/tora3/src/tools/toawr.cpp 2012-06-28 12:43:53 UTC (rev 4376) @@ -428,7 +428,7 @@ toQueryParams params; params << dbid << inst << date.toString("yyyy:MM:dd") << date.toString("yyyy:MM:dd"); fsnap->setSelectionPolicy(toResultCombo::None); - fsnap->executeWithParams(params); + fsnap->refreshWithParams(params); } TOCATCH; } @@ -453,7 +453,7 @@ toQueryParams params; params << dbid << inst << date.toString("yyyy:MM:dd") << date.toString("yyyy:MM:dd"); tsnap->setSelectionPolicy(toResultCombo::None); - tsnap->executeWithParams(params); + tsnap->refreshWithParams(params); } TOCATCH; @@ -476,12 +476,12 @@ toQueryParams sparams, eparams; sparams << dbid << inst << startdate->date().toString("yyyy:MM:dd") << startdate->date().toString("yyyy:MM:dd"); TLOG(1, toDecorator, __HERE__) << "FSNAP: (" << sparams.size() << ")" << std::endl; - fsnap->executeWithParams(sparams); + fsnap->refreshWithParams(sparams); eparams << dbid << inst << enddate->date().toString("yyyy:MM:dd") << enddate->date().toString("yyyy:MM:dd"); TLOG(1, toDecorator, __HERE__) << "TSNAP: (" << eparams.size() << ")" << std::endl; - tsnap->executeWithParams(eparams); + tsnap->refreshWithParams(eparams); } TOCATCH; }; @@ -499,8 +499,8 @@ toQueryParams params; params << dbids << insts << QDate::currentDate().toString("yyyy:MM:dd") << QDate::currentDate().toString("yyyy:MM:dd"); //fsnap->setSelectionPolicy(toResultCombo::None); - fsnap->executeWithParams(params); - tsnap->executeWithParams(params); + fsnap->refreshWithParams(params); + tsnap->refreshWithParams(params); } TOCATCH; Modified: branches/tora3/src/tools/tobrowserbasewidget.cpp =================================================================== --- branches/tora3/src/tools/tobrowserbasewidget.cpp 2012-06-28 08:36:43 UTC (rev 4375) +++ branches/tora3/src/tools/tobrowserbasewidget.cpp 2012-06-28 12:43:53 UTC (rev 4376) @@ -154,7 +154,7 @@ // object (when the same object name is used for objects of different types). if (currentWidget()->objectName() == "extractView") { - m_tabs[ix]->executeWithParams(toQueryParams() << schema() << object() << type()); + m_tabs[ix]->refreshWithParams(toQueryParams() << schema() << object() << type()); } else { @@ -166,11 +166,11 @@ // MySQL requires additional parameter to fetch routine (procedure/function) creation script // Parameter type must be passed first because it is not possible to rearrange parameters // used in SQL. - m_tabs[ix]->executeWithParams(toQueryParams() << type() << schema() << object()); + m_tabs[ix]->refreshWithParams(toQueryParams() << type() << schema() << object()); } else { - m_tabs[ix]->executeWithParams(toQueryParams() << schema() << object()); + m_tabs[ix]->refreshWithParams(toQueryParams() << schema() << object()); } } } Modified: branches/tora3/src/tools/tobrowserschemawidget.cpp =================================================================== --- branches/tora3/src/tools/tobrowserschemawidget.cpp 2012-06-28 08:36:43 UTC (rev 4375) +++ branches/tora3/src/tools/tobrowserschemawidget.cpp 2012-06-28 12:43:53 UTC (rev 4376) @@ -90,7 +90,7 @@ ForceRequery = false; Schema = schema; - toResultTableView::executeWithParams(toQueryParams() << schema << filter); + toResultTableView::refreshWithParams(toQueryParams() << schema << filter); } void toBrowserSchemaTableView::updateCache(void) Modified: branches/tora3/src/tools/toer.cpp =================================================================== --- branches/tora3/src/tools/toer.cpp 2012-06-28 08:36:43 UTC (rev 4375) +++ branches/tora3/src/tools/toer.cpp 2012-06-28 12:43:53 UTC (rev 4376) @@ -47,7 +47,7 @@ #include "core/toresultview.h" #include "core/toparamget.h" #include "core/tochangeconnection.h" -#include "core/toquery.h" +#include "core/toeventquery.h" #include "icons/execute.xpm" #include "icons/awrtool.xpm" @@ -55,59 +55,7 @@ #include "dotgraph.h" #include "dotgraphview.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"); - -static toSQL SQLALLRef ( +static toSQL SQLALLRefs ( "toResultDrawing:ALLREFConstraints", " WITH REFS \n" " AS \n" @@ -124,7 +72,6 @@ " 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_ROOT_1' \n" " AND a.constraint_type = 'R' \n" " ) \n" " SELECT REFS.* \n" @@ -190,54 +137,99 @@ toERSchema::toERSchema(/*toTool *tool,*/ QWidget *parent, toConnection &_connection) : toToolWidget(ERSchemaTool, "simplequery.html", parent, _connection, "toERSchema") + , Query(NULL) { QToolBar *toolbar = Utils::toAllocBar(this, tr("Simple Query")); layout()->addWidget(toolbar); - toolbar->addWidget(new QLabel("Inst:", toolbar)); - - + toolbar->addWidget(new QLabel("ER Schema view - TODO add some icons here:", toolbar)); toolbar->addAction(QIcon(QPixmap(const_cast<const char**>(execute_xpm))), - tr("Generate report"), + tr("Start reversing"), this, SLOT(execute())); toolbar->addWidget(new Utils::toSpacer()); - QAction *executeAct = new QAction(QPixmap(execute_xpm), tr("Execute_ current statement"), this); - executeAct->setShortcut(QKeySequence::Refresh); - connect(executeAct, SIGNAL(triggered()), this, SLOT(refresh(void))); - + m_DotGraphView = new DotGraphView(NULL, this); new toChangeConnection(toolbar); - Tabs = new QTabWidget(this); - layout()->addWidget(Tabs); +// QVBoxLayout *vbox = new QVBoxLayout; +// vbox->setSpacing(0); +// vbox->setContentsMargins(0, 0, 0, 0); +// this->setLayout(vbox); + + layout()->addWidget(m_DotGraphView); } void toERSchema::execute(void) { try { + toConnection &conn = connection(); - QWidget *box = new QWidget(Tabs); - QVBoxLayout *vbox = new QVBoxLayout; - vbox->setSpacing(0); - vbox->setContentsMargins(0, 0, 0, 0); - box->setLayout(vbox); + m_Tables.clear(); + m_References.clear(); + m_DotGraphView->initEmpty(); - vbox->addWidget(new QLabel(tr("AWR report"), box)); - QTextBrowser *tb = new QTextBrowser(box); - tb->setFontFamily("monospace"); - tb->setReadOnly(true); - //tb->setText(reports); - //tb->setFontFamily("Courier"); - - vbox->addWidget(tb); - Tabs->addTab(box, tr("AWR Report")); - + // TODO use own toResultSchema combo box in this tool + // TODO Disable all the actions till query done + Query = new toEventQuery(conn, toSQL::sql(SQLALLRefs, conn), toQueryParams() << conn.schema()); + connect(Query, SIGNAL(dataAvailable(toEventQuery*)), this, SLOT(poll(toEventQuery*))); + connect(Query, SIGNAL(done()), this, SLOT(queryDone())); + Query->readAll(); + Query->start(); } catch (const toConnection::exception &t) { TOMessageBox::information(this, t, t); } +} +void toERSchema::poll(toEventQuery *e) +{ + toQValue c1, c2, c3, c4, c5; + while (Query->hasMore()) + { + c1 = Query->readValue(); // FK NAME + c2 = Query->readValue(); // owner + c3 = Query->readValue(); // table_name + c4 = Query->readValue(); // r_owner + c5 = Query->readValue(); // r_table_name + + m_Tables.insert(c3); + m_Tables.insert(c5); + m_References.insert(Reference(c3,c5)); + } } +void toERSchema::queryDone(void) +{ + DotGraph m_Graph; + m_Graph.setGraphAttributes(GraphAttributes); + + if (Query) + { + delete Query; + Query = NULL; + } + + Q_FOREACH(QString const&t, m_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; + m_Graph.addNewNode(ta); + } + m_Tables.clear(); + + Q_FOREACH(Reference const&r, m_References) + { + QMap<QString,QString> ea; // edge attreibutes + m_Graph.addNewEdge(r.first, r.second, ea); + } + m_DotGraphView->graph()->updateWithGraph(m_Graph); + m_DotGraphView->graph()->update(); +} + void toERSchema::instanceChanged(int pos) { }; @@ -250,9 +242,22 @@ { try { + if(Query) + Query->stop(); ERSchemaTool.closeWindow(connection()); } TOCATCH; event->accept(); } + +QMap<QString, QString> toERSchema::GraphAttributesHelper() +{ + QMap<QString, QString>ga; + ga["id"] = "Schema"; + ga["compound"] = "true"; + ga["shape"] = "box"; + ga["rankdir"] = "BT"; // BOTTOM to TOP arrows + return ga; +} +const QMap<QString, QString> toERSchema::GraphAttributes = toERSchema::GraphAttributesHelper(); Modified: branches/tora3/src/tools/toer.h =================================================================== --- branches/tora3/src/tools/toer.h 2012-06-28 08:36:43 UTC (rev 4375) +++ branches/tora3/src/tools/toer.h 2012-06-28 12:43:53 UTC (rev 4376) @@ -44,26 +44,28 @@ #include "core/totool.h" +#include <QDate> +#include <QMap> +#include <QPair> +#include <QSet> #include <iostream> -#include <QDate> -class toResultView; + class toConnection; -class toResultCombo; +class toEventQuery; +class DotGraphView; -class QTextBrowser; -class QLineEdit; - class toERSchema : public toToolWidget { Q_OBJECT; - toResultView *Result; - QAction *updateAct; + typedef QPair<QString, QString> Reference; - QTabWidget *Tabs; - QTextBrowser *tb; + DotGraphView *m_DotGraphView; + toEventQuery *Query; + QSet<QString> m_Tables; + QSet<Reference> m_References; public: toERSchema(/*toTool *tool,*/ QWidget *parent, toConnection &connection); virtual ~toERSchema(); @@ -71,9 +73,17 @@ protected: void closeEvent(QCloseEvent *event); +public slots: + void poll(toEventQuery *e); + private slots: void execute(void); void instanceChanged(int); + void queryDone(void); + +private: + static QMap<QString, QString> GraphAttributesHelper(); + static const QMap<QString, QString> GraphAttributes; }; #endif Modified: branches/tora3/src/tools/toresultstorage.cpp =================================================================== --- branches/tora3/src/tools/toresultstorage.cpp 2012-06-28 08:36:43 UTC (rev 4375) +++ branches/tora3/src/tools/toresultstorage.cpp 2012-06-28 12:43:53 UTC (rev 4376) @@ -1275,7 +1275,7 @@ return ; QString table = (*i); - List->executeWithParams(toQueryParams() << owner << table); + List->refreshWithParams(toQueryParams() << owner << table); toQList res = toQuery::readQuery(connection(), SQLTableTablespace, toQueryParams() << owner << table); Modified: branches/tora3/src/tools/tosgastatement.cpp =================================================================== --- branches/tora3/src/tools/tosgastatement.cpp 2012-06-28 08:36:43 UTC (rev 4375) +++ branches/tora3/src/tools/tosgastatement.cpp 2012-06-28 12:43:53 UTC (rev 4376) @@ -57,7 +57,7 @@ { try { - Resources->executeWithParams(toQueryParams() << Address); + Resources->refreshWithParams(toQueryParams() << Address); } catch (...) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2012-07-12 13:04:59
|
Revision: 4378 http://tora.svn.sourceforge.net/tora/?rev=4378&view=rev Author: ibre5041 Date: 2012-07-12 13:04:47 +0000 (Thu, 12 Jul 2012) Log Message: ----------- preffer TNS Oracle client before the Instant one Modified Paths: -------------- branches/tora3/src/connection/tooraclefind.cpp branches/tora3/src/core/tomain.cpp Modified: branches/tora3/src/connection/tooraclefind.cpp =================================================================== --- branches/tora3/src/connection/tooraclefind.cpp 2012-06-28 15:35:28 UTC (rev 4377) +++ branches/tora3/src/connection/tooraclefind.cpp 2012-07-12 13:04:47 UTC (rev 4378) @@ -312,10 +312,10 @@ if ( hmoduleOCI) TLOG(5, toNoDecorator, __HERE__) << "OK" << std::endl; #else - /* Steps to load libclntsh.so on linux + /* Steps to load libclntsh.so on Linux All these approaches fail: - setenv("LD_LIBRARY_PATH", ..); - does not work. glibc preverses copy of this variable and ignores any further changes + does not work. glibc preserves copy of this variable and ignores any further changes - dlopen("/opt/instantclient_11_1/libclntsh.so.11.1"); fails. libclntsh.so.11.1 depends on libnnz.so - dlopen("/opt/instantclient_11_1/libnns.so"); @@ -326,7 +326,7 @@ For some courious reason Oracle client thinks, that it is a thick one and searches for "rdbms" subdir. This approach works correctly: - - libtrotl.so has compiled in, library search path. "$ORIGIN/instantclient:$$ORIGIN/instantclient". + - libtrotl.so has compiled in this library search path: "$ORIGIN/instantclient:$$ORIGIN/instantclient". - libtrotl.so has dependency on libclntsh.so.11.1. - ln -sf /opt/instantclient_11_1 ./instantclient - dlopen("libtrotl.so") Modified: branches/tora3/src/core/tomain.cpp =================================================================== --- branches/tora3/src/core/tomain.cpp 2012-06-28 15:35:28 UTC (rev 4377) +++ branches/tora3/src/core/tomain.cpp 2012-07-12 13:04:47 UTC (rev 4378) @@ -65,6 +65,7 @@ #include "connection/absfact.h" #include "tools/toworksheet.h" +#include "core/tooracleconst.h" // TODO remove this (included for ORACLE_PROVIDER) #include "icons/connect.xpm" #include "icons/copy.xpm" @@ -219,18 +220,42 @@ { try { - toConnectionProviderFinder::ConnectionProvirerParams const& params = allProviders.first(); - TLOG(5, toDecorator, __HERE__) << "Loading: " << params.value("PATH").toString() << std::endl; - QString providerName = params.value("PROVIDER").toString(); - toConnectionProviderRegistrySing::Instance().load(params); - TLOG(5, toDecorator, __HERE__) << "Loaded provider: " - << toConnectionProviderRegistrySing::Instance().get(providerName).name() - << std::endl; + // 1st try to load thick(TNS) Oracle client + Q_FOREACH(toConnectionProviderFinder::ConnectionProvirerParams const& params, allProviders) + { + if ( params.value("PROVIDER").toString() == ORACLE_PROVIDER && params.value("IS INSTANT").toBool() == false) + { + TLOG(5, toDecorator, __HERE__) << "Loading: " << params.value("PATH").toString() << std::endl; + QString providerName = params.value("PROVIDER").toString(); + toConnectionProviderRegistrySing::Instance().load(params); + TLOG(5, toDecorator, __HERE__) << "Loaded provider: " + << toConnectionProviderRegistrySing::Instance().get(providerName).name() + << std::endl; - QList<QString> databases = toConnectionProviderRegistrySing::Instance().get(providerName).databases("", "", ""); - foreach(QString const & d, databases) + QList<QString> databases = toConnectionProviderRegistrySing::Instance().get(providerName).databases("", "", ""); + foreach(QString const & d, databases) + { + TLOG(5, toDecorator, __HERE__) << d << std::endl; + } + } + } + + // if not found load ANY Instant client + if ( !toConnectionProviderRegistrySing::Instance().providers().contains(ORACLE_PROVIDER)) { - TLOG(5, toDecorator, __HERE__) << d << std::endl; + toConnectionProviderFinder::ConnectionProvirerParams const& params = allProviders.first(); + TLOG(5, toDecorator, __HERE__) << "Loading: " << params.value("PATH").toString() << std::endl; + QString providerName = params.value("PROVIDER").toString(); + toConnectionProviderRegistrySing::Instance().load(params); + TLOG(5, toDecorator, __HERE__) << "Loaded provider: " + << toConnectionProviderRegistrySing::Instance().get(providerName).name() + << std::endl; + + QList<QString> databases = toConnectionProviderRegistrySing::Instance().get(providerName).databases("", "", ""); + foreach(QString const & d, databases) + { + TLOG(5, toDecorator, __HERE__) << d << std::endl; + } } foreach(toConnectionProviderFinder::ConnectionProvirerParams p, allProviders) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2012-07-25 21:07:48
|
Revision: 4382 http://tora.svn.sourceforge.net/tora/?rev=4382&view=rev Author: ibre5041 Date: 2012-07-25 21:07:41 +0000 (Wed, 25 Jul 2012) Log Message: ----------- const correctness + some code cleanup Modified Paths: -------------- branches/tora3/src/core/toresult.h branches/tora3/src/core/toresultdata.h branches/tora3/src/core/toresultextract.cpp branches/tora3/src/tools/tobrowsertablewidget.cpp branches/tora3/src/tools/tocurrent.cpp branches/tora3/src/tools/toworksheet.cpp Modified: branches/tora3/src/core/toresult.h =================================================================== --- branches/tora3/src/core/toresult.h 2012-07-25 21:05:17 UTC (rev 4381) +++ branches/tora3/src/core/toresult.h 2012-07-25 21:07:41 UTC (rev 4382) @@ -139,7 +139,7 @@ /** Get last parameters used. * @return Don't modify the list returned. */ - toQueryParams ¶ms(void) + toQueryParams const& params(void) { return Params; } Modified: branches/tora3/src/core/toresultdata.h =================================================================== --- branches/tora3/src/core/toresultdata.h 2012-07-25 21:05:17 UTC (rev 4381) +++ branches/tora3/src/core/toresultdata.h 2012-07-25 21:07:41 UTC (rev 4382) @@ -60,8 +60,8 @@ class toResultData : public QWidget, public toResult { + Q_OBJECT; private: - Q_OBJECT; // toolbar actions QAction *filterAct; Modified: branches/tora3/src/core/toresultextract.cpp =================================================================== --- branches/tora3/src/core/toresultextract.cpp 2012-07-25 21:05:17 UTC (rev 4381) +++ branches/tora3/src/core/toresultextract.cpp 2012-07-25 21:07:41 UTC (rev 4382) @@ -84,7 +84,7 @@ try { - toQueryParams::iterator i = params().begin(); + toQueryParams::const_iterator i = params().begin(); QString owner; QString name; if (i != params().end()) Modified: branches/tora3/src/tools/tobrowsertablewidget.cpp =================================================================== --- branches/tora3/src/tools/tobrowsertablewidget.cpp 2012-07-25 21:05:17 UTC (rev 4381) +++ branches/tora3/src/tools/tobrowsertablewidget.cpp 2012-07-25 21:07:41 UTC (rev 4382) @@ -482,9 +482,9 @@ referencesView->hide(); if (c.providerIs("Oracle")) - addTab(schemaView, "&Schema"); + addTab(schemaView, "&Schema"); else - schemaView->hide(); + schemaView->hide(); if (c.providerIs("Oracle")) addTab(grantsView, "&Grants"); Modified: branches/tora3/src/tools/tocurrent.cpp =================================================================== --- branches/tora3/src/tools/tocurrent.cpp 2012-07-25 21:05:17 UTC (rev 4381) +++ branches/tora3/src/tools/tocurrent.cpp 2012-07-25 21:07:41 UTC (rev 4382) @@ -50,6 +50,7 @@ #include "core/toresultparam.h" #include "core/toresultstats.h" #include "core/toresultview.h" +#include "core/toeventquery.h" #include "core/tosql.h" #include "core/totool.h" @@ -117,7 +118,7 @@ toCurrent::toCurrent(QWidget *main, toConnection &connection) : toToolWidget(CurrentTool, "current.html", main, connection, "toCurrent") { - QToolBar *toolbar = toAllocBar(this, tr("Current Session")); + QToolBar *toolbar = Utils::toAllocBar(this, tr("Current Session")); layout()->addWidget(toolbar); toolbar->addAction(QIcon(QPixmap(const_cast<const char**>(refresh_xpm))), @@ -125,7 +126,7 @@ this, SLOT(refresh(void))); - toolbar->addWidget(new toSpacer()); + toolbar->addWidget(new Utils::toSpacer()); new toChangeConnection(toolbar, TO_TOOLBAR_WIDGET_NAME); @@ -211,11 +212,11 @@ CurrentUpdate = Updates.takeFirst(); - toQList param; + toQueryParams param; if (!CurrentUpdate.Role.isEmpty()) - toPush(param, toQValue(CurrentUpdate.Role)); + param << toQValue(CurrentUpdate.Role); Query = new toEventQuery(connection(), - toQuery::Background, + //toQuery::Background, CurrentUpdate.SQL, param); connect(Query, SIGNAL(dataAvailable()), this, SLOT(poll())); @@ -249,7 +250,7 @@ } catch (const QString &exc) { - toStatusMessage(exc); + Utils::toStatusMessage(exc); delete Query; Query = NULL; } Modified: branches/tora3/src/tools/toworksheet.cpp =================================================================== --- branches/tora3/src/tools/toworksheet.cpp 2012-07-25 21:05:17 UTC (rev 4381) +++ branches/tora3/src/tools/toworksheet.cpp 2012-07-25 21:07:41 UTC (rev 4382) @@ -521,6 +521,8 @@ WaitChart->setYPostfix(QString::fromLatin1("ms/s")); WaitChart->setSamples(-1); WaitChart->start(); + // TODO: there is no method toResult::changeParams(QString const &, ...) + // it was renamed to refreshWithParams(toQueryParams const&) connect(Statistics, SIGNAL(sessionChanged(const QString &)), WaitChart, SLOT(changeParams(const QString &))); IOChart = new toResultBar(splitter); @@ -536,6 +538,8 @@ IOChart->setYPostfix(tr("blocks/s")); IOChart->setSamples(-1); IOChart->start(); + // TODO: there is no method toResult::changeParams(QString const &, ...) + // it was renamed to refreshWithParams(toQueryParams const&) connect(Statistics, SIGNAL(sessionChanged(const QString &)), IOChart, SLOT(changeParams(const QString &))); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2012-07-28 21:37:21
|
Revision: 4394 http://tora.svn.sourceforge.net/tora/?rev=4394&view=rev Author: ibre5041 Date: 2012-07-28 21:37:14 +0000 (Sat, 28 Jul 2012) Log Message: ----------- set name for all remaining thread implementations Modified Paths: -------------- branches/tora3/src/CMakeLists.txt branches/tora3/src/core/tocache.h branches/tora3/src/core/torunnable.h branches/tora3/src/core/totaskrunner.cpp branches/tora3/src/core/tothread.h Modified: branches/tora3/src/CMakeLists.txt =================================================================== --- branches/tora3/src/CMakeLists.txt 2012-07-28 21:29:53 UTC (rev 4393) +++ branches/tora3/src/CMakeLists.txt 2012-07-28 21:37:14 UTC (rev 4394) @@ -196,7 +196,6 @@ core/toresultfield.h core/toresultgrants.h core/toresultdepend.h - core/toresultdrawing.h core/tocodemodel.h core/totableselect.h core/toresultdatasingle.h @@ -206,6 +205,7 @@ core/toeditablemenu.h core/tosyntaxsetup.h core/tocache.h + core/tothread.h ts_log/toostream.h @@ -344,7 +344,7 @@ ENDIF (USE_EXPERIMENTAL) IF(graphviz_FOUND) - LIST(APPEND TORA_MOC_CLASSES tools/toer.h) + LIST(APPEND TORA_MOC_CLASSES tools/toer.h core/toresultdrawing.h) ENDIF(graphviz_FOUND) # sources @@ -427,7 +427,6 @@ core/tocodemodel.cpp core/totableselect.cpp core/toresultdatasingle.cpp - core/toresultdrawing.cpp core/todatatype.cpp core/tovisualize.cpp core/topiechart.cpp @@ -579,7 +578,7 @@ ENDIF (USE_EXPERIMENTAL) IF(graphviz_FOUND) - LIST (APPEND TORA_SOURCES tools/toer.cpp) + LIST (APPEND TORA_SOURCES tools/toer.cpp core/toresultdrawing.cpp) ENDIF(graphviz_FOUND) IF (POPPLER_QT4_FOUND) Modified: branches/tora3/src/core/tocache.h =================================================================== --- branches/tora3/src/core/tocache.h 2012-07-28 21:29:53 UTC (rev 4393) +++ branches/tora3/src/core/tocache.h 2012-07-28 21:37:14 UTC (rev 4394) @@ -236,7 +236,10 @@ { toConnection &_pConnection; public: - cacheObjects(toConnection &conn) : _pConnection(conn) { } + cacheObjects(toConnection &conn) : _pConnection(conn) + { + setObjectName(QString::fromLatin1("toCache::cacheObjects")); + } /** Get the parent connection object of this connection. */ toConnection& parentConnection(void) Modified: branches/tora3/src/core/torunnable.h =================================================================== --- branches/tora3/src/core/torunnable.h 2012-07-28 21:29:53 UTC (rev 4393) +++ branches/tora3/src/core/torunnable.h 2012-07-28 21:37:14 UTC (rev 4394) @@ -147,6 +147,7 @@ { Runner = runner; Runner->moveToThread(this); + setObjectName(QString::fromLatin1("Task:") + Runner->objectName()); } Modified: branches/tora3/src/core/totaskrunner.cpp =================================================================== --- branches/tora3/src/core/totaskrunner.cpp 2012-07-28 21:29:53 UTC (rev 4393) +++ branches/tora3/src/core/totaskrunner.cpp 2012-07-28 21:37:14 UTC (rev 4394) @@ -43,8 +43,10 @@ #include <stdio.h> toTaskRunner::toTaskRunner(toTask *task) - : Task(task) -{} + : Task(task) +{ + setObjectName(QString::fromLatin1("TaskRunner:") + Task->objectName()); +} void toTaskRunner::run(void) { Modified: branches/tora3/src/core/tothread.h =================================================================== --- branches/tora3/src/core/tothread.h 2012-07-28 21:29:53 UTC (rev 4393) +++ branches/tora3/src/core/tothread.h 2012-07-28 21:37:14 UTC (rev 4394) @@ -54,8 +54,10 @@ /** This is an abstract class that defines something that is to be performed by a * thread. */ -class toTask +class toTask : public QObject { +Q_OBJECT + public: virtual ~toTask() { } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2012-07-30 22:52:46
|
Revision: 4399 http://tora.svn.sourceforge.net/tora/?rev=4399&view=rev Author: ibre5041 Date: 2012-07-30 22:52:40 +0000 (Mon, 30 Jul 2012) Log Message: ----------- one more provider trait Modified Paths: -------------- branches/tora3/src/connection/tooracletraits.h branches/tora3/src/core/toconnectiontraits.h Modified: branches/tora3/src/connection/tooracletraits.h =================================================================== --- branches/tora3/src/connection/tooracletraits.h 2012-07-29 22:37:41 UTC (rev 4398) +++ branches/tora3/src/connection/tooracletraits.h 2012-07-30 22:52:40 UTC (rev 4399) @@ -64,4 +64,9 @@ { return true; } + + virtual bool hasAsyncBreak() + { + return true; + } }; Modified: branches/tora3/src/core/toconnectiontraits.h =================================================================== --- branches/tora3/src/core/toconnectiontraits.h 2012-07-29 22:37:41 UTC (rev 4398) +++ branches/tora3/src/core/toconnectiontraits.h 2012-07-30 22:52:40 UTC (rev 4399) @@ -60,5 +60,11 @@ * @return bool return true if database supports table level comments * See toSQL: toResultCols:TableComment */ - virtual bool hasTableComments() = 0; + virtual bool hasTableComments() = 0; + + /** Check if connection provider supports asynchronous query break. + * @return bool return true if db query can be canceled from bg thread + */ + virtual bool hasAsyncBreak() = 0; + }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |