From: <mrj...@us...> - 2008-07-20 21:09:07
|
Revision: 2897 http://tora.svn.sourceforge.net/tora/?rev=2897&view=rev Author: mrjohnson0 Date: 2008-07-20 21:08:49 +0000 (Sun, 20 Jul 2008) Log Message: ----------- calling exit on the test thread somehow prevents PGgetResult from ever returning. If you're unlucky like I frequently am and quit while the test thread is running a db test, you can get a deadlock. Modified Paths: -------------- trunk/tora/src/toconnectionpool.cpp trunk/tora/src/toconnectionpool.h Modified: trunk/tora/src/toconnectionpool.cpp =================================================================== --- trunk/tora/src/toconnectionpool.cpp 2008-07-17 12:51:36 UTC (rev 2896) +++ trunk/tora/src/toconnectionpool.cpp 2008-07-20 21:08:49 UTC (rev 2897) @@ -43,6 +43,7 @@ #include <QTimer> #include <QCoreApplication> +#include <QApplication> static const int TEST_MSEC = 5000; @@ -79,6 +80,11 @@ } +void toConnectionPoolTest::exitLoop() { + QThread::exit(0); +} + + toConnectionPoolExec::toConnectionPoolExec(toConnectionPool *pool, Action act) { action = act; Pool = pool; @@ -150,7 +156,10 @@ toConnectionPool::~toConnectionPool() { - TestThread->exit(); + QMetaObject::invokeMethod(TestThread, "exitLoop", Qt::QueuedConnection); + // must call this or the queued call never executes while we wait + // on the thread. Awesome. + qApp->processEvents(); TestThread->wait(); delete TestThread; Modified: trunk/tora/src/toconnectionpool.h =================================================================== --- trunk/tora/src/toconnectionpool.h 2008-07-17 12:51:36 UTC (rev 2896) +++ trunk/tora/src/toconnectionpool.h 2008-07-20 21:08:49 UTC (rev 2897) @@ -71,6 +71,15 @@ */ virtual void run(void); +public slots: + /** + * Calling exit() from another thread prevents proper exit of sql + * queries, leading to a deadlock + * + */ + void exitLoop(); + + private slots: // execute tests void test(void); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mrj...@us...> - 2008-07-20 22:01:47
|
Revision: 2900 http://tora.svn.sourceforge.net/tora/?rev=2900&view=rev Author: mrjohnson0 Date: 2008-07-20 22:01:45 +0000 (Sun, 20 Jul 2008) Log Message: ----------- use quit method on qthread, does the same thing Modified Paths: -------------- trunk/tora/src/toconnectionpool.cpp trunk/tora/src/toconnectionpool.h Modified: trunk/tora/src/toconnectionpool.cpp =================================================================== --- trunk/tora/src/toconnectionpool.cpp 2008-07-20 21:42:24 UTC (rev 2899) +++ trunk/tora/src/toconnectionpool.cpp 2008-07-20 22:01:45 UTC (rev 2900) @@ -80,11 +80,6 @@ } -void toConnectionPoolTest::exitLoop() { - QThread::exit(0); -} - - toConnectionPoolExec::toConnectionPoolExec(toConnectionPool *pool, Action act) { action = act; Pool = pool; @@ -156,7 +151,7 @@ toConnectionPool::~toConnectionPool() { - QMetaObject::invokeMethod(TestThread, "exitLoop", Qt::QueuedConnection); + QMetaObject::invokeMethod(TestThread, "quit", Qt::QueuedConnection); // must call this or the queued call never executes while we wait // on the thread. Awesome. qApp->processEvents(); Modified: trunk/tora/src/toconnectionpool.h =================================================================== --- trunk/tora/src/toconnectionpool.h 2008-07-20 21:42:24 UTC (rev 2899) +++ trunk/tora/src/toconnectionpool.h 2008-07-20 22:01:45 UTC (rev 2900) @@ -71,15 +71,6 @@ */ virtual void run(void); -public slots: - /** - * Calling exit() from another thread prevents proper exit of sql - * queries, leading to a deadlock - * - */ - void exitLoop(); - - private slots: // execute tests void test(void); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <su...@us...> - 2008-07-25 10:53:38
|
Revision: 2904 http://tora.svn.sourceforge.net/tora/?rev=2904&view=rev Author: subik Date: 2008-07-25 10:53:46 +0000 (Fri, 25 Jul 2008) Log Message: ----------- fixed "If you delete (with the trash can icon) all of the rows, then click delete again, it crashes"; row number display is starting from 1 instead of 0 now Modified Paths: -------------- trunk/tora/src/toresultdata.cpp trunk/tora/src/toresultmodel.cpp trunk/tora/src/toresulttableviewedit.cpp Modified: trunk/tora/src/toresultdata.cpp =================================================================== --- trunk/tora/src/toresultdata.cpp 2008-07-21 16:40:42 UTC (rev 2903) +++ trunk/tora/src/toresultdata.cpp 2008-07-25 10:53:46 UTC (rev 2904) @@ -247,6 +247,9 @@ void toResultData::navigate(QAction *action) { Edit->setFocus(); + if (!Edit->selectionModel()) + return; + QModelIndex current = Edit->selectionModel()->currentIndex(); int row = current.row(); int col = current.column(); Modified: trunk/tora/src/toresultmodel.cpp =================================================================== --- trunk/tora/src/toresultmodel.cpp 2008-07-21 16:40:42 UTC (rev 2903) +++ trunk/tora/src/toresultmodel.cpp 2008-07-25 10:53:46 UTC (rev 2904) @@ -255,7 +255,7 @@ if (!Editable) return; - if (!index.isValid() && index.row() >= Rows.size()) + if (!index.isValid() || index.row() >= Rows.size()) return; beginRemoveRows(QModelIndex(), index.row(), index.row()); @@ -390,7 +390,7 @@ } if (orientation == Qt::Vertical) - return section; + return section + 1; return QVariant(); } Modified: trunk/tora/src/toresulttableviewedit.cpp =================================================================== --- trunk/tora/src/toresulttableviewedit.cpp 2008-07-21 16:40:42 UTC (rev 2903) +++ trunk/tora/src/toresulttableviewedit.cpp 2008-07-25 10:53:46 UTC (rev 2904) @@ -542,6 +542,9 @@ void toResultTableViewEdit::deleteRecord(void) { + if (!selectionModel()) + return; + QModelIndex ind = selectionModel()->currentIndex(); if (ind.isValid()) Model->deleteRow(ind); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mrj...@us...> - 2008-07-26 19:10:42
|
Revision: 2906 http://tora.svn.sourceforge.net/tora/?rev=2906&view=rev Author: mrjohnson0 Date: 2008-07-26 19:10:50 +0000 (Sat, 26 Jul 2008) Log Message: ----------- use resource file for help documents Modified Paths: -------------- trunk/tora/src/Makefile.am trunk/tora/src/tohelp.cpp trunk/tora/src/tora.qrc trunk/tora/src/utils.cpp Modified: trunk/tora/src/Makefile.am =================================================================== --- trunk/tora/src/Makefile.am 2008-07-25 11:26:23 UTC (rev 2905) +++ trunk/tora/src/Makefile.am 2008-07-26 19:10:50 UTC (rev 2906) @@ -426,6 +426,9 @@ qrc_%.cpp: %.qrc $(RCC) $< -o $@ +#make resource file depend on resources +qrc_tora.cpp: help/*.html help/images/*.png icons/*.xpm + #.h.moc: # $(MOC) $(AM_CPPFLAGS) -o $@ $< @@ -460,6 +463,3 @@ install-data-hook: mkdir -p $(DESTDIR)$(libdir) cp -f $(top_builddir)/src/i18n/*.qm $(DESTDIR)$(libdir) - $(INSTALL_DATA) $(top_builddir)/src/templates/log4plsql.tpl $(DESTDIR)$(libdir) - $(INSTALL_DATA) $(top_builddir)/src/templates/hints.tpl $(DESTDIR)$(libdir) - $(INSTALL_DATA) $(top_builddir)/src/templates/sqlfunctions.tpl $(DESTDIR)$(libdir) Modified: trunk/tora/src/tohelp.cpp =================================================================== --- trunk/tora/src/tohelp.cpp 2008-07-25 11:26:23 UTC (rev 2905) +++ trunk/tora/src/tohelp.cpp 2008-07-26 19:10:50 UTC (rev 2906) @@ -261,7 +261,7 @@ Help, SLOT(forward(void))); std::map<QString, QString> Dsc; - Dsc[tr(TOAPPNAME " manual")] = toConfigurationSingle::Instance().helpPath(); //toHelpPath(); + Dsc[tr(TOAPPNAME " manual")] = QString("qrc:/help/toc.html"); // int tot = HelpTool.config("Number", "-1").toInt(); // if (tot != -1) @@ -391,7 +391,7 @@ { QString cur; if (path.isNull()) - cur = toConfigurationSingle::Instance().helpPath();/*toHelpPath();*/ + cur = "qrc:/help/toc.html"; else cur = path; cur.replace(QRegExp(QString::fromLatin1("[^/]+$")), QString::null); Modified: trunk/tora/src/tora.qrc =================================================================== --- trunk/tora/src/tora.qrc 2008-07-25 11:26:23 UTC (rev 2905) +++ trunk/tora/src/tora.qrc 2008-07-26 19:10:50 UTC (rev 2906) @@ -1,138 +1,237 @@ -<!DOCTYPE RCC><RCC version="1.0"> - <qresource> - <file>icons/addfile.xpm</file> - <file>icons/addindex.xpm</file> - <file>icons/addproject.xpm</file> - <file>icons/addrecord.xpm</file> - <file>icons/addrole.xpm</file> - <file>icons/addrollback.xpm</file> - <file>icons/addtablespace.xpm</file> - <file>icons/addtable.xpm</file> - <file>icons/addtemplate.xpm</file> - <file>icons/adduser.xpm</file> - <file>icons/addwatch.xpm</file> - <file>icons/add.xpm</file> - <file>icons/axis.xpm</file> - <file>icons/background.xpm</file> - <file>icons/breakpoint.xpm</file> - <file>icons/canceledit.xpm</file> - <file>icons/changeconnect.xpm</file> - <file>icons/changewatch.xpm</file> - <file>icons/chart.xpm</file> - <file>icons/clock.xpm</file> - <file>icons/close.xpm</file> - <file>icons/coalesce.xpm</file> - <file>icons/commit.xpm</file> - <file>icons/compile.xpm</file> - <file>icons/connect.xpm</file> - <file>icons/copyuser.xpm</file> - <file>icons/copy.xpm</file> - <file>icons/cut.xpm</file> - <file>icons/database.xpm</file> - <file>icons/deindent.xpm</file> - <file>icons/delwatch.xpm</file> - <file>icons/describe.xpm</file> - <file>icons/disbreakpoint.xpm</file> - <file>icons/disconnect.xpm</file> - <file>icons/down.xpm</file> - <file>icons/droptablespace.xpm</file> - <file>icons/duplicaterecord.xpm</file> - <file>icons/enablebreak.xpm</file> - <file>icons/eraselog.xpm</file> - <file>icons/executeall.xpm</file> - <file>icons/executestep.xpm</file> - <file>icons/execute.xpm</file> - <file>icons/explainplan.xpm</file> - <file>icons/fileopen.xpm</file> - <file>icons/filesave.xpm</file> - <file>icons/filter.xpm</file> - <file>icons/forward.xpm</file> - <file>icons/function.xpm</file> - <file>icons/grid.xpm</file> - <file>icons/indent.xpm</file> - <file>icons/index.xpm</file> - <file>icons/insertsaved.xpm</file> - <file>icons/kill.xpm</file> - <file>icons/largelogo.xpm</file> - <file>icons/legend.xpm</file> - <file>icons/logging.xpm</file> - <file>icons/minus.xpm</file> - <file>icons/modconstraint.xpm</file> - <file>icons/modfile.xpm</file> - <file>icons/modindex.xpm</file> - <file>icons/modtablespace.xpm</file> - <file>icons/modtable.xpm</file> - <file>icons/movefile.xpm</file> - <file>icons/new.xpm</file> - <file>icons/nextbug.xpm</file> - <file>icons/next.xpm</file> - <file>icons/noclock.xpm</file> - <file>icons/nofilter.xpm</file> - <file>icons/offline.xpm</file> - <file>icons/online.xpm</file> - <file>icons/paste.xpm</file> - <file>icons/prevbug.xpm</file> - <file>icons/previous.xpm</file> - <file>icons/print.xpm</file> - <file>icons/readtablespace.xpm</file> - <file>icons/recall.xpm</file> - <file>icons/redo.xpm</file> - <file>icons/refresh.xpm</file> - <file>icons/returnfrom.xpm</file> - <file>icons/return.xpm</file> - <file>icons/rewind.xpm</file> - <file>icons/rollback.xpm</file> - <file>icons/saverecord.xpm</file> - <file>icons/scansource.xpm</file> - <file>icons/schema.xpm</file> - <file>icons/search.xpm</file> - <file>icons/sequence.xpm</file> - <file>icons/shrink.xpm</file> - <file>icons/single.xpm</file> - <file>icons/sql.xpm</file> - <file>icons/stepinto.xpm</file> - <file>icons/stepover.xpm</file> - <file>icons/stop.xpm</file> - <file>icons/storageextents.xpm</file> - <file>icons/synonym.xpm</file> - <file>icons/table.xpm</file> - <file>icons/toalert.xpm</file> - <file>icons/toanalyze.xpm</file> - <file>icons/tobackup.xpm</file> - <file>icons/tobrowser.xpm</file> - <file>icons/tocurrent.xpm</file> - <file>icons/todebug.xpm</file> - <file>icons/togglebreak.xpm</file> - <file>icons/toinvalid.xpm</file> - <file>icons/tolongops.xpm</file> - <file>icons/tooutput.xpm</file> - <file>icons/toramini.xpm</file> - <file>icons/tora.xpm</file> - <file>icons/torollback.xpm</file> - <file>icons/toscript.xpm</file> - <file>icons/tosecurity.xpm</file> - <file>icons/tosession.xpm</file> - <file>icons/tosgatrace.xpm</file> - <file>icons/tosqledit.xpm</file> - <file>icons/tostorage.xpm</file> - <file>icons/totemplate.xpm</file> - <file>icons/totemporary.xpm</file> - <file>icons/totuning.xpm</file> - <file>icons/toworksheet.xpm</file> - <file>icons/trash.xpm</file> - <file>icons/tree.xpm</file> - <file>icons/twirl.mng</file> - <file>icons/undo.xpm</file> - <file>icons/unittest.xpm</file> - <file>icons/up.xpm</file> - <file>icons/view.xpm</file> - <file>icons/writetablespace.xpm</file> - - <file>templates/hints.tpl</file> - <file>templates/log4plsql.tpl</file> - <file>templates/sqlfunctions.tpl</file> - - <file>templates/completion.api</file> - - </qresource> +<RCC> + <qresource prefix="/" > + <file>icons/add.xpm</file> + <file>icons/addfile.xpm</file> + <file>icons/addindex.xpm</file> + <file>icons/addproject.xpm</file> + <file>icons/addrecord.xpm</file> + <file>icons/addrole.xpm</file> + <file>icons/addrollback.xpm</file> + <file>icons/addtable.xpm</file> + <file>icons/addtablespace.xpm</file> + <file>icons/addtemplate.xpm</file> + <file>icons/adduser.xpm</file> + <file>icons/addwatch.xpm</file> + <file>icons/axis.xpm</file> + <file>icons/background.xpm</file> + <file>icons/breakpoint.xpm</file> + <file>icons/canceledit.xpm</file> + <file>icons/changeconnect.xpm</file> + <file>icons/changewatch.xpm</file> + <file>icons/chart.xpm</file> + <file>icons/clock.xpm</file> + <file>icons/close.xpm</file> + <file>icons/coalesce.xpm</file> + <file>icons/commit.xpm</file> + <file>icons/compile.xpm</file> + <file>icons/connect.xpm</file> + <file>icons/copy.xpm</file> + <file>icons/copyuser.xpm</file> + <file>icons/cut.xpm</file> + <file>icons/database.xpm</file> + <file>icons/deindent.xpm</file> + <file>icons/delwatch.xpm</file> + <file>icons/describe.xpm</file> + <file>icons/disbreakpoint.xpm</file> + <file>icons/disconnect.xpm</file> + <file>icons/down.xpm</file> + <file>icons/droptablespace.xpm</file> + <file>icons/duplicaterecord.xpm</file> + <file>icons/enablebreak.xpm</file> + <file>icons/eraselog.xpm</file> + <file>icons/execute.xpm</file> + <file>icons/executeall.xpm</file> + <file>icons/executestep.xpm</file> + <file>icons/explainplan.xpm</file> + <file>icons/fileopen.xpm</file> + <file>icons/filesave.xpm</file> + <file>icons/filter.xpm</file> + <file>icons/forward.xpm</file> + <file>icons/function.xpm</file> + <file>icons/grid.xpm</file> + <file>icons/indent.xpm</file> + <file>icons/index.xpm</file> + <file>icons/insertsaved.xpm</file> + <file>icons/kill.xpm</file> + <file>icons/largelogo.xpm</file> + <file>icons/legend.xpm</file> + <file>icons/logging.xpm</file> + <file>icons/minus.xpm</file> + <file>icons/modconstraint.xpm</file> + <file>icons/modfile.xpm</file> + <file>icons/modindex.xpm</file> + <file>icons/modtable.xpm</file> + <file>icons/modtablespace.xpm</file> + <file>icons/movefile.xpm</file> + <file>icons/new.xpm</file> + <file>icons/next.xpm</file> + <file>icons/nextbug.xpm</file> + <file>icons/noclock.xpm</file> + <file>icons/nofilter.xpm</file> + <file>icons/offline.xpm</file> + <file>icons/online.xpm</file> + <file>icons/paste.xpm</file> + <file>icons/prevbug.xpm</file> + <file>icons/previous.xpm</file> + <file>icons/print.xpm</file> + <file>icons/readtablespace.xpm</file> + <file>icons/recall.xpm</file> + <file>icons/redo.xpm</file> + <file>icons/refresh.xpm</file> + <file>icons/return.xpm</file> + <file>icons/returnfrom.xpm</file> + <file>icons/rewind.xpm</file> + <file>icons/rollback.xpm</file> + <file>icons/saverecord.xpm</file> + <file>icons/scansource.xpm</file> + <file>icons/schema.xpm</file> + <file>icons/search.xpm</file> + <file>icons/sequence.xpm</file> + <file>icons/shrink.xpm</file> + <file>icons/single.xpm</file> + <file>icons/sql.xpm</file> + <file>icons/stepinto.xpm</file> + <file>icons/stepover.xpm</file> + <file>icons/stop.xpm</file> + <file>icons/storageextents.xpm</file> + <file>icons/synonym.xpm</file> + <file>icons/table.xpm</file> + <file>icons/toalert.xpm</file> + <file>icons/toanalyze.xpm</file> + <file>icons/tobackup.xpm</file> + <file>icons/tobrowser.xpm</file> + <file>icons/tocurrent.xpm</file> + <file>icons/todebug.xpm</file> + <file>icons/togglebreak.xpm</file> + <file>icons/toinvalid.xpm</file> + <file>icons/tolongops.xpm</file> + <file>icons/tooutput.xpm</file> + <file>icons/tora.xpm</file> + <file>icons/toramini.xpm</file> + <file>icons/torollback.xpm</file> + <file>icons/toscript.xpm</file> + <file>icons/tosecurity.xpm</file> + <file>icons/tosession.xpm</file> + <file>icons/tosgatrace.xpm</file> + <file>icons/tosqledit.xpm</file> + <file>icons/tostorage.xpm</file> + <file>icons/totemplate.xpm</file> + <file>icons/totemporary.xpm</file> + <file>icons/totuning.xpm</file> + <file>icons/toworksheet.xpm</file> + <file>icons/trash.xpm</file> + <file>icons/tree.xpm</file> + <file>icons/twirl.mng</file> + <file>icons/undo.xpm</file> + <file>icons/unittest.xpm</file> + <file>icons/up.xpm</file> + <file>icons/view.xpm</file> + <file>icons/writetablespace.xpm</file> + <file>templates/completion.api</file> + <file>templates/hints.tpl</file> + <file>templates/log4plsql.tpl</file> + <file>templates/sqlfunctions.tpl</file> + <file>help/Explain-plan.html</file> + <file>help/Getting-bind-parameters.html</file> + <file>help/Index.html</file> + <file>help/Memo-editor.html</file> + <file>help/Object-description.html</file> + <file>help/SGA-Statement.html</file> + <file>help/What-privileges-do-you-need-to-run-TOra.html</file> + <file>help/additionalhelp.html</file> + <file>help/alert.html</file> + <file>help/analyze.html</file> + <file>help/api.html</file> + <file>help/browser.html</file> + <file>help/charts.html</file> + <file>help/common.html</file> + <file>help/current.html</file> + <file>help/database.html</file> + <file>help/debugger.html</file> + <file>help/editors.html</file> + <file>help/extendingtora.html</file> + <file>help/externalapi.html</file> + <file>help/fonts.html</file> + <file>help/globalsettings.html</file> + <file>help/help.html</file> + <file>help/history.html</file> + <file>help/images/additionalhelp.png</file> + <file>help/images/addwatch.png</file> + <file>help/images/alert.png</file> + <file>help/images/analyze.png</file> + <file>help/images/browser.png</file> + <file>help/images/browserfilter.png</file> + <file>help/images/changewatch.png</file> + <file>help/images/charts.png</file> + <file>help/images/chartsetup.png</file> + <file>help/images/contentfilter.png</file> + <file>help/images/current.png</file> + <file>help/images/database.png</file> + <file>help/images/debugger.png</file> + <file>help/images/describe.png</file> + <file>help/images/difference.png</file> + <file>help/images/editmenu.png</file> + <file>help/images/filemenu.png</file> + <file>help/images/fonts.png</file> + <file>help/images/getparam.png</file> + <file>help/images/help.png</file> + <file>help/images/helpmenu.png</file> + <file>help/images/invalid.png</file> + <file>help/images/largelogo.png</file> + <file>help/images/lists.png</file> + <file>help/images/memo.png</file> + <file>help/images/newconnection.png</file> + <file>help/images/oracle.png</file> + <file>help/images/output.png</file> + <file>help/images/pfileeditor.png</file> + <file>help/images/preferences.png</file> + <file>help/images/priviledges.png</file> + <file>help/images/quota.png</file> + <file>help/images/resize.png</file> + <file>help/images/rollback.png</file> + <file>help/images/rollbacksetup.png</file> + <file>help/images/script.png</file> + <file>help/images/searchreplace.png</file> + <file>help/images/security.png</file> + <file>help/images/session.png</file> + <file>help/images/sgastatement.png</file> + <file>help/images/sgatrace.png</file> + <file>help/images/sqledit.png</file> + <file>help/images/storage.png</file> + <file>help/images/template.png</file> + <file>help/images/templateeditor.png</file> + <file>help/images/templatesetup.png</file> + <file>help/images/toolbar.png</file> + <file>help/images/tools.png</file> + <file>help/images/toolsmenu.png</file> + <file>help/images/tuning.png</file> + <file>help/images/visualize.png</file> + <file>help/images/windowsmenu.png</file> + <file>help/images/worksheet.png</file> + <file>help/images/worksheetsetup.png</file> + <file>help/images/workspace.png</file> + <file>help/index.html</file> + <file>help/invalid.html</file> + <file>help/lists.html</file> + <file>help/newconnection.html</file> + <file>help/output.html</file> + <file>help/preferences.html</file> + <file>help/rollback.html</file> + <file>help/script.html</file> + <file>help/searchreplace.html</file> + <file>help/security.html</file> + <file>help/session.html</file> + <file>help/sqledit.html</file> + <file>help/storage.html</file> + <file>help/template.html</file> + <file>help/toc.html</file> + <file>help/tools.html</file> + <file>help/toolsetting.html</file> + <file>help/trace.html</file> + <file>help/tuning.html</file> + <file>help/unittest.html</file> + <file>help/window.html</file> + <file>help/worksheet.html</file> + <file>help/workspace.html</file> + </qresource> </RCC> Modified: trunk/tora/src/utils.cpp =================================================================== --- trunk/tora/src/utils.cpp 2008-07-25 11:26:23 UTC (rev 2905) +++ trunk/tora/src/utils.cpp 2008-07-26 19:10:50 UTC (rev 2906) @@ -626,9 +626,14 @@ QString toReadFile(const QString &filename) { QString expanded = toExpandFile(filename); + // for some reason qrc:/ urls fail with QFile but are required for + // QTextBrowser + if(expanded.startsWith("qrc")) + expanded = expanded.right(expanded.length() - 3); + QFile file(expanded); if (!file.open(QIODevice::ReadOnly)) - throw QT_TRANSLATE_NOOP("toReadFile", "Couldn't open file %1.").arg(filename); + throw QT_TRANSLATE_NOOP("toReadFile", "Couldn't open file %1.").arg(expanded); QTextStream in(&file); return in.readAll(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mrj...@us...> - 2008-07-26 19:13:07
|
Revision: 2907 http://tora.svn.sourceforge.net/tora/?rev=2907&view=rev Author: mrjohnson0 Date: 2008-07-26 19:13:10 +0000 (Sat, 26 Jul 2008) Log Message: ----------- add html files and images Added Paths: ----------- trunk/tora/src/help/ trunk/tora/src/help/Explain-plan.html trunk/tora/src/help/Getting-bind-parameters.html trunk/tora/src/help/Index.html trunk/tora/src/help/Memo-editor.html trunk/tora/src/help/Object-description.html trunk/tora/src/help/SGA-Statement.html trunk/tora/src/help/What-privileges-do-you-need-to-run-TOra.html trunk/tora/src/help/additionalhelp.html trunk/tora/src/help/alert.html trunk/tora/src/help/analyze.html trunk/tora/src/help/api.html trunk/tora/src/help/browser.html trunk/tora/src/help/charts.html trunk/tora/src/help/common.html trunk/tora/src/help/current.html trunk/tora/src/help/database.html trunk/tora/src/help/debugger.html trunk/tora/src/help/editors.html trunk/tora/src/help/extendingtora.html trunk/tora/src/help/externalapi.html trunk/tora/src/help/fonts.html trunk/tora/src/help/globalsettings.html trunk/tora/src/help/help.html trunk/tora/src/help/history.html trunk/tora/src/help/images/ trunk/tora/src/help/images/additionalhelp.png trunk/tora/src/help/images/addwatch.png trunk/tora/src/help/images/alert.png trunk/tora/src/help/images/analyze.png trunk/tora/src/help/images/browser.png trunk/tora/src/help/images/browserfilter.png trunk/tora/src/help/images/changewatch.png trunk/tora/src/help/images/charts.png trunk/tora/src/help/images/chartsetup.png trunk/tora/src/help/images/contentfilter.png trunk/tora/src/help/images/current.png trunk/tora/src/help/images/database.png trunk/tora/src/help/images/debugger.png trunk/tora/src/help/images/describe.png trunk/tora/src/help/images/difference.png trunk/tora/src/help/images/editmenu.png trunk/tora/src/help/images/filemenu.png trunk/tora/src/help/images/fonts.png trunk/tora/src/help/images/getparam.png trunk/tora/src/help/images/help.png trunk/tora/src/help/images/helpmenu.png trunk/tora/src/help/images/invalid.png trunk/tora/src/help/images/largelogo.png trunk/tora/src/help/images/lists.png trunk/tora/src/help/images/memo.png trunk/tora/src/help/images/newconnection.png trunk/tora/src/help/images/oracle.png trunk/tora/src/help/images/output.png trunk/tora/src/help/images/pfileeditor.png trunk/tora/src/help/images/preferences.png trunk/tora/src/help/images/priviledges.png trunk/tora/src/help/images/quota.png trunk/tora/src/help/images/resize.png trunk/tora/src/help/images/rollback.png trunk/tora/src/help/images/rollbacksetup.png trunk/tora/src/help/images/script.png trunk/tora/src/help/images/searchreplace.png trunk/tora/src/help/images/security.png trunk/tora/src/help/images/session.png trunk/tora/src/help/images/sgastatement.png trunk/tora/src/help/images/sgatrace.png trunk/tora/src/help/images/sqledit.png trunk/tora/src/help/images/storage.png trunk/tora/src/help/images/template.png trunk/tora/src/help/images/templateeditor.png trunk/tora/src/help/images/templatesetup.png trunk/tora/src/help/images/toolbar.png trunk/tora/src/help/images/tools.png trunk/tora/src/help/images/toolsmenu.png trunk/tora/src/help/images/tuning.png trunk/tora/src/help/images/visualize.png trunk/tora/src/help/images/windowsmenu.png trunk/tora/src/help/images/worksheet.png trunk/tora/src/help/images/worksheetsetup.png trunk/tora/src/help/images/workspace.png trunk/tora/src/help/index.html trunk/tora/src/help/invalid.html trunk/tora/src/help/lists.html trunk/tora/src/help/newconnection.html trunk/tora/src/help/output.html trunk/tora/src/help/preferences.html trunk/tora/src/help/rollback.html trunk/tora/src/help/script.html trunk/tora/src/help/searchreplace.html trunk/tora/src/help/security.html trunk/tora/src/help/session.html trunk/tora/src/help/sqledit.html trunk/tora/src/help/storage.html trunk/tora/src/help/template.html trunk/tora/src/help/toc.html trunk/tora/src/help/tools.html trunk/tora/src/help/toolsetting.html trunk/tora/src/help/trace.html trunk/tora/src/help/tuning.html trunk/tora/src/help/unittest.html trunk/tora/src/help/window.html trunk/tora/src/help/worksheet.html trunk/tora/src/help/workspace.html Added: trunk/tora/src/help/Explain-plan.html =================================================================== --- trunk/tora/src/help/Explain-plan.html (rev 0) +++ trunk/tora/src/help/Explain-plan.html 2008-07-26 19:13:10 UTC (rev 2907) @@ -0,0 +1,53 @@ +<html lang="en"> +<head> +<title>Explain plan - TOra</title> +<meta http-equiv="Content-Type" content="text/html"> +<meta name="description" content="TOra"> +<meta name="generator" content="makeinfo 4.11"> +<link title="Top" rel="start" href="index.html#Top"> +<link rel="up" href="common.html#common" title="common"> +<link rel="prev" href="SGA-Statement.html#SGA-Statement" title="SGA Statement"> +<link rel="next" href="Getting-bind-parameters.html#Getting-bind-parameters" title="Getting bind parameters"> +<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage"> +<!-- +This manual is for TOra, version 1.4.0.--> +<meta http-equiv="Content-Style-Type" content="text/css"> +<style type="text/css"><!-- + pre.display { font-family:inherit } + pre.format { font-family:inherit } + pre.smalldisplay { font-family:inherit; font-size:smaller } + pre.smallformat { font-family:inherit; font-size:smaller } + pre.smallexample { font-size:smaller } + pre.smalllisp { font-size:smaller } + span.sc { font-variant:small-caps } + span.roman { font-family:serif; font-weight:normal; } + span.sansserif { font-family:sans-serif; font-weight:normal; } +--></style> +</head> +<body> +<div class="node"> +<p> +<a name="Explain-plan"></a> +Next: <a rel="next" accesskey="n" href="Getting-bind-parameters.html#Getting-bind-parameters">Getting bind parameters</a>, +Previous: <a rel="previous" accesskey="p" href="SGA-Statement.html#SGA-Statement">SGA Statement</a>, +Up: <a rel="up" accesskey="u" href="common.html#common">common</a> +<hr> +</div> + +<h4 class="subsection">3.9.2 Explain plan</h4> + +<p>This element can be either part of an SGA statement or by itself in some cases (See above for a screenshot). For more information about execution paths check the Oracle manual Designing and Tuning for Performance, chapter 5 in the 8i release. + + <p>A few notes here is that the execution plan displayed here is not necessarily the same as when run depending on one of these reasons. + + <ul> +<li>It is run as a different user which doesn't access the same database objects as the user you are logged in as now. +<li>The session running the query can have changed some optimizer parameters compared to your session. +</ul> + + <p>What you see in this window is the execution you would get if you ran the statement like the one you are logged in as now and in your session. One example of this problem is if a user executes SQL which accesses his own objects which doesn't have public synonyms, then another person can simply not execute the SQL without modifying it to add owner specifier to the tables which TOra will not do automatically. + + <p>Explain plan requires a table to store the result in. The name of this table can be configured in the options(see <a href="preferences.html#preferences">Options</a>). If the table doesn't exist TOra will ask you if it should try to create it. Without this table you can not display execution plans in TOra. + + </body></html> + Added: trunk/tora/src/help/Getting-bind-parameters.html =================================================================== --- trunk/tora/src/help/Getting-bind-parameters.html (rev 0) +++ trunk/tora/src/help/Getting-bind-parameters.html 2008-07-26 19:13:10 UTC (rev 2907) @@ -0,0 +1,54 @@ +<html lang="en"> +<head> +<title>Getting bind parameters - TOra</title> +<meta http-equiv="Content-Type" content="text/html"> +<meta name="description" content="TOra"> +<meta name="generator" content="makeinfo 4.11"> +<link title="Top" rel="start" href="index.html#Top"> +<link rel="up" href="common.html#common" title="common"> +<link rel="prev" href="Explain-plan.html#Explain-plan" title="Explain plan"> +<link rel="next" href="Object-description.html#Object-description" title="Object description"> +<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage"> +<!-- +This manual is for TOra, version 1.4.0.--> +<meta http-equiv="Content-Style-Type" content="text/css"> +<style type="text/css"><!-- + pre.display { font-family:inherit } + pre.format { font-family:inherit } + pre.smalldisplay { font-family:inherit; font-size:smaller } + pre.smallformat { font-family:inherit; font-size:smaller } + pre.smallexample { font-size:smaller } + pre.smalllisp { font-size:smaller } + span.sc { font-variant:small-caps } + span.roman { font-family:serif; font-weight:normal; } + span.sansserif { font-family:sans-serif; font-weight:normal; } +--></style> +</head> +<body> +<div class="node"> +<p> +<a name="Getting-bind-parameters"></a> +Next: <a rel="next" accesskey="n" href="Object-description.html#Object-description">Object description</a>, +Previous: <a rel="previous" accesskey="p" href="Explain-plan.html#Explain-plan">Explain plan</a>, +Up: <a rel="up" accesskey="u" href="common.html#common">common</a> +<hr> +</div> + +<h4 class="subsection">3.9.3 Getting bind parameters</h4> + +<p>This dialog is displayed when input parameters are required to run the SQL. For instance the example dialog is the dialog displayed when running the following SQL in the worksheet. + +<pre class="example"><pre class="verbatim"> + + select * from essprc where prcid > :prcid and begrdt > :begrdt; + +</pre> +</pre> + <div class="block-image"><img src="images/getparam.png" alt="images/getparam.png"></div> + + <p>As you can see the field name as specified after the : character is presented as a title. If the same field name is used at several parts of the query you only get to specify it once. You specify the value in the editor line just to the right of the field name label. If you want to specify a NULL value check the <strong>NULL</strong> checkbox to the right of the editor. You can also edit the value in a memo editor(see <a href="Memo-editor.html#Memo-editor">Memo editor</a>) pressing the <strong>Edit</strong> button to the right on the value. + + <p>The parameter editor will cache it's value so it will remember the last parameters you fed to it when you run the query again. + + </body></html> + Added: trunk/tora/src/help/Index.html =================================================================== --- trunk/tora/src/help/Index.html (rev 0) +++ trunk/tora/src/help/Index.html 2008-07-26 19:13:10 UTC (rev 2907) @@ -0,0 +1,74 @@ +<html lang="en"> +<head> +<title>Index - TOra</title> +<meta http-equiv="Content-Type" content="text/html"> +<meta name="description" content="TOra"> +<meta name="generator" content="makeinfo 4.11"> +<link title="Top" rel="start" href="index.html#Top"> +<link rel="prev" href="extendingtora.html#extendingtora" title="extendingtora"> +<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage"> +<!-- +This manual is for TOra, version 1.4.0.--> +<meta http-equiv="Content-Style-Type" content="text/css"> +<style type="text/css"><!-- + pre.display { font-family:inherit } + pre.format { font-family:inherit } + pre.smalldisplay { font-family:inherit; font-size:smaller } + pre.smallformat { font-family:inherit; font-size:smaller } + pre.smallexample { font-size:smaller } + pre.smalllisp { font-size:smaller } + span.sc { font-variant:small-caps } + span.roman { font-family:serif; font-weight:normal; } + span.sansserif { font-family:sans-serif; font-weight:normal; } +--></style> +</head> +<body> +<div class="node"> +<p> +<a name="Index"></a> +Previous: <a rel="previous" accesskey="p" href="extendingtora.html#extendingtora">extendingtora</a>, +Up: <a rel="up" accesskey="u" href="index.html#Top">Top</a> +<hr> +</div> + +<h2 class="unnumbered">Index</h2> + +<ul class="index-cp" compact> +<li><a href="additionalhelp.html#index-Additional-Help-Settings-13">Additional Help Settings</a>: <a href="additionalhelp.html#additionalhelp">additionalhelp</a></li> +<li><a href="alert.html#index-Alert-Tool-30">Alert Tool</a>: <a href="alert.html#alert">alert</a></li> +<li><a href="tools.html#index-Available-tools-16">Available tools</a>: <a href="tools.html#tools">tools</a></li> +<li><a href="newconnection.html#index-Connecting-to-a-database-5">Connecting to a database</a>: <a href="newconnection.html#newconnection">newconnection</a></li> +<li><a href="current.html#index-Current-Session-27">Current Session</a>: <a href="current.html#current">current</a></li> +<li><a href="browser.html#index-Database-Browser-18">Database Browser</a>: <a href="browser.html#browser">browser</a></li> +<li><a href="database.html#index-Database-Settings-11">Database Settings</a>: <a href="database.html#database">database</a></li> +<li><a href="window.html#index-Elements-of-the-main-window-4">Elements of the main window</a>: <a href="window.html#window">window</a></li> +<li><a href="extendingtora.html#index-Extending-TOra-35">Extending TOra</a>: <a href="extendingtora.html#extendingtora">extendingtora</a></li> +<li><a href="fonts.html#index-Font-Settings-12">Font Settings</a>: <a href="fonts.html#fonts">fonts</a></li> +<li><a href="workspace.html#index-Getting-to-know-your-workspace-3">Getting to know your workspace</a>: <a href="workspace.html#workspace">workspace</a></li> +<li><a href="history.html#index-History-and-future-of-TOra-2">History and future of TOra</a>: <a href="history.html#history">history</a></li> +<li><a href="invalid.html#index-Invalid-Objects-31">Invalid Objects</a>: <a href="invalid.html#invalid">invalid</a></li> +<li><a href="lists.html#index-lists-7">lists</a>: <a href="lists.html#lists">lists</a></li> +<li><a href="preferences.html#index-Options-10">Options</a>: <a href="preferences.html#preferences">preferences</a></li> +<li><a href="common.html#index-Other-common-elements-15">Other common elements</a>: <a href="common.html#common">common</a></li> +<li><a href="debugger.html#index-PL_002fSQL-Debugger-19">PL/SQL Debugger</a>: <a href="debugger.html#debugger">debugger</a></li> +<li><a href="unittest.html#index-PL_002fSQL-Unit-Tester-20">PL/SQL Unit Tester</a>: <a href="unittest.html#unittest">unittest</a></li> +<li><a href="rollback.html#index-Rollback-Segments-25">Rollback Segments</a>: <a href="rollback.html#rollback">rollback</a></li> +<li><a href="script.html#index-Schema-extraction_002c-compare-and-search-28">Schema extraction, compare and search</a>: <a href="script.html#script">script</a></li> +<li><a href="searchreplace.html#index-Search-_0026-Replace-9">Search & Replace</a>: <a href="searchreplace.html#searchreplace">searchreplace</a></li> +<li><a href="security.html#index-Security-Manager-22">Security Manager</a>: <a href="security.html#security">security</a></li> +<li><a href="tuning.html#index-Server-Tuning-21">Server Tuning</a>: <a href="tuning.html#tuning">tuning</a></li> +<li><a href="session.html#index-Session-Manager-24">Session Manager</a>: <a href="session.html#session">session</a></li> +<li><a href="trace.html#index-SGA-Trace-26">SGA Trace</a>: <a href="trace.html#trace">trace</a></li> +<li><a href="sqledit.html#index-SQL-Editor-34">SQL Editor</a>: <a href="sqledit.html#sqledit">sqledit</a></li> +<li><a href="output.html#index-SQL-Output-32">SQL Output</a>: <a href="output.html#output">output</a></li> +<li><a href="worksheet.html#index-SQL-Worksheet-17">SQL Worksheet</a>: <a href="worksheet.html#worksheet">worksheet</a></li> +<li><a href="analyze.html#index-Statistics-manager-29">Statistics manager</a>: <a href="analyze.html#analyze">analyze</a></li> +<li><a href="storage.html#index-Storage-Manager-23">Storage Manager</a>: <a href="storage.html#storage">storage</a></li> +<li><a href="template.html#index-Template-Help-33">Template Help</a>: <a href="template.html#template">template</a></li> +<li><a href="toolsetting.html#index-Tool-Settings-14">Tool Settings</a>: <a href="toolsetting.html#toolsetting">toolsetting</a></li> +<li><a href="api.html#index-TOra-Tool-Tutorial-36">TOra Tool Tutorial</a>: <a href="api.html#api">api</a></li> +<li><a href="charts.html#index-Using-charts-8">Using charts</a>: <a href="charts.html#charts">charts</a></li> +<li><a href="editors.html#index-Using-editors-6">Using editors</a>: <a href="editors.html#editors">editors</a></li> +<li><a href="help.html#index-Using-the-help-browser-1">Using the help browser</a>: <a href="help.html#help">help</a></li> + </ul></body></html> + Added: trunk/tora/src/help/Memo-editor.html =================================================================== --- trunk/tora/src/help/Memo-editor.html (rev 0) +++ trunk/tora/src/help/Memo-editor.html 2008-07-26 19:13:10 UTC (rev 2907) @@ -0,0 +1,43 @@ +<html lang="en"> +<head> +<title>Memo editor - TOra</title> +<meta http-equiv="Content-Type" content="text/html"> +<meta name="description" content="TOra"> +<meta name="generator" content="makeinfo 4.11"> +<link title="Top" rel="start" href="index.html#Top"> +<link rel="up" href="common.html#common" title="common"> +<link rel="prev" href="Object-description.html#Object-description" title="Object description"> +<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage"> +<!-- +This manual is for TOra, version 1.4.0.--> +<meta http-equiv="Content-Style-Type" content="text/css"> +<style type="text/css"><!-- + pre.display { font-family:inherit } + pre.format { font-family:inherit } + pre.smalldisplay { font-family:inherit; font-size:smaller } + pre.smallformat { font-family:inherit; font-size:smaller } + pre.smallexample { font-size:smaller } + pre.smalllisp { font-size:smaller } + span.sc { font-variant:small-caps } + span.roman { font-family:serif; font-weight:normal; } + span.sansserif { font-family:sans-serif; font-weight:normal; } +--></style> +</head> +<body> +<div class="node"> +<p> +<a name="Memo-editor"></a> +Previous: <a rel="previous" accesskey="p" href="Object-description.html#Object-description">Object description</a>, +Up: <a rel="up" accesskey="u" href="common.html#common">common</a> +<hr> +</div> + +<h4 class="subsection">3.9.5 Memo editor</h4> + +<div class="block-image"><img src="images/memo.png" alt="images/memo.png"></div> + + <p>This is used to display or edit larger text than is easily entered in a oneline editor or list. To the top is a toolbar with some editing buttons. Specifically you have the save changes button to the left. You can also do this using the key <strong>CTRL+Return</strong>. +You can remove the editor without saving changes using the <strong>Escape</strong> key or closing the window. + + </body></html> + Added: trunk/tora/src/help/Object-description.html =================================================================== --- trunk/tora/src/help/Object-description.html (rev 0) +++ trunk/tora/src/help/Object-description.html 2008-07-26 19:13:10 UTC (rev 2907) @@ -0,0 +1,44 @@ +<html lang="en"> +<head> +<title>Object description - TOra</title> +<meta http-equiv="Content-Type" content="text/html"> +<meta name="description" content="TOra"> +<meta name="generator" content="makeinfo 4.11"> +<link title="Top" rel="start" href="index.html#Top"> +<link rel="up" href="common.html#common" title="common"> +<link rel="prev" href="Getting-bind-parameters.html#Getting-bind-parameters" title="Getting bind parameters"> +<link rel="next" href="Memo-editor.html#Memo-editor" title="Memo editor"> +<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage"> +<!-- +This manual is for TOra, version 1.4.0.--> +<meta http-equiv="Content-Style-Type" content="text/css"> +<style type="text/css"><!-- + pre.display { font-family:inherit } + pre.format { font-family:inherit } + pre.smalldisplay { font-family:inherit; font-size:smaller } + pre.smallformat { font-family:inherit; font-size:smaller } + pre.smallexample { font-size:smaller } + pre.smalllisp { font-size:smaller } + span.sc { font-variant:small-caps } + span.roman { font-family:serif; font-weight:normal; } + span.sansserif { font-family:sans-serif; font-weight:normal; } +--></style> +</head> +<body> +<div class="node"> +<p> +<a name="Object-description"></a> +Next: <a rel="next" accesskey="n" href="Memo-editor.html#Memo-editor">Memo editor</a>, +Previous: <a rel="previous" accesskey="p" href="Getting-bind-parameters.html#Getting-bind-parameters">Getting bind parameters</a>, +Up: <a rel="up" accesskey="u" href="common.html#common">common</a> +<hr> +</div> + +<h4 class="subsection">3.9.4 Object description</h4> + +<div class="block-image"><img src="images/describe.png" alt="images/describe.png"></div> + + <p>This is a list that describes the columns of a table or view. There is nothing much special about this view except that you can check the collected analyze statistics for the column by placing the cursor over it and reading the tooltip that will be displayed. If no tooltip is displayed there is no analyzed statistics available. Also notable is that this list is read completely from the object cache if it available. This will mean that if you are modifying the object you are modifying you need to reread the object cache before you can see the changes. + + </body></html> + Added: trunk/tora/src/help/SGA-Statement.html =================================================================== --- trunk/tora/src/help/SGA-Statement.html (rev 0) +++ trunk/tora/src/help/SGA-Statement.html 2008-07-26 19:13:10 UTC (rev 2907) @@ -0,0 +1,44 @@ +<html lang="en"> +<head> +<title>SGA Statement - TOra</title> +<meta http-equiv="Content-Type" content="text/html"> +<meta name="description" content="TOra"> +<meta name="generator" content="makeinfo 4.11"> +<link title="Top" rel="start" href="index.html#Top"> +<link rel="up" href="common.html#common" title="common"> +<link rel="next" href="Explain-plan.html#Explain-plan" title="Explain plan"> +<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage"> +<!-- +This manual is for TOra, version 1.4.0.--> +<meta http-equiv="Content-Style-Type" content="text/css"> +<style type="text/css"><!-- + pre.display { font-family:inherit } + pre.format { font-family:inherit } + pre.smalldisplay { font-family:inherit; font-size:smaller } + pre.smallformat { font-family:inherit; font-size:smaller } + pre.smallexample { font-size:smaller } + pre.smalllisp { font-size:smaller } + span.sc { font-variant:small-caps } + span.roman { font-family:serif; font-weight:normal; } + span.sansserif { font-family:sans-serif; font-weight:normal; } +--></style> +</head> +<body> +<div class="node"> +<p> +<a name="SGA-Statement"></a> +Next: <a rel="next" accesskey="n" href="Explain-plan.html#Explain-plan">Explain plan</a>, +Up: <a rel="up" accesskey="u" href="common.html#common">common</a> +<hr> +</div> + +<h4 class="subsection">3.9.1 SGA Statement</h4> + +<p>This element is used to describe an element in the SGA. + + <div class="block-image"><img src="images/sgastatement.png" alt="images/sgastatement.png"></div> + + <p>The SGA statement have three tabs. The first tab called SQL simply display all of the SQL of the statement. The second tab called Execution plan displays the execution plan of the statement. This is described in more detail later. The last tab called Information simply display the information available about the statement in the SGA. + + </body></html> + Added: trunk/tora/src/help/What-privileges-do-you-need-to-run-TOra.html =================================================================== --- trunk/tora/src/help/What-privileges-do-you-need-to-run-TOra.html (rev 0) +++ trunk/tora/src/help/What-privileges-do-you-need-to-run-TOra.html 2008-07-26 19:13:10 UTC (rev 2907) @@ -0,0 +1,44 @@ +<html lang="en"> +<head> +<title>What privileges do you need to run TOra - TOra</title> +<meta http-equiv="Content-Type" content="text/html"> +<meta name="description" content="TOra"> +<meta name="generator" content="makeinfo 4.11"> +<link title="Top" rel="start" href="index.html#Top"> +<link rel="up" href="workspace.html#workspace" title="workspace"> +<link rel="prev" href="newconnection.html#newconnection" title="newconnection"> +<link rel="next" href="editors.html#editors" title="editors"> +<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage"> +<!-- +This manual is for TOra, version 1.4.0.--> +<meta http-equiv="Content-Style-Type" content="text/css"> +<style type="text/css"><!-- + pre.display { font-family:inherit } + pre.format { font-family:inherit } + pre.smalldisplay { font-family:inherit; font-size:smaller } + pre.smallformat { font-family:inherit; font-size:smaller } + pre.smallexample { font-size:smaller } + pre.smalllisp { font-size:smaller } + span.sc { font-variant:small-caps } + span.roman { font-family:serif; font-weight:normal; } + span.sansserif { font-family:sans-serif; font-weight:normal; } +--></style> +</head> +<body> +<div class="node"> +<p> +<a name="What-privileges-do-you-need-to-run-TOra"></a> +Next: <a rel="next" accesskey="n" href="editors.html#editors">editors</a>, +Previous: <a rel="previous" accesskey="p" href="newconnection.html#newconnection">newconnection</a>, +Up: <a rel="up" accesskey="u" href="workspace.html#workspace">workspace</a> +<hr> +</div> + +<h3 class="section">3.3 What privileges do you need to run TOra</h3> + +<p>TOra should be able to run as any user, although off course you can never do anything in TOra that aren't allowed from that Oracle account. You will be able to use pretty much any tool in TOra for read only purposes if you are granted the <strong>SELECT_CATALOG_ROLE</strong>, also some parts of TOra will have limited functionality if you do not have the <strong>ALTER SESSION</strong> privilege. + + <p>Also you need to be able to create the plan table if that is not done for you. The plan table (see <a href="database.html#database">Database Settings</a> for how to select plan table name) must also be available with <strong>INSERT</strong> and <strong>SELECT</strong> access. TOra will function without the plan table but off course you will not be able to display any execution plans. + + </body></html> + Added: trunk/tora/src/help/additionalhelp.html =================================================================== --- trunk/tora/src/help/additionalhelp.html (rev 0) +++ trunk/tora/src/help/additionalhelp.html 2008-07-26 19:13:10 UTC (rev 2907) @@ -0,0 +1,59 @@ +<html lang="en"> +<head> +<title>additionalhelp - TOra</title> +<meta http-equiv="Content-Type" content="text/html"> +<meta name="description" content="TOra"> +<meta name="generator" content="makeinfo 4.11"> +<link title="Top" rel="start" href="index.html#Top"> +<link rel="up" href="preferences.html#preferences" title="preferences"> +<link rel="prev" href="fonts.html#fonts" title="fonts"> +<link rel="next" href="toolsetting.html#toolsetting" title="toolsetting"> +<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage"> +<!-- +This manual is for TOra, version 1.4.0.--> +<meta http-equiv="Content-Style-Type" content="text/css"> +<style type="text/css"><!-- + pre.display { font-family:inherit } + pre.format { font-family:inherit } + pre.smalldisplay { font-family:inherit; font-size:smaller } + pre.smallformat { font-family:inherit; font-size:smaller } + pre.smallexample { font-size:smaller } + pre.smalllisp { font-size:smaller } + span.sc { font-variant:small-caps } + span.roman { font-family:serif; font-weight:normal; } + span.sansserif { font-family:sans-serif; font-weight:normal; } +--></style> +</head> +<body> +<div class="node"> +<p> +<a name="additionalhelp"></a> +Next: <a rel="next" accesskey="n" href="toolsetting.html#toolsetting">toolsetting</a>, +Previous: <a rel="previous" accesskey="p" href="fonts.html#fonts">fonts</a>, +Up: <a rel="up" accesskey="u" href="preferences.html#preferences">preferences</a> +<hr> +</div> + +<h4 class="subsection">3.8.4 Additional Help Settings</h4> + +<p><a name="index-Additional-Help-Settings-13"></a> +This page is used to configure extra manuals for viewing in the TOra help viewer. Specifically the Oracle HTML based manuals which contents can be parsed and included in the left pane contents tree of the TOra help. + + <div class="block-image"><img src="images/additionalhelp.png" alt="images/additionalhelp.png"></div> + + <p>If you have compiled TOra with KDE support (Not Windows or Qt versions) you can point this to any HTTP location. You could even use the help browser to browse the Oracle manuals directly from Technet if you wanted to (Free membership required). + + <dl> +<dt>‘<samp><span class="samp">Remove path</span></samp>’<dd>This will remove the currently selected manual from the list. +‘<samp><span class="samp">Remove path</span></samp>’ + + <br><dt>‘<samp><span class="samp">Oracle Manuals</span></samp>’<dd>This is a quick way to add a collection of manuals. When you select this button a dialog will pop up and ask you for a filename. In Oracle 8 this should be the index page that contains the links to the manuals. Observe that this is not the page which links to the different book categories. In Oracle 9i you should point it to the docindex.htm file in the base directory of the documentation. If successful all the manuals available on the page is added to the list of manuals. +‘<samp><span class="samp">Oracle Manuals</span></samp>’ + + <br><dt>‘<samp><span class="samp">Add path</span></samp>’<dd>Add a manual to the list of manuals. This pop up a dialog asking for the name of the manual and the location of the manuals table of contents HTML file (toc.html). +‘<samp><span class="samp">Add path</span></samp>’ + + </dl> + + </body></html> + Added: trunk/tora/src/help/alert.html =================================================================== --- trunk/tora/src/help/alert.html (rev 0) +++ trunk/tora/src/help/alert.html 2008-07-26 19:13:10 UTC (rev 2907) @@ -0,0 +1,63 @@ +<html lang="en"> +<head> +<title>alert - TOra</title> +<meta http-equiv="Content-Type" content="text/html"> +<meta name="description" content="TOra"> +<meta name="generator" content="makeinfo 4.11"> +<link title="Top" rel="start" href="index.html#Top"> +<link rel="up" href="tools.html#tools" title="tools"> +<link rel="prev" href="analyze.html#analyze" title="analyze"> +<link rel="next" href="invalid.html#invalid" title="invalid"> +<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage"> +<!-- +This manual is for TOra, version 1.4.0.--> +<meta http-equiv="Content-Style-Type" content="text/css"> +<style type="text/css"><!-- + pre.display { font-family:inherit } + pre.format { font-family:inherit } + pre.smalldisplay { font-family:inherit; font-size:smaller } + pre.smallformat { font-family:inherit; font-size:smaller } + pre.smallexample { font-size:smaller } + pre.smalllisp { font-size:smaller } + span.sc { font-variant:small-caps } + span.roman { font-family:serif; font-weight:normal; } + span.sansserif { font-family:sans-serif; font-weight:normal; } +--></style> +</head> +<body> +<div class="node"> +<p> +<a name="alert"></a> +Next: <a rel="next" accesskey="n" href="invalid.html#invalid">invalid</a>, +Previous: <a rel="previous" accesskey="p" href="analyze.html#analyze">analyze</a>, +Up: <a rel="up" accesskey="u" href="tools.html#tools">tools</a> +<hr> +</div> + +<h3 class="section">4.14 Alert Tool</h3> + +<p><a name="index-Alert-Tool-30"></a>This tool is usefull for debugging database packages that send or depend on receiving dbms alerts. + + <div class="block-image"><img src="images/alert.png" alt="images/alert.png"></div> + + <p>This tool is controled solely from it's toolbar which is followed by a list containing the alerts received so far on the watched alerts. The toolbar contains the following controls. + + <dl> +<dt>Registered<dd>This list contains the alerts that are registered for listening. To add a new alert simply write the name in this combo box and press return or the register current button immediately to the right. To remove an alert select it in the list and press the remove registered button.‘<samp><span class="samp">Registered</span></samp>’. + + <br><dt><strong>Register current</strong><dd>Register the name currently entered in the registered combo box. + + <br><dt><strong>Remove registered</strong><dd>Stop listening to the registered alert currently selected in the registered combo box. + + <br><dt><strong>Name</strong><dd>Name of the alert to send. + + <br><dt><strong>Message</strong><dd>Message to send in an alert. Pressing return in this lineedit will send the alert. + + <br><dt><strong>Edit message in memo</strong><dd>Edit the message in a memo editor, usefull for sending newlines and longer messages. + + <br><dt><strong>Send alert</strong><dd>Send the currently defined alert. You can also send an alert by pressing return in the message line editor. + + </dl> + + </body></html> + Added: trunk/tora/src/help/analyze.html =================================================================== --- trunk/tora/src/help/analyze.html (rev 0) +++ trunk/tora/src/help/analyze.html 2008-07-26 19:13:10 UTC (rev 2907) @@ -0,0 +1,74 @@ +<html lang="en"> +<head> +<title>analyze - TOra</title> +<meta http-equiv="Content-Type" content="text/html"> +<meta name="description" content="TOra"> +<meta name="generator" content="makeinfo 4.11"> +<link title="Top" rel="start" href="index.html#Top"> +<link rel="up" href="tools.html#tools" title="tools"> +<link rel="prev" href="script.html#script" title="script"> +<link rel="next" href="alert.html#alert" title="alert"> +<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage"> +<!-- +This manual is for TOra, version 1.4.0.--> +<meta http-equiv="Content-Style-Type" content="text/css"> +<style type="text/css"><!-- + pre.display { font-family:inherit } + pre.format { font-family:inherit } + pre.smalldisplay { font-family:inherit; font-size:smaller } + pre.smallformat { font-family:inherit; font-size:smaller } + pre.smallexample { font-size:smaller } + pre.smalllisp { font-size:smaller } + span.sc { font-variant:small-caps } + span.roman { font-family:serif; font-weight:normal; } + span.sansserif { font-family:sans-serif; font-weight:normal; } +--></style> +</head> +<body> +<div class="node"> +<p> +<a name="analyze"></a> +Next: <a rel="next" accesskey="n" href="alert.html#alert">alert</a>, +Previous: <a rel="previous" accesskey="p" href="script.html#script">script</a>, +Up: <a rel="up" accesskey="u" href="tools.html#tools">tools</a> +<hr> +</div> + +<h3 class="section">4.13 Statistics manager</h3> + +<p><a name="index-Statistics-manager-29"></a> +This tool is usefull for collecting statistics and analyze tables in parallel. You can also use it to browse collected statistics. + + <div class="block-image"><img src="images/analyze.png" alt="images/analyze.png"></div> + + <p>You control the interface through the controls in the toolbar. The rest of the interface simply displays currently available tables in the current schema. When collecting statistics only the selected items in the tablelist are analyzed. + + <dl> +<dt>‘<samp><span class="samp">Refresh</span></samp>’<dd>Refresh the table list from the database. +‘<samp><span class="samp">Refresh</span></samp>’ + + <br><dt>‘<samp><span class="samp">Schema</span></samp>’<dd>The next control is which schema to investigate tables for. +‘<samp><span class="samp">Schema</span></samp>’ + + <br><dt>‘<samp><span class="samp">Operation</span></samp>’<dd>What operation to perform. Select one of <strong>compute statistics</strong>, <strong>estimate statistics</strong>, <strong>delete statistics</strong> and <strong>validate references</strong>. +‘<samp><span class="samp">Operation</span></samp>’ + + <br><dt>‘<samp><span class="samp">Target</span></samp>’<dd>Depending on the <strong>operation</strong> you can sometimes select what kind of statistic to collect. Choose between <strong>all</strong>, <strong>table</strong>, <strong>indexed columns</strong> and <strong>local indexes</strong>. +‘<samp><span class="samp">Target</span></samp>’ + + <br><dt>‘<samp><span class="samp">Sample</span></samp>’<dd>If the <strong>operation</strong> is <strong>estimate statistics</strong> you can choose how large sample should be used to estimate the statistic information in percent of total amount of data. +‘<samp><span class="samp">Sample</span></samp>’ + + <br><dt>‘<samp><span class="samp">Parallel</span></samp>’<dd>Indicate the number of separate connections to open to the database and run collecting statistics concurrently when collecting. +‘<samp><span class="samp">Parallel</span></samp>’ + + <br><dt>‘<samp><span class="samp">Start analyzing</span></samp>’<dd>Press this button to perform the indicated operation on the tables selected in the list below the toolbar. +‘<samp><span class="samp">Start analyzing</span></samp>’ + + <br><dt>‘<samp><span class="samp">Stop</span></samp>’<dd>Stop current run. Before the stop button you can also see information about the currently running statistics gathering run if any is running. +‘<samp><span class="samp">Stop</span></samp>’ + + </dl> + + </body></html> + Added: trunk/tora/src/help/api.html =================================================================== --- trunk/tora/src/help/api.html (rev 0) +++ trunk/tora/src/help/api.html 2008-07-26 19:13:10 UTC (rev 2907) @@ -0,0 +1,254 @@ +<html lang="en"> +<head> +<title>api - TOra</title> +<meta http-equiv="Content-Type" content="text/html"> +<meta name="description" content="TOra"> +<meta name="generator" content="makeinfo 4.11"> +<link title="Top" rel="start" href="index.html#Top"> +<link rel="up" href="extendingtora.html#extendingtora" title="extendingtora"> +<link rel="next" href="externalapi.html#externalapi" title="externalapi"> +<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage"> +<!-- +This manual is for TOra, version 1.4.0.--> +<meta http-equiv="Content-Style-Type" content="text/css"> +<style type="text/css"><!-- + pre.display { font-family:inherit } + pre.format { font-family:inherit } + pre.smalldisplay { font-family:inherit; font-size:smaller } + pre.smallformat { font-family:inherit; font-size:smaller } + pre.smallexample { font-size:smaller } + pre.smalllisp { font-size:smaller } + span.sc { font-variant:small-caps } + span.roman { font-family:serif; font-weight:normal; } + span.sansserif { font-family:sans-serif; font-weight:normal; } +--></style> +</head> +<body> +<div class="node"> +<p> +<a name="api"></a> +Next: <a rel="next" accesskey="n" href="externalapi.html#externalapi">externalapi</a>, +Up: <a rel="up" accesskey="u" href="extendingtora.html#extendingtora">extendingtora</a> +<hr> +</div> + +<h3 class="section">5.1 TOra Tool Tutorial</h3> + +<p><a name="index-TOra-Tool-Tutorial-36"></a> +This tutorial will create a simple tool that can execute an SQL statement and display it's content in a list. This tutorial assumes you have knowledge of C++ and Qt programming. + + <p>First of all we create an include file which defines the tool widget. This is the window that will be displayed when the a tool window is created. How that happens comes later. + +<pre class="example"><pre class="verbatim"> + + #ifndef TOSIMPLEQUERY_H + #define TOSIMPLEQUERY_H + + #include "totool.h" + + class toResultView; + class QLineEdit; + class toConnection; + + class toSimpleQuery : public toToolWidget { + Q_OBJECT + + toResultView *Result; + QLineEdit *Statement; + private slots: + void execute(void); + public: + toSimpleQuery(QWidget *parent,toConnection &connection); + }; + + #endif + +</pre> +</pre> + <p>If this file is put in the main TOra source directory the configure script will generate the appropriate moc file which will be needed later. If you don't know what moc is, please go back to the Qt manual to read up on slots and signals. + + <p>The rest is pretty straight forward and will be much clearer after we start working our way through the implementation of this tool. + + <p>The first thing we need to do is create a tool description which is done by subclassing the toTool class. This is how we implement this class for this function. + +<pre class="example"><pre class="verbatim"> + + #include "totool.h" + #include "tosimplequery.h" + + static char * tosimplequery_xpm[] = { + "16 16 3 1", + " c None", + ".c #000000", + "+c #FFFFFF", + " ...... ", + " ..++++. ", + " .+.++++. ", + " .++.++++. ", + " .....++++. ", + " .++++++++. ", + " .++++++++. ", + " .++++++++. ", + " .++++++++. ", + " .++++++++. ", + " .++++++++. ", + " .++++++++. ", + " .++++++++. ", + " .++++++++. ", + " .++++++++. ", + " .......... "}; + + class toSimpleQueryTool : public toTool { + protected: + virtual char **pictureXPM(void) + { return tosimplequery_xpm; } + public: + toSimpleQueryTool() + : toTool(203,"Simple Query") + { } + virtual const char *menuItem() + { return "Simple Query"; } + virtual QWidget *toolWindow(QWidget *parent,toConnection &connection) + { + return new toSimpleQuery(parent,connection); + } + }; + + static toSimpleQueryTool SimpleQueryTool; + +</pre> +</pre> + <p>The first thing that happens is that we include the header file which defines the tool widget and the tool definition header files. Even if this is included in the tosimplequery.h it is good practice not to assume any extra files are included by header files. + + <p>Next comes a definition of an xpm pixmap. Normally these are placed in the icons directory and then included into the file as you can see in the TOra source. This is placed inline for clarity. + + <p>The next one is the big one. Here we define the tool class which has a few important virtual functions. + + <dl> +<dt>‘<samp><span class="samp">pictureXPM</span></samp>’<dd>This function should if defined return a pointer to a xpm definition. This will then be used for toolbar icon, menu icon and tool window icon. +‘<samp><span class="samp">pictureXPM</span></samp>’ + + <br><dt>‘<samp><span class="samp">menuItem</span></samp>’<dd>Should return a string containing the name of the menu item to add to the tools menu. This is also used for a tip for the toolbar icon by default. +‘<samp><span class="samp">menuItem</span></samp>’ + + <br><dt>‘<samp><span class="samp">toolWindow</span></samp>’<dd>This function will create a new tool widget and return a pointer to it. It doesn't need to create a widget, then it should then return NULL. Some tools there might only be one per connection for instance. +‘<samp><span class="samp">toolWindow</span></samp>’ + + </dl> + + <p>The number in the constructor is a priority indicator that denote where in the list of tools this tool should be inserted, between each 100 step a separator is inserted into the toolbar and menubar. + + <p>And last a not so obvious line where the an instance of the tool descriptor is instantiated. This is a feature that is used a lot in TOra. This will ensure that all tools are registered when the application is started. It also works when using modules, if this is compiled as a module the tool will be instantiated on loading without any hassle with functions with predefined names and such stuff. + + <p>Lastly comes the implementation of the tool widget which is not much longer. I have divided this into several parts to simplify explaining them. + +<pre class="example"><pre class="verbatim"> + + #include <list> + + #include <qtoolbar.h> + #include <qlabel.h> + #include <qtoolbutton.h> + #include <qlineedit.h> + + #include "tosimplequery.h" + #include "toresultview.h" + #include "toparamget.h" + #include "tochangeconnection.h" + + #include "tosimplequery.moc" + + static char * execute_xpm[] = { + "16 16 3 1", + " c None", + ".c #000000", + "+c #0FFE14", + " ", + " ", + " ", + " . ", + " .. ", + " .+. ", + " .++. ", + " .+++. ", + " .+++. ", + " .++. ", + " .+. ", + " .. ", + " . ", + " ", + " ", + " "}; + + toSimpleQuery::toSimpleQuery(QWidget *main,toConnection &connection) + : toToolWidget(SimpleQueryTool,"simplequery.html",main,connection) + { + QToolBar *toolbar=toAllocBar(this,"Simple Query",connection.description()); + QPixmap executePixmap((const char **)execute_xpm); + new QToolButton(executePixmap, + "Execute current statement", + "Execute current statement", + this,SLOT(execute()), + toolbar); + toolbar->setStretchableWidget(new QLabel("",toolbar)); + new toChangeConnection(toolbar); + +</pre> +</pre> + <p>In this part the parent constructor is called and the toolbar is set up. Also note the inclusion of the moc file which by convention is called tosimplequery.moc. One thing worth noticing here is the toAllocBar which is used to be able to transparently support either using KToolBar or QToolBar depending on whether this is a Qt or KDE application. This is very important since TOra also supports windows to which KDE is not available. + + <p>The second part is the setStretchableWidget call which is used to indicate that an empty label should be stretch instead of the tool button which just looks really weird. + + <p>Also worth noting is that the toToolWidget class is derived from QVBox so any widgets constructed in this widget will be lined up vertically in the order of creation. + + <p>Next up is creating our widgets and connecting them. + +<pre class="example"><pre class="verbatim"> + + Statement=new QLineEdit(this); + Result=new toResultView(this); + connect(Statement,SIGNAL(returnPressed()),this,SLOT(execute())); + } + +</pre> +</pre> + <p>This just adds two additional widgets and connect the returnPressed signal to the execute slot. One thing to realise here is that all the toResult children will use the connection of the closest parent of type toToolWidget in the widget hierarchy. And now the last thing to do is implement the execute method. + +<pre class="example"><pre class="verbatim"> + + void toSimpleQuery::execute(void) + { + try { + QString sql=Statement->text(); + toQList params=toParamGet::getParam(this,sql); + Result->query(sql,params); + } TOCATCH + } + +</pre> +</pre> + <p>The toParamGet::getParam function is used to ask for bind values in the query string. To understand what I mean try executing the query "select :hello from dual" when you try the result. The toQList is simple a list of toQValue which can hold different datatypes and converting between them transparently. + + <p>Now finally to compile this module you need to add the tosimplequery.cpp file to SOURCES define in the file Makefile. To build a plugin you also need to add the following line. + +<pre class="example"><pre class="verbatim"> + + plugins/tosimplequery.tso:objs/tosimplequery.o + +</pre> +</pre> + <p>This should go among the other plugin definitions and you also need to add the plugins/tosimplequery.tso to the dependencies of tora-plugin. + + <p>You must rerun configure for the tosimplequery.moc file to be generated the first time. Any subsequent changes should update the moc file automatically from the Makefile. + + <p>Here are the example files in their entire. + + <ul> +<li><a href="tosimplequery.h">tosimplequery.h</a> +<li><a href="tosimplequery.cpp">tosimplequery.cpp</a> +</ul> + + <p>Hopefully this is a starting point to help you read the rest of the documentation and start cranking out those plugins. + + </body></html> + Added: trunk/tora/src/help/browser.html =================================================================== --- trunk/tora/src/help/browser.html (rev 0) +++ trunk/tora/src/help/browser.html 2008-07-26 19:13:10 UTC (rev 2907) @@ -0,0 +1,276 @@ +<html lang="en"> +<head> +<title>browser - TOra</title> +<meta http-equiv="Content-Type" content="text/html"> +<meta name="description" content="TOra"> +<meta name="generator" content="makeinfo 4.11"> +<link title="Top" rel="start" href="index.html#Top"> +<link rel="up" href="tools.html#tools" title="tools"> +<link rel="prev" href="worksheet.html#worksheet" title="worksheet"> +<link rel="next" href="debugger.html#debugger" title="debugger"> +<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage"> +<!-- +This manual is for TOra, version 1.4.0.--> +<meta http-equiv="Content-Style-Type" content="text/css"> +<style type="text/css"><!-- + pre.display { font-family:inherit } + pre.format { font-family:inherit } + pre.smalldisplay { font-family:inherit; font-size:smaller } + pre.smallformat { font-family:inherit; font-size:smaller } + pre.smallexample { font-size:smaller } + pre.smalllisp { font-size:smaller } + span.sc { font-variant:small-caps } + span.roman { font-family:serif; font-weight:normal; } + span.sansserif { font-family:sans-serif; font-weight:normal; } +--></style> +</head> +<body> +<div class="node"> +<p> +<a name="browser"></a> +Next: <a rel="next" accesskey="n" href="debugger.html#debugger">debugger</a>, +Previous: <a rel="previous" accesskey="p" href="worksheet.html#worksheet">worksheet</a>, +Up: <a rel="up" accesskey="u" href="tools.html#tools">tools</a> +<hr> +</div> + +<h3 class="section">4.2 Database Browser</h3> + +<p><a name="index-Database-Browser-18"></a> +This tool provides you a simple browser for exploring database schema objects. Initially it can be said that the browser also provides a browser like functionality for the template help (see <a href="template.html#template">Template Help</a>) +which is covered separately. This browser will provide you with more information and you will also in future versions of TOra be able to interact with schema objects (Dropping or create tables etc.), this is not possible in the +<!-- @uref{template.html, template help} --> +version. The template help on the other hand is tree based and some people consider it easier and faster to work with. + + <div class="block-image"><img src="images/browser.png" alt="images/browser.png"></div> + +<!-- * Using the browser:: --> +<!-- * Available information:: --> +<!-- * Content editor:: --> +<!-- * Defining a filter:: --> + </ul> + +<!-- @node Using the browser, Available information, browser, browser --> +<h4 class="subheading">Using the browser</h4> + +<p>The database browser has a very simple interface with a toolbar which contain the following functions. All of these are also available in the Browser menu item except for the schema selection and change object. + + <dl> +<dt><strong>Refresh</strong><dd>Refresh the displayed data from the database. Also available on the <strong>F5</strong> key. + + <br><dt><strong>Define filter</strong><dd>Displays the define filter dialog( +<!-- @pxref{Defining a filter} --> +). This is used to specify which objects to show in the browser. The default filter is to show everything. Also available on the <strong>CTRL+SHIFT+G</strong> key. + + <br><dt><strong>Clear filter</strong><dd>Remove the current filter and revert to the default of showing everything. Also available on the <strong>CTRL+SHIFT+H</strong> key. + + <br><dt><strong>Schema</strong><dd>The last item on the toolbar is a combo box where you can select the schema to display objects for. It defaults the schema you are currently logged in as. Only schemas that are visible to the current user is selectable in the lost (Really, TOra does not contain the secret DBA password that will always let you access everything regardless of your privileges). + + <br><dt><strong>Change connection</strong><dd>Change the connection this tool window should operate on. + + </dl> + + <p>The rest of the interface consists of two tabbed windows, one within the other. The first one you can use to select the object type you want to inspect. When you have selected a type you can see the visible objects of the specified type available in the selected schema. The second tab indicate what kind of information you want to explore about the selected object and depends on the object type ( +<!-- @pxref{Available information} --> +.). When you select an object name in the left list you can inspect information about it to the right. + + <p>You can move the keyboard focus to the schema selection using <strong>ALT+S</strong> and to the current object list using <strong>ALT+N</strong>. + +<!-- * Available information:: --> +<!-- * Content editor:: --> +<!-- * Defining a filter:: --> + </ul> + +<!-- @node Available information, Content editor, Using the browser, browser --> +<h4 class="subheading">Available information</h4> + +<p>This is the available information for the different object types. + + <p><table summary=""> +<tr align="left"><th valign="top" width="20%">Object type +</th><th valign="top" width="30%">Name +</th><th valign="top" width="50%">Description + +<p><br></th></tr><tr align="left"><td valign="top" width="20%"><strong>Tables</strong> +</td><td valign="top" width="30%"> +</td><td valign="top" width="50%"> +<br></td></tr><tr align="left"><td valign="top" width="20%"></td><td valign="top" width="30%"><strong>Columns</strong> +</td><td valign="top" width="50%">A description of the columns in the table. For more information about this information also see object description. +<br></td></tr><tr align="left"><td valign="top" width="20%"></td><td valign="top" width="30%"><strong>Indexes</strong> +</td><td valign="top" width="50%">A list with the indexes that have been created for this table. +<br></td></tr><tr align="left"><td valign="top" width="20%"></td><td valign="top" width="30%"><strong>References</strong> +</td><td valign="top" width="50%">Displays the foreign key constraints that references this table and the other objects that have dependencies on this table. +<br></td></tr><tr align="left"><td valign="top" width="20%"></td><td valign="top" width="30%"><strong>Grants</strong> +</td><td valign="top" width="50%">The grants that have been made on this table. +<br></td></tr><tr align="left"><td valign="top" width="20%"></td><td valign="top" width="30%"><strong>Triggers</strong> +</td><td valign="top" width="50%">Lists the triggers that exist for this table. +<br></td></tr><tr align="left"><td valign="top" width="20%"></td><td valign="top" width="30%"><strong>Data</strong> +</td><td valign="top" width="50%">Displays the data in the table. This is the only part of the database browser that let you modify any data. For more information about how to use the content editor +<!-- @pxref{Content editor} --> +. +<br></td></tr><tr align="left"><td valign="top" width="20%"></td><td valign="top" width="30%"><strong>Information</strong> +</td><td valign="top" width="50%">Contains information about the table available in the SGA including analyzed statistics etc. +<br></td></tr><tr align="left"><td valign="top" width="20%"></td><td valign="top" width="30%"><strong>Script</strong> +</td><td valign="top" width="50%">This tab displays an SQL script to recreate the database object. + +<p><br></td></tr><tr align="left"><td valign="top" width="20%"><strong>Views</strong> +</td><td valign="top" width="30%"> +</td><td valign="top" width="50%"> +<br></td></tr><tr align="left"><td valign="top" width="20%"></td><td valign="top" width="30%"><strong>Columns</strong> +</td><td valign="top" width="50%">A description of the columns in the view. For more information about this information also see object description. +<br></td></tr><tr align="left"><td valign="top" width="20%"></td><td valign="top" width="30%"><strong>SQL</strong> +</td><td valign="top" width="50%">The SQL that defines the view. +<br></td></tr><tr align="left"><td valign="top" width="20%"></td><td valign="top" width="30%"><strong>Data</strong> +</td><td valign="top" width="50%">Displays the data in the view. This is the only part of the database browser that let you modify any data. For more information about how to use the content editor ( +<!-- @pxref{Content editor} --> +). You can not modify some views depending on how they are defined. See the Oracle reference for more information about editing views.<br></td></tr><tr align="left"><td valign="top" width="20%"></td><td valign="top" width="30%"><strong>Grants</strong> +</td><td valign="top" width="50%">The grants that have been made on this view. +<br></td></tr><tr align="left"><td valign="top" width="20%"></td><td valign="top" width="30%"><strong>Dependencies</strong> +</td><td valign="top" width="50%">The objects that depend on this view. +<br></td></tr><tr align="left"><td valign="top" width="20%"></td><td valign="top" width="30%"><strong>Script</strong> +</td><td valign="top" width="50%">This tab displays an SQL script to recreate the database object. + +<p><br></td></tr><tr align="left"><td valign="top" width="20%"><strong>Indexes</strong> +</td><td valign="top" width="30%"> +</td><td valign="top" width="50%"> +<br></td></tr><tr align="left"><td valign="top" width="20%"></td><td valign="top" width="30%"><strong>Columns</strong> +</td><td valign="top" width="50%">The columns that the index operate on. +<br></td></tr><tr align="left"><td valign="top" width="20%"></td><td valign="top" width="30%"><strong>Info</strong> +</td><td valign="top" width="50%">Information in the SGA about an index. For instance analyzed statistics available for this index. +<br></td></tr><tr align="left"><td valign="top" width="20%"></td><td valign="top" width="30%"><strong>Script</strong> +</td><td valign="top" width="50%">This tab displays an SQL script to recreate the database object. +<br></td></tr><tr align="left"><td valign="top" width="20%"></td><td valign="top" width="30%"><strong>Script</strong> +</td><td valign="top" width="50%">This tab displays an SQL script to recreate the database object. + +<p><br></td></tr><tr align="left"><td valign="top" width="20%"><strong>Sequences</strong> +</td><td valign="top" width="30%"> +</td><td valign="top" width="50%"> +<br></td></tr><tr align="left"><td valign="top" width="20%"></td><td valign="top" width... [truncated message content] |
From: <mrj...@us...> - 2008-07-27 20:22:15
|
Revision: 2908 http://tora.svn.sourceforge.net/tora/?rev=2908&view=rev Author: mrjohnson0 Date: 2008-07-27 20:22:24 +0000 (Sun, 27 Jul 2008) Log Message: ----------- printing with qscintilla with syntax highlighting Modified Paths: -------------- trunk/tora/src/tomarkedtext.cpp trunk/tora/src/tomarkedtext.h Modified: trunk/tora/src/tomarkedtext.cpp =================================================================== --- trunk/tora/src/tomarkedtext.cpp 2008-07-26 19:13:10 UTC (rev 2907) +++ trunk/tora/src/tomarkedtext.cpp 2008-07-27 20:22:24 UTC (rev 2908) @@ -44,9 +44,7 @@ #include "tosearchreplace.h" #include "totool.h" -#ifdef TO_HAS_KPRINT -#include <kprinter.h> -#endif +#include <Qsci/qsciprinter.h> #include <qapplication.h> #include <qfileinfo.h> @@ -65,6 +63,7 @@ #include <QMouseEvent> #include <QDir> #include <QApplication> +#include <QPrintDialog> #include "icons/undo.xpm" #include "icons/redo.xpm" @@ -196,100 +195,40 @@ QsciScintilla::focusOutEvent(e); } + void toMarkedText::editPrint(void) { -#if 0 - TOPrinter printer; - printer.setMinMax(1, 1000); - printer.setFromTo(1, 1000); - if (printer.setup()) - { - printer.setCreator(tr(TOAPPNAME)); - QPainter painter(&printer); + QsciPrinter printer; - int line = 0; - int offset = 0; - int page = 1; - while (page < printer.fromPage() && - (line = printPage(&printer, &painter, line, offset, page++, false))) - painter.resetXForm(); - while ((line = printPage(&printer, &painter, line, offset, page++)) && - line < lines() && - (printer.toPage() == 0 || page <= printer.toPage())) - { - printer.newPage(); - painter.resetXForm(); - qApp->processEvents(); - toStatusMessage(tr("Printing page %1").arg(page), false, false); - } - painter.end(); - toStatusMessage(tr("Done printing"), false, false); - } -#endif -} + QPrintDialog dialog(&printer, this); + dialog.setMinMax(1, 1000); + dialog.setFromTo(1, 1000); -#if 0 -int toMarkedText::printPage(TOPrinter *printer, QPainter *painter, int line, int &offset, - int pageNo, bool paint) -{ - Q3PaintDeviceMetrics metrics(printer); - painter->drawLine(0, 0, metrics.width(), 0); - QRect size = painter->boundingRect(0, 0, metrics.width(), metrics.height(), - Qt::AlignLeft | Qt::AlignTop | Qt::ExpandTabs | Qt::SingleLine, - Filename); - QString str = tr("Page: %1").arg(pageNo); - if (paint) - { - painter->drawText(0, metrics.height() - size.height(), size.width(), size.height(), - Qt::AlignLeft | Qt::AlignTop | Qt::ExpandTabs | Qt::SingleLine, - Filename); - painter->drawText(size.width(), metrics.height() - size.height(), metrics.width() - size.width(), - size.height(), - Qt::AlignRight | Qt::AlignTop | Qt::SingleLine, - str); - painter->drawLine(0, 0, metrics.width(), 0); + if(!Filename.isEmpty()) { + QFileInfo info(Filename); + dialog.setWindowTitle(tr("Print %1").arg(info.fileName())); + printer.setOutputFileName(info.path() + + QString("/") + + info.baseName() + + ".pdf"); } - int margin = size.height() + 2; + else + dialog.setWindowTitle(tr("Print Document")); - QFont defFont = painter->font(); - painter->setFont(font()); - size = painter->boundingRect(0, 0, metrics.width(), metrics.height(), - Qt::AlignLeft | Qt::AlignTop, - QString::fromLatin1("x")); - int height = size.height(); - int totalHeight = (metrics.height() - margin) / height * height; - if (paint) - painter->drawLine(0, totalHeight + 2, metrics.width(), totalHeight + 2); - painter->setClipRect(0, 2, metrics.width(), totalHeight); - int pos = 1 + offset; - do - { - QRect bound; - if (paint) - { - painter->drawText(0, pos, - metrics.width(), metrics.height(), - Qt::AlignLeft | Qt::AlignTop | Qt::ExpandTabs | Qt::WordBreak, - text(line), -1, &bound); - } - else - bound = painter->boundingRect(0, pos, - metrics.width(), metrics.height(), - Qt::AlignLeft | Qt::AlignTop | Qt::ExpandTabs | Qt::WordBreak, - text(line)); - int cheight = bound.height() ? bound.height() : height; - totalHeight -= cheight; - pos += cheight; - if (totalHeight >= 0) - line++; - } - while (totalHeight > 0 && line < lines()); - painter->setClipping(false); - offset = totalHeight; - painter->setFont(defFont); - return line; + // printRange() not handling this and not sure what to do about it +// if(hasSelectedText()) +// dialog.addEnabledOption(QAbstractPrintDialog::PrintSelection); + + if(!dialog.exec()) + return; + + printer.setCreator(tr(TOAPPNAME)); + + // they show up in the print + setMarginLineNumbers(0, false); + printer.printRange(this); + setMarginLineNumbers(0, true); } -#endif void toMarkedText::openFilename(const QString &file) { Modified: trunk/tora/src/tomarkedtext.h =================================================================== --- trunk/tora/src/tomarkedtext.h 2008-07-26 19:13:10 UTC (rev 2907) +++ trunk/tora/src/tomarkedtext.h 2008-07-27 20:22:24 UTC (rev 2908) @@ -58,8 +58,8 @@ #include <QKeyEvent> #include <QPoint> -class TOPrinter; class QMenu; +class QsciPrinter; /** @@ -86,19 +86,6 @@ QPoint DragStart; -#if 0 - /** Print one page to printer. - * @param printer Printer to print to. - * @param painter Painter to print to. - * @param line Line at top of page. - * @param offset Where one the drawn result this line starts. - * @param pageNo Pagenumber. - * @param paint Wether to paint or just test. - */ - virtual int printPage(TOPrinter *printer, QPainter *painter, int line, int &offset, - int pageNo, bool paint = true); -#endif - void searchFound(int line, int col); void incrementalSearch(bool forward, bool next); protected: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mrj...@us...> - 2008-07-27 22:29:37
|
Revision: 2910 http://tora.svn.sourceforge.net/tora/?rev=2910&view=rev Author: mrjohnson0 Date: 2008-07-27 22:29:44 +0000 (Sun, 27 Jul 2008) Log Message: ----------- add migrate tool for .torarc Modified Paths: -------------- trunk/tora/src/CMakeLists.txt trunk/tora/src/Makefile.am trunk/tora/src/toconnectionimport.cpp trunk/tora/src/toconnectionimport.h Added Paths: ----------- trunk/tora/src/migratetool/tora3.cpp trunk/tora/src/migratetool/tora3.h Modified: trunk/tora/src/CMakeLists.txt =================================================================== --- trunk/tora/src/CMakeLists.txt 2008-07-27 22:18:26 UTC (rev 2909) +++ trunk/tora/src/CMakeLists.txt 2008-07-27 22:29:44 UTC (rev 2910) @@ -345,6 +345,7 @@ migratetool/connectionmodel.cpp migratetool/sqldeveloper.cpp migratetool/squirrelsql.cpp + migratetool/tora3.cpp ) QT4_ADD_TRANSLATION(TORA_I18N_QM ${TORA_I18N_TS}) Modified: trunk/tora/src/Makefile.am =================================================================== --- trunk/tora/src/Makefile.am 2008-07-27 22:18:26 UTC (rev 2909) +++ trunk/tora/src/Makefile.am 2008-07-27 22:29:44 UTC (rev 2910) @@ -173,6 +173,7 @@ migratetool/connectionmodel.cpp migratetool/connectionmodel.h \ migratetool/sqldeveloper.cpp migratetool/sqldeveloper.h \ migratetool/squirrelsql.cpp migratetool/squirrelsql.h \ + migratetool/tora3.cpp migratetool/tora3.h \ $(EXTRA_ORACLE_MONO_SOURCE) \ $(LOKIDIR_SRC)/SmallObj.cpp \ $(LOKIDIR_SRC)/Singleton.cpp \ Added: trunk/tora/src/migratetool/tora3.cpp =================================================================== --- trunk/tora/src/migratetool/tora3.cpp (rev 0) +++ trunk/tora/src/migratetool/tora3.cpp 2008-07-27 22:29:44 UTC (rev 2910) @@ -0,0 +1,211 @@ +/***** + * + * TOra - An Oracle Toolkit for DBA's and developers + * Copyright (C) 2003-2005 Quest Software, Inc + * Portions Copyright (C) 2005 Other Contributors + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; only version 2 of + * the License is valid for this program. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * As a special exception, you have permission to link this program + * with the Oracle Client libraries and distribute executables, as long + * as you follow the requirements of the GNU GPL in regard to all of the + * software in the executable aside from Oracle client libraries. + * + * Specifically you are not permitted to link this program with the + * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. + * And you are not permitted to distribute binaries compiled against + * these libraries without written consent from Quest Software, Inc. + * Observe that this does not disallow linking to the Qt Free Edition. + * + * You may link this product with any GPL'd Qt library such as Qt/Free + * + * All trademarks belong to their respective owners. + * + *****/ + +#include "config.h" +#include "tora3.h" +#include "utils.h" + +#include <QMessageBox> +#include <QFileDialog> +#include <QMap> + +#include <set> + + +namespace MigrateTool +{ + +void loadMap(const QString &filename, QMap<QString, QString> &pairs); +void loadConnections(QMap<QString, QString> &pairs, QList<toConnectionOptions> &ret); +std::set<QString> processOptions(const QString &str); + + +QList<toConnectionOptions> tora3(QWidget * parent) +{ + QList<toConnectionOptions> ret; + + // I can't get the stupid QFileDialog to show hidden files by + // default, so I'm going to just try to open the file. + + // I found plenty of people complaining about it online but with + // no solutions for qt4. + + QFile file(QDir::homePath() + QString("/.torarc")); + if(!file.exists()) { + QMessageBox::warning(parent, + "Load Error", + QString("Cannot open file %1 for reading.").arg(file.fileName())); + return ret; + } + + + QMap<QString, QString> config; + loadMap(file.fileName(), config); + loadConnections(config, ret); + return ret; +} + + +// updated old code from toconfiguration.cpp rev 2575 +void loadMap(const QString &filename, QMap<QString, QString> &pairs) +{ + QByteArray data = toReadFile(filename).toUtf8(); + + int pos = 0; + int bol = 0; + int endtag = -1; + int wpos = 0; + int size = data.length(); + while (pos < size) + { + switch (data[pos]) + { + case '\n': + data[wpos] = 0; + if (endtag == -1) + throw QString(QT_TRANSLATE_NOOP( + "toTool", + "Malformed tag in config file. Missing = on row. (%1)")).arg( + QString(data.mid(bol, wpos - bol))); + { + QString tag = ((const char *)data) + bol; + QString val = ((const char *)data) + endtag + 1; + pairs[tag] = val; + } + bol = pos + 1; + endtag = -1; + wpos = pos; + break; + case '=': + if (endtag == -1) + { + endtag = pos; + data[wpos] = 0; + wpos = pos; + } + else + data[wpos] = data[pos]; + break; + case '\\': + pos++; + switch (data[pos]) + { + case 'n': + data[wpos] = '\n'; + break; + case '\\': + if (endtag >= 0) + data[wpos] = '\\'; + else + data[wpos] = ':'; + break; + default: + throw QT_TRANSLATE_NOOP("toTool", "Unknown escape character in string (Only \\\\ and \\n recognised)"); + } + break; + default: + data[wpos] = data[pos]; + } + wpos++; + pos++; + } + return; +} + + +// similar, but heavily modified from tonewconnection.cpp:toNewConnection() -r2535 +void loadConnections(QMap<QString, QString> &pairs, QList<toConnectionOptions> &ret) +{ + static const QString HISTORY = "ConnectHistory:"; + + QString strMax = pairs[QString("ConnectCurrent")]; + + int max; + if(strMax.isEmpty()) + max = 40; + else { + bool ok; + int t = strMax.toInt(&ok); + if(ok) + max = t; + } + + for(int pos = 0; pos < max; pos++) { + QString num; + num.setNum(pos); + + QString db = pairs[HISTORY + num + "DefaultDatabase"]; + QString pass = pairs[HISTORY + num + "DefaultPassword"]; + QString user = pairs[HISTORY + num + "DefaultUser"]; + QString host = pairs[HISTORY + num + "Host"]; + QString options = pairs[HISTORY + num + "Options"]; + QString prov = pairs[HISTORY + num + "Provider"]; + + if(prov.isEmpty()) + break; + + if(prov == "Oracle") + prov = "Oracle (TNS)"; + if(!pass.isEmpty()) + pass = toUnobfuscate(pass); + + toConnectionOptions conn(prov, + host, + db, + user, + pass, + 0, + processOptions(options)); + ret.append(conn); + } +} + + +// also old code from tonewconnection.cpp +std::set<QString> processOptions(const QString &str) { + QStringList options = str.split(","); + std::set<QString> values; + + Q_FOREACH(QString val, options) { + if(val.startsWith("*")) + values.insert(val.mid(1)); + } + + return values; +} + +} // namespace Added: trunk/tora/src/migratetool/tora3.h =================================================================== --- trunk/tora/src/migratetool/tora3.h (rev 0) +++ trunk/tora/src/migratetool/tora3.h 2008-07-27 22:29:44 UTC (rev 2910) @@ -0,0 +1,58 @@ +/***** + * + * TOra - An Oracle Toolkit for DBA's and developers + * Copyright (C) 2003-2005 Quest Software, Inc + * Portions Copyright (C) 2005 Other Contributors + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; only version 2 of + * the License is valid for this program. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * As a special exception, you have permission to link this program + * with the Oracle Client libraries and distribute executables, as long + * as you follow the requirements of the GNU GPL in regard to all of the + * software in the executable aside from Oracle client libraries. + * + * Specifically you are not permitted to link this program with the + * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. + * And you are not permitted to distribute binaries compiled against + * these libraries without written consent from Quest Software, Inc. + * Observe that this does not disallow linking to the Qt Free Edition. + * + * You may link this product with any GPL'd Qt library such as Qt/Free + * + * All trademarks belong to their respective owners. + * + *****/ + +#ifndef TORA3_H +#define TORA3_H + +#include <QList> + +#include "tonewconnection.h" + +namespace MigrateTool +{ + +/*! \brief Parse Tora 1.3.x preferences file + * + * Probably works for older versions, too. But does anybody care? + * + * \author Mike Johnson + */ +QList<toConnectionOptions> tora3(QWidget *parent = 0); + +} // namespace + +#endif Modified: trunk/tora/src/toconnectionimport.cpp =================================================================== --- trunk/tora/src/toconnectionimport.cpp 2008-07-27 22:18:26 UTC (rev 2909) +++ trunk/tora/src/toconnectionimport.cpp 2008-07-27 22:29:44 UTC (rev 2910) @@ -39,6 +39,7 @@ #include "migratetool/sqldeveloper.h" #include "migratetool/squirrelsql.h" +#include "migratetool/tora3.h" #include "toconnectionimport.h" @@ -49,6 +50,8 @@ setupUi(this); m_tool = toConnectionImport::None; toolComboBox->addItem("None", toConnectionImport::None); + toolComboBox->addItem("TOra (1.3.x)", + toConnectionImport::Tora3); toolComboBox->addItem("Oracle SQL Developer (1.5)", toConnectionImport::OracleSQLDeveloper); toolComboBox->addItem("SquirrelSQL (2.6.x)", @@ -70,13 +73,15 @@ { m_tool = (ToolUsed)toolComboBox->itemData(ix).toInt(); if (m_tool == toConnectionImport::OracleSQLDeveloper) - notificationLabel->setText(tr("Handle exported connections XML file." - "No passwords and options are imported.")); + notificationLabel->setText(tr("Import connections from an XML file.\n" + "No passwords or options are imported.")); else if (m_tool == toConnectionImport::SquirrelSQL) - notificationLabel->setText(tr("Handle connections from tool config directory.")); + notificationLabel->setText(tr("Import connections from tool config directory.")); + else if (m_tool == toConnectionImport::Tora3) + notificationLabel->setText(tr("Import connections from ~/.torarc")); else notificationLabel->setText(tr("Select one of tools available.\n" - "Connections could require manual handling after import.")); + "Connections could require manual changes after importing.")); } void toConnectionImport::refreshAvailable() @@ -84,13 +89,15 @@ if (m_tool == toConnectionImport::None) { QMessageBox::information(this, "TOra", - "Select Import application first, please."); + "Please select an import tool first."); return; } if (m_tool == toConnectionImport::OracleSQLDeveloper) availableModel->setupData(MigrateTool::sqlDeveloper(this)); else if (m_tool == toConnectionImport::SquirrelSQL) availableModel->setupData(MigrateTool::squirrelSql(this)); + else if (m_tool == toConnectionImport::Tora3) + availableModel->setupData(MigrateTool::tora3(this)); tableView->resizeColumnsToContents(); } Modified: trunk/tora/src/toconnectionimport.h =================================================================== --- trunk/tora/src/toconnectionimport.h 2008-07-27 22:18:26 UTC (rev 2909) +++ trunk/tora/src/toconnectionimport.h 2008-07-27 22:29:44 UTC (rev 2910) @@ -56,7 +56,8 @@ enum ToolUsed { None = 0, OracleSQLDeveloper = 1, - SquirrelSQL = 2 + SquirrelSQL = 2, + Tora3 = 3 }; //! \brief Send all imported connections to the caller This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <su...@us...> - 2008-07-28 09:34:51
|
Revision: 2912 http://tora.svn.sourceforge.net/tora/?rev=2912&view=rev Author: subik Date: 2008-07-28 09:34:59 +0000 (Mon, 28 Jul 2008) Log Message: ----------- fixed crash on quickly repeated docs search; progressBar is placed correctly in GUI. Modified Paths: -------------- trunk/tora/src/tohelp.cpp trunk/tora/src/tohelp.h trunk/tora/src/tohelpui.ui Modified: trunk/tora/src/tohelp.cpp =================================================================== --- trunk/tora/src/tohelp.cpp 2008-07-28 08:45:01 UTC (rev 2911) +++ trunk/tora/src/tohelp.cpp 2008-07-28 09:34:59 UTC (rev 2912) @@ -375,7 +375,7 @@ for (int i = 0; i < Sections->topLevelItemCount(); ++i) Manuals->addItem(Sections->topLevelItem(i)->text(0)); - Progress = new QProgressBar(tabs); +// Progress = new QProgressBar(tabs); Progress->setMaximum(Dsc.size()); Progress->hide(); Searching = false; @@ -470,6 +470,8 @@ { if (Searching) return ; + + Searching = true; Result->clear(); QStringList words = SearchLine->text().toLower().split(QRegExp(QString::fromLatin1("\\s+"))); if (words.count() == 0) @@ -478,8 +480,7 @@ QRegExp stripend(QString::fromLatin1(",$")); int steps = 1; Progress->setValue(0); - Progress->show(); - Searching = true; + qApp->processEvents(); QTreeWidgetItem * parent; @@ -583,6 +584,8 @@ } Progress->setValue(steps); ++steps; + if (steps > 10) + Progress->show(); qApp->processEvents(); } Progress->hide(); Modified: trunk/tora/src/tohelp.h =================================================================== --- trunk/tora/src/tohelp.h 2008-07-28 08:45:01 UTC (rev 2911) +++ trunk/tora/src/tohelp.h 2008-07-28 09:34:59 UTC (rev 2912) @@ -161,29 +161,6 @@ bool Searching; /** - * List containing the manuals and their sections, compiled from the toc.htm files. - * @see toHelp - */ -// toListView *Sections; - /** - * List containing the search result of the latest search. Search reads the index.htm files. - */ -// toListView *Result; - /** - * The line containing the search text. - */ -// QLineEdit *SearchLine; - /** - * Manuals to include in search. - */ -// QComboBox *Manuals; -// Q3TextBrowser *Help; - /** - * Display progress of current search. - */ - QProgressBar *Progress; - - /** * Set selection and also update selected item in list if any item matches the * selected location. * @param lst Listview to update selected item in. Modified: trunk/tora/src/tohelpui.ui =================================================================== --- trunk/tora/src/tohelpui.ui 2008-07-28 08:45:01 UTC (rev 2911) +++ trunk/tora/src/tohelpui.ui 2008-07-28 09:34:59 UTC (rev 2912) @@ -44,7 +44,7 @@ <property name="orientation" > <enum>Qt::Horizontal</enum> </property> - <property name="sizeHint" > + <property name="sizeHint" stdset="0" > <size> <width>271</width> <height>20</height> @@ -62,6 +62,14 @@ <number>0</number> </property> <widget class="QWidget" name="tab" > + <property name="geometry" > + <rect> + <x>0</x> + <y>0</y> + <width>332</width> + <height>375</height> + </rect> + </property> <attribute name="title" > <string>Contents</string> </attribute> @@ -81,10 +89,18 @@ </layout> </widget> <widget class="QWidget" name="tab_2" > + <property name="geometry" > + <rect> + <x>0</x> + <y>0</y> + <width>332</width> + <height>375</height> + </rect> + </property> <attribute name="title" > <string>Search</string> </attribute> - <layout class="QGridLayout" > + <layout class="QGridLayout" name="gridLayout" > <item row="0" column="0" > <widget class="QLabel" name="label" > <property name="text" > @@ -112,6 +128,13 @@ </widget> </item> <item row="2" column="0" colspan="2" > + <widget class="QProgressBar" name="Progress" > + <property name="value" > + <number>24</number> + </property> + </widget> + </item> + <item row="3" column="0" colspan="2" > <widget class="QTreeWidget" name="Result" > <property name="alternatingRowColors" > <bool>true</bool> @@ -135,6 +158,9 @@ </widget> </item> </layout> + <zorder>backButton</zorder> + <zorder>forwardButton</zorder> + <zorder>splitter</zorder> </widget> <tabstops> <tabstop>tabs</tabstop> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <su...@us...> - 2008-07-29 08:43:35
|
Revision: 2913 http://tora.svn.sourceforge.net/tora/?rev=2913&view=rev Author: subik Date: 2008-07-29 08:43:43 +0000 (Tue, 29 Jul 2008) Log Message: ----------- help and connection dialogs remember theis sizes now Modified Paths: -------------- trunk/tora/src/tohelp.cpp trunk/tora/src/tohelp.h trunk/tora/src/tonewconnection.cpp Modified: trunk/tora/src/tohelp.cpp =================================================================== --- trunk/tora/src/tohelp.cpp 2008-07-28 09:34:59 UTC (rev 2912) +++ trunk/tora/src/tohelp.cpp 2008-07-29 08:43:43 UTC (rev 2913) @@ -45,27 +45,10 @@ #include "totool.h" #include "tohelpsetup.h" -#include <QAction> -#include <qcombobox.h> -#include <qdir.h> -#include <qfileinfo.h> -#include <qlabel.h> -#include <qlayout.h> -#include <qlineedit.h> -#include <qmessagebox.h> -#include <qpushbutton.h> -#include <qregexp.h> -#include <qsplitter.h> -#include <qtabwidget.h> -#include <qtimer.h> -#include <qtoolbutton.h> -#include <qtooltip.h> +#include <QMessageBox> +#include <QSettings> -#include <QString> -#include <QVBoxLayout> -#include <QToolBar> - toHelp *toHelp::Window; toHelpAddFile::toHelpAddFile(QWidget *parent, const char *name) @@ -379,6 +362,11 @@ Progress->setMaximum(Dsc.size()); Progress->hide(); Searching = false; + + QSettings s; + s.beginGroup("helpdialog"); + restoreGeometry(s.value("geometry").toByteArray()); + splitter->restoreState(s.value("splitter").toByteArray()); } toHelp::~toHelp() @@ -387,6 +375,19 @@ Window = NULL; } +void toHelp::closeEvent(QCloseEvent * e) +{ + if (Searching) + return; + + QSettings s; + s.beginGroup("helpdialog"); + s.setValue("geometry", saveGeometry()); + s.setValue("splitter", splitter->saveState()); + + QWidget::closeEvent(e); +} + QString toHelp::path(const QString &path) { QString cur; Modified: trunk/tora/src/tohelp.h =================================================================== --- trunk/tora/src/tohelp.h 2008-07-28 09:34:59 UTC (rev 2912) +++ trunk/tora/src/tohelp.h 2008-07-29 08:43:43 UTC (rev 2913) @@ -170,11 +170,8 @@ /** * Reimplemented for internal reasons. */ - virtual void closeEvent(QCloseEvent *e) - { - if (!Searching) - QWidget::closeEvent(e); - } + virtual void closeEvent(QCloseEvent *e); + private slots: /** Initiate a search with the parameters in the internal widgets. * @internal Modified: trunk/tora/src/tonewconnection.cpp =================================================================== --- trunk/tora/src/tonewconnection.cpp 2008-07-28 09:34:59 UTC (rev 2912) +++ trunk/tora/src/tonewconnection.cpp 2008-07-29 08:43:43 UTC (rev 2913) @@ -159,7 +159,6 @@ Password->setFocus(Qt::OtherFocusReason); } - QString toNewConnection::realProvider() { QString p = Provider->currentText(); @@ -172,7 +171,7 @@ void toNewConnection::readSettings() { - resize(Settings.value("size", QSize(657, 550)).toSize()); + restoreGeometry(Settings.value("geometry").toByteArray()); Previous->setSortingEnabled(false); for (int pos = 0; pos < MAX_HISTORY; pos++) @@ -230,7 +229,7 @@ void toNewConnection::writeSettings() { - Settings.setValue("size", size()); + Settings.setValue("geometry", saveGeometry()); Settings.remove("history"); @@ -329,6 +328,8 @@ void toNewConnection::done(int r) { + writeSettings(); + if (!r) { QDialog::done(r); @@ -339,7 +340,6 @@ if (!NewConnection) return; - writeSettings(); QDialog::done(r); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <nn...@us...> - 2008-07-30 14:21:25
|
Revision: 2918 http://tora.svn.sourceforge.net/tora/?rev=2918&view=rev Author: nneul Date: 2008-07-30 14:21:33 +0000 (Wed, 30 Jul 2008) Log Message: ----------- silence a couple of ambiguous precedence related warnings Modified Paths: -------------- trunk/tora/src/tohelp.cpp trunk/tora/src/tohighlightedtext.cpp trunk/tora/src/toresultmodel.cpp trunk/tora/src/tosqlparse.cpp Modified: trunk/tora/src/tohelp.cpp =================================================================== --- trunk/tora/src/tohelp.cpp 2008-07-30 14:14:04 UTC (rev 2917) +++ trunk/tora/src/tohelp.cpp 2008-07-30 14:21:33 UTC (rev 2918) @@ -172,7 +172,7 @@ dsc = QString::null; } } - else if (file.open() && file.tag() == "dd" || file.tag() == "book") + else if ((file.open() && file.tag() == "dd") || file.tag() == "book") { dsc = QString::null; inDsc = true; Modified: trunk/tora/src/tohighlightedtext.cpp =================================================================== --- trunk/tora/src/tohighlightedtext.cpp 2008-07-30 14:14:04 UTC (rev 2917) +++ trunk/tora/src/tohighlightedtext.cpp 2008-07-30 14:21:33 UTC (rev 2918) @@ -792,7 +792,7 @@ tokens.setLine(curline); tokens.setOffset(curcol); token = tokens.getToken(); - while ((invalidToken(tokens.line(), tokens.offset()) || UpperIdent(token) != cmp && lastToken != ".") && token != ";" && !token.isEmpty()) + while ((invalidToken(tokens.line(), tokens.offset()) || (UpperIdent(token) != cmp && lastToken != ".")) && token != ";" && !token.isEmpty()) token = tokens.getToken(); lastToken = token; tokens.getToken(false); Modified: trunk/tora/src/toresultmodel.cpp =================================================================== --- trunk/tora/src/toresultmodel.cpp 2008-07-30 14:14:04 UTC (rev 2917) +++ trunk/tora/src/toresultmodel.cpp 2008-07-30 14:21:33 UTC (rev 2918) @@ -527,8 +527,8 @@ for (int i = left; i < right; i++) { - if (order == Qt::AscendingOrder && (Rows.at(i).at(column) < key) || - order == Qt::DescendingOrder && (Rows.at(i).at(column) > key)) + if ((order == Qt::AscendingOrder && (Rows.at(i).at(column) < key)) || + (order == Qt::DescendingOrder && (Rows.at(i).at(column) > key))) Rows.swap(i, store++); } Modified: trunk/tora/src/tosqlparse.cpp =================================================================== --- trunk/tora/src/tosqlparse.cpp 2008-07-30 14:14:04 UTC (rev 2917) +++ trunk/tora/src/tosqlparse.cpp 2008-07-30 14:21:33 UTC (rev 2918) @@ -885,7 +885,7 @@ return ret; } else if (upp == (",") || - (syntax.reservedWord(upp) && + ((syntax.reservedWord(upp) && upp != ("NOT") && upp != ("IS") && upp != ("LIKE") && @@ -896,7 +896,7 @@ upp != ("BETWEEN") && upp != ("ASC") && upp != ("DESC") && - upp != ("NULL")) && !nokey) + upp != ("NULL")) && !nokey)) { ret.subTokens().insert(ret.subTokens().end(), statement(statement::Keyword, token, tokens.line())); nokey = false; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <nn...@us...> - 2008-07-30 20:08:56
|
Revision: 2920 http://tora.svn.sourceforge.net/tora/?rev=2920&view=rev Author: nneul Date: 2008-07-30 20:08:56 +0000 (Wed, 30 Jul 2008) Log Message: ----------- add code to allow storing a preferred schema with saved connections Modified Paths: -------------- trunk/tora/src/migratetool/connectionmodel.cpp trunk/tora/src/migratetool/connectionmodel.h trunk/tora/src/migratetool/tora3.cpp trunk/tora/src/tobrowser.cpp trunk/tora/src/toconnection.cpp trunk/tora/src/toconnection.h trunk/tora/src/tomain.cpp trunk/tora/src/tonewconnection.cpp trunk/tora/src/tonewconnection.h trunk/tora/src/tonewconnectionui.ui Modified: trunk/tora/src/migratetool/connectionmodel.cpp =================================================================== --- trunk/tora/src/migratetool/connectionmodel.cpp 2008-07-30 15:28:27 UTC (rev 2919) +++ trunk/tora/src/migratetool/connectionmodel.cpp 2008-07-30 20:08:56 UTC (rev 2920) @@ -65,6 +65,7 @@ case 1 : return "Host"; case 2 : return "Database"; case 3 : return "Username"; + case 4 : return "Schema"; } return "oops!"; } @@ -83,6 +84,7 @@ case 1 : return opt.host; case 2 : return opt.database; case 3 : return opt.username; + case 4 : return opt.schema; default : return "oops!"; } } Modified: trunk/tora/src/migratetool/connectionmodel.h =================================================================== --- trunk/tora/src/migratetool/connectionmodel.h 2008-07-30 15:28:27 UTC (rev 2919) +++ trunk/tora/src/migratetool/connectionmodel.h 2008-07-30 20:08:56 UTC (rev 2920) @@ -63,7 +63,7 @@ QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const; - int columnCount(const QModelIndex & parent = QModelIndex()) const { return 4; }; + int columnCount(const QModelIndex & parent = QModelIndex()) const { return 5; }; int rowCount(const QModelIndex & parent = QModelIndex()) const { return m_data.count(); }; Qt::ItemFlags flags(const QModelIndex & index) const; Modified: trunk/tora/src/migratetool/tora3.cpp =================================================================== --- trunk/tora/src/migratetool/tora3.cpp 2008-07-30 15:28:27 UTC (rev 2919) +++ trunk/tora/src/migratetool/tora3.cpp 2008-07-30 20:08:56 UTC (rev 2920) @@ -174,6 +174,7 @@ QString host = pairs[HISTORY + num + "Host"]; QString options = pairs[HISTORY + num + "Options"]; QString prov = pairs[HISTORY + num + "Provider"]; + QString schema; if(prov.isEmpty()) break; @@ -188,6 +189,7 @@ db, user, pass, + schema, 0, processOptions(options)); ret.append(conn); Modified: trunk/tora/src/tobrowser.cpp =================================================================== --- trunk/tora/src/tobrowser.cpp 2008-07-30 15:28:27 UTC (rev 2919) +++ trunk/tora/src/tobrowser.cpp 2008-07-30 20:08:56 UTC (rev 2920) @@ -2101,10 +2101,17 @@ void toBrowser::changeConnection(void) { Schema->query(toSQL::sql(toSQL::TOSQL_USERLIST)); - if (toIsMySQL(connection())) + + if ( ! connection().schema().isEmpty() ) + { + Schema->setSelected(connection().schema().toUpper()); + } + else if (toIsMySQL(connection())) Schema->setSelected(connection().database()); else if (toIsOracle(connection()) || toIsSapDB(connection())) + { Schema->setSelected(connection().user().toUpper()); + } else Schema->setSelected(connection().user()); SecondText = QString::null; @@ -2116,6 +2123,9 @@ try { if (!Schema->selected().isEmpty() && FirstTab) + Schema->setSelected(connection().schema().toUpper()); + + if (!Schema->selected().isEmpty() && FirstTab) FirstTab->changeParams( schema(), Filter ? Filter->wildCard() : QString::fromLatin1("%")); Modified: trunk/tora/src/toconnection.cpp =================================================================== --- trunk/tora/src/toconnection.cpp 2008-07-30 15:28:27 UTC (rev 2919) +++ trunk/tora/src/toconnection.cpp 2008-07-30 20:08:56 UTC (rev 2920) @@ -1279,12 +1279,14 @@ toConnection::toConnection(const QString &provider, const QString &user, const QString &password, const QString &host, const QString &database, + const QString &schema, const std::set<QString> &options, bool cache) : Provider(provider), User(user), Password(password), Host(host), Database(database), + Schema(schema), Options(options), Connection(0) { @@ -1314,6 +1316,7 @@ Password(conn.Password), Host(conn.Host), Database(conn.Database), + Schema(conn.Schema), Options(conn.Options), Connection(0) { Modified: trunk/tora/src/toconnection.h =================================================================== --- trunk/tora/src/toconnection.h 2008-07-30 15:28:27 UTC (rev 2919) +++ trunk/tora/src/toconnection.h 2008-07-30 20:08:56 UTC (rev 2920) @@ -499,6 +499,7 @@ QString Password; QString Host; QString Database; + QString Schema; QString Version; std::list<QPointer<QWidget> > Widgets; std::list<QString> InitStrings; @@ -733,11 +734,12 @@ * @param password Password to connect with. * @param host Host to connect to the database with. * @param database Database to connect to. + * @param schema Default schema to switch to. * @param options Options used to connect to the database with. * @param cache Enable object cache for this connection. */ toConnection(const QString &provider, const QString &user, const QString &password, - const QString &host, const QString &database, const std::set + const QString &host, const QString &database, const QString &schema, const std::set <QString> &options, bool cache = true); /** Create a copy of a connection. Will not cache objects, so objects will never be available @@ -789,6 +791,12 @@ { return Database; } + /** Get schema of connection. + */ + const QString &schema() const + { + return Schema; + } /** Get version of connection. */ const QString &version() const Modified: trunk/tora/src/tomain.cpp =================================================================== --- trunk/tora/src/tomain.cpp 2008-07-30 15:28:27 UTC (rev 2919) +++ trunk/tora/src/tomain.cpp 2008-07-30 20:08:56 UTC (rev 2920) @@ -1609,6 +1609,7 @@ QString database = (*i).second; QString user = data[key + ":User"]; QString host = data[key + ":Host"]; + QString schema = data[key + ":Schema"]; QStringList optionlist = data[key + ":Options"].split(","); std::set @@ -1636,7 +1637,7 @@ { try { - toConnection *conn = new toConnection(provider.toLatin1(), user, password, host, database, options); + toConnection *conn = new toConnection(provider.toLatin1(), user, password, host, database, schema, options); if (conn) { conn = addConnection(conn, false); Modified: trunk/tora/src/tonewconnection.cpp =================================================================== --- trunk/tora/src/tonewconnection.cpp 2008-07-30 15:28:27 UTC (rev 2919) +++ trunk/tora/src/tonewconnection.cpp 2008-07-30 20:08:56 UTC (rev 2920) @@ -109,14 +109,17 @@ this, SLOT(previousMenu(const QPoint &))); - Previous->setColumnCount(5); + Previous->setColumnCount(6); Previous->setHorizontalHeaderItem(IndexColumn, new QTableWidgetItem(tr("Index"))); Previous->setHorizontalHeaderItem(ProviderColumn, new QTableWidgetItem(tr("Provider"))); Previous->setHorizontalHeaderItem(HostColumn, new QTableWidgetItem(tr("Host"))); Previous->setHorizontalHeaderItem(DatabaseColumn, new QTableWidgetItem(tr("Database"))); Previous->setHorizontalHeaderItem(UsernameColumn, new QTableWidgetItem(tr("Username"))); - Previous->sortItems(IndexColumn, Qt::AscendingOrder); + Previous->setHorizontalHeaderItem(SchemaColumn, new QTableWidgetItem(tr("Schema"))); + /* This should be changed to be a setting in preferences */ + Previous->sortItems(UsernameColumn, Qt::AscendingOrder); + Settings.beginGroup("connections"); readSettings(); @@ -190,6 +193,7 @@ QString database = Settings.value("database", "").toString(); QString username = Settings.value("username", "").toString(); QString password = toUnobfuscate(Settings.value("password", "").toString()); + QString schema = Settings.value("schema", "").toString(); if ( provider == ORACLE_TNS ) host = ""; @@ -210,6 +214,7 @@ database, username, password, + schema, Settings.value("port", 0).toInt(), options); OptionMap[pos] = opt; @@ -219,6 +224,7 @@ Previous->setItem(pos, HostColumn, new QTableWidgetItem(host)); Previous->setItem(pos, DatabaseColumn, new QTableWidgetItem(database)); Previous->setItem(pos, UsernameColumn, new QTableWidgetItem(username)); + Previous->setItem(pos, SchemaColumn, new QTableWidgetItem(schema)); Settings.endGroup(); } @@ -240,6 +246,7 @@ Settings.setValue("host", Host->currentText()); Settings.setValue("port", Port->value()); Settings.setValue("database", Database->currentText()); + Settings.setValue("schema", Schema->text()); Settings.beginGroup("options"); QList<QCheckBox *> widgets = OptionGroup->findChildren<QCheckBox *>(); @@ -252,7 +259,8 @@ int skip = findHistory(Provider->currentText(), Username->text(), Host->currentText(), - Database->currentText()); + Database->currentText(), + Schema->text()); int skipped = 0; for (int row = 0; row < Previous->rowCount() && row < MAX_HISTORY; row++) @@ -268,6 +276,7 @@ Settings.setValue("username", Previous->item(row, UsernameColumn)->text()); Settings.setValue("host", Previous->item(row, HostColumn)->text()); Settings.setValue("database", Previous->item(row, DatabaseColumn)->text()); + Settings.setValue("schema", Previous->item(row, SchemaColumn)->text()); Settings.setValue("port", opt.port); Settings.setValue("password", toObfuscate(opt.password)); @@ -285,14 +294,16 @@ int toNewConnection::findHistory(const QString &provider, const QString &username, const QString &host, - const QString &database) + const QString &database, + const QString &schema) { for (int row = 0; row < Previous->rowCount(); row++) { if (provider == Previous->item(row, ProviderColumn)->text() && username == Previous->item(row, UsernameColumn)->text() && host == Previous->item(row, HostColumn)->text() && - database == Previous->item(row, DatabaseColumn)->text()) + database == Previous->item(row, DatabaseColumn)->text() && + schema == Previous->item(row, SchemaColumn)->text() ) return row; } @@ -319,6 +330,7 @@ Username->setText(opt.username); Password->setText(opt.password); Port->setValue(opt.port); + Schema->setText(opt.schema); QList<QCheckBox *> widgets = OptionGroup->findChildren<QCheckBox *>(); Q_FOREACH(QCheckBox *box, widgets) @@ -385,6 +397,17 @@ DefaultPort = 1521; } + if (Provider->currentText() == ORACLE_TNS || Provider->currentText() == ORACLE_INSTANT ) + { + SchemaLabel->show(); + Schema->show(); + } + else + { + SchemaLabel->hide(); + Schema->hide(); + } + Port->setValue(DefaultPort); if (Provider->currentText() == ORACLE_TNS) @@ -491,7 +514,7 @@ foreach (toConnectionOptions opt, dia.availableConnections()) { - if (findHistory(opt.provider, opt.username, opt.host, opt.database) != -1) + if (findHistory(opt.provider, opt.username, opt.host, opt.database, opt.schema) != -1) continue; Previous->setRowCount(pos + 1); @@ -502,6 +525,7 @@ Previous->setItem(pos, HostColumn, new QTableWidgetItem(opt.host)); Previous->setItem(pos, DatabaseColumn, new QTableWidgetItem(opt.database)); Previous->setItem(pos, UsernameColumn, new QTableWidgetItem(opt.username)); + Previous->setItem(pos, SchemaColumn, new QTableWidgetItem(opt.schema)); ++pos; ++max; } @@ -520,6 +544,10 @@ if (!Host->isHidden()) host = Host->currentText(); + QString schema; + if (!Schema->isHidden()) + schema = Schema->text(); + QString optionstring; std::set<QString> options; @@ -570,7 +598,8 @@ if (conn.user() == Username->text() && conn.provider() == realProvider() && conn.host() == host && - conn.database() == database) + conn.database() == database && + conn.schema() == schema) return &conn; } catch (...) {} @@ -582,6 +611,7 @@ Password->text(), host, database, + schema, options); return retCon; Modified: trunk/tora/src/tonewconnection.h =================================================================== --- trunk/tora/src/tonewconnection.h 2008-07-30 15:28:27 UTC (rev 2919) +++ trunk/tora/src/tonewconnection.h 2008-07-30 20:08:56 UTC (rev 2920) @@ -67,6 +67,7 @@ QString username; QString password; int port; + QString schema; std::set<QString> options; // must have for qmap @@ -79,6 +80,7 @@ const QString &_data, const QString &_user, const QString &_pass, + const QString &_schema, int _port, std::set<QString> _options) { @@ -87,6 +89,7 @@ database = _data; username = _user; password = _pass; + schema = _schema; port = _port; options = _options; } @@ -96,7 +99,8 @@ return provider == other.provider && host == other.host && database == other.database && - username == other.username; + username == other.username && + schema == other.schema; } bool operator!=(const toConnectionOptions &other) @@ -126,7 +130,8 @@ ProviderColumn, HostColumn, DatabaseColumn, - UsernameColumn + UsernameColumn, + SchemaColumn, }; // stores connection options by unique id. these are read from the @@ -142,7 +147,8 @@ int findHistory(const QString &provider, const QString &username, const QString &host, - const QString &database); + const QString &database, + const QString &schema); // fills form with data from previous connection at param row void loadPrevious(int row); Modified: trunk/tora/src/tonewconnectionui.ui =================================================================== --- trunk/tora/src/tonewconnectionui.ui 2008-07-30 15:28:27 UTC (rev 2919) +++ trunk/tora/src/tonewconnectionui.ui 2008-07-30 20:08:56 UTC (rev 2920) @@ -107,7 +107,7 @@ </widget> </item> <item> - <widget class="QLabel" name="TextLabel1" > + <widget class="QLabel" name="UsernameLabel" > <property name="sizePolicy" > <sizepolicy vsizetype="Fixed" hsizetype="Minimum" > <horstretch>0</horstretch> @@ -145,7 +145,7 @@ </widget> </item> <item> - <widget class="QLabel" name="TextLabel1_2" > + <widget class="QLabel" name="PasswordLabel" > <property name="sizePolicy" > <sizepolicy vsizetype="Minimum" hsizetype="Minimum" > <horstretch>0</horstretch> @@ -227,6 +227,44 @@ </widget> </item> <item> + <widget class="QLabel" name="SchemaLabel" > + <property name="sizePolicy" > + <sizepolicy vsizetype="Fixed" hsizetype="Minimum" > + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="toolTip" > + <string>Schema to switch to</string> + </property> + <property name="text" > + <string>&Schema</string> + </property> + <property name="wordWrap" > + <bool>false</bool> + </property> + <property name="buddy" > + <cstring>Schema</cstring> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="Schema" > + <property name="sizePolicy" > + <sizepolicy vsizetype="Fixed" hsizetype="Minimum" > + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize" > + <size> + <width>200</width> + <height>0</height> + </size> + </property> + </widget> + </item> + <item> <layout class="QHBoxLayout" > <property name="spacing" > <number>0</number> @@ -393,6 +431,7 @@ <tabstop>Username</tabstop> <tabstop>Password</tabstop> <tabstop>Host</tabstop> + <tabstop>Schema</tabstop> <tabstop>Port</tabstop> <tabstop>Database</tabstop> <tabstop>SqlNet</tabstop> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <nn...@us...> - 2008-07-30 20:26:47
|
Revision: 2921 http://tora.svn.sourceforge.net/tora/?rev=2921&view=rev Author: nneul Date: 2008-07-30 20:26:50 +0000 (Wed, 30 Jul 2008) Log Message: ----------- change tab order and default focus Modified Paths: -------------- trunk/tora/src/tonewconnection.cpp trunk/tora/src/tonewconnectionui.ui Modified: trunk/tora/src/tonewconnection.cpp =================================================================== --- trunk/tora/src/tonewconnection.cpp 2008-07-30 20:08:56 UTC (rev 2920) +++ trunk/tora/src/tonewconnection.cpp 2008-07-30 20:26:50 UTC (rev 2921) @@ -159,7 +159,7 @@ // must call after connecting signals loadPrevious(0); - Password->setFocus(Qt::OtherFocusReason); + Previous->setFocus(Qt::OtherFocusReason); } QString toNewConnection::realProvider() Modified: trunk/tora/src/tonewconnectionui.ui =================================================================== --- trunk/tora/src/tonewconnectionui.ui 2008-07-30 20:08:56 UTC (rev 2920) +++ trunk/tora/src/tonewconnectionui.ui 2008-07-30 20:26:50 UTC (rev 2921) @@ -427,6 +427,7 @@ </widget> <layoutdefault spacing="6" margin="11" /> <tabstops> + <tabstop>Previous</tabstop> <tabstop>Provider</tabstop> <tabstop>Username</tabstop> <tabstop>Password</tabstop> @@ -437,9 +438,8 @@ <tabstop>SqlNet</tabstop> <tabstop>SysDba</tabstop> <tabstop>SysOper</tabstop> - <tabstop>Previous</tabstop> <tabstop>ButtonBox</tabstop> - <tabstop>OptionGroup</tabstop> + <tabstop>ImportButton</tabstop> </tabstops> <resources/> <connections> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mrj...@us...> - 2008-08-02 16:41:01
|
Revision: 2924 http://tora.svn.sourceforge.net/tora/?rev=2924&view=rev Author: mrjohnson0 Date: 2008-08-02 16:41:07 +0000 (Sat, 02 Aug 2008) Log Message: ----------- move toqvalue implementation to it's own file... i can never find anything Modified Paths: -------------- trunk/tora/src/CMakeLists.txt trunk/tora/src/Makefile.am trunk/tora/src/toconnection.cpp trunk/tora/src/toqsqlconnection.cpp trunk/tora/src/toqvalue.h Added Paths: ----------- trunk/tora/src/toqvalue.cpp Modified: trunk/tora/src/CMakeLists.txt =================================================================== --- trunk/tora/src/CMakeLists.txt 2008-07-31 13:52:21 UTC (rev 2923) +++ trunk/tora/src/CMakeLists.txt 2008-08-02 16:41:07 UTC (rev 2924) @@ -226,6 +226,7 @@ tobrowsertable.cpp toconfiguration.cpp toconnection.cpp + toqvalue.cpp toconnectionimport.cpp toconnectionpool.cpp torunnable.cpp Modified: trunk/tora/src/Makefile.am =================================================================== --- trunk/tora/src/Makefile.am 2008-07-31 13:52:21 UTC (rev 2923) +++ trunk/tora/src/Makefile.am 2008-08-02 16:41:07 UTC (rev 2924) @@ -50,6 +50,7 @@ tobackgroundlabel.cpp tobackgroundlabel.h \ toconfiguration.cpp toconfiguration.h \ toconnection.cpp toconnection.h \ + toqvalue.cpp toqvalue.h \ toconnectionimport.cpp toconnectionimport.h \ toconnectionpool.cpp toconnectionpool.h \ torunnable.cpp torunnable.h \ @@ -241,7 +242,6 @@ tomysqlkeywords.h \ toocistub.cpp \ tooraclepreload.cpp \ - toqvalue.h \ toresultresources.h \ $(TRANSLATIONS) \ LICENSE.h \ Modified: trunk/tora/src/toconnection.cpp =================================================================== --- trunk/tora/src/toconnection.cpp 2008-07-31 13:52:21 UTC (rev 2923) +++ trunk/tora/src/toconnection.cpp 2008-08-02 16:41:07 UTC (rev 2924) @@ -68,9 +68,6 @@ std::map<QString, toConnectionProvider *> *toConnectionProvider::Providers; std::map<QString, toConnectionProvider *> *toConnectionProvider::Types; -static int NumberFormat; -static int NumberDecimals; - void toConnectionProvider::checkAlloc(void) { if (!Providers) @@ -201,577 +198,6 @@ return NULL; } -// Query value implementation - -toQValue::toQValue(int i) -{ - Type = intType; - Value.Int = i; -} - -toQValue::toQValue(double i) -{ - Type = doubleType; - Value.Double = i; -} - -toQValue::toQValue(qlonglong d) -{ - Type = longType; - Value.Long = d; -} - -toQValue::toQValue(qulonglong d) -{ - Type = ulongType; - Value.uLong = d; -} - -toQValue::toQValue(const toQValue ©) -{ - Type = copy.Type; - switch (Type) - { - case intType: - Value.Int = copy.Value.Int; - break; - case doubleType: - Value.Double = copy.Value.Double; - break; - case stringType: - Value.String = new QString(*copy.Value.String); - break; - case binaryType: - Value.Array = new QByteArray(*copy.Value.Array); - break; - case nullType: - break; - case longType: - Value.Long = copy.Value.Long; - break; - case ulongType: - Value.uLong = copy.Value.uLong; - } -} - - -bool toQValue::operator<(const toQValue &other) const -{ - if (isInt() && other.isInt()) - return toInt() < other.toInt(); - if (isDouble() && other.isDouble()) - return toDouble() < other.toDouble(); - if (isLong() && other.isLong()) - return toLong() < other.toLong(); - if (isuLong() && other.isuLong()) - return touLong() < other.touLong(); - if (isBinary() && other.isBinary()) - return Value.Array < other.Value.Array; - - // otherwise, try to convert to double for comparison - bool ok; - double d1 = toString().toDouble(&ok); - if (ok) - { - double d2 = other.toString().toDouble(&ok); - if (ok) - return d1 < d2; - } - - return toString() < other.toString(); -} - - -bool toQValue::operator>(const toQValue &other) const -{ - return !operator<(other); -} - - -const toQValue &toQValue::operator = (const toQValue & copy) -{ - if (Type == stringType) - delete Value.String; - else if (Type == binaryType) - delete Value.Array; - - Type = copy.Type; - switch (Type) - { - case intType: - Value.Int = copy.Value.Int; - break; - case doubleType: - Value.Double = copy.Value.Double; - break; - case stringType: - Value.String = new QString(*copy.Value.String); - break; - case binaryType: - Value.Array = new QByteArray(*copy.Value.Array); - break; - case nullType: - break; - case longType: - Value.Long = copy.Value.Long; - break; - case ulongType: - Value.uLong = copy.Value.uLong; - break; - } - return *this; -} - -bool toQValue::isNumber() const -{ - switch (Type) - { - case intType: - case doubleType: - case nullType: // intentional fall through - case longType: - case ulongType: - return true; - - case stringType: // intentional - case binaryType: - return false; - } - - return false; -} - -bool toQValue::operator == (const toQValue &val) const -{ - if (isNull() && val.isNull()) - return true; - if (val.Type != Type) - return false; - switch (Type) - { - case intType: - return (val.Value.Int == Value.Int); - case doubleType: - return (val.Value.Double == Value.Double); - case stringType: - return (*val.Value.String) == (*Value.String); - case binaryType: - return (*val.Value.Array) == (*Value.Array); - case nullType: - break; - case longType: - return val.Value.Long == Value.Long; - case ulongType: - return val.Value.uLong == Value.uLong; - } - return false; // Should never get here -} - -toQValue::toQValue(const QString &str) -{ - Type = stringType; - Value.String = new QString(str); -} - -toQValue::toQValue(void) -{ - Type = nullType; -} - -toQValue::~toQValue() -{ - if (Type == stringType) - delete Value.String; - else if (Type == binaryType) - delete Value.Array; -} - -QVariant toQValue::toQVariant(void) const -{ - if (isInt()) - return QVariant(toInt()); - if (isDouble()) - return QVariant(toDouble()); - if (isNull()) - return QVariant(); - if (isString()) - return QVariant(toUtf8()); - if (isBinary()) - return QVariant(toString()); - if (isLong()) - return QVariant(toLong()); - if (isuLong()) - return QVariant(touLong()); - return QVariant(toByteArray()); -} - -bool toQValue::isInt(void) const -{ - return Type == intType; -} - -bool toQValue::isDouble(void) const -{ - return Type == doubleType; -} - -bool toQValue::isuLong(void) const -{ - return Type == ulongType; -} - -bool toQValue::isLong(void) const -{ - return Type == longType; -} - -bool toQValue::isString(void) const -{ - return Type == stringType; -} - -bool toQValue::isBinary(void) const -{ - return Type == binaryType; -} - -bool toQValue::isNull(void) const -{ - if (Type == nullType) - return true; - if (Type == stringType && Value.String->isNull()) - return true; - return false; -} - -const QByteArray &toQValue::toByteArray() const -{ - if (Type != binaryType) - throw qApp->translate("toQValue", "Tried to convert non binary value to binary"); - return *Value.Array; -} - -static char HexString[] = "0123456789ABCDEF"; - -QString toQValue::toUtf8(void) const -{ - switch (Type) - { - case nullType: - { - QString ret; - return ret; - } - case intType: - { - QString ret; - ret.setNum(Value.Int); - return ret; - } - case longType: - { - QString ret; - ret.setNum(Value.Long); - return ret; - } - case ulongType: - { - QString ret; - ret.setNum(Value.uLong); - return ret; - } - case doubleType: - { - QString ret; - if (Value.Double != int(Value.Double)) - { - ret.setNum(Value.Double); - return ret; - } - char buf[100]; - switch (NumberFormat) - { - default: - ret.setNum(Value.Double); - break; - case 1: - sprintf(buf, "%E", Value.Double); - ret = buf; - break; - case 2: - sprintf(buf, "%0.*f", NumberDecimals, Value.Double); - ret = buf; - break; - } - return ret; - } - case stringType: - return *(Value.String); - case binaryType: - { - QString ret(Value.Array->size()*2 + 1); - for (int i = 0;i < Value.Array->size();i++) - { - unsigned char c = (unsigned char)Value.Array->at(i); -// ret.at(i*2) = HexString[(c / 16) % 16]; -// ret.at(i*2 + 1) = HexString[c % 16]; - ret[i*2] = HexString[(c / 16) % 16]; - ret[i*2 + 1] = HexString[c % 16]; - } -// ret.at(Value.Array->size()*2) = 0; - ret[Value.Array->size()*2] = 0; - return ret; - } - } - throw qApp->translate("toQValue", "Unknown type of query value"); -} - -int toQValue::toInt(void) const -{ - switch (Type) - { - case nullType: - return 0; - case intType: - return Value.Int; - case doubleType: - return int(Value.Double); - case longType: - return int(Value.Long); - case ulongType: - return int(Value.uLong); - case stringType: - return Value.String->toInt(); - case binaryType: - throw qApp->translate("toQValue", "Can't transform binary value to int"); - } - throw qApp->translate("toQValue", "Unknown type of query value"); -} - -double toQValue::toDouble(void) const -{ - switch (Type) - { - case nullType: - return 0; - case intType: - return double(Value.Int); - case longType: - return double(Value.Long); - case ulongType: - return double(Value.uLong); - case doubleType: - return Value.Double; - case stringType: - return Value.String->toDouble(); - case binaryType: - throw qApp->translate("toQValue", "Can't transform binary value to double"); - } - throw qApp->translate("toQValue", "Unknown type of query value"); -} - -qlonglong toQValue::toLong(void) const -{ - switch (Type) - { - case longType: - return Value.Long; - case ulongType: - return (qlonglong) Value.uLong; - case nullType: - return (qlonglong) 0; - case intType: - return (qlonglong) Value.Int; - case doubleType: - return (qlonglong) Value.Double; - case stringType: - return Value.String->toLongLong(); - case binaryType: - throw qApp->translate("toQValue", "Can't transform binary value to long"); - } - throw qApp->translate("toQValue", "Unknown type of query value"); -} - -qulonglong toQValue::touLong(void) const -{ - switch (Type) - { - case longType: - return (qulonglong) Value.Long; - case ulongType: - return Value.uLong; - case nullType: - return (qulonglong) 0; - case intType: - return (qulonglong) Value.Int; - case doubleType: - return (qulonglong) Value.Double; - case stringType: - return Value.String->toULongLong(); - case binaryType: - throw qApp->translate("toQValue", "Can't transform binary value to ulong"); - } - throw qApp->translate("toQValue", "Unknown type of query value"); -} - -void toQValue::setNumberFormat(int format, int decimals) -{ - NumberFormat = format; - NumberDecimals = decimals; -} - -QString toQValue::formatNumber(double number) -{ - if (number == int(number)) - return QString::number(number); - switch (NumberFormat) - { - case 1: - { - char buf[100]; - sprintf(buf, "%E", number); - return buf; - } - case 2: - { - char buf[100]; - sprintf(buf, "%0.*f", NumberDecimals, number); - return buf; - } - default: - return QString::number(number); - } -} - -int toQValue::numberFormat(void) -{ - return NumberFormat; -} - -int toQValue::numberDecimals(void) -{ - return NumberDecimals; -} - -toQValue toQValue::fromVariant(const QVariant &val) -{ - switch (val.type()) - { - case QVariant::Invalid: - return toQValue(); - case QVariant::Bool: - return toQValue((int) val.toBool()); - case QVariant::Double: - return toQValue((double) val.toDouble()); - case QVariant::Int: - return toQValue((int) val.toInt()); - case QVariant::LongLong: - return toQValue((qlonglong) val.toLongLong()); - case QVariant::UInt: - return toQValue((qulonglong) val.toUInt()); - case QVariant::ULongLong: - return toQValue(val.toULongLong()); - case QVariant::ByteArray: - return toQValue::createBinary(val.toByteArray()); - default: - return toQValue(val.toString()); - } -} - -toQValue toQValue::createBinary(const QByteArray &arr) -{ - toQValue ret; - ret.Type = binaryType; - ret.Value.Array = new QByteArray(arr); - return ret; -} - -toQValue toQValue::createFromHex(const QByteArray &hex) -{ - QByteArray arr; - for (int i = 0;i < hex.length();i += 2) - { - int num; - char c = hex.at(i); - if (c >= 'a') - num = c - 'a'; - else if (c >= 'A') - num = c - 'A'; - else - num = c - '0'; - num <<= 4; - c = hex.at(i + 1); - if (c >= 'a') - num += c - 'a'; - else if (c >= 'A') - num += c - 'A'; - else - num += c - '0'; -// arr.at(i / 2) = num; - arr[i / 2] = num; - } - return createBinary(arr); -} - -toQValue toQValue::createFromHex(const QString &hex) -{ - QByteArray arr; - for (int i = 0;i < hex.length();i += 2) - { - int num; -// qt4 char c = hex.at(i); - char c = hex.at(i).toAscii(); - if (c >= 'a') - num = c - 'a'; - else if (c >= 'A') - num = c - 'A'; - else - num = c - '0'; - num <<= 4; -// qt4 c = hex.at(i + 1); - c = hex.at(i + 1).toAscii(); - if (c >= 'a') - num += c - 'a'; - else if (c >= 'A') - num += c - 'A'; - else - num += c - '0'; - arr[i / 2] = num; - } - return createBinary(arr); -} - -toQValue::operator QString() const -{ - switch (Type) - { - case nullType: - return QString::null; - case doubleType: - return formatNumber(Value.Double); - case intType: - return QString::number(Value.Int); - case longType: - return QString::number(Value.Long); - case ulongType: - return QString::number(Value.uLong); - case stringType: - return *Value.String; - case binaryType: - { - QString ret; - for (int i = 0;i < Value.Array->size();i++) - { - unsigned char c = (unsigned char)Value.Array->at(i); - ret += HexString[(c / 16) % 16]; - ret += HexString[c % 16]; - } - return ret; - } - } - throw qApp->translate("toQValue", "Unknown type of query value"); -} - // toQuery implementation toQuery::toQuery(toConnection &conn, Modified: trunk/tora/src/toqsqlconnection.cpp =================================================================== --- trunk/tora/src/toqsqlconnection.cpp 2008-07-31 13:52:21 UTC (rev 2923) +++ trunk/tora/src/toqsqlconnection.cpp 2008-08-02 16:41:07 UTC (rev 2924) @@ -66,6 +66,8 @@ #include <postgresql/libpq-fe.h> #endif +#include <QDebug> + static toSQL SQLVersion("toQSqlConnection:Version", "SHOW VARIABLES LIKE 'version'", "Show version of database, " Added: trunk/tora/src/toqvalue.cpp =================================================================== --- trunk/tora/src/toqvalue.cpp (rev 0) +++ trunk/tora/src/toqvalue.cpp 2008-08-02 16:41:07 UTC (rev 2924) @@ -0,0 +1,617 @@ +/***** + * + * TOra - An Oracle Toolkit for DBA's and developers + * Copyright (C) 2003-2005 Quest Software, Inc + * Portions Copyright (C) 2005 Other Contributors + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; only version 2 of + * the License is valid for this program. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * As a special exception, you have permission to link this program + * with the Oracle Client libraries and distribute executables, as long + * as you follow the requirements of the GNU GPL in regard to all of the + * software in the executable aside from Oracle client libraries. + * + * Specifically you are not permitted to link this program with the + * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. + * And you are not permitted to distribute binaries compiled against + * these libraries without written consent from Quest Software, Inc. + * Observe that this does not disallow linking to the Qt Free Edition. + * + * You may link this product with any GPL'd Qt library such as Qt/Free + * + * All trademarks belong to their respective owners. + * + *****/ + +#include "utils.h" + +#include "toconf.h" +#include "toqvalue.h" + +#include <QVariant> +#include <QApplication> + +static int NumberFormat; +static int NumberDecimals; + + +toQValue::toQValue(int i) +{ + Type = intType; + Value.Int = i; +} + +toQValue::toQValue(double i) +{ + Type = doubleType; + Value.Double = i; +} + +toQValue::toQValue(qlonglong d) +{ + Type = longType; + Value.Long = d; +} + +toQValue::toQValue(qulonglong d) +{ + Type = ulongType; + Value.uLong = d; +} + +toQValue::toQValue(const toQValue ©) +{ + Type = copy.Type; + switch (Type) + { + case intType: + Value.Int = copy.Value.Int; + break; + case doubleType: + Value.Double = copy.Value.Double; + break; + case stringType: + Value.String = new QString(*copy.Value.String); + break; + case binaryType: + Value.Array = new QByteArray(*copy.Value.Array); + break; + case nullType: + break; + case longType: + Value.Long = copy.Value.Long; + break; + case ulongType: + Value.uLong = copy.Value.uLong; + } +} + + +bool toQValue::operator<(const toQValue &other) const +{ + if (isInt() && other.isInt()) + return toInt() < other.toInt(); + if (isDouble() && other.isDouble()) + return toDouble() < other.toDouble(); + if (isLong() && other.isLong()) + return toLong() < other.toLong(); + if (isuLong() && other.isuLong()) + return touLong() < other.touLong(); + if (isBinary() && other.isBinary()) + return Value.Array < other.Value.Array; + + // otherwise, try to convert to double for comparison + bool ok; + double d1 = toString().toDouble(&ok); + if (ok) + { + double d2 = other.toString().toDouble(&ok); + if (ok) + return d1 < d2; + } + + return toString() < other.toString(); +} + + +bool toQValue::operator>(const toQValue &other) const +{ + return !operator<(other); +} + + +const toQValue &toQValue::operator = (const toQValue & copy) +{ + if (Type == stringType) + delete Value.String; + else if (Type == binaryType) + delete Value.Array; + + Type = copy.Type; + switch (Type) + { + case intType: + Value.Int = copy.Value.Int; + break; + case doubleType: + Value.Double = copy.Value.Double; + break; + case stringType: + Value.String = new QString(*copy.Value.String); + break; + case binaryType: + Value.Array = new QByteArray(*copy.Value.Array); + break; + case nullType: + break; + case longType: + Value.Long = copy.Value.Long; + break; + case ulongType: + Value.uLong = copy.Value.uLong; + break; + } + return *this; +} + +bool toQValue::isNumber() const +{ + switch (Type) + { + case intType: + case doubleType: + case nullType: // intentional fall through + case longType: + case ulongType: + return true; + + case stringType: // intentional + case binaryType: + return false; + } + + return false; +} + +bool toQValue::operator == (const toQValue &val) const +{ + if (isNull() && val.isNull()) + return true; + if (val.Type != Type) + return false; + switch (Type) + { + case intType: + return (val.Value.Int == Value.Int); + case doubleType: + return (val.Value.Double == Value.Double); + case stringType: + return (*val.Value.String) == (*Value.String); + case binaryType: + return (*val.Value.Array) == (*Value.Array); + case nullType: + break; + case longType: + return val.Value.Long == Value.Long; + case ulongType: + return val.Value.uLong == Value.uLong; + } + return false; // Should never get here +} + +toQValue::toQValue(const QString &str) +{ + Type = stringType; + Value.String = new QString(str); +} + +toQValue::toQValue(void) +{ + Type = nullType; +} + +toQValue::~toQValue() +{ + if (Type == stringType) + delete Value.String; + else if (Type == binaryType) + delete Value.Array; +} + +QVariant toQValue::toQVariant(void) const +{ + if (isInt()) + return QVariant(toInt()); + if (isDouble()) + return QVariant(toDouble()); + if (isNull()) + return QVariant(); + if (isString()) + return QVariant(toUtf8()); + if (isBinary()) + return QVariant(toString()); + if (isLong()) + return QVariant(toLong()); + if (isuLong()) + return QVariant(touLong()); + return QVariant(toByteArray()); +} + +bool toQValue::isInt(void) const +{ + return Type == intType; +} + +bool toQValue::isDouble(void) const +{ + return Type == doubleType; +} + +bool toQValue::isuLong(void) const +{ + return Type == ulongType; +} + +bool toQValue::isLong(void) const +{ + return Type == longType; +} + +bool toQValue::isString(void) const +{ + return Type == stringType; +} + +bool toQValue::isBinary(void) const +{ + return Type == binaryType; +} + +bool toQValue::isNull(void) const +{ + if (Type == nullType) + return true; + if (Type == stringType && Value.String->isNull()) + return true; + return false; +} + +const QByteArray &toQValue::toByteArray() const +{ + if (Type != binaryType) + throw qApp->translate("toQValue", "Tried to convert non binary value to binary"); + return *Value.Array; +} + +static char HexString[] = "0123456789ABCDEF"; + +QString toQValue::toUtf8(void) const +{ + switch (Type) + { + case nullType: + { + QString ret; + return ret; + } + case intType: + { + QString ret; + ret.setNum(Value.Int); + return ret; + } + case longType: + { + QString ret; + ret.setNum(Value.Long); + return ret; + } + case ulongType: + { + QString ret; + ret.setNum(Value.uLong); + return ret; + } + case doubleType: + { + QString ret; + if (Value.Double != int(Value.Double)) + { + ret.setNum(Value.Double); + return ret; + } + char buf[100]; + switch (NumberFormat) + { + default: + ret.setNum(Value.Double); + break; + case 1: + sprintf(buf, "%E", Value.Double); + ret = buf; + break; + case 2: + sprintf(buf, "%0.*f", NumberDecimals, Value.Double); + ret = buf; + break; + } + return ret; + } + case stringType: + return *(Value.String); + case binaryType: + { + QString ret(Value.Array->size()*2 + 1); + for (int i = 0;i < Value.Array->size();i++) + { + unsigned char c = (unsigned char)Value.Array->at(i); +// ret.at(i*2) = HexString[(c / 16) % 16]; +// ret.at(i*2 + 1) = HexString[c % 16]; + ret[i*2] = HexString[(c / 16) % 16]; + ret[i*2 + 1] = HexString[c % 16]; + } +// ret.at(Value.Array->size()*2) = 0; + ret[Value.Array->size()*2] = 0; + return ret; + } + } + throw qApp->translate("toQValue", "Unknown type of query value"); +} + +int toQValue::toInt(void) const +{ + switch (Type) + { + case nullType: + return 0; + case intType: + return Value.Int; + case doubleType: + return int(Value.Double); + case longType: + return int(Value.Long); + case ulongType: + return int(Value.uLong); + case stringType: + return Value.String->toInt(); + case binaryType: + throw qApp->translate("toQValue", "Can't transform binary value to int"); + } + throw qApp->translate("toQValue", "Unknown type of query value"); +} + +double toQValue::toDouble(void) const +{ + switch (Type) + { + case nullType: + return 0; + case intType: + return double(Value.Int); + case longType: + return double(Value.Long); + case ulongType: + return double(Value.uLong); + case doubleType: + return Value.Double; + case stringType: + return Value.String->toDouble(); + case binaryType: + throw qApp->translate("toQValue", "Can't transform binary value to double"); + } + throw qApp->translate("toQValue", "Unknown type of query value"); +} + +qlonglong toQValue::toLong(void) const +{ + switch (Type) + { + case longType: + return Value.Long; + case ulongType: + return (qlonglong) Value.uLong; + case nullType: + return (qlonglong) 0; + case intType: + return (qlonglong) Value.Int; + case doubleType: + return (qlonglong) Value.Double; + case stringType: + return Value.String->toLongLong(); + case binaryType: + throw qApp->translate("toQValue", "Can't transform binary value to long"); + } + throw qApp->translate("toQValue", "Unknown type of query value"); +} + +qulonglong toQValue::touLong(void) const +{ + switch (Type) + { + case longType: + return (qulonglong) Value.Long; + case ulongType: + return Value.uLong; + case nullType: + return (qulonglong) 0; + case intType: + return (qulonglong) Value.Int; + case doubleType: + return (qulonglong) Value.Double; + case stringType: + return Value.String->toULongLong(); + case binaryType: + throw qApp->translate("toQValue", "Can't transform binary value to ulong"); + } + throw qApp->translate("toQValue", "Unknown type of query value"); +} + +void toQValue::setNumberFormat(int format, int decimals) +{ + NumberFormat = format; + NumberDecimals = decimals; +} + +QString toQValue::formatNumber(double number) +{ + if (number == int(number)) + return QString::number(number); + switch (NumberFormat) + { + case 1: + { + char buf[100]; + sprintf(buf, "%E", number); + return buf; + } + case 2: + { + char buf[100]; + sprintf(buf, "%0.*f", NumberDecimals, number); + return buf; + } + default: + return QString::number(number); + } +} + +int toQValue::numberFormat(void) +{ + return NumberFormat; +} + +int toQValue::numberDecimals(void) +{ + return NumberDecimals; +} + +toQValue toQValue::fromVariant(const QVariant &val) +{ + switch (val.type()) + { + case QVariant::Invalid: + return toQValue(); + case QVariant::Bool: + return toQValue((int) val.toBool()); + case QVariant::Double: + return toQValue((double) val.toDouble()); + case QVariant::Int: + return toQValue((int) val.toInt()); + case QVariant::LongLong: + return toQValue((qlonglong) val.toLongLong()); + case QVariant::UInt: + return toQValue((qulonglong) val.toUInt()); + case QVariant::ULongLong: + return toQValue(val.toULongLong()); + case QVariant::ByteArray: + return toQValue::createBinary(val.toByteArray()); + default: + return toQValue(val.toString()); + } +} + +toQValue toQValue::createBinary(const QByteArray &arr) +{ + toQValue ret; + ret.Type = binaryType; + ret.Value.Array = new QByteArray(arr); + return ret; +} + +toQValue toQValue::createFromHex(const QByteArray &hex) +{ + QByteArray arr; + for (int i = 0;i < hex.length();i += 2) + { + int num; + char c = hex.at(i); + if (c >= 'a') + num = c - 'a'; + else if (c >= 'A') + num = c - 'A'; + else + num = c - '0'; + num <<= 4; + c = hex.at(i + 1); + if (c >= 'a') + num += c - 'a'; + else if (c >= 'A') + num += c - 'A'; + else + num += c - '0'; +// arr.at(i / 2) = num; + arr[i / 2] = num; + } + return createBinary(arr); +} + +toQValue toQValue::createFromHex(const QString &hex) +{ + QByteArray arr; + for (int i = 0;i < hex.length();i += 2) + { + int num; +// qt4 char c = hex.at(i); + char c = hex.at(i).toAscii(); + if (c >= 'a') + num = c - 'a'; + else if (c >= 'A') + num = c - 'A'; + else + num = c - '0'; + num <<= 4; +// qt4 c = hex.at(i + 1); + c = hex.at(i + 1).toAscii(); + if (c >= 'a') + num += c - 'a'; + else if (c >= 'A') + num += c - 'A'; + else + num += c - '0'; + arr[i / 2] = num; + } + return createBinary(arr); +} + +toQValue::operator QString() const +{ + switch (Type) + { + case nullType: + return QString::null; + case doubleType: + return formatNumber(Value.Double); + case intType: + return QString::number(Value.Int); + case longType: + return QString::number(Value.Long); + case ulongType: + return QString::number(Value.uLong); + case stringType: + return *Value.String; + case binaryType: + { + QString ret; + for (int i = 0;i < Value.Array->size();i++) + { + unsigned char c = (unsigned char)Value.Array->at(i); + ret += HexString[(c / 16) % 16]; + ret += HexString[c % 16]; + } + return ret; + } + } + throw qApp->translate("toQValue", "Unknown type of query value"); +} Modified: trunk/tora/src/toqvalue.h =================================================================== --- trunk/tora/src/toqvalue.h 2008-07-31 13:52:21 UTC (rev 2923) +++ trunk/tora/src/toqvalue.h 2008-08-02 16:41:07 UTC (rev 2924) @@ -41,9 +41,6 @@ #include "config.h" #include <list> - -#include <qstring.h> -//Added by qt3to4: #include <QString> class QVariant; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mrj...@us...> - 2008-08-03 16:22:37
|
Revision: 2925 http://tora.svn.sourceforge.net/tora/?rev=2925&view=rev Author: mrjohnson0 Date: 2008-08-03 16:22:46 +0000 (Sun, 03 Aug 2008) Log Message: ----------- toqvalue is now a small wrapper for qvariant. this eliminates many data copies and fixes the mysterious mysql utf8 problem Modified Paths: -------------- trunk/tora/src/toqvalue.cpp trunk/tora/src/toqvalue.h Modified: trunk/tora/src/toqvalue.cpp =================================================================== --- trunk/tora/src/toqvalue.cpp 2008-08-02 16:41:07 UTC (rev 2924) +++ trunk/tora/src/toqvalue.cpp 2008-08-03 16:22:46 UTC (rev 2925) @@ -49,56 +49,42 @@ toQValue::toQValue(int i) { - Type = intType; - Value.Int = i; + Value = i; } toQValue::toQValue(double i) { - Type = doubleType; - Value.Double = i; + Value = i; } toQValue::toQValue(qlonglong d) { - Type = longType; - Value.Long = d; + Value = d; } toQValue::toQValue(qulonglong d) { - Type = ulongType; - Value.uLong = d; + Value = d; } toQValue::toQValue(const toQValue ©) { - Type = copy.Type; - switch (Type) - { - case intType: - Value.Int = copy.Value.Int; - break; - case doubleType: - Value.Double = copy.Value.Double; - break; - case stringType: - Value.String = new QString(*copy.Value.String); - break; - case binaryType: - Value.Array = new QByteArray(*copy.Value.Array); - break; - case nullType: - break; - case longType: - Value.Long = copy.Value.Long; - break; - case ulongType: - Value.uLong = copy.Value.uLong; - } + Value = copy.Value; } +toQValue::toQValue(const QString &str) +{ + Value = str; +} +toQValue::toQValue() +{ +} + +toQValue::~toQValue() +{ +} + bool toQValue::operator<(const toQValue &other) const { if (isInt() && other.isInt()) @@ -110,7 +96,7 @@ if (isuLong() && other.isuLong()) return touLong() < other.touLong(); if (isBinary() && other.isBinary()) - return Value.Array < other.Value.Array; + return Value.toByteArray() < other.Value.toByteArray(); // otherwise, try to convert to double for comparison bool ok; @@ -134,330 +120,96 @@ const toQValue &toQValue::operator = (const toQValue & copy) { - if (Type == stringType) - delete Value.String; - else if (Type == binaryType) - delete Value.Array; - - Type = copy.Type; - switch (Type) - { - case intType: - Value.Int = copy.Value.Int; - break; - case doubleType: - Value.Double = copy.Value.Double; - break; - case stringType: - Value.String = new QString(*copy.Value.String); - break; - case binaryType: - Value.Array = new QByteArray(*copy.Value.Array); - break; - case nullType: - break; - case longType: - Value.Long = copy.Value.Long; - break; - case ulongType: - Value.uLong = copy.Value.uLong; - break; - } - return *this; + Value = copy.Value; } bool toQValue::isNumber() const { - switch (Type) - { - case intType: - case doubleType: - case nullType: // intentional fall through - case longType: - case ulongType: - return true; - - case stringType: // intentional - case binaryType: - return false; - } - - return false; + return isInt() || isDouble() || isLong() || isuLong(); } bool toQValue::operator == (const toQValue &val) const { - if (isNull() && val.isNull()) - return true; - if (val.Type != Type) - return false; - switch (Type) - { - case intType: - return (val.Value.Int == Value.Int); - case doubleType: - return (val.Value.Double == Value.Double); - case stringType: - return (*val.Value.String) == (*Value.String); - case binaryType: - return (*val.Value.Array) == (*Value.Array); - case nullType: - break; - case longType: - return val.Value.Long == Value.Long; - case ulongType: - return val.Value.uLong == Value.uLong; - } - return false; // Should never get here + return Value == val.Value; } -toQValue::toQValue(const QString &str) +QVariant toQValue::toQVariant() const { - Type = stringType; - Value.String = new QString(str); + return Value; } -toQValue::toQValue(void) +bool toQValue::isInt() const { - Type = nullType; + return Value.type() == QVariant::Int; } -toQValue::~toQValue() +bool toQValue::isDouble() const { - if (Type == stringType) - delete Value.String; - else if (Type == binaryType) - delete Value.Array; + return Value.type() == QVariant::Double; } -QVariant toQValue::toQVariant(void) const +bool toQValue::isuLong() const { - if (isInt()) - return QVariant(toInt()); - if (isDouble()) - return QVariant(toDouble()); - if (isNull()) - return QVariant(); - if (isString()) - return QVariant(toUtf8()); - if (isBinary()) - return QVariant(toString()); - if (isLong()) - return QVariant(toLong()); - if (isuLong()) - return QVariant(touLong()); - return QVariant(toByteArray()); + return Value.type() == QVariant::ULongLong; } -bool toQValue::isInt(void) const +bool toQValue::isLong() const { - return Type == intType; + return Value.type() == QVariant::LongLong; } -bool toQValue::isDouble(void) const +bool toQValue::isString() const { - return Type == doubleType; + return Value.type() == QVariant::String; } -bool toQValue::isuLong(void) const +bool toQValue::isBinary() const { - return Type == ulongType; + return Value.type() == QVariant::ByteArray; } -bool toQValue::isLong(void) const +bool toQValue::isNull() const { - return Type == longType; + return Value.isNull(); } -bool toQValue::isString(void) const +const QByteArray toQValue::toByteArray() const { - return Type == stringType; + return Value.toByteArray(); } -bool toQValue::isBinary(void) const -{ - return Type == binaryType; -} +static char HexString[] = "0123456789ABCDEF"; -bool toQValue::isNull(void) const +QString toQValue::toUtf8() const { - if (Type == nullType) - return true; - if (Type == stringType && Value.String->isNull()) - return true; - return false; + return Value.toString(); } -const QByteArray &toQValue::toByteArray() const +QString toQValue::toString() const { - if (Type != binaryType) - throw qApp->translate("toQValue", "Tried to convert non binary value to binary"); - return *Value.Array; + return Value.toString(); } -static char HexString[] = "0123456789ABCDEF"; - -QString toQValue::toUtf8(void) const +int toQValue::toInt() const { - switch (Type) - { - case nullType: - { - QString ret; - return ret; - } - case intType: - { - QString ret; - ret.setNum(Value.Int); - return ret; - } - case longType: - { - QString ret; - ret.setNum(Value.Long); - return ret; - } - case ulongType: - { - QString ret; - ret.setNum(Value.uLong); - return ret; - } - case doubleType: - { - QString ret; - if (Value.Double != int(Value.Double)) - { - ret.setNum(Value.Double); - return ret; - } - char buf[100]; - switch (NumberFormat) - { - default: - ret.setNum(Value.Double); - break; - case 1: - sprintf(buf, "%E", Value.Double); - ret = buf; - break; - case 2: - sprintf(buf, "%0.*f", NumberDecimals, Value.Double); - ret = buf; - break; - } - return ret; - } - case stringType: - return *(Value.String); - case binaryType: - { - QString ret(Value.Array->size()*2 + 1); - for (int i = 0;i < Value.Array->size();i++) - { - unsigned char c = (unsigned char)Value.Array->at(i); -// ret.at(i*2) = HexString[(c / 16) % 16]; -// ret.at(i*2 + 1) = HexString[c % 16]; - ret[i*2] = HexString[(c / 16) % 16]; - ret[i*2 + 1] = HexString[c % 16]; - } -// ret.at(Value.Array->size()*2) = 0; - ret[Value.Array->size()*2] = 0; - return ret; - } - } - throw qApp->translate("toQValue", "Unknown type of query value"); + return Value.toInt(); } -int toQValue::toInt(void) const +double toQValue::toDouble() const { - switch (Type) - { - case nullType: - return 0; - case intType: - return Value.Int; - case doubleType: - return int(Value.Double); - case longType: - return int(Value.Long); - case ulongType: - return int(Value.uLong); - case stringType: - return Value.String->toInt(); - case binaryType: - throw qApp->translate("toQValue", "Can't transform binary value to int"); - } - throw qApp->translate("toQValue", "Unknown type of query value"); + return Value.toDouble(); } -double toQValue::toDouble(void) const +qlonglong toQValue::toLong() const { - switch (Type) - { - case nullType: - return 0; - case intType: - return double(Value.Int); - case longType: - return double(Value.Long); - case ulongType: - return double(Value.uLong); - case doubleType: - return Value.Double; - case stringType: - return Value.String->toDouble(); - case binaryType: - throw qApp->translate("toQValue", "Can't transform binary value to double"); - } - throw qApp->translate("toQValue", "Unknown type of query value"); + return Value.toLongLong(); } -qlonglong toQValue::toLong(void) const +qulonglong toQValue::touLong() const { - switch (Type) - { - case longType: - return Value.Long; - case ulongType: - return (qlonglong) Value.uLong; - case nullType: - return (qlonglong) 0; - case intType: - return (qlonglong) Value.Int; - case doubleType: - return (qlonglong) Value.Double; - case stringType: - return Value.String->toLongLong(); - case binaryType: - throw qApp->translate("toQValue", "Can't transform binary value to long"); - } - throw qApp->translate("toQValue", "Unknown type of query value"); + return Value.toULongLong(); } -qulonglong toQValue::touLong(void) const -{ - switch (Type) - { - case longType: - return (qulonglong) Value.Long; - case ulongType: - return Value.uLong; - case nullType: - return (qulonglong) 0; - case intType: - return (qulonglong) Value.Int; - case doubleType: - return (qulonglong) Value.Double; - case stringType: - return Value.String->toULongLong(); - case binaryType: - throw qApp->translate("toQValue", "Can't transform binary value to ulong"); - } - throw qApp->translate("toQValue", "Unknown type of query value"); -} - void toQValue::setNumberFormat(int format, int decimals) { NumberFormat = format; @@ -487,46 +239,27 @@ } } -int toQValue::numberFormat(void) +int toQValue::numberFormat() { return NumberFormat; } -int toQValue::numberDecimals(void) +int toQValue::numberDecimals() { return NumberDecimals; } toQValue toQValue::fromVariant(const QVariant &val) { - switch (val.type()) - { - case QVariant::Invalid: - return toQValue(); - case QVariant::Bool: - return toQValue((int) val.toBool()); - case QVariant::Double: - return toQValue((double) val.toDouble()); - case QVariant::Int: - return toQValue((int) val.toInt()); - case QVariant::LongLong: - return toQValue((qlonglong) val.toLongLong()); - case QVariant::UInt: - return toQValue((qulonglong) val.toUInt()); - case QVariant::ULongLong: - return toQValue(val.toULongLong()); - case QVariant::ByteArray: - return toQValue::createBinary(val.toByteArray()); - default: - return toQValue(val.toString()); - } + toQValue ret; + ret.Value = val; + return ret; } toQValue toQValue::createBinary(const QByteArray &arr) { toQValue ret; - ret.Type = binaryType; - ret.Value.Array = new QByteArray(arr); + ret.Value = arr; return ret; } @@ -587,31 +320,44 @@ toQValue::operator QString() const { - switch (Type) + return Value.toString(); +} + + +QString toQValue::toSIsize() const +{ + if (this->isNull()) + return NULL; + + double size = toDouble(); + QString s = "%1"; + int i = 0; + + while (size / 1024 >= 10) { - case nullType: - return QString::null; - case doubleType: - return formatNumber(Value.Double); - case intType: - return QString::number(Value.Int); - case longType: - return QString::number(Value.Long); - case ulongType: - return QString::number(Value.uLong); - case stringType: - return *Value.String; - case binaryType: + i++; + size = size / 1024; + } + + switch (i) { - QString ret; - for (int i = 0;i < Value.Array->size();i++) - { - unsigned char c = (unsigned char)Value.Array->at(i); - ret += HexString[(c / 16) % 16]; - ret += HexString[c % 16]; - } - return ret; + case 0: + break; + case 1: + s.append("K"); + break; + case 2: + s.append("M"); + break; + case 3: + s.append("G"); + break; + case 4: + s.append("T"); + break; + default: + s.append("E"); } - } - throw qApp->translate("toQValue", "Unknown type of query value"); + + return s.arg(size, 0, 'f', 0); } Modified: trunk/tora/src/toqvalue.h =================================================================== --- trunk/tora/src/toqvalue.h 2008-08-02 16:41:07 UTC (rev 2924) +++ trunk/tora/src/toqvalue.h 2008-08-03 16:22:46 UTC (rev 2925) @@ -42,39 +42,24 @@ #include <list> #include <QString> +#include <QVariant> -class QVariant; - -/** This function is used to represent values that are passed to and from queries +/** + * This is now a wrapper around QVariant to avoid a lot of memory + * copies. Choosing not to subclass QVariant though -- it's a + * complicated class and it'd be easy to screw it up. + * */ class toQValue { - enum queryType - { - intType, - doubleType, - longType, - ulongType, - stringType, - binaryType, - nullType - } Type; + QVariant Value; - union queryValue - { - int Int; - double Double; - qlonglong Long; - qulonglong uLong; - QString *String; - QByteArray *Array; - } Value; - public: /** Create null value. */ toQValue(void); + /** Create integer value. * @param i Value. */ @@ -167,7 +152,7 @@ /** Get binary representation of value. Can only be called when the data is actually binary. */ - const QByteArray &toByteArray(void) const; + const QByteArray toByteArray(void) const; /** Convert value to a string. If binary convert to hex. */ @@ -175,48 +160,10 @@ /** Convert value to a string. If binary convert to hex. */ - QString toString() const - { - return QString(*this); - } + QString toString() const; - QString toSIsize() const - { - if (this->isNull()) return NULL; + QString toSIsize() const; - double size = toDouble(); - QString s = "%1"; - int i = 0; - - while (size / 1024 >= 10) - { - i++; - size = size / 1024; - } - - switch (i) - { - case 0: - break; - case 1: - s.append("K"); - break; - case 2: - s.append("M"); - break; - case 3: - s.append("G"); - break; - case 4: - s.append("T"); - break; - default: - s.append("E"); - } - - return s.arg(size, 0, 'f', 0); - } - /** Set numberformat. * @param format 0 = Default, 1 = Scientific, 2 = Fixed Decimals * @param decimals Number on decimals for fixed decimals. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <su...@us...> - 2008-08-04 13:01:34
|
Revision: 2929 http://tora.svn.sourceforge.net/tora/?rev=2929&view=rev Author: subik Date: 2008-08-04 13:01:39 +0000 (Mon, 04 Aug 2008) Log Message: ----------- Security Manager tool: the "Object Privileges" tab is working again. Modified Paths: -------------- trunk/tora/src/CMakeLists.txt trunk/tora/src/Makefile.am trunk/tora/src/tosecurity.cpp trunk/tora/src/tosecurity.h Added Paths: ----------- trunk/tora/src/tosecuritytreeitem.cpp trunk/tora/src/tosecuritytreeitem.h trunk/tora/src/tosecuritytreemodel.cpp trunk/tora/src/tosecuritytreemodel.h Modified: trunk/tora/src/CMakeLists.txt =================================================================== --- trunk/tora/src/CMakeLists.txt 2008-08-04 01:09:20 UTC (rev 2928) +++ trunk/tora/src/CMakeLists.txt 2008-08-04 13:01:39 UTC (rev 2929) @@ -171,6 +171,8 @@ toscripttreemodel.h tosearchreplace.h tosecurity.h + tosecuritytreemodel.h +# tosecuritytreeitem.h tosession.h tosgastatement.h tosgatrace.h @@ -310,6 +312,8 @@ toscripttreemodel.cpp tosearchreplace.cpp tosecurity.cpp + tosecuritytreemodel.cpp + tosecuritytreeitem.cpp tosession.cpp tosgastatement.cpp tosgatrace.cpp Modified: trunk/tora/src/Makefile.am =================================================================== --- trunk/tora/src/Makefile.am 2008-08-04 01:09:20 UTC (rev 2928) +++ trunk/tora/src/Makefile.am 2008-08-04 13:01:39 UTC (rev 2929) @@ -125,6 +125,8 @@ toscripttreeitem.cpp toscripttreeitem.h \ toscripttreemodel.cpp toscripttreemodel.h \ tosecurity.cpp tosecurity.h \ + tosecuritytreemodel.cpp tosecuritytreemodel.h \ + tosecuritytreeitem.cpp tosecuritytreeitem.h \ tosession.cpp tosession.h \ tosgatrace.cpp tosgatrace.h \ tosqledit.cpp tosqledit.h \ @@ -337,6 +339,7 @@ moc_toscript.cpp \ moc_tosearchreplace.cpp \ moc_tosecurity.cpp \ + moc_tosecuritytreemodel.cpp \ moc_tosession.cpp \ moc_tosgastatement.cpp \ moc_tosgatrace.cpp \ Modified: trunk/tora/src/tosecurity.cpp =================================================================== --- trunk/tora/src/tosecurity.cpp 2008-08-04 01:09:20 UTC (rev 2928) +++ trunk/tora/src/tosecurity.cpp 2008-08-04 13:01:39 UTC (rev 2929) @@ -142,30 +142,6 @@ "SELECT privilege, NVL(admin_option,'NO') FROM sys.dba_sys_privs WHERE grantee = :f1<char[100]>", "Get information about the system privileges a user has, should have same bindings and columns"); -static toSQL SQLObjectPrivs("toSecurity:ObjectPrivs", - "SELECT DECODE(:type<char[100]>,'FUNCTION','EXECUTE',\n" - " 'LIBRARY','EXECUTE',\n" - " 'PACKAGE','EXECUTE',\n" - " 'PROCEDURE','EXECUTE',\n" - " 'SEQUENCE','ALTER,SELECT',\n" - " 'TABLE','ALTER,DELETE,INDEX,INSERT,REFERENCES,SELECT,UPDATE',\n" - " 'TYPE','EXECUTE',\n" - " 'VIEW','DELETE,SELECT,INSERT,UPDATE',\n" - " 'OPERATOR','EXECUTE',\n" - " 'DIRECTORY','READ',\n" - " NULL) FROM sys.DUAL", - "Takes a type as parameter and return ',' separated list of privileges"); - -static toSQL SQLObjectGrant("toSecurity:ObjectGrant", - "SELECT owner,\n" - " table_name,\n" - " privilege,\n" - " grantable\n" - " FROM sys.dba_tab_privs\n" - " WHERE grantee = :f1<char[100]>", - "Get the privilege on objects for a user or role, " - "must have same columns and binds"); - static toSQL SQLRoleGrant("toSecurity:RoleGrant", "SELECT granted_role,\n" " admin_option,\n" @@ -844,281 +820,36 @@ }; toSecurityObject::toSecurityObject(QWidget *parent) - : toListView(parent) + : QTreeView(parent) { - addColumn(tr("Object")); - setRootIsDecorated(true); - update(); - setSorting(0); - connect(this, SIGNAL(clicked(toTreeWidgetItem *)), this, SLOT(changed(toTreeWidgetItem *))); + setObjectName("toSecurityObject"); + + m_model = new toSecurityTreeModel(this); + setModel(m_model); +// update(); } void toSecurityObject::update(void) { - clear(); - try - { - QString oType; - QString oOwner; - QString oName; - std::list<toConnection::objectName> &objectList = toCurrentConnection(this).objects(true); - std::map<QString, QStringList> TypeOptions; - toQuery typelst(toCurrentConnection(this)); - toTreeWidgetItem *typeItem = NULL; - toTreeWidgetItem *ownerItem = NULL; - toTreeWidgetItem *nameItem = NULL; - QStringList Options; - for (std::list<toConnection::objectName>::iterator i = objectList.begin();i != objectList.end();i++) - { - QString type = (*i).Type; - QString owner = (*i).Owner; - QString name = (*i).Name; - if (owner != oOwner) - { - oType = oName = QString::null; - typeItem = nameItem = NULL; - oOwner = owner; - ownerItem = new toResultViewItem(this, ownerItem, owner); - } - if (type != oType) - { - oName = QString::null; - nameItem = NULL; - oType = type; - if (TypeOptions.find(type) == TypeOptions.end()) - { - toQList args; - toPush(args, toQValue(type)); - typelst.execute(SQLObjectPrivs, args); - Options = typelst.readValue().toString().split(QString(",")); - TypeOptions[type] = Options; - } - else - Options = TypeOptions[type]; - - if (Options.count() > 0) - { - for (typeItem = ownerItem->firstChild();typeItem;typeItem = typeItem->nextSibling()) - { - if (typeItem->text(0) == type) - break; - } - if (!typeItem) - typeItem = new toResultViewItem(ownerItem, typeItem, type); - } - } - if (Options.count() > 0) - { - // causes crash. todo -// nameItem = new toResultViewItem(typeItem, nameItem, name); -// for (QStringList::Iterator i = Options.begin();i != Options.end();i++) -// { -// toTreeWidgetItem *item = new toResultViewCheck(nameItem, *i, toTreeWidgetCheck::CheckBox); -// item->setText(2, name); -// item->setText(3, owner); -// new toResultViewCheck(item, tr("Admin"), toTreeWidgetCheck::CheckBox); -// } - } - } - } - TOCATCH + m_model->setupModelData(toCurrentConnection(this).user()); } void toSecurityObject::eraseUser(bool all) { - toTreeWidgetItem *next = NULL; - for (toTreeWidgetItem *item = firstChild();item;item = next) - { - toResultViewCheck * chk = dynamic_cast<toResultViewCheck *>(item); - if (chk) - { - if (all) - chk->setOn(false); - chk->setText(1, QString::null); - } - if (all) - item->setOpen(false); - if (item->firstChild()) - next = item->firstChild(); - else if (item->nextSibling()) - next = item->nextSibling(); - else - { - next = item; - do - { - next = next->parent(); - } - while (next && !next->nextSibling()); - if (next) - next = next->nextSibling(); - } - } + m_model->setupModelData(toCurrentConnection(this).user()); } void toSecurityObject::changeUser(const QString &user) { - bool open = true; - eraseUser(); - try - { - std::map<QString, std::map<QString, std::map<QString, QString> > > privs; - toQuery grant(toCurrentConnection(this), SQLObjectGrant, user); - QString yes = "YES"; - QString admstr = "ADMIN"; - QString normalstr = "normal"; - while (!grant.eof()) - { - QString owner(grant.readValue()); - QString object(grant.readValue()); - QString priv(grant.readValue()); - QString admin(grant.readValue()); - - ((privs[owner])[object])[priv] = (admin == yes ? admstr : normalstr); - } - - for (toTreeWidgetItem *ownerItem = firstChild();ownerItem;ownerItem = ownerItem->nextSibling()) - { - for (toTreeWidgetItem * tmpitem = ownerItem->firstChild();tmpitem;tmpitem = tmpitem->nextSibling()) - { - for (toTreeWidgetItem * object = tmpitem->firstChild();object;object = object->nextSibling()) - { - for (toTreeWidgetItem * type = object->firstChild();type;type = type->nextSibling()) - { - QString t = ((privs[ownerItem->text(0)])[object->text(0)])[type->text(0)]; - if (!t.isNull()) - { - toResultViewCheck *chk = dynamic_cast<toResultViewCheck *>(type); - if (chk) - { - chk->setText(1, tr("ON")); - chk->setOn(true); - if (t == admstr) - { - toResultViewCheck *chld = dynamic_cast<toResultViewCheck *>(type->firstChild()); - if (chld) - { - chld->setText(1, tr("ON")); - chld->setOn(true); - if (open) - chk->setOpen(true); - } - } - } - if (open) - for (toTreeWidgetItem *par = chk->parent();par;par = par->parent()) - par->setOpen(true); - } - } - } - } - } - } - TOCATCH + m_model->setupModelData(user); } void toSecurityObject::sql(const QString &user, std::list<QString> &sqlLst) { - toTreeWidgetItem *next = NULL; - for (toTreeWidgetItem *item = firstChild();item;item = next) - { - toResultViewCheck * check = dynamic_cast<toResultViewCheck *>(item); - toResultViewCheck *chld = dynamic_cast<toResultViewCheck *>(item->firstChild()); - if (check) - { - QString sql; - QString what = item->text(0); - what += QString::fromLatin1(" ON \""); - what += item->text(3); - what += QString::fromLatin1("\".\""); - what += item->text(2); - what += QString::fromLatin1("\" "); - if (chld && chld->isOn() && chld->text(1).isEmpty()) - { - sql = QString::fromLatin1("GRANT "); - sql += what; - sql += QString::fromLatin1("TO \""); - sql += user; - sql += QString::fromLatin1("\" WITH GRANT OPTION"); - sqlLst.insert(sqlLst.end(), sql); - } - else if (check->isOn() && !item->text(1).isEmpty()) - { - if (chld && !chld->isOn() && !chld->text(1).isEmpty()) - { - sql = QString::fromLatin1("REVOKE "); - sql += what; - sql += QString::fromLatin1("FROM \""); - sql += user; - sql += QString::fromLatin1("\""); - sqlLst.insert(sqlLst.end(), sql); - - sql = QString::fromLatin1("GRANT "); - sql += what; - sql += QString::fromLatin1("TO \""); - sql += user; - sql += QString::fromLatin1("\""); - sqlLst.insert(sqlLst.end(), sql); - } - } - else if (check->isOn() && item->text(1).isEmpty()) - { - sql = QString::fromLatin1("GRANT "); - sql += what; - sql += QString::fromLatin1("TO \""); - sql += user; - sql += QString::fromLatin1("\""); - sqlLst.insert(sqlLst.end(), sql); - } - else if (!check->isOn() && !item->text(1).isEmpty()) - { - sql = QString::fromLatin1("REVOKE "); - sql += what; - sql += QString::fromLatin1("FROM \""); - sql += user; - sql += QString::fromLatin1("\""); - sqlLst.insert(sqlLst.end(), sql); - } - } - if (!check && item->firstChild()) - next = item->firstChild(); - else if (item->nextSibling()) - next = item->nextSibling(); - else - { - next = item; - do - { - next = next->parent(); - } - while (next && !next->nextSibling()); - if (next) - next = next->nextSibling(); - } - } + m_model->sql(user, sqlLst); } -void toSecurityObject::changed(toTreeWidgetItem *org) -{ - toResultViewCheck *item = dynamic_cast<toResultViewCheck *>(org); - if (item) - { - if (item->isOn()) - { - item = dynamic_cast<toResultViewCheck *>(item->parent()); - if (item) - item->setOn(true); - } - else - { - item = dynamic_cast<toResultViewCheck *>(item->firstChild()); - if (item) - item->setOn(false); - } - } -} - toSecuritySystem::toSecuritySystem(QWidget *parent) : toListView(parent) { Modified: trunk/tora/src/tosecurity.h =================================================================== --- trunk/tora/src/tosecurity.h 2008-08-04 01:09:20 UTC (rev 2928) +++ trunk/tora/src/tosecurity.h 2008-08-04 13:01:39 UTC (rev 2929) @@ -43,6 +43,7 @@ // due the toListView #include "toresultview.h" #include "ui_tosecurityquotaui.h" +#include "tosecuritytreemodel.h" #include <list> @@ -55,6 +56,7 @@ class toSecurityQuota; + class toSecuritySystem : public toListView { Q_OBJECT @@ -84,7 +86,7 @@ virtual void changed(toTreeWidgetItem *item); }; -class toSecurityObject : public toListView +class toSecurityObject : public QTreeView { Q_OBJECT @@ -94,8 +96,8 @@ void sql(const QString &user, std::list<QString> &sql); void eraseUser(bool all = true); void update(void); -public slots: - virtual void changed(toTreeWidgetItem *item); +private: + toSecurityTreeModel * m_model; }; class toSecurity : public toToolWidget Added: trunk/tora/src/tosecuritytreeitem.cpp =================================================================== --- trunk/tora/src/tosecuritytreeitem.cpp (rev 0) +++ trunk/tora/src/tosecuritytreeitem.cpp 2008-08-04 13:01:39 UTC (rev 2929) @@ -0,0 +1,116 @@ +/***** +* +* TOra - An Oracle Toolkit for DBA's and developers +* Copyright (C) 2003-2005 Quest Software, Inc +* Portions Copyright (C) 2005 Other Contributors +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; only version 2 of +* the License is valid for this program. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +* +* As a special exception, you have permission to link this program +* with the Oracle Client libraries and distribute executables, as long +* as you follow the requirements of the GNU GPL in regard to all of the +* software in the executable aside from Oracle client libraries. +* +* Specifically you are not permitted to link this program with the +* Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. +* And you are not permitted to distribute binaries compiled against +* these libraries without written consent from Quest Software, Inc. +* Observe that this does not disallow linking to the Qt Free Edition. +* +* You may link this product with any GPL'd Qt library such as Qt/Free +* +* All trademarks belong to their respective owners. +* +*****/ + +#include <QStringList> + +#include "tosecuritytreeitem.h" + + +toSecurityTreeItem::toSecurityTreeItem( + toSecurityTreeItem *parent, + const QString & data, + const QString & name, + const QString & type, + const QString & schema) + : m_changed(false), + m_checkable(false), + m_checked(Qt::Unchecked) +{ + parentItem = parent; + itemData = data; + itemName = name; + itemType = type; + itemSchema = schema; +} + +toSecurityTreeItem::~toSecurityTreeItem() +{ + qDeleteAll(childItems); +} + +void toSecurityTreeItem::appendChild(toSecurityTreeItem *item) +{ + childItems.append(item); +} + +toSecurityTreeItem *toSecurityTreeItem::child(int row) +{ + return childItems.value(row); +} + +int toSecurityTreeItem::childCount() const +{ + return childItems.count(); +} + +int toSecurityTreeItem::columnCount() const +{ + return 1;//itemData.count(); +} + +QString toSecurityTreeItem::data() const +{ + return itemData; +} + +QString toSecurityTreeItem::name() const +{ + return itemName; +} + +QString toSecurityTreeItem::type() const +{ + return itemType; +} + +QString toSecurityTreeItem::schema() const +{ + return itemSchema; +} + +toSecurityTreeItem *toSecurityTreeItem::parent() +{ + return parentItem; +} + +int toSecurityTreeItem::row() const +{ + if (parentItem) + return parentItem->childItems.indexOf(const_cast<toSecurityTreeItem*>(this)); + + return 0; +} Added: trunk/tora/src/tosecuritytreeitem.h =================================================================== --- trunk/tora/src/tosecuritytreeitem.h (rev 0) +++ trunk/tora/src/tosecuritytreeitem.h 2008-08-04 13:01:39 UTC (rev 2929) @@ -0,0 +1,108 @@ +/***** +* +* TOra - An Oracle Toolkit for DBA's and developers +* Copyright (C) 2003-2005 Quest Software, Inc +* Portions Copyright (C) 2005 Other Contributors +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; only version 2 of +* the License is valid for this program. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +* +* As a special exception, you have permission to link this program +* with the Oracle Client libraries and distribute executables, as long +* as you follow the requirements of the GNU GPL in regard to all of the +* software in the executable aside from Oracle client libraries. +* +* Specifically you are not permitted to link this program with the +* Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. +* And you are not permitted to distribute binaries compiled against +* these libraries without written consent from Quest Software, Inc. +* Observe that this does not disallow linking to the Qt Free Edition. +* +* You may link this product with any GPL'd Qt library such as Qt/Free +* +* All trademarks belong to their respective owners. +* +*****/ + +#ifndef TOSECURITYTREEITEM_H +#define TOSECURITYTREEITEM_H + +#include <QList> +#include <QVariant> + + +/*! \brief A leaf item for toSecurity, toSecurityObject. +DB object GRANTs are handled in this model. +Read Qt4 documentation to understand undocumented +methods in this class. +*/ +class toSecurityTreeItem +{ +public: + /*! + \param parent a parent item. When it's 0, it's a root one. + \param data main data - object name usually. + \param type object type. See SQL statements for its content. + \param schema a schema/owner name. See SQL statements for its content. + */ + toSecurityTreeItem( + toSecurityTreeItem *parent = 0, + const QString & data = 0, + const QString & name = 0, + const QString & type = 0, + const QString & schema = 0 + ); + ~toSecurityTreeItem(); + + void appendChild(toSecurityTreeItem *child); + + toSecurityTreeItem *child(int row); + int childCount() const; + int columnCount() const; + int row() const; + toSecurityTreeItem *parent(); + + //! Object display string + QString data() const; + //! Object name + QString name() const; + //! Object type + QString type() const; + //! Object owner/its schema name + QString schema() const; + + //! "Can be checked?" property handlign + bool isCheckable() { return m_checkable; }; + void setCheckable(bool state) { m_checkable = state; }; + //! Handle its check state + Qt::CheckState state() { return m_checked; }; + void setState(Qt::CheckState state) { m_checked = state; }; + //! "Is it modified by user?" property. + bool changed() { return m_changed; }; + void setChanged(bool v) { m_changed = v; }; + +private: + QList<toSecurityTreeItem*> childItems; + QString itemData; + QString itemName; + QString itemType; + QString itemSchema; + toSecurityTreeItem *parentItem; + + bool m_changed; + bool m_checkable; + Qt::CheckState m_checked; +}; + +#endif Added: trunk/tora/src/tosecuritytreemodel.cpp =================================================================== --- trunk/tora/src/tosecuritytreemodel.cpp (rev 0) +++ trunk/tora/src/tosecuritytreemodel.cpp 2008-08-04 13:01:39 UTC (rev 2929) @@ -0,0 +1,365 @@ +/***** +* +* TOra - An Oracle Toolkit for DBA's and developers +* Copyright (C) 2003-2005 Quest Software, Inc +* Portions Copyright (C) 2005 Other Contributors +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; only version 2 of +* the License is valid for this program. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +* +* As a special exception, you have permission to link this program +* with the Oracle Client libraries and distribute executables, as long +* as you follow the requirements of the GNU GPL in regard to all of the +* software in the executable aside from Oracle client libraries. +* +* Specifically you are not permitted to link this program with the +* Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. +* And you are not permitted to distribute binaries compiled against +* these libraries without written consent from Quest Software, Inc. +* Observe that this does not disallow linking to the Qt Free Edition. +* +* You may link this product with any GPL'd Qt library such as Qt/Free +* +* All trademarks belong to their respective owners. +* +*****/ + +#include "tosql.h" +#include "toconnection.h" +#include "tomain.h" +#include "toqvalue.h" +#include "utils.h" +#include "tosecuritytreemodel.h" + +/*static toSQL SQLObjectPrivs("toSecurity:ObjectPrivs", + "SELECT DECODE(:type<char[100]>,'FUNCTION','EXECUTE',\n" + " 'LIBRARY','EXECUTE',\n" + " 'PACKAGE','EXECUTE',\n" + " 'PROCEDURE','EXECUTE',\n" + " 'SEQUENCE','ALTER,SELECT',\n" + " 'TABLE','ALTER,DELETE,INDEX,INSERT,REFERENCES,SELECT,UPDATE',\n" + " 'TYPE','EXECUTE',\n" + " 'VIEW','DELETE,SELECT,INSERT,UPDATE',\n" + " 'OPERATOR','EXECUTE',\n" + " 'DIRECTORY','READ',\n" + " NULL) FROM sys.DUAL", + "Takes a type as parameter and return ',' separated list of privileges");*/ +static toSQL SQLObjectPrivs("toSecurity:ObjectPrivs", + "SELECT 'FUNCTION','EXECUTE' from dual\n" + " UNION ALL\n" + "SELECT 'LIBRARY','EXECUTE' from dual\n" + " UNION ALL\n" + "SELECT 'PACKAGE','EXECUTE' from dual\n" + " UNION ALL\n" + "SELECT 'PROCEDURE','EXECUTE' from dual\n" + " UNION ALL\n" + "SELECT 'SEQUENCE','ALTER,SELECT' from dual\n" + " UNION ALL\n" + "SELECT 'TABLE','ALTER,DELETE,INDEX,INSERT,REFERENCES,SELECT,UPDATE' from dual\n" + " UNION ALL\n" + "SELECT 'TYPE','EXECUTE' from dual\n" + " UNION ALL\n" + "SELECT 'VIEW','DELETE,SELECT,INSERT,UPDATE' from dual\n" + " UNION ALL\n" + "SELECT 'OPERATOR','EXECUTE' from dual\n" + " UNION ALL\n" + "SELECT 'DIRECTORY','READ' from dual", + "Returns mapping of TYPE-supported acces right"); + +static toSQL SQLObjectGrant("toSecurity:ObjectGrant", + "SELECT owner,\n" + " table_name,\n" + " privilege,\n" + " grantable,\n" + " hierarchy\n" + " FROM sys.dba_tab_privs\n" + " WHERE grantee = :f1<char[100]>", + "Get the privilege on objects for a user or role, " + "must have same columns and binds"); + + +toSecurityTreeModel::toSecurityTreeModel(QObject *parent) + : QAbstractItemModel(parent) +{ + rootItem = new toSecurityTreeItem(); + + // read common object type vs its privs mapping + toQuery typelst(toCurrentConnection(this), SQLObjectPrivs); + QString key; + QStringList value; + while (!typelst.eof()) + { + key = typelst.readValueNull(); + value = typelst.readValueNull().toString().split(","); + m_SQLObjectPrivs[key] = value; + } +} + +toSecurityTreeModel::~toSecurityTreeModel() +{ + if (rootItem) + delete rootItem; +} + +int toSecurityTreeModel::columnCount(const QModelIndex &parent) const +{ + if (parent.isValid()) + return static_cast<toSecurityTreeItem*>(parent.internalPointer())->columnCount(); + else + return rootItem->columnCount(); +} + +QVariant toSecurityTreeModel::data(const QModelIndex &index, int role) const +{ + if (!index.isValid()) + return QVariant(); + + toSecurityTreeItem *item = static_cast<toSecurityTreeItem*>(index.internalPointer()); + if (!item) + return QVariant(); + + if (role == Qt::CheckStateRole && item->isCheckable()) + return item->state(); + + if (role != Qt::DisplayRole) + return QVariant(); + + return item->data(/*index.column()*/); +} + +bool toSecurityTreeModel::setData(const QModelIndex & index, const QVariant & value, int role) +{ + if (!index.isValid()) + return false; + + toSecurityTreeItem *item = static_cast<toSecurityTreeItem*>(index.internalPointer()); + if (!item) + return false; + if (role == Qt::CheckStateRole) + { + Qt::CheckState state = (Qt::CheckState)value.toInt(); + item->setState(state); + item->setChanged(true); + // check parent if its child ("with admin opt") is currently checked + if (item->parent()->isCheckable() && state != Qt::Unchecked) + { + item->parent()->setState(state); + item->parent()->setChanged(true); + } + // uncheck "admin opt" child when its parent gets unchecked + if (item->childCount() == 2 && state == Qt::Unchecked && item->child(0)->isCheckable()) + { + item->child(0)->setState(state); + item->child(1)->setState(state); + } + return true; + } + return false; +} + +Qt::ItemFlags toSecurityTreeModel::flags(const QModelIndex &index) const +{ + if (!index.isValid()) + return 0; + + toSecurityTreeItem *item = static_cast<toSecurityTreeItem*>(index.internalPointer()); + if (item) + return Qt::ItemIsEnabled | /*Qt::ItemIsSelectable |*/ Qt::ItemIsUserCheckable; + + return Qt::ItemIsEnabled /*| Qt::ItemIsSelectable*/; +} + +QVariant toSecurityTreeModel::headerData(int section, Qt::Orientation orientation, + int role) const +{ + if (orientation == Qt::Horizontal && role == Qt::DisplayRole) + return tr("Objects"); + + return QVariant(); +} + +QModelIndex toSecurityTreeModel::index(int row, int column, const QModelIndex &parent) + const +{ + if (!hasIndex(row, column, parent)) + return QModelIndex(); + + toSecurityTreeItem *parentItem; + + if (!parent.isValid()) + parentItem = rootItem; + else + parentItem = static_cast<toSecurityTreeItem*>(parent.internalPointer()); + + toSecurityTreeItem *childItem = parentItem->child(row); + if (childItem) + return createIndex(row, column, childItem); + else + return QModelIndex(); +} + +QModelIndex toSecurityTreeModel::parent(const QModelIndex &index) const +{ + if (!index.isValid()) + return QModelIndex(); + + toSecurityTreeItem *childItem = static_cast<toSecurityTreeItem*>(index.internalPointer()); + toSecurityTreeItem *parentItem = childItem->parent(); + + if (parentItem == rootItem) + return QModelIndex(); + + return createIndex(parentItem->row(), 0, parentItem); +} + +int toSecurityTreeModel::rowCount(const QModelIndex &parent) const +{ + toSecurityTreeItem *parentItem; + if (parent.column() > 0) + return 0; + + if (!parent.isValid()) + parentItem = rootItem; + else + parentItem = static_cast<toSecurityTreeItem*>(parent.internalPointer()); + + return parentItem->childCount(); +} + +void toSecurityTreeModel::setupModelData(const QString & user) +{ + // clear old contents + m_objectList.clear(); + delete rootItem; + rootItem = new toSecurityTreeItem(); + + // a map to remember schema vs its root item + QMap<QString, toSecurityTreeItem*> ownerMap; + // key owner; value <typename, its item> + QMap<toSecurityTreeItem*,QMap<QString,toSecurityTreeItem*> > typeMap; + + // reading current grants status + QMap<QString, QMap<QString, QMap<QString, QString> > > privs; + QMap<QString, QMap<QString, QMap<QString, QString> > > hierarchyPrivs; + toQuery grant(toCurrentConnection(this), SQLObjectGrant, user); + QString yes = "YES"; + QString admstr = "ADMIN"; + QString normalstr = "normal"; + while (!grant.eof()) + { + QString owner(grant.readValue()); + QString object(grant.readValue()); + QString priv(grant.readValue()); + QString admin(grant.readValue()); + QString hierarchy(grant.readValue()); + + ((privs[owner])[object])[priv] = (admin == yes ? admstr : normalstr); + ((hierarchyPrivs[owner])[object])[priv] = (admin == yes ? admstr : normalstr); + } + + QString type; + QString owner; + QString name; + + std::list<toConnection::objectName> &objectList = toCurrentConnection(this).objects(true); + for (std::list<toConnection::objectName>::iterator i = objectList.begin(); + i != objectList.end(); + i++) + { + type = (*i).Type; + owner = (*i).Owner; + name = (*i).Name; + + // no granting user's own objects for himself + if (owner == user) + continue; + if (!ownerMap.contains(owner)) + { + toSecurityTreeItem *i = new toSecurityTreeItem(rootItem, owner); + ownerMap[owner] = i; + rootItem->appendChild(i); + } + toSecurityTreeItem * ownerItem = ownerMap[owner]; + if (!typeMap[ownerItem].contains(type)) + { + toSecurityTreeItem *i = new toSecurityTreeItem(ownerItem, type); + typeMap[ownerItem][type] = i; + ownerItem->appendChild(i); + } + + toSecurityTreeItem * objectItem = new toSecurityTreeItem(typeMap[ownerItem][type], name); + typeMap[ownerItem][type]->appendChild(objectItem); + + toSecurityTreeItem * grantItem; + foreach(QString right, m_SQLObjectPrivs[type]) + { + grantItem = new toSecurityTreeItem(objectItem, right, name, type, owner); + objectItem->appendChild(grantItem); + m_objectList.append(grantItem); + grantItem->setCheckable(true); + + toSecurityTreeItem * admin = new toSecurityTreeItem(grantItem, "WITH GRANT OPTION"); + grantItem->appendChild(admin); + admin->setCheckable(true); + if (privs.contains(owner) && privs[owner].contains(name) + && privs[owner][name].contains(right)) + { + grantItem->setState(Qt::Checked); + if (((privs[owner])[name])[right] == admstr) + admin->setState(Qt::Checked); + } + + if (right != "SELECT") + continue; + // hierarchy option is only for SELECTs + toSecurityTreeItem * hierarchyOption = new toSecurityTreeItem(grantItem, "WITH HIERARCHY OPTION"); + grantItem->appendChild(hierarchyOption); + hierarchyOption->setCheckable(true); + if (hierarchyPrivs.contains(owner) && hierarchyPrivs[owner].contains(name)) + { +// grantItem->setState(Qt::Checked); + if (((hierarchyPrivs[owner])[name])[right] == admstr) + hierarchyOption->setState(Qt::Checked); + } + } + } + + reset(); +} + +void toSecurityTreeModel::sql(const QString &user, std::list<QString> &sqlLst) +{ + QString grant("GRANT %1 ON %2 TO %3"); + QString revoke("REVOKE %1 ON %2 FROM %3"); + + foreach (toSecurityTreeItem *i, m_objectList) + { + if (!i->changed()) + continue; + + QString addons; + if (i->state() == Qt::Checked) + { + addons = ""; + for (int j = 0; j < i->childCount(); ++j) + { + if (i->child(j)->isCheckable() && i->child(j)->state() == Qt::Checked) + addons += "\n" + i->child(j)->data(); + } + sqlLst.push_back(grant.arg(i->data()).arg(i->name()).arg(user) + addons); + } + else + sqlLst.push_back(revoke.arg(i->data()).arg(i->name()).arg(user)); + } +} \ No newline at end of file Added: trunk/tora/src/tosecuritytreemodel.h =================================================================== --- trunk/tora/src/tosecuritytreemodel.h (rev 0) +++ trunk/tora/src/tosecuritytreemodel.h 2008-08-04 13:01:39 UTC (rev 2929) @@ -0,0 +1,91 @@ +/***** +* +* TOra - An Oracle Toolkit for DBA's and developers +* Copyright (C) 2003-2005 Quest Software, Inc +* Portions Copyright (C) 2005 Other Contributors +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; only version 2 of +* the License is valid for this program. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +* +* As a special exception, you have permission to link this program +* with the Oracle Client libraries and distribute executables, as long +* as you follow the requirements of the GNU GPL in regard to all of the +* software in the executable aside from Oracle client libraries. +* +* Specifically you are not permitted to link this program with the +* Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. +* And you are not permitted to distribute binaries compiled against +* these libraries without written consent from Quest Software, Inc. +* Observe that this does not disallow linking to the Qt Free Edition. +* +* You may link this product with any GPL'd Qt library such as Qt/Free +* +* All trademarks belong to their respective owners. +* +*****/ +#ifndef TOSECURITYTREEMODEL_H +#define TOSECURITYTREEMODEL_H + +#include <QAbstractItemModel> +#include <QModelIndex> +#include <QVariant> + +#include "tosecuritytreeitem.h" + + +/*! \brief A tree model for QTreeView used in toSecurity, toSecurityObject +Read Qt4 documenation to understand MVC used here. +*/ +class toSecurityTreeModel : public QAbstractItemModel +{ + Q_OBJECT + +public: + toSecurityTreeModel(QObject *parent = 0); + ~toSecurityTreeModel(); + + QVariant data(const QModelIndex &index, int role) const; + bool setData(const QModelIndex & index, const QVariant & value, int role = Qt::EditRole); + Qt::ItemFlags flags(const QModelIndex &index) const; + QVariant headerData(int section, Qt::Orientation orientation, + int role = Qt::DisplayRole) const; + QModelIndex index(int row, int column, + const QModelIndex &parent = QModelIndex()) const; + QModelIndex parent(const QModelIndex &index) const; + int rowCount(const QModelIndex &parent = QModelIndex()) const; + int columnCount(const QModelIndex &parent = QModelIndex()) const; + + /*! \brief Reset the model with newly readed data from database. + \param user a user name. It will use WHERE clause with this string. + The tree is built with (un)checkable items. Only the "grants" related + items are set as checkable. These chanckable items with set isChanged() + to true are used for SQL creation in the sql() method. + */ + void setupModelData(const QString & user); + + /*! \brief Construct GRANT/REVOKE script based on user's changes. + */ + void sql(const QString &user, std::list<QString> &sqlLst); + +private: + //! An universal root item. It's deleted and recreated in setupModelData() + toSecurityTreeItem *rootItem; + + //! Mapping of the OBJECT TYPE - its available privileges + QMap<QString,QStringList> m_SQLObjectPrivs; + //! A list with privilege items (only th 3rd level is stored there. + QList<toSecurityTreeItem*> m_objectList; +}; + +#endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mrj...@us...> - 2008-08-04 15:45:49
|
Revision: 2930 http://tora.svn.sourceforge.net/tora/?rev=2930&view=rev Author: mrjohnson0 Date: 2008-08-04 15:45:45 +0000 (Mon, 04 Aug 2008) Log Message: ----------- some warnings found with gcc 4.2.3 Modified Paths: -------------- trunk/tora/src/migratetool/connectionmodel.cpp trunk/tora/src/toqvalue.cpp trunk/tora/src/tosecuritytreemodel.cpp Modified: trunk/tora/src/migratetool/connectionmodel.cpp =================================================================== --- trunk/tora/src/migratetool/connectionmodel.cpp 2008-08-04 13:01:39 UTC (rev 2929) +++ trunk/tora/src/migratetool/connectionmodel.cpp 2008-08-04 15:45:45 UTC (rev 2930) @@ -96,4 +96,4 @@ return Qt::ItemIsSelectable | Qt::ItemIsEnabled; } -}; // namespace \ No newline at end of file +}; // namespace Modified: trunk/tora/src/toqvalue.cpp =================================================================== --- trunk/tora/src/toqvalue.cpp 2008-08-04 13:01:39 UTC (rev 2929) +++ trunk/tora/src/toqvalue.cpp 2008-08-04 15:45:45 UTC (rev 2930) @@ -121,6 +121,7 @@ const toQValue &toQValue::operator = (const toQValue & copy) { Value = copy.Value; + return *this; } bool toQValue::isNumber() const @@ -178,8 +179,6 @@ return Value.toByteArray(); } -static char HexString[] = "0123456789ABCDEF"; - QString toQValue::toUtf8() const { return Value.toString(); Modified: trunk/tora/src/tosecuritytreemodel.cpp =================================================================== --- trunk/tora/src/tosecuritytreemodel.cpp 2008-08-04 13:01:39 UTC (rev 2929) +++ trunk/tora/src/tosecuritytreemodel.cpp 2008-08-04 15:45:45 UTC (rev 2930) @@ -362,4 +362,4 @@ else sqlLst.push_back(revoke.arg(i->data()).arg(i->name()).arg(user)); } -} \ No newline at end of file +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mrj...@us...> - 2008-08-05 05:38:51
|
Revision: 2931 http://tora.svn.sourceforge.net/tora/?rev=2931&view=rev Author: mrjohnson0 Date: 2008-08-05 05:39:00 +0000 (Tue, 05 Aug 2008) Log Message: ----------- remove old lock from commmit() and release() these shouldn't be needed anymore. change connection pool to wait for commit and release by default. this seems to solve some crashes when abusing the schema browser. Modified Paths: -------------- trunk/tora/src/toconnection.cpp trunk/tora/src/toconnectionpool.cpp trunk/tora/src/toconnectionpool.h Modified: trunk/tora/src/toconnection.cpp =================================================================== --- trunk/tora/src/toconnection.cpp 2008-08-04 15:45:45 UTC (rev 2930) +++ trunk/tora/src/toconnection.cpp 2008-08-05 05:39:00 UTC (rev 2931) @@ -807,8 +807,6 @@ void toConnection::commit(toConnectionSub *sub) { toBusy busy; - toLocker lock(Lock); - Connection->commit(sub); } @@ -821,8 +819,6 @@ void toConnection::rollback(toConnectionSub *sub) { toBusy busy; - toLocker lock(Lock); - Connection->rollback(sub); } Modified: trunk/tora/src/toconnectionpool.cpp =================================================================== --- trunk/tora/src/toconnectionpool.cpp 2008-08-04 15:45:45 UTC (rev 2930) +++ trunk/tora/src/toconnectionpool.cpp 2008-08-05 05:39:00 UTC (rev 2931) @@ -325,13 +325,25 @@ } -void toConnectionPool::commit() { - (new toRunnableThread(new toConnectionPoolExec(this, toConnectionPoolExec::Commit)))->start(); +void toConnectionPool::commit(bool wait) { + toConnectionPoolExec *ex = new toConnectionPoolExec( + this, + toConnectionPoolExec::Commit); + if(!wait) + (new toRunnableThread(ex))->start(); + else + ex->run(); } -void toConnectionPool::rollback() { - (new toRunnableThread(new toConnectionPoolExec(this, toConnectionPoolExec::Rollback)))->start(); +void toConnectionPool::rollback(bool wait) { + toConnectionPoolExec *ex = new toConnectionPoolExec( + this, + toConnectionPoolExec::Rollback); + if(!wait) + (new toRunnableThread(ex))->start(); + else + ex->run(); } Modified: trunk/tora/src/toconnectionpool.h =================================================================== --- trunk/tora/src/toconnectionpool.h 2008-08-04 15:45:45 UTC (rev 2930) +++ trunk/tora/src/toconnectionpool.h 2008-08-05 05:39:00 UTC (rev 2931) @@ -247,14 +247,14 @@ * Commit connections that are not busy * */ - void commit(void); + void commit(bool wait = true); /** * Rollback connections that are not busy * */ - void rollback(void); + void rollback(bool wait = true); /** This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <su...@us...> - 2008-08-06 13:06:02
|
Revision: 2935 http://tora.svn.sourceforge.net/tora/?rev=2935&view=rev Author: subik Date: 2008-08-06 13:06:11 +0000 (Wed, 06 Aug 2008) Log Message: ----------- some freezes fixed (let's hope in it) Modified Paths: -------------- trunk/tora/src/todebug.cpp trunk/tora/src/todebug.h Modified: trunk/tora/src/todebug.cpp =================================================================== --- trunk/tora/src/todebug.cpp 2008-08-06 12:02:24 UTC (rev 2934) +++ trunk/tora/src/todebug.cpp 2008-08-06 13:06:11 UTC (rev 2935) @@ -426,6 +426,7 @@ toQuery init(Connection, SQLDebugInit); Parent.DebuggerStarted = true; + Parent.enableDebugger(true); toLocker lock (Parent.Lock); Parent.TargetID = init.readValue(); Parent.ChildSemaphore.up(); @@ -437,6 +438,7 @@ Parent.TargetLog += QString::fromLatin1("Couldn't start debugging:"); Parent.TargetLog += exc; Parent.DebuggerStarted = false; + Parent.enableDebugger(false); Parent.ChildSemaphore.up(); return ; } @@ -462,7 +464,7 @@ Parent.InputData.clear(); // To make sure data is not shared Parent.OutputData.clear(); } - Parent.StartedSemaphore.up(); +// Parent.StartedSemaphore.up(); if (sql.isEmpty()) break; @@ -504,6 +506,7 @@ TOCATCH toLocker lock (Parent.Lock); Parent.DebuggerStarted = false; + Parent.enableDebugger(false); Parent.TargetLog += QString::fromLatin1("Closing debug session\n"); Parent.TargetThread = NULL; Parent.ChildSemaphore.up(); @@ -866,7 +869,7 @@ TargetSQL = toDeepCopy(sql); // Deep copy of SQL TargetSemaphore.up(); // Go go power rangers! } - StartedSemaphore.down(); +// StartedSemaphore.down(); if (sync() >= 0 && RunningTarget) continueExecution(TO_BREAK_ANY_CALL); } @@ -1713,7 +1716,7 @@ void toDebug::executeInTarget(const QString &str, toQList ¶ms) { -// qDebug() << "toDebug::executeInTarget 1"; +// qDebug() << "toDebug::executeInTarget 1" << str; toBusy busy; { toLocker lock (Lock); @@ -1721,7 +1724,7 @@ InputData = params; TargetSemaphore.up(); } - StartedSemaphore.down(); +// StartedSemaphore.down(); int ret = sync(); while (ret >= 0 && ret != TO_REASON_EXIT && ret != TO_REASON_KNL_EXIT && RunningTarget) @@ -1918,6 +1921,23 @@ } +void toDebug::enableDebugger(bool enable) +{ + executeAct->setEnabled(enable); + stopAct->setEnabled(enable); + stepAct->setEnabled(enable); + nextAct->setEnabled(enable); + returnAct->setEnabled(enable); + debugPaneAct->setEnabled(enable); + nextErrorAct->setEnabled(enable); + previousErrorAct->setEnabled(enable); + toggleBreakAct->setEnabled(enable); + disableBreakAct->setEnabled(enable); + addWatchAct->setEnabled(enable); + deleteWatchAct->setEnabled(enable); + changeWatchAct->setEnabled(enable); +} + void toDebug::createActions(void) { refreshAct = new QAction(QIcon(QPixmap(const_cast<const char**>(refresh_xpm))), Modified: trunk/tora/src/todebug.h =================================================================== --- trunk/tora/src/todebug.h 2008-08-06 12:02:24 UTC (rev 2934) +++ trunk/tora/src/todebug.h 2008-08-06 13:06:11 UTC (rev 2935) @@ -177,6 +177,11 @@ // End of lock stuff toTimer StartTimer; + /*! \brief Enable/disable debugging related actions (steps etc.). + It's set to false when DBMS_DEBUG related calls fail. + */ + void enableDebugger(bool); + class targetTask : public toTask { toDebug &Parent; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <su...@us...> - 2008-08-08 14:44:13
|
Revision: 2936 http://tora.svn.sourceforge.net/tora/?rev=2936&view=rev Author: subik Date: 2008-08-08 14:44:17 +0000 (Fri, 08 Aug 2008) Log Message: ----------- woohoo! we can compile on macos! Modified Paths: -------------- trunk/tora/src/toaboutui.ui trunk/tora/src/todatabasesettingui.ui trunk/tora/src/todebugwatch.ui trunk/tora/src/todroptablespaceui.ui trunk/tora/src/toeditextensiongotoui.ui trunk/tora/src/toglobalsettingui.ui trunk/tora/src/tohelpaddfileui.ui trunk/tora/src/tohelpsetupui.ui trunk/tora/src/tooraclesettingui.ui trunk/tora/src/topreferencesui.ui trunk/tora/src/toresultlistformatui.ui trunk/tora/src/tosearchreplaceui.ui trunk/tora/src/tosecurityroleui.ui trunk/tora/src/tosecurityuserui.ui trunk/tora/src/tostorageprefsui.ui trunk/tora/src/totemplateaddfileui.ui trunk/tora/src/totemplatesetupui.ui trunk/tora/src/totoolsettingui.ui trunk/tora/src/totuningsettingui.ui trunk/tora/src/toworksheetsetupui.ui Modified: trunk/tora/src/toaboutui.ui =================================================================== --- trunk/tora/src/toaboutui.ui 2008-08-06 13:06:11 UTC (rev 2935) +++ trunk/tora/src/toaboutui.ui 2008-08-08 14:44:17 UTC (rev 2936) @@ -73,7 +73,6 @@ </item> </layout> </widget> - <pixmapfunction>qPixmapFromMimeSource</pixmapfunction> <tabstops> <tabstop>OkButton</tabstop> <tabstop>CancelButton</tabstop> Modified: trunk/tora/src/todatabasesettingui.ui =================================================================== --- trunk/tora/src/todatabasesettingui.ui 2008-08-06 13:06:11 UTC (rev 2935) +++ trunk/tora/src/todatabasesettingui.ui 2008-08-08 14:44:17 UTC (rev 2936) @@ -328,7 +328,6 @@ </layout> </widget> <layoutdefault spacing="6" margin="11" /> - <pixmapfunction>qPixmapFromMimeSource</pixmapfunction> <tabstops> <tabstop>AutoCommit</tabstop> <tabstop>ObjectCache</tabstop> Modified: trunk/tora/src/todebugwatch.ui =================================================================== --- trunk/tora/src/todebugwatch.ui 2008-08-06 13:06:11 UTC (rev 2935) +++ trunk/tora/src/todebugwatch.ui 2008-08-08 14:44:17 UTC (rev 2936) @@ -173,7 +173,6 @@ </item> </layout> </widget> - <pixmapfunction>qPixmapFromMimeSource</pixmapfunction> <tabstops> <tabstop>LocalScope_2</tabstop> <tabstop>Name</tabstop> Modified: trunk/tora/src/todroptablespaceui.ui =================================================================== --- trunk/tora/src/todroptablespaceui.ui 2008-08-06 13:06:11 UTC (rev 2935) +++ trunk/tora/src/todroptablespaceui.ui 2008-08-08 14:44:17 UTC (rev 2936) @@ -75,7 +75,6 @@ </widget> </widget> <layoutdefault spacing="6" margin="11" /> - <pixmapfunction>qPixmapFromMimeSource</pixmapfunction> <resources/> <connections> <connection> Modified: trunk/tora/src/toeditextensiongotoui.ui =================================================================== --- trunk/tora/src/toeditextensiongotoui.ui 2008-08-06 13:06:11 UTC (rev 2935) +++ trunk/tora/src/toeditextensiongotoui.ui 2008-08-08 14:44:17 UTC (rev 2936) @@ -85,7 +85,6 @@ </layout> </widget> <layoutdefault spacing="6" margin="11" /> - <pixmapfunction>qPixmapFromMimeSource</pixmapfunction> <tabstops> <tabstop>Line</tabstop> <tabstop>pushButton1</tabstop> Modified: trunk/tora/src/toglobalsettingui.ui =================================================================== --- trunk/tora/src/toglobalsettingui.ui 2008-08-06 13:06:11 UTC (rev 2935) +++ trunk/tora/src/toglobalsettingui.ui 2008-08-08 14:44:17 UTC (rev 2936) @@ -575,7 +575,6 @@ </layout> </widget> <layoutdefault spacing="6" margin="11" /> - <pixmapfunction>qPixmapFromMimeSource</pixmapfunction> <tabstops> <tabstop>CustomSQL</tabstop> <tabstop>SQLBrowse</tabstop> Modified: trunk/tora/src/tohelpaddfileui.ui =================================================================== --- trunk/tora/src/tohelpaddfileui.ui 2008-08-06 13:06:11 UTC (rev 2935) +++ trunk/tora/src/tohelpaddfileui.ui 2008-08-08 14:44:17 UTC (rev 2936) @@ -108,7 +108,6 @@ </item> </layout> </widget> - <pixmapfunction>qPixmapFromMimeSource</pixmapfunction> <tabstops> <tabstop>Root</tabstop> <tabstop>Filename</tabstop> Modified: trunk/tora/src/tohelpsetupui.ui =================================================================== --- trunk/tora/src/tohelpsetupui.ui 2008-08-06 13:06:11 UTC (rev 2935) +++ trunk/tora/src/tohelpsetupui.ui 2008-08-08 14:44:17 UTC (rev 2936) @@ -127,7 +127,6 @@ </item> </layout> </widget> - <pixmapfunction>qPixmapFromMimeSource</pixmapfunction> <customwidgets> <customwidget> <class>toTreeWidget</class> Modified: trunk/tora/src/tooraclesettingui.ui =================================================================== --- trunk/tora/src/tooraclesettingui.ui 2008-08-06 13:06:11 UTC (rev 2935) +++ trunk/tora/src/tooraclesettingui.ui 2008-08-08 14:44:17 UTC (rev 2936) @@ -192,7 +192,6 @@ </item> </layout> </widget> - <pixmapfunction>qPixmapFromMimeSource</pixmapfunction> <tabstops> <tabstop>CheckPoint</tabstop> <tabstop>DefaultDate</tabstop> Modified: trunk/tora/src/topreferencesui.ui =================================================================== --- trunk/tora/src/topreferencesui.ui 2008-08-06 13:06:11 UTC (rev 2935) +++ trunk/tora/src/topreferencesui.ui 2008-08-08 14:44:17 UTC (rev 2936) @@ -140,7 +140,6 @@ </layout> </widget> <layoutdefault spacing="6" margin="11" /> - <pixmapfunction>qPixmapFromMimeSource</pixmapfunction> <tabstops> <tabstop>TabSelection</tabstop> <tabstop>HelpButton</tabstop> Modified: trunk/tora/src/toresultlistformatui.ui =================================================================== --- trunk/tora/src/toresultlistformatui.ui 2008-08-06 13:06:11 UTC (rev 2935) +++ trunk/tora/src/toresultlistformatui.ui 2008-08-08 14:44:17 UTC (rev 2936) @@ -121,7 +121,6 @@ </item> </layout> </widget> - <pixmapfunction>qPixmapFromMimeSource</pixmapfunction> <tabstops> <tabstop>Format</tabstop> <tabstop>Separator</tabstop> Modified: trunk/tora/src/tosearchreplaceui.ui =================================================================== --- trunk/tora/src/tosearchreplaceui.ui 2008-08-06 13:06:11 UTC (rev 2935) +++ trunk/tora/src/tosearchreplaceui.ui 2008-08-08 14:44:17 UTC (rev 2936) @@ -281,7 +281,6 @@ </layout> </widget> <layoutdefault spacing="6" margin="11" /> - <pixmapfunction>qPixmapFromMimeSource</pixmapfunction> <tabstops> <tabstop>SearchText</tabstop> <tabstop>Exact</tabstop> Modified: trunk/tora/src/tosecurityroleui.ui =================================================================== --- trunk/tora/src/tosecurityroleui.ui 2008-08-06 13:06:11 UTC (rev 2935) +++ trunk/tora/src/tosecurityroleui.ui 2008-08-08 14:44:17 UTC (rev 2936) @@ -204,5 +204,4 @@ </item> </layout> </widget> - <pixmapfunction>qPixmapFromMimeSource</pixmapfunction> </ui> Modified: trunk/tora/src/tosecurityuserui.ui =================================================================== --- trunk/tora/src/tosecurityuserui.ui 2008-08-06 13:06:11 UTC (rev 2935) +++ trunk/tora/src/tosecurityuserui.ui 2008-08-08 14:44:17 UTC (rev 2936) @@ -271,7 +271,6 @@ </item> </layout> </widget> - <pixmapfunction>qPixmapFromMimeSource</pixmapfunction> <tabstops> <tabstop>Name</tabstop> <tabstop>Profile</tabstop> Modified: trunk/tora/src/tostorageprefsui.ui =================================================================== --- trunk/tora/src/tostorageprefsui.ui 2008-08-06 13:06:11 UTC (rev 2935) +++ trunk/tora/src/tostorageprefsui.ui 2008-08-08 14:44:17 UTC (rev 2936) @@ -110,7 +110,6 @@ </item> </layout> </widget> - <pixmapfunction>qPixmapFromMimeSource</pixmapfunction> <resources/> <connections/> </ui> Modified: trunk/tora/src/totemplateaddfileui.ui =================================================================== --- trunk/tora/src/totemplateaddfileui.ui 2008-08-06 13:06:11 UTC (rev 2935) +++ trunk/tora/src/totemplateaddfileui.ui 2008-08-08 14:44:17 UTC (rev 2936) @@ -108,7 +108,6 @@ </item> </layout> </widget> - <pixmapfunction>qPixmapFromMimeSource</pixmapfunction> <tabstops> <tabstop>Root</tabstop> <tabstop>Filename</tabstop> Modified: trunk/tora/src/totemplatesetupui.ui =================================================================== --- trunk/tora/src/totemplatesetupui.ui 2008-08-06 13:06:11 UTC (rev 2935) +++ trunk/tora/src/totemplatesetupui.ui 2008-08-08 14:44:17 UTC (rev 2936) @@ -121,7 +121,6 @@ </item> </layout> </widget> - <pixmapfunction>qPixmapFromMimeSource</pixmapfunction> <customwidgets> <customwidget> <class>toTreeWidget</class> Modified: trunk/tora/src/totoolsettingui.ui =================================================================== --- trunk/tora/src/totoolsettingui.ui 2008-08-06 13:06:11 UTC (rev 2935) +++ trunk/tora/src/totoolsettingui.ui 2008-08-08 14:44:17 UTC (rev 2936) @@ -102,7 +102,6 @@ </item> </layout> </widget> - <pixmapfunction>qPixmapFromMimeSource</pixmapfunction> <customwidgets> <customwidget> <class>toTreeWidget</class> Modified: trunk/tora/src/totuningsettingui.ui =================================================================== --- trunk/tora/src/totuningsettingui.ui 2008-08-06 13:06:11 UTC (rev 2935) +++ trunk/tora/src/totuningsettingui.ui 2008-08-08 14:44:17 UTC (rev 2936) @@ -91,7 +91,6 @@ </item> </layout> </widget> - <pixmapfunction>qPixmapFromMimeSource</pixmapfunction> <customwidgets> <customwidget> <class>toTreeWidget</class> Modified: trunk/tora/src/toworksheetsetupui.ui =================================================================== --- trunk/tora/src/toworksheetsetupui.ui 2008-08-06 13:06:11 UTC (rev 2935) +++ trunk/tora/src/toworksheetsetupui.ui 2008-08-08 14:44:17 UTC (rev 2936) @@ -217,7 +217,6 @@ </layout> </widget> <layoutdefault spacing="6" margin="11" /> - <pixmapfunction>qPixmapFromMimeSource</pixmapfunction> <tabstops> <tabstop>AutoSave</tabstop> <tabstop>CheckSave</tabstop> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <su...@us...> - 2008-08-14 12:39:00
|
Revision: 2938 http://tora.svn.sourceforge.net/tora/?rev=2938&view=rev Author: subik Date: 2008-08-14 12:39:07 +0000 (Thu, 14 Aug 2008) Log Message: ----------- new connection dialog is searchable now (all internals are moved to Qt4 MVC architecture). Modified Paths: -------------- trunk/tora/src/CMakeLists.txt trunk/tora/src/Makefile.am trunk/tora/src/migratetool/sqldeveloper.cpp trunk/tora/src/migratetool/sqldeveloper.h trunk/tora/src/migratetool/squirrelsql.cpp trunk/tora/src/migratetool/squirrelsql.h trunk/tora/src/migratetool/tora3.cpp trunk/tora/src/migratetool/tora3.h trunk/tora/src/toconnectionimport.cpp trunk/tora/src/toconnectionimport.h trunk/tora/src/tonewconnection.cpp trunk/tora/src/tonewconnection.h trunk/tora/src/tonewconnectionui.ui Added Paths: ----------- trunk/tora/src/toconnectionmodel.cpp trunk/tora/src/toconnectionmodel.h Removed Paths: ------------- trunk/tora/src/migratetool/connectionmodel.cpp trunk/tora/src/migratetool/connectionmodel.h Modified: trunk/tora/src/CMakeLists.txt =================================================================== --- trunk/tora/src/CMakeLists.txt 2008-08-12 08:56:53 UTC (rev 2937) +++ trunk/tora/src/CMakeLists.txt 2008-08-14 12:39:07 UTC (rev 2938) @@ -87,6 +87,7 @@ # toconfiguration.h toconnection.h toconnectionimport.h + toconnectionmodel.h toconnectionpool.h torunnable.h tonoblockquery.h @@ -206,8 +207,6 @@ # toworksheettext.h toworksheetwidget.h utils.h - # - migratetool/connectionmodel.h ) IF (ORACLE_FOUND) LIST(APPEND TORA_MOC_CLASSES tooraclesetting.h) @@ -232,6 +231,7 @@ toconnection.cpp toqvalue.cpp toconnectionimport.cpp + toconnectionmodel.cpp toconnectionpool.cpp torunnable.cpp tocurrent.cpp @@ -351,7 +351,6 @@ toworksheetwidget.cpp utils.cpp # - migratetool/connectionmodel.cpp migratetool/sqldeveloper.cpp migratetool/squirrelsql.cpp migratetool/tora3.cpp Modified: trunk/tora/src/Makefile.am =================================================================== --- trunk/tora/src/Makefile.am 2008-08-12 08:56:53 UTC (rev 2937) +++ trunk/tora/src/Makefile.am 2008-08-14 12:39:07 UTC (rev 2938) @@ -175,7 +175,7 @@ totableselect.cpp totableselect.h \ tovisualize.cpp tovisualize.h \ towaitevents.cpp towaitevents.h \ - migratetool/connectionmodel.cpp migratetool/connectionmodel.h \ + toconnectionmodel.cpp toconnectionmodel.h \ migratetool/sqldeveloper.cpp migratetool/sqldeveloper.h \ migratetool/squirrelsql.cpp migratetool/squirrelsql.h \ migratetool/tora3.cpp migratetool/tora3.h \ Deleted: trunk/tora/src/migratetool/connectionmodel.cpp =================================================================== --- trunk/tora/src/migratetool/connectionmodel.cpp 2008-08-12 08:56:53 UTC (rev 2937) +++ trunk/tora/src/migratetool/connectionmodel.cpp 2008-08-14 12:39:07 UTC (rev 2938) @@ -1,99 +0,0 @@ -/***** - * - * TOra - An Oracle Toolkit for DBA's and developers - * Copyright (C) 2003-2005 Quest Software, Inc - * Portions Copyright (C) 2005 Other Contributors - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; only version 2 of - * the License is valid for this program. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * As a special exception, you have permission to link this program - * with the Oracle Client libraries and distribute executables, as long - * as you follow the requirements of the GNU GPL in regard to all of the - * software in the executable aside from Oracle client libraries. - * - * Specifically you are not permitted to link this program with the - * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. - * And you are not permitted to distribute binaries compiled against - * these libraries without written consent from Quest Software, Inc. - * Observe that this does not disallow linking to the Qt Free Edition. - * - * You may link this product with any GPL'd Qt library such as Qt/Free - * - * All trademarks belong to their respective owners. - * - *****/ - -#include "connectionmodel.h" - - -namespace MigrateTool -{ - -ConnectionModel::ConnectionModel() -{ - m_data.clear(); -} - -void ConnectionModel::setupData(QList<toConnectionOptions> list) -{ - m_data.clear(); - m_data = list; - reset(); -} - -QVariant ConnectionModel::headerData(int section, Qt::Orientation orientation, int role) const -{ - if (role != Qt::DisplayRole) - return QVariant(); - if (orientation == Qt::Vertical) - return section + 1; - switch (section) - { - case 0 : return "Provider"; - case 1 : return "Host"; - case 2 : return "Database"; - case 3 : return "Username"; - case 4 : return "Schema"; - } - return "oops!"; -} - -QVariant ConnectionModel::data(const QModelIndex & index, int role) const -{ - if (!index.isValid()) - return QVariant(); - - if (role == Qt::DisplayRole) - { - toConnectionOptions opt = m_data.at(index.row()); - switch (index.column()) - { - case 0 : return opt.provider; - case 1 : return opt.host; - case 2 : return opt.database; - case 3 : return opt.username; - case 4 : return opt.schema; - default : return "oops!"; - } - } - return QVariant(); -} - -Qt::ItemFlags ConnectionModel::flags(const QModelIndex & index) const -{ - return Qt::ItemIsSelectable | Qt::ItemIsEnabled; -} - -}; // namespace Deleted: trunk/tora/src/migratetool/connectionmodel.h =================================================================== --- trunk/tora/src/migratetool/connectionmodel.h 2008-08-12 08:56:53 UTC (rev 2937) +++ trunk/tora/src/migratetool/connectionmodel.h 2008-08-14 12:39:07 UTC (rev 2938) @@ -1,76 +0,0 @@ -/***** - * - * TOra - An Oracle Toolkit for DBA's and developers - * Copyright (C) 2003-2005 Quest Software, Inc - * Portions Copyright (C) 2005 Other Contributors - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; only version 2 of - * the License is valid for this program. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * As a special exception, you have permission to link this program - * with the Oracle Client libraries and distribute executables, as long - * as you follow the requirements of the GNU GPL in regard to all of the - * software in the executable aside from Oracle client libraries. - * - * Specifically you are not permitted to link this program with the - * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. - * And you are not permitted to distribute binaries compiled against - * these libraries without written consent from Quest Software, Inc. - * Observe that this does not disallow linking to the Qt Free Edition. - * - * You may link this product with any GPL'd Qt library such as Qt/Free - * - * All trademarks belong to their respective owners. - * - *****/ - -#ifndef CONNECTIONMODEL_H -#define CONNECTIONMODEL_H - -#include <QAbstractTableModel> -#include "tonewconnection.h" - - -/*! \brief Display imported/available connections in -the Import dialog's view. -\author Petr Vanek <pe...@sc...> -*/ -namespace MigrateTool -{ - -class ConnectionModel : public QAbstractTableModel -{ - Q_OBJECT - - public: - ConnectionModel(); - - //! \brief Set the m_data and update all connected views. - void setupData(QList<toConnectionOptions> list); - //! \brief Bring m_data back to caller. - QList<toConnectionOptions> availableConnections() { return m_data; }; - - QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; - QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const; - int columnCount(const QModelIndex & parent = QModelIndex()) const { return 5; }; - int rowCount(const QModelIndex & parent = QModelIndex()) const { return m_data.count(); }; - Qt::ItemFlags flags(const QModelIndex & index) const; - - private: - QList<toConnectionOptions> m_data; -}; - -}; //namespace - -#endif Modified: trunk/tora/src/migratetool/sqldeveloper.cpp =================================================================== --- trunk/tora/src/migratetool/sqldeveloper.cpp 2008-08-12 08:56:53 UTC (rev 2937) +++ trunk/tora/src/migratetool/sqldeveloper.cpp 2008-08-14 12:39:07 UTC (rev 2938) @@ -47,14 +47,14 @@ namespace MigrateTool { -QList<toConnectionOptions> sqlDeveloper(QWidget * parent) +QMap<int,toConnectionOptions> sqlDeveloper(QWidget * parent) { QString fileName = QFileDialog::getOpenFileName(parent, "SQL Developer Connections", QDir::homePath(), "XML Files (*.xml);;All Files (*.*)"); - QList<toConnectionOptions> ret; + QMap<int,toConnectionOptions> ret; if (fileName.isNull()) return ret; @@ -69,6 +69,7 @@ bool isXML = false; toConnectionOptions opt; QString attr; + int key = 0; while (!xml.atEnd()) { @@ -85,7 +86,8 @@ else opt.provider = "Oracle (Instant Client)"; } - ret.append(opt); + ret[key] = opt; + ++key; opt.username = ""; opt.database = ""; opt.host = ""; Modified: trunk/tora/src/migratetool/sqldeveloper.h =================================================================== --- trunk/tora/src/migratetool/sqldeveloper.h 2008-08-12 08:56:53 UTC (rev 2937) +++ trunk/tora/src/migratetool/sqldeveloper.h 2008-08-14 12:39:07 UTC (rev 2938) @@ -50,7 +50,7 @@ OK, this code looks ugly but it's enough for "one time runners". \author Petr Vanek <pe...@sc...> */ -QList<toConnectionOptions> sqlDeveloper(QWidget * parent = 0); +QMap<int,toConnectionOptions> sqlDeveloper(QWidget * parent = 0); } // namespace Modified: trunk/tora/src/migratetool/squirrelsql.cpp =================================================================== --- trunk/tora/src/migratetool/squirrelsql.cpp 2008-08-12 08:56:53 UTC (rev 2937) +++ trunk/tora/src/migratetool/squirrelsql.cpp 2008-08-14 12:39:07 UTC (rev 2938) @@ -47,9 +47,10 @@ namespace MigrateTool { -QList<toConnectionOptions> squirrelSql(QWidget * parent) +QMap<int,toConnectionOptions> squirrelSql(QWidget * parent) { - QList<toConnectionOptions> ret; + QMap<int,toConnectionOptions> ret; + int key = 0; QString fileName = QFileDialog::getOpenFileName(parent, "SquirrelSQL Configuration file (SQLAliases23.xml)", @@ -77,7 +78,8 @@ { if (!opt.username.isEmpty() && !opt.provider.isEmpty()) { - ret.append(opt); + ret[key] = opt; + ++key; opt.username = ""; opt.database = ""; opt.host = ""; Modified: trunk/tora/src/migratetool/squirrelsql.h =================================================================== --- trunk/tora/src/migratetool/squirrelsql.h 2008-08-12 08:56:53 UTC (rev 2937) +++ trunk/tora/src/migratetool/squirrelsql.h 2008-08-14 12:39:07 UTC (rev 2938) @@ -50,7 +50,7 @@ OK, this code looks ugly but it's enough for "one time runners". \author Petr Vanek <pe...@sc...> */ -QList<toConnectionOptions> squirrelSql(QWidget * parent = 0); +QMap<int,toConnectionOptions> squirrelSql(QWidget * parent = 0); } // namespace Modified: trunk/tora/src/migratetool/tora3.cpp =================================================================== --- trunk/tora/src/migratetool/tora3.cpp 2008-08-12 08:56:53 UTC (rev 2937) +++ trunk/tora/src/migratetool/tora3.cpp 2008-08-14 12:39:07 UTC (rev 2938) @@ -54,9 +54,10 @@ std::set<QString> processOptions(const QString &str); -QList<toConnectionOptions> tora3(QWidget * parent) +QMap<int,toConnectionOptions> tora3(QWidget * parent) { - QList<toConnectionOptions> ret; + QMap<int,toConnectionOptions> ret; + int key = 0; // I can't get the stupid QFileDialog to show hidden files by // default, so I'm going to just try to open the file. @@ -75,7 +76,13 @@ QMap<QString, QString> config; loadMap(file.fileName(), config); - loadConnections(config, ret); + QList<toConnectionOptions> l; + loadConnections(config, l); + foreach(toConnectionOptions o, l) + { + ret[key] = o; + ++key; + } return ret; } Modified: trunk/tora/src/migratetool/tora3.h =================================================================== --- trunk/tora/src/migratetool/tora3.h 2008-08-12 08:56:53 UTC (rev 2937) +++ trunk/tora/src/migratetool/tora3.h 2008-08-14 12:39:07 UTC (rev 2938) @@ -51,7 +51,7 @@ * * \author Mike Johnson */ -QList<toConnectionOptions> tora3(QWidget *parent = 0); +QMap<int,toConnectionOptions> tora3(QWidget *parent = 0); } // namespace Modified: trunk/tora/src/toconnectionimport.cpp =================================================================== --- trunk/tora/src/toconnectionimport.cpp 2008-08-12 08:56:53 UTC (rev 2937) +++ trunk/tora/src/toconnectionimport.cpp 2008-08-14 12:39:07 UTC (rev 2938) @@ -41,6 +41,7 @@ #include "migratetool/squirrelsql.h" #include "migratetool/tora3.h" #include "toconnectionimport.h" +#include "toconnectionmodel.h" @@ -59,7 +60,7 @@ toolComboBox_changed(0); - availableModel = new MigrateTool::ConnectionModel(); + availableModel = new toConnectionModel(); tableView->setModel(availableModel); Modified: trunk/tora/src/toconnectionimport.h =================================================================== --- trunk/tora/src/toconnectionimport.h 2008-08-12 08:56:53 UTC (rev 2937) +++ trunk/tora/src/toconnectionimport.h 2008-08-14 12:39:07 UTC (rev 2938) @@ -39,7 +39,7 @@ #define TOCONNECTIONIMPORT_H #include "ui_toconnectionimportui.h" -#include "migratetool/connectionmodel.h" +#include "toconnectionmodel.h" /*! \brief GUI to load conections from the others tools. @@ -61,13 +61,13 @@ }; //! \brief Send all imported connections to the caller - QList<toConnectionOptions> availableConnections() + QMap<int,toConnectionOptions> availableConnections() { return availableModel->availableConnections(); }; private: - MigrateTool::ConnectionModel * availableModel; + toConnectionModel * availableModel; ToolUsed m_tool; Added: trunk/tora/src/toconnectionmodel.cpp =================================================================== --- trunk/tora/src/toconnectionmodel.cpp (rev 0) +++ trunk/tora/src/toconnectionmodel.cpp 2008-08-14 12:39:07 UTC (rev 2938) @@ -0,0 +1,113 @@ +/***** + * + * TOra - An Oracle Toolkit for DBA's and developers + * Copyright (C) 2003-2005 Quest Software, Inc + * Portions Copyright (C) 2005 Other Contributors + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; only version 2 of + * the License is valid for this program. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * As a special exception, you have permission to link this program + * with the Oracle Client libraries and distribute executables, as long + * as you follow the requirements of the GNU GPL in regard to all of the + * software in the executable aside from Oracle client libraries. + * + * Specifically you are not permitted to link this program with the + * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. + * And you are not permitted to distribute binaries compiled against + * these libraries without written consent from Quest Software, Inc. + * Observe that this does not disallow linking to the Qt Free Edition. + * + * You may link this product with any GPL'd Qt library such as Qt/Free + * + * All trademarks belong to their respective owners. + * + *****/ + +#include "toconnectionmodel.h" + + +toConnectionModel::toConnectionModel() +{ + m_data.clear(); +} + +void toConnectionModel::setupData(QMap<int,toConnectionOptions> list) +{ + m_data.clear(); + m_data = list; + reset(); +} + +void toConnectionModel::append(int ix, toConnectionOptions conn) +{ + m_data[ix] = conn; + reset(); +} + +// bool toConnectionModel::removeRow(int row, const QModelIndex & parent) +// { +// // beginRemoveRows(QModelIndex(), row, row + 1); +// QModelIndex ix = index(row, 0); +// int key = data(ix, Qt::DisplayRole).toInt(); +// bool ret = m_data.remove(key); +// // endRemoveRows(); +// return ret; +// } + +QVariant toConnectionModel::headerData(int section, Qt::Orientation orientation, int role) const +{ + if (role != Qt::DisplayRole) + return QVariant(); + if (orientation == Qt::Vertical) + return section + 1; + switch (section) + { + case 0 : return "#"; + case 1 : return "Provider"; + case 2 : return "Host"; + case 3 : return "Database"; + case 4 : return "Username"; + case 5 : return "Schema"; + } + return "oops!"; +} + +QVariant toConnectionModel::data(const QModelIndex & index, int role) const +{ + if (!index.isValid()) + return QVariant(); + + if (role == Qt::DisplayRole) + { + toConnectionOptions opt = m_data[index.row()]; + switch (index.column()) + { + case 0 : return index.row(); + case 1 : return opt.provider; + case 2 : return opt.host; + case 3 : return opt.database; + case 4 : return opt.username; + case 5 : return opt.schema; + default : return "oops!"; + } + } + return QVariant(); +} + +Qt::ItemFlags toConnectionModel::flags(const QModelIndex & index) const +{ + return Qt::ItemIsSelectable | Qt::ItemIsEnabled; +} + Added: trunk/tora/src/toconnectionmodel.h =================================================================== --- trunk/tora/src/toconnectionmodel.h (rev 0) +++ trunk/tora/src/toconnectionmodel.h 2008-08-14 12:39:07 UTC (rev 2938) @@ -0,0 +1,75 @@ +/***** + * + * TOra - An Oracle Toolkit for DBA's and developers + * Copyright (C) 2003-2005 Quest Software, Inc + * Portions Copyright (C) 2005 Other Contributors + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; only version 2 of + * the License is valid for this program. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * As a special exception, you have permission to link this program + * with the Oracle Client libraries and distribute executables, as long + * as you follow the requirements of the GNU GPL in regard to all of the + * software in the executable aside from Oracle client libraries. + * + * Specifically you are not permitted to link this program with the + * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. + * And you are not permitted to distribute binaries compiled against + * these libraries without written consent from Quest Software, Inc. + * Observe that this does not disallow linking to the Qt Free Edition. + * + * You may link this product with any GPL'd Qt library such as Qt/Free + * + * All trademarks belong to their respective owners. + * + *****/ + +#ifndef TOCONNECTIONMODEL_H +#define TOCONNECTIONMODEL_H + +#include <QAbstractTableModel> +#include "tonewconnection.h" + + +/*! \brief Display imported/available connections in +the Import dialog's view. +\author Petr Vanek <pe...@sc...> +*/ + +class toConnectionModel : public QAbstractTableModel +{ + Q_OBJECT + + public: + toConnectionModel(); + + //! \brief Set the m_data and update all connected views. + void setupData(QMap<int,toConnectionOptions> list); + void append(int ix, toConnectionOptions conn); +// bool removeRow(int row, const QModelIndex & parent = QModelIndex()); + //! \brief Bring m_data back to caller. + QMap<int,toConnectionOptions> availableConnections() { return m_data; }; + toConnectionOptions availableConnection(int ix) { return m_data[ix]; }; + + QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; + QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const; + int columnCount(const QModelIndex & parent = QModelIndex()) const { return 6; }; + int rowCount(const QModelIndex & parent = QModelIndex()) const { return m_data.count(); }; + Qt::ItemFlags flags(const QModelIndex & index) const; + + private: + QMap<int,toConnectionOptions> m_data; +}; + +#endif Modified: trunk/tora/src/tonewconnection.cpp =================================================================== --- trunk/tora/src/tonewconnection.cpp 2008-08-12 08:56:53 UTC (rev 2937) +++ trunk/tora/src/tonewconnection.cpp 2008-08-14 12:39:07 UTC (rev 2938) @@ -43,6 +43,7 @@ #include "toconnectionimport.h" #include "tomain.h" #include "totool.h" +#include "toconnectionmodel.h" #include "icons/trash.xpm" @@ -51,8 +52,9 @@ #include <QStringList> #include <QMenu> #include <QIcon> +#include <QSortFilterProxyModel> -#define MAX_HISTORY 50 +// #define MAX_HISTORY 50 static const QString ORACLE_INSTANT = "Oracle (Instant Client)"; static const QString ORACLE_TNS = "Oracle (TNS)"; @@ -66,6 +68,13 @@ setupUi(this); toHelp::connectDialog(this); + m_connectionModel = new toConnectionModel(); + m_proxyModel = new QSortFilterProxyModel(this); + m_proxyModel->setSourceModel(m_connectionModel); + m_proxyModel->setFilterCaseSensitivity(Qt::CaseInsensitive); + m_proxyModel->setFilterKeyColumn(-1); + Previous->setModel(m_proxyModel); + std::list<QString> lst = toConnectionProvider::providers(); Q_FOREACH(QString s, lst) @@ -109,32 +118,17 @@ this, SLOT(previousMenu(const QPoint &))); - Previous->setColumnCount(6); - Previous->setHorizontalHeaderItem(IndexColumn, new QTableWidgetItem(tr("Index"))); - Previous->setHorizontalHeaderItem(ProviderColumn, new QTableWidgetItem(tr("Provider"))); - Previous->setHorizontalHeaderItem(HostColumn, new QTableWidgetItem(tr("Host"))); - Previous->setHorizontalHeaderItem(DatabaseColumn, new QTableWidgetItem(tr("Database"))); - Previous->setHorizontalHeaderItem(UsernameColumn, new QTableWidgetItem(tr("Username"))); - Previous->setHorizontalHeaderItem(SchemaColumn, new QTableWidgetItem(tr("Schema"))); - - /* This should be changed to be a setting in preferences */ - Previous->sortItems(UsernameColumn, Qt::AscendingOrder); - Settings.beginGroup("connections"); readSettings(); - Previous->verticalHeader()->setVisible(false); Previous->horizontalHeader()->setStretchLastSection(true); - Previous->resizeRowsToContents(); - Previous->resizeColumnsToContents(); Previous->horizontalHeader()->setHighlightSections(false); - Previous->hideColumn(IndexColumn); - Previous->setCurrentCell(0, ProviderColumn); + Previous->verticalHeader()->setVisible(false); - connect(Previous, - SIGNAL(currentCellChanged(int, int, int, int)), + connect(Previous->selectionModel(), + SIGNAL(currentRowChanged(const QModelIndex &,const QModelIndex &)), this, - SLOT(previousCellChanged(int, int, int, int))); + SLOT(previousCellChanged(const QModelIndex &))); connect(Provider, SIGNAL(currentIndexChanged(int)), @@ -142,7 +136,7 @@ SLOT(changeProvider(int))); connect(Previous, - SIGNAL(cellDoubleClicked(int, int)), + SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(accept())); @@ -154,11 +148,11 @@ connect(ImportButton, SIGNAL(clicked()), this, SLOT(importButton_clicked())); + connect(searchEdit, SIGNAL(textEdited(const QString &)), + this, SLOT(searchEdit_textEdited(const QString &))); + // must make sure this gets called manually. changeProvider(Provider->currentIndex()); - // must call after connecting signals - loadPrevious(0); - Previous->setFocus(Qt::OtherFocusReason); } @@ -171,23 +165,23 @@ return p; } - void toNewConnection::readSettings() { + QMap<int, toConnectionOptions> OptionMap; restoreGeometry(Settings.value("geometry").toByteArray()); Previous->setSortingEnabled(false); - for (int pos = 0; pos < MAX_HISTORY; pos++) + + Settings.beginGroup("history"); + for (int pos = 0; pos < Settings.childGroups().count(); ++pos) { - Settings.beginGroup("history/" + QString::number(pos)); + Settings.beginGroup(/*"history/" +*/ QString::number(pos)); // X if (!Settings.contains("provider")) { - Settings.endGroup(); + Settings.endGroup(); // X break; } - Previous->setRowCount(pos + 1); - QString provider = Settings.value("provider", "").toString(); QString host = Settings.value("host", "").toString(); QString database = Settings.value("database", "").toString(); @@ -206,7 +200,7 @@ if (Settings.value(s, false).toBool()) options.insert(s); } - Settings.endGroup(); + Settings.endGroup(); // options toConnectionOptions opt( provider, @@ -218,66 +212,69 @@ Settings.value("port", 0).toInt(), options); OptionMap[pos] = opt; - - Previous->setItem(pos, IndexColumn, new QTableWidgetItem(QString::number(pos))); - Previous->setItem(pos, ProviderColumn, new QTableWidgetItem(provider)); - Previous->setItem(pos, HostColumn, new QTableWidgetItem(host)); - Previous->setItem(pos, DatabaseColumn, new QTableWidgetItem(database)); - Previous->setItem(pos, UsernameColumn, new QTableWidgetItem(username)); - Previous->setItem(pos, SchemaColumn, new QTableWidgetItem(schema)); - - Settings.endGroup(); + Settings.endGroup(); // X } + Settings.endGroup(); // history + m_connectionModel->setupData(OptionMap); + Previous->resizeColumnsToContents(); Previous->setSortingEnabled(true); + Previous->hideColumn(0); } -void toNewConnection::writeSettings() +void toNewConnection::writeSettings(bool checkHistory) { + int r = 0; Settings.setValue("geometry", saveGeometry()); Settings.remove("history"); - Settings.beginGroup("history/0"); - Settings.setValue("provider", Provider->currentText()); - Settings.setValue("username", Username->text()); - Settings.setValue("password", toObfuscate(Password->text())); - Settings.setValue("host", Host->currentText()); - Settings.setValue("port", Port->value()); - Settings.setValue("database", Database->currentText()); - Settings.setValue("schema", Schema->text()); + if (!Provider->currentText().isEmpty() && checkHistory) + { + Settings.beginGroup("history/0"); + Settings.setValue("provider", Provider->currentText()); + Settings.setValue("username", Username->text()); + Settings.setValue("password", toObfuscate(Password->text())); + Settings.setValue("host", Host->currentText()); + Settings.setValue("port", Port->value()); + Settings.setValue("database", Database->currentText()); + Settings.setValue("schema", Schema->text()); - Settings.beginGroup("options"); - QList<QCheckBox *> widgets = OptionGroup->findChildren<QCheckBox *>(); - Q_FOREACH(QCheckBox *box, widgets) - Settings.setValue(box->text(), box->isChecked()); - Settings.endGroup(); - Settings.endGroup(); + Settings.beginGroup("options"); + QList<QCheckBox *> widgets = OptionGroup->findChildren<QCheckBox *>(); + Q_FOREACH(QCheckBox *box, widgets) + Settings.setValue(box->text(), box->isChecked()); + Settings.endGroup(); // options + Settings.endGroup(); // history/0 + ++r; + } // find history item with same options. will skip later. - int skip = findHistory(Provider->currentText(), + int skip = -1; + if (checkHistory) + { + skip = findHistory(Provider->currentText(), Username->text(), Host->currentText(), Database->currentText(), Schema->text()); + } - int skipped = 0; - for (int row = 0; row < Previous->rowCount() && row < MAX_HISTORY; row++) + QMap<int,toConnectionOptions> c = m_connectionModel->availableConnections(); + foreach(int row, c.keys()) { - if (row == skip && ++skipped) + if (row == skip)// && ++skipped) continue; - toConnectionOptions &opt = - OptionMap[Previous->item(row, IndexColumn)->text().toInt()]; + toConnectionOptions &opt = c[row]; - Settings.beginGroup("history/" + QString::number(row + 1 - skipped)); - Settings.setValue("provider", Previous->item(row, ProviderColumn)->text()); - Settings.setValue("username", Previous->item(row, UsernameColumn)->text()); - Settings.setValue("host", Previous->item(row, HostColumn)->text()); - Settings.setValue("database", Previous->item(row, DatabaseColumn)->text()); - Settings.setValue("schema", Previous->item(row, SchemaColumn)->text()); - + Settings.beginGroup("history/" + QString::number(r/*row*/));// + 1 - skipped)); + Settings.setValue("provider", opt.provider); + Settings.setValue("username", opt.username); + Settings.setValue("host", opt.host); + Settings.setValue("database", opt.database); + Settings.setValue("schema", opt.schema); Settings.setValue("port", opt.port); Settings.setValue("password", toObfuscate(opt.password)); @@ -287,6 +284,7 @@ Settings.endGroup(); Settings.endGroup(); + ++r; } } @@ -297,33 +295,30 @@ const QString &database, const QString &schema) { - for (int row = 0; row < Previous->rowCount(); row++) + QMapIterator<int,toConnectionOptions> i(m_connectionModel->availableConnections()); + while (i.hasNext()) { - if (provider == Previous->item(row, ProviderColumn)->text() && - username == Previous->item(row, UsernameColumn)->text() && - host == Previous->item(row, HostColumn)->text() && - database == Previous->item(row, DatabaseColumn)->text() && - schema == Previous->item(row, SchemaColumn)->text() ) - return row; + i.next(); + toConnectionOptions opt = i.value(); + if (provider == opt.provider && + username == opt.username && + host == opt.host && + database == opt.database && + schema == opt.schema) + return i.key(); } - return -1; } - -void toNewConnection::loadPrevious(int row) +void toNewConnection::loadPrevious(const QModelIndex & current) { - QTableWidgetItem *item = Previous->item(row, IndexColumn); - if (!item) + if (!current.isValid()) return; - bool ok; - int index = item->text().toInt(&ok); - if (!ok) - return; + QModelIndex baseIndex = m_proxyModel->index(current.row(), 0); + int index = m_proxyModel->data(baseIndex, Qt::DisplayRole).toInt(); + toConnectionOptions opt = m_connectionModel->availableConnection(index);// OptionMap[index]; - toConnectionOptions &opt = OptionMap[index]; - Provider->setCurrentIndex(Provider->findText(opt.provider)); Host->lineEdit()->setText(opt.host); Database->lineEdit()->setText(opt.database); @@ -356,16 +351,9 @@ } -void toNewConnection::previousCellChanged(int currentRow, - int currentColumn, - int previousRow, - int previousColumn) +void toNewConnection::previousCellChanged(const QModelIndex & current) { - Q_UNUSED(currentColumn); - Q_UNUSED(previousColumn); - - if (currentRow != previousRow) - loadPrevious(currentRow); + loadPrevious(current); } @@ -503,30 +491,19 @@ Previous->setSortingEnabled(false); - // rows in gui - int pos = Previous->rowCount(); // find latest id (max+1) - QList<int> keys = OptionMap.keys(); + QList<int> keys = m_connectionModel->availableConnections().keys(); qSort(keys); int max = 0; - if(keys.count() > 0) + if (keys.count() > 0) max = keys.at(keys.count()-1) + 1; - foreach (toConnectionOptions opt, dia.availableConnections()) + foreach (toConnectionOptions opt, dia.availableConnections().values()) { if (findHistory(opt.provider, opt.username, opt.host, opt.database, opt.schema) != -1) continue; - Previous->setRowCount(pos + 1); - OptionMap[max] = opt; - - Previous->setItem(pos, IndexColumn, new QTableWidgetItem(QString::number(max))); - Previous->setItem(pos, ProviderColumn, new QTableWidgetItem(opt.provider)); - Previous->setItem(pos, HostColumn, new QTableWidgetItem(opt.host)); - Previous->setItem(pos, DatabaseColumn, new QTableWidgetItem(opt.database)); - Previous->setItem(pos, UsernameColumn, new QTableWidgetItem(opt.username)); - Previous->setItem(pos, SchemaColumn, new QTableWidgetItem(opt.schema)); - ++pos; + m_connectionModel->append(max, opt); ++max; } writeSettings(); @@ -534,6 +511,10 @@ Previous->setSortingEnabled(true); } +void toNewConnection::searchEdit_textEdited(const QString & text) +{ + m_proxyModel->setFilterWildcard(QString("*%1*").arg(text)); +} toConnection* toNewConnection::makeConnection(void) { @@ -634,10 +615,20 @@ PreviousContext->exec(QCursor::pos()); } - void toNewConnection::historyDelete() { - QModelIndexList list = Previous->selectionModel()->selectedIndexes(); - if (list.size() > 0) - Previous->removeRow(list.at(0).row()); +// QModelIndexList indexes = Previous->selectionModel()->selectedRows(); +// QModelIndex index; +// foreach(index, indexes) // loop through and remove them +// { +// int row = m_proxyModel->mapToSource(index).row(); +// m_connectionModel->removeRow(row, QModelIndex()); +// } + QMap<int,toConnectionOptions> v = m_connectionModel->availableConnections(); + int ix = m_proxyModel->data(m_proxyModel->index(Previous->currentIndex().row(), 0)).toInt(); + v.remove(ix); + m_connectionModel->setupData(v); + + writeSettings(false); + readSettings(); } Modified: trunk/tora/src/tonewconnection.h =================================================================== --- trunk/tora/src/tonewconnection.h 2008-08-12 08:56:53 UTC (rev 2937) +++ trunk/tora/src/tonewconnection.h 2008-08-14 12:39:07 UTC (rev 2938) @@ -51,6 +51,8 @@ #include <set> class toConnection; +class toConnectionModel; +class QSortFilterProxyModel; class QMenu; @@ -123,34 +125,22 @@ QMenu *PreviousContext; - // an enum to keep the columns in qtablewidget straight - enum PreviousColumns - { - IndexColumn = 0, - ProviderColumn, - HostColumn, - DatabaseColumn, - UsernameColumn, - SchemaColumn, - }; + toConnectionModel * m_connectionModel; + QSortFilterProxyModel * m_proxyModel; - // stores connection options by unique id. these are read from the - // settings class. - QMap<int, toConnectionOptions> OptionMap; - // connection created by dialog toConnection *NewConnection; QString realProvider(void); void readSettings(void); - void writeSettings(void); + void writeSettings(bool checkHistory = false); int findHistory(const QString &provider, const QString &username, const QString &host, const QString &database, const QString &schema); // fills form with data from previous connection at param row - void loadPrevious(int row); + void loadPrevious(const QModelIndex & current); toConnection* makeConnection(); @@ -173,15 +163,13 @@ * will load details from history. * */ - void previousCellChanged(int currentRow, - int currentColumn, - int previousRow, - int previousColumn); + void previousCellChanged(const QModelIndex & current); void previousMenu(const QPoint &pos); void historyDelete(void); void changeProvider(int current); void changeHost(void); void importButton_clicked(void); + void searchEdit_textEdited(const QString & text); }; Modified: trunk/tora/src/tonewconnectionui.ui =================================================================== --- trunk/tora/src/tonewconnectionui.ui 2008-08-12 08:56:53 UTC (rev 2937) +++ trunk/tora/src/tonewconnectionui.ui 2008-08-14 12:39:07 UTC (rev 2938) @@ -5,8 +5,8 @@ <rect> <x>0</x> <y>0</y> - <width>593</width> - <height>559</height> + <width>661</width> + <height>579</height> </rect> </property> <property name="windowTitle" > @@ -14,9 +14,9 @@ </property> <layout class="QGridLayout" name="gridLayout" > <item row="0" column="0" colspan="2" > - <layout class="QHBoxLayout" > + <layout class="QVBoxLayout" name="verticalLayout" > <item> - <layout class="QVBoxLayout" > + <layout class="QHBoxLayout" name="horizontalLayout" > <item> <widget class="QLabel" name="TextLabel2" > <property name="sizePolicy" > @@ -40,370 +40,393 @@ </widget> </item> <item> - <widget class="QTableWidget" name="Previous" > - <property name="editTriggers" > - <set>QAbstractItemView::NoEditTriggers</set> + <spacer name="horizontalSpacer" > + <property name="orientation" > + <enum>Qt::Horizontal</enum> </property> - <property name="dragDropOverwriteMode" > - <bool>false</bool> - </property> - <property name="dragDropMode" > - <enum>QAbstractItemView::NoDragDrop</enum> - </property> - <property name="alternatingRowColors" > - <bool>true</bool> - </property> - <property name="selectionMode" > - <enum>QAbstractItemView::SingleSelection</enum> - </property> - <property name="selectionBehavior" > - <enum>QAbstractItemView::SelectRows</enum> - </property> - <property name="showGrid" > - <bool>false</bool> - </property> - <property name="gridStyle" > - <enum>Qt::NoPen</enum> - </property> - <property name="sortingEnabled" > - <bool>true</bool> - </property> - </widget> - </item> - </layout> - </item> - <item> - <layout class="QVBoxLayout" > - <property name="spacing" > - <number>2</number> - </property> - <item> - <widget class="QLabel" name="ProviderLabel" > - <property name="sizePolicy" > - <sizepolicy vsizetype="Preferred" hsizetype="Minimum" > - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text" > - <string>Connection pro&vider</string> - </property> - <property name="wordWrap" > - <bool>false</bool> - </property> - <property name="buddy" > - <cstring>Provider</cstring> - </property> - </widget> - </item> - <item> - <widget class="QComboBox" name="Provider" > - <property name="sizePolicy" > - <sizepolicy vsizetype="Fixed" hsizetype="Minimum" > - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - </widget> - </item> - <item> - <widget class="QLabel" name="UsernameLabel" > - <property name="sizePolicy" > - <sizepolicy vsizetype="Fixed" hsizetype="Minimum" > - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="toolTip" > - <string>Username to connect with</string> - </property> - <property name="text" > - <string>&Username</string> - </property> - <property name="wordWrap" > - <bool>false</bool> - </property> - <property name="buddy" > - <cstring>Username</cstring> - </property> - </widget> - </item> - <item> - <widget class="QLineEdit" name="Username" > - <property name="sizePolicy" > - <sizepolicy vsizetype="Fixed" hsizetype="Minimum" > - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize" > + <property name="sizeHint" stdset="0" > <size> - <width>200</width> - <height>0</height> + <width>40</width> + <height>20</height> </size> </property> - </widget> + </spacer> </item> <item> - <widget class="QLabel" name="PasswordLabel" > - <property name="sizePolicy" > - <sizepolicy vsizetype="Minimum" hsizetype="Minimum" > - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="toolTip" > - <string>Password to connect with.</string> - </property> + <widget class="QLabel" name="label" > <property name="text" > - <string>&Password</string> + <string>Se&arch:</string> </property> - <property name="wordWrap" > - <bool>false</bool> - </property> <property name="buddy" > - <cstring>Password</cstring> + <cstring>searchEdit</cstring> </property> </widget> </item> <item> - <widget class="QLineEdit" name="Password" > - <property name="sizePolicy" > - <sizepolicy vsizetype="Fixed" hsizetype="Minimum" > - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="echoMode" > - <enum>QLineEdit::Password</enum> - </property> - </widget> + <widget class="QLineEdit" name="searchEdit" /> </item> + </layout> + </item> + <item> + <widget class="QTableView" name="Previous" > + <property name="editTriggers" > + <set>QAbstractItemView::NoEditTriggers</set> + </property> + <property name="dragDropOverwriteMode" > + <bool>false</bool> + </property> + <property name="dragDropMode" > + <enum>QAbstractItemView::NoDragDrop</enum> + </property> + <property name="alternatingRowColors" > + <bool>true</bool> + </property> + <property name="selectionMode" > + <enum>QAbstractItemView::SingleSelection</enum> + </property> + <property name="selectionBehavior" > + <enum>QAbstractItemView::SelectRows</enum> + </property> + <property name="showGrid" > + <bool>false</bool> + </property> + <property name="sortingEnabled" > + <bool>true</bool> + </property> + </widget> + </item> + </layout> + </item> + <item row="0" column="2" > + <layout class="QVBoxLayout" > + <property name="spacing" > + <number>2</number> + </property> + <item> + <widget class="QLabel" name="ProviderLabel" > + <property name="sizePolicy" > + <sizepolicy vsizetype="Preferred" hsizetype="Minimum" > + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text" > + <string>Connection pro&vider</string> + </property> + <property name="wordWrap" > + <bool>false</bool> + </property> + <property name="buddy" > + <cstring>Provider</cstring> + </property> + </widget> + </item> + <item> + <widget class="QComboBox" name="Provider" > + <property name="sizePolicy" > + <sizepolicy vsizetype="Fixed" hsizetype="Minimum" > + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="UsernameLabel" > + <property name="sizePolicy" > + <sizepolicy vsizetype="Fixed" hsizetype="Minimum" > + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="toolTip" > + <string>Username to connect with</string> + </property> + <property name="text" > + <string>&Username</string> + </property> + <property name="wordWrap" > + <bool>false</bool> + </property> + <property name="buddy" > + <cstring>Username</cstring> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="Username" > + <property name="sizePolicy" > + <sizepolicy vsizetype="Fixed" hsizetype="Minimum" > + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize" > + <size> + <width>200</width> + <height>0</height> + </size> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="PasswordLabel" > + <property name="sizePolicy" > + <sizepolicy vsizetype="Minimum" hsizetype="Minimum" > + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="toolTip" > + <string>Password to connect with.</string> + </property> + <property name="text" > + <string>&Password</string> + </property> + <property name="wordWrap" > + <bool>false</bool> + </property> + <property name="buddy" > + <cstring>Password</cstring> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="Password" > + <property name="sizePolicy" > + <sizepolicy vsizetype="Fixed" hsizetype="Minimum" > + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="echoMode" > + <enum>QLineEdit::Password</enum> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="HostLabel" > + <property name="sizePolicy" > + <sizepolicy vsizetype="Preferred" hsizetype="Minimum" > + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="toolTip" > + <string>Select the database ID to connect to.</string> + </property> + <property name="text" > + <string>&Host</string> + </property> + <property name="wordWrap" > + <bool>false</bool> + </property> + <property name="buddy" > + <cstring>Host</cstring> + </property> + </widget> + </item> + <item> + <widget class="QComboBox" name="Host" > + <property name="sizePolicy" > + <sizepolicy vsizetype="Fixed" hsizetype="Maximum" > + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize" > + <size> + <width>200</width> + <height>0</height> + </size> + </property> + <property name="editable" > + <bool>true</bool> + </property> + <property name="autoCompletion" > + <bool>true</bool> + </property> + <property name="duplicatesEnabled" > + <bool>false</bool> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="SchemaLabel" > + <property name="sizePolicy" > + <sizepolicy vsizetype="Fixed" hsizetype="Minimum" > + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="toolTip" > + <string>Schema to switch to</string> + </property> + <property name="text" > + <string>&Schema</string> + </property> + <property name="wordWrap" > + <bool>false</bool> + </property> + <property name="buddy" > + <cstring>Schema</cstring> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="Schema" > + <property name="sizePolicy" > + <sizepolicy vsizetype="Fixed" hsizetype="Minimum" > + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize" > + <size> + <width>200</width> + <height>0</height> + </size> + </property> + </widget> + </item> + <item> + <layout class="QHBoxLayout" > + <property name="spacing" > + <number>0</number> + </property> <item> - <widget class="QLabel" name="HostLabel" > - <property name="sizePolicy" > - <sizepolicy vsizetype="Preferred" hsizetype="Minimum" > - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> + <widget class="QLabel" name="PortLabel" > <property name="toolTip" > <string>Select the database ID to connect to.</string> </property> <property name="text" > - <string>&Host</string> + <string>P&ort</string> </property> <property name="wordWrap" > <bool>false</bool> </property> <property name="buddy" > - <cstring>Host</cstring> + <cstring>Port</cstring> </property> </widget> </item> <item> - <widget class="QComboBox" name="Host" > - <property name="sizePolicy" > - <sizepolicy vsizetype="Fixed" hsizetype="Maximum" > - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> + <widget class="QSpinBox" name="Port" > + <property name="maximum" > + <number>65535</number> </property> - <property name="minimumSize" > - <size> - <width>200</width> - <height>0</height> - </size> - </property> - <property name="editable" > - <bool>true</bool> - </property> - <property name="autoCompletion" > - <bool>true</bool> - </property> - <property name="duplicatesEnabled" > - <bool>false</bool> - </property> </widget> </item> - <item> - <widget class="QLabel" name="SchemaLabel" > - <property name="sizePolicy" > - <sizepolicy vsizetype="Fixed" hsizetype="Minimum" > - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="toolTip" > - <string>Schema to switch to</string> - </property> - <property name="text" > - <string>&Schema</string> - </property> - <property name="wordWrap" > - <bool>false</bool> - </property> - <property name="buddy" > - <cstring>Schema</cstring> - </property> - </widget> - </item> - <item> - <widget class="QLineEdit" name="Schema" > - <property name="sizePolicy" > - <sizepolicy vsizetype="Fixed" hsizetype="Minimum" > - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize" > - <size> - <width>200</width> - <height>0</height> - </size> - </property> - </widget> - </item> - <item> - <layout class="QHBoxLayout" > - <property name="spacing" > - <number>0</number> - </property> - <item> - <widget class="QLabel" name="PortLabel" > - <property name="toolTip" > - <string>Select the database ID to connect to.</string> - </property> - <property name="text" > - <string>P&ort</string> - </property> - <property name="wordWrap" > - <bool>false</bool> - </property> - <property name="buddy" > - <cstring>Port</cstring> - </property> - </widget> - </item> - <item> - <widget class="QSpinBox" name="Port" > - <property name="maximum" > - <number>65535</number> - </property> - </widget> - </item> - </layout> - </item> - <item> - <widget class="QLabel" name="TextLabel3" > - <property name="toolTip" > - <string>Select the database ID to connect to.</string> - </property> - <property name="text" > - <string>&Database</string> - </property> - <property name="wordWrap" > - <bool>false</bool> - </property> - <property name="textInteractionFlags" > - <set>Qt::NoTextInteraction</set> - </property> - <property name="buddy" > - <cstring>Database</cstring> - </property> - </widget> - </item> - <item> - <widget class="QComboBox" name="Database" > - <property name="sizePolicy" > - <sizepolicy vsizetype="Fixed" hsizetype="Minimum" > - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize" > - <size> - <width>200</width> - <height>0</height> - </size> - </property> - <property name="editable" > - <bool>true</bool> - </property> - <property name="autoCompletion" > - <bool>true</bool> - </property> - <property name="duplicatesEnabled" > - <bool>false</bool> - </property> - </widget> - </item> - <item> - <widget class="QGroupBox" name="OptionGroup" > - <property name="focusPolicy" > - <enum>Qt::NoFocus</enum> - </property> - <property name="title" > - <string>Options</string> - </property> - <layout class="QVBoxLayout" > - <property name="spacing" > - <number>3</number> + </layout> + </item> + <item> + <widget class="QLabel" name="TextLabel3" > + <property name="toolTip" > + <string>Select the database ID to connect to.</string> + </property> + <property name="text" > + <string>&Database</string> + </property> + <property name="wordWrap" > + <bool>false</bool> + </property> + <property name="textInteractionFlags" > + <set>Qt::NoTextInteraction</set> + </property> + <property name="buddy" > + <cstring>Database</cstring> + </property> + </widget> + </item> + <item> + <widget class="QComboBox" name="Database" > + <property name="sizePolicy" > + <sizepolicy vsizetype="Fixed" hsizetype="Minimum" > + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize" > + <size> + <width>200</width> + <height>0</height> + </size> + </property> + <property name="editable" > + <bool>true</bool> + </property> + <property name="autoCompletion" > + <bool>true</bool> + </property> + <property name="duplicatesEnabled" > + <bool>false</bool> + </property> + </widget> + </item> + <item> + <widget class="QGroupBox" name="OptionGroup" > + <property name="focusPolicy" > + <enum>Qt::NoFocus</enum> + </property> + <property name="title" > + <string>Options</string> + </property> + <layout class="QVBoxLayout" > + <property name="spacing" > + <number>3</number> + </property> + <property name="leftMargin" > + <number>6</number> + </property> + <property name="topMargin" > + <number>0</number> + </property> + <property name="rightMargin" > + <number>0</number> + </property> + <property name="bottomMargin" > + <number>0</number> + </property> + <item> + <widget class="QCheckBox" name="SqlNet" > + <property name="text" > + <string>SQL*&Net</string> </property> - <property name="leftMargin" > - <number>6</number> + <property name="checked" > + <bool>true</bool> </property> - <property name="topMargin" > - <number>0</number> + </widget> + </item> + <item> + <widget class="QCheckBox" name="SysDba" > + <property name=... [truncated message content] |
From: <mrj...@us...> - 2008-08-15 14:51:38
|
Revision: 2942 http://tora.svn.sourceforge.net/tora/?rev=2942&view=rev Author: mrjohnson0 Date: 2008-08-15 14:51:44 +0000 (Fri, 15 Aug 2008) Log Message: ----------- qsqlsub's lockDown and lockUp are too primitive and exception handling was not always correct. patch moves LockingPtr to tothread.h and reworks the qsqldatabase locking. this fixes some crashes mostly around commit and rollback (unprotected access). qsqldatabase is not thread safe. Modified Paths: -------------- trunk/tora/src/toconnectionpool.cpp trunk/tora/src/toconnectionpool.h trunk/tora/src/toeventquerytask.cpp trunk/tora/src/toqsqlconnection.cpp trunk/tora/src/tothread.h Modified: trunk/tora/src/toconnectionpool.cpp =================================================================== --- trunk/tora/src/toconnectionpool.cpp 2008-08-15 14:07:49 UTC (rev 2941) +++ trunk/tora/src/toconnectionpool.cpp 2008-08-15 14:51:44 UTC (rev 2942) @@ -40,6 +40,7 @@ #include "toconf.h" #include "toconnectionpool.h" #include "tosql.h" +#include "tothread.h" #include <QTimer> #include <QCoreApplication> @@ -135,7 +136,7 @@ toConnectionPool::toConnectionPool(toConnection *conn) : QObject(conn) { Connection = conn; - LockingPtr ptr(Pool, PoolLock); + LockingPtr<SubList> ptr(Pool, PoolLock); for(int i = 0; i < PreferredSize; i++) { PooledSub *psub = new PooledSub; @@ -161,7 +162,7 @@ toConnection *conn = Connection; Connection = 0; - LockingPtr ptr(Pool, PoolLock); + LockingPtr<SubList> ptr(Pool, PoolLock); for(int mem = 0; mem < ptr->size(); mem++) { PooledSub *psub = (*ptr)[mem]; @@ -185,7 +186,7 @@ if(!Connection) return; - LockingPtr ptr(Pool, PoolLock); + LockingPtr<SubList> ptr(Pool, PoolLock); PooledSub *psub = (*ptr)[member]; psub->State = Broken; ptr.unlock(); @@ -211,7 +212,7 @@ if(!Connection) return Broken; - LockingPtr ptr(Pool, PoolLock); + LockingPtr<SubList> ptr(Pool, PoolLock); PooledSub *psub = (*ptr)[member]; if(psub->State != Free) return psub->State; @@ -249,13 +250,13 @@ int toConnectionPool::size() { - LockingPtr ptr(Pool, PoolLock); + LockingPtr<SubList> ptr(Pool, PoolLock); return ptr->size(); } toConnectionSub* toConnectionPool::steal(int member) { - LockingPtr ptr(Pool, PoolLock); + LockingPtr<SubList> ptr(Pool, PoolLock); return (*ptr)[member]->Sub; } @@ -264,7 +265,7 @@ { // keep lock here so adding connection below can be sure // there's no current lock in case of exception - LockingPtr ptr(Pool, PoolLock); + LockingPtr<SubList> ptr(Pool, PoolLock); for(int mem = 0; mem < ptr->size(); mem++) { PooledSub *psub = (*ptr)[mem]; @@ -290,14 +291,14 @@ toConnectionSub *sub = Connection->addConnection(); PooledSub *psub = new PooledSub(sub, Busy); - LockingPtr ptr(Pool, PoolLock); + LockingPtr<SubList> ptr(Pool, PoolLock); ptr->append(psub); return psub->Sub; } void toConnectionPool::release(toConnectionSub *sub) { - LockingPtr ptr(Pool, PoolLock); + LockingPtr<SubList> ptr(Pool, PoolLock); for(int mem = 0; mem < ptr->size(); mem++) { PooledSub *psub = (*ptr)[mem]; Modified: trunk/tora/src/toconnectionpool.h =================================================================== --- trunk/tora/src/toconnectionpool.h 2008-08-15 14:07:49 UTC (rev 2941) +++ trunk/tora/src/toconnectionpool.h 2008-08-15 14:51:44 UTC (rev 2942) @@ -160,52 +160,6 @@ // lock for the pool. QMutex PoolLock; - // much thanks to: - // http://www.ddj.com/cpp/184403766 - // i remove the template and added lock and unlock - class LockingPtr { - public: - // Constructors/destructors - LockingPtr(volatile SubList& obj, QMutex& mtx) - : pObj_(const_cast<SubList*>(&obj)), - pMtx_(&mtx) { - - mtx.lock(); - locked = true; - } - - ~LockingPtr() { - if(locked) - pMtx_->unlock(); - } - - void lock() { - pMtx_->lock(); - locked = true; - } - - void unlock() { - locked = false; - pMtx_->unlock(); - } - - // Pointer behavior - SubList& operator*() { - return *pObj_; - } - - SubList* operator->() { - return pObj_; - } - - private: - bool locked; - SubList* pObj_; - QMutex* pMtx_; - LockingPtr(const LockingPtr&); - LockingPtr& operator=(const LockingPtr&); - }; - // toConnection instance this class is a member of. will be used // to create new connections when needed. QPointer<toConnection> Connection; Modified: trunk/tora/src/toeventquerytask.cpp =================================================================== --- trunk/tora/src/toeventquerytask.cpp 2008-08-15 14:07:49 UTC (rev 2941) +++ trunk/tora/src/toeventquerytask.cpp 2008-08-15 14:51:44 UTC (rev 2942) @@ -124,6 +124,7 @@ } try { + Closed = true; delete Query; Query = 0; } Modified: trunk/tora/src/toqsqlconnection.cpp =================================================================== --- trunk/tora/src/toqsqlconnection.cpp 2008-08-15 14:07:49 UTC (rev 2941) +++ trunk/tora/src/toqsqlconnection.cpp 2008-08-15 14:51:44 UTC (rev 2942) @@ -43,6 +43,7 @@ #include "tomysqlkeywords.h" #include "tosql.h" #include "totool.h" +#include "tothread.h" #include <ctype.h> #include <string.h> @@ -63,7 +64,7 @@ #include <QString> #ifdef HAVE_POSTGRESQL_LIBPQ_FE_H - #include <libpq-fe.h> + #include <postgresql/libpq-fe.h> #endif // #include <QDebug> @@ -1117,46 +1118,48 @@ } }; -class qSqlSub : public toConnectionSub + class qSqlSub : public toConnectionSub { - toSemaphore Lock; public: - QSqlDatabase Connection; + // use compilter to prevent accidental unprotected access. Use + // LockingPtr. + volatile QSqlDatabase Connection; + QMutex Lock; QString Name; QString ConnectionID; qSqlSub(QSqlDatabase conn, const QString &name) - : Lock(1), Connection(conn), Name(name) { + : Connection(conn), Name(name) { } void lockUp() { - Lock.up(); } void lockDown () { - Lock.down(); } int getLockValue() { - return Lock.getValue(); + return 1; } - void reconnect(toConnection &conn); - ~qSqlSub() { - Connection.close(); + LockingPtr<QSqlDatabase> ptr(Connection, Lock); + ptr->close(); } + + // doh. better release the lock before calling this void throwError(const QString &sql) { - throw ErrorString(Connection.lastError(), sql); + LockingPtr<QSqlDatabase> ptr(Connection, Lock); + throw ErrorString(ptr->lastError(), sql); } }; -class qSqlQuery : public toQuery::queryImpl + class qSqlQuery : public toQuery::queryImpl { QSqlQuery *Query; QSqlRecord Record; @@ -1192,8 +1195,10 @@ } QSqlQuery *createQuery(const QString &query) { + LockingPtr<QSqlDatabase> ptr(Connection->Connection, Connection->Lock); + QSqlQuery *ret; - ret = new QSqlQuery(Connection->Connection); + ret = new QSqlQuery(*ptr); if (toQSqlProvider::OnlyForward) ret->setForwardOnly(true); ret->exec(query); @@ -1228,8 +1233,10 @@ pars.insert(pars.end(), Connection->ConnectionID); conn.execute(sql, pars); } - else - native_cancel(Connection->Connection.driver()); + else { + LockingPtr<QSqlDatabase> ptr(Connection->Connection, Connection->Lock); + native_cancel(ptr->driver()); + } } catch (...) {} @@ -1302,7 +1309,7 @@ if (EOQ) throw QString::fromLatin1("Tried to read past end of query"); - Connection->lockDown(); + LockingPtr<QSqlDatabase> ptr(Connection->Connection, Connection->Lock); QVariant val; bool fixEmpty = false; if (ColumnOrder) @@ -1358,19 +1365,11 @@ delete Query; Query = NULL; CurrentExtra = *ExtraData.begin(); - try - { - Query = createQuery(QueryParam(parseReorder(query()->sql()), query()->params(), &ExtraData)); - } - catch (...) - { - Connection->lockUp(); - throw; - } + Query = createQuery(QueryParam(parseReorder(query()->sql()), query()->params(), &ExtraData)); + + ptr.unlock(); checkQuery(); } - else - Connection->lockUp(); return toQValue::fromVariant(val); } @@ -1380,35 +1379,30 @@ } virtual int rowsProcessed(void) { + LockingPtr<QSqlDatabase> ptr(Connection->Connection, Connection->Lock); + if (!Query) return 0; - Connection->lockDown(); - int ret = Query->numRowsAffected(); - Connection->lockUp(); - return ret; + return Query->numRowsAffected(); } virtual int columns(void) { - Connection->lockDown(); + LockingPtr<QSqlDatabase> ptr(Connection->Connection, Connection->Lock); int ret = Record.count(); - ; if (ColumnOrder) - { ret = ColumnOrderSize; - } - Connection->lockUp(); + return ret; } virtual std::list<toQuery::queryDescribe> describe(void) { + LockingPtr<QSqlDatabase> ptr(Connection->Connection, Connection->Lock); std::list<toQuery::queryDescribe> ret; if (Query && Query->isSelect()) { QString provider = query()->connection().provider(); - Connection->lockDown(); QSqlRecord rec = Query->record(); ret = Describe(provider, rec, ColumnOrder, ColumnOrderSize); - Connection->lockUp(); } return ret; } @@ -1598,9 +1592,8 @@ qSqlSub *sub = dynamic_cast<qSqlSub *>(query.connectionSub()); if (sub) { - sub->lockDown(); - desc = Describe(connection().provider(), sub->Connection.record(quote(table.Name)), NULL, 0); - sub->lockUp(); + LockingPtr<QSqlDatabase> ptr(sub->Connection, sub->Lock); + desc = Describe(connection().provider(), ptr->record(quote(table.Name)), NULL, 0); } } else @@ -1633,14 +1626,20 @@ virtual void commit(toConnectionSub *sub) { qSqlSub *conn = qSqlConv(sub); - if (!conn->Connection.commit() && HasTransactions) + LockingPtr<QSqlDatabase> ptr(conn->Connection, conn->Lock); + if(!ptr->commit() && HasTransactions) { + ptr.unlock(); conn->throwError(QString::fromLatin1("COMMIT")); + } } virtual void rollback(toConnectionSub *sub) { qSqlSub *conn = qSqlConv(sub); - if (!conn->Connection.rollback() && HasTransactions) + LockingPtr<QSqlDatabase> ptr(conn->Connection, conn->Lock); + if(!ptr->rollback() && HasTransactions) { + ptr.unlock(); conn->throwError(QString::fromLatin1("ROLLBACK")); + } } virtual toConnectionSub *createConnection(void); @@ -1654,11 +1653,12 @@ { QString ret; qSqlSub *conn = qSqlConv(sub); - conn->lockDown(); try { - QSqlQuery query = conn->Connection.exec( - toSQL::string(SQLVersion, connection())); + LockingPtr<QSqlDatabase> ptr(conn->Connection, conn->Lock); + + QSqlQuery query = ptr->exec(toSQL::string(SQLVersion, + connection())); if (query.next()) { if (query.isValid()) @@ -1671,7 +1671,6 @@ } catch (...) {} - conn->lockUp(); return ret; } @@ -1682,23 +1681,21 @@ virtual void execute(toConnectionSub *sub, const QString &sql, toQList ¶ms) { qSqlSub *conn = qSqlConv(sub); - conn->lockDown(); try { - QSqlQuery Query(conn->Connection.exec(QueryParam(sql, params, NULL))); + LockingPtr<QSqlDatabase> ptr(conn->Connection, conn->Lock); + QSqlQuery Query(ptr->exec(QueryParam(sql, params, NULL))); if (!Query.isActive()) { - conn->lockUp(); QString msg = QString::fromLatin1("Query not active "); msg += sql; + ptr.unlock(); throw ErrorString(Query.lastError(), msg); } - conn->lockUp(); } catch (const toQSqlProviderAggregate &) { // Ok, this one is complicated and will probably never be used. - conn->lockUp(); throw QString("Direct exec aggregate queries are not supported, use a toQuery object for this one"); } } @@ -1784,12 +1781,6 @@ void toQSqlProvider::qSqlQuery::execute(void) { - while (Connection->getLockValue() > 1) - { - Connection->lockDown(); - toStatusMessage(QString::fromLatin1("Too high value on connection lock semaphore")); - } - Connection->lockDown(); Query = NULL; try { @@ -1800,42 +1791,33 @@ ExtraData = extraData(aggr); if (ExtraData.begin() != ExtraData.end()) CurrentExtra = *ExtraData.begin(); - try + + QString t = QueryParam(parseReorder(query()->sql()), query()->params(), &ExtraData); + if (t.isEmpty()) { - QString t = QueryParam(parseReorder(query()->sql()), query()->params(), &ExtraData); - if (t.isEmpty()) - { - toStatusMessage("Nothing to send to aggregate query"); - Query = NULL; - EOQ = true; - Connection->lockUp(); - return ; - } - else - Query = createQuery(t); + toStatusMessage("Nothing to send to aggregate query"); + Query = NULL; + EOQ = true; + return; } - catch (...) - { - Connection->lockUp(); - throw; - } + else + Query = createQuery(t); } + checkQuery(); } -void toQSqlProvider::qSqlQuery::checkQuery(void) // Must call with lockDown!!!! +void toQSqlProvider::qSqlQuery::checkQuery(void) // Must *not* call while locked { - while (Connection->getLockValue() > 0) - { - toStatusMessage(QString::fromLatin1("Too high value on connection lock semaphore for checkQuery")); - } + LockingPtr<QSqlDatabase> ptr(Connection->Connection, Connection->Lock); + do { if (!Query->isActive()) { - Connection->lockUp(); QString msg = QString::fromLatin1("Query not active "); msg += query()->sql(); + ptr.unlock(); throw ErrorString(Query->lastError(), msg); } @@ -1866,20 +1848,13 @@ { delete Query; Query = NULL; - try - { - Query = createQuery(QueryParam(parseReorder(query()->sql()), query()->params(), &ExtraData)); - } - catch (...) - { - Connection->lockUp(); - throw; - } + + Query = createQuery(QueryParam(parseReorder(query()->sql()), + query()->params(), + &ExtraData)); } } while (ExtraData.begin() != ExtraData.end() && EOQ); - - Connection->lockUp(); } toQSqlProvider::qSqlSub *toQSqlProvider::createConnection(toConnection &conn) @@ -1940,19 +1915,6 @@ return ret; } -void toQSqlProvider::qSqlSub::reconnect(toConnection &conn) -{ - qSqlSub *sub = createConnection(conn); - Connection = sub->Connection; - ConnectionID = sub->ConnectionID; - - // Switch database and remove the old one - QString t = Name; - Name = sub->Name; - sub->Name = t; - delete sub; -} - toConnectionSub *toQSqlProvider::qSqlConnection::createConnection(void) { return toQSqlProvider::createConnection(connection()); Modified: trunk/tora/src/tothread.h =================================================================== --- trunk/tora/src/tothread.h 2008-08-15 14:07:49 UTC (rev 2941) +++ trunk/tora/src/tothread.h 2008-08-15 14:51:44 UTC (rev 2942) @@ -185,4 +185,49 @@ } }; + +// much thanks to: +// http://www.ddj.com/cpp/184403766 +// i added lock and unlock +template <typename T> class LockingPtr { +public: + // Constructors/destructors + LockingPtr(volatile T& obj, QMutex& mtx) : pObj_(const_cast<T*>(&obj)), + pMtx_(&mtx) { + mtx.lock(); + locked = true; + } + + ~LockingPtr() { + if(locked) + pMtx_->unlock(); + } + + void lock() { + pMtx_->lock(); + locked = true; + } + + void unlock() { + locked = false; + pMtx_->unlock(); + } + + // Pointer behavior + T& operator*() { + return *pObj_; + } + + T* operator->() { + return pObj_; + } + +private: + bool locked; + T* pObj_; + QMutex* pMtx_; + LockingPtr(const LockingPtr&); + LockingPtr& operator=(const LockingPtr&); +}; + #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mrj...@us...> - 2008-08-15 20:38:30
|
Revision: 2945 http://tora.svn.sourceforge.net/tora/?rev=2945&view=rev Author: mrjohnson0 Date: 2008-08-15 20:38:38 +0000 (Fri, 15 Aug 2008) Log Message: ----------- unprotected query access is fine, but locking must coordinate deleting query Modified Paths: -------------- trunk/tora/src/toeventquerytask.cpp trunk/tora/src/toeventquerytask.h Modified: trunk/tora/src/toeventquerytask.cpp =================================================================== --- trunk/tora/src/toeventquerytask.cpp 2008-08-15 20:23:25 UTC (rev 2944) +++ trunk/tora/src/toeventquerytask.cpp 2008-08-15 20:38:38 UTC (rev 2945) @@ -44,6 +44,7 @@ #include "toresultstats.h" #include <QApplication> +#include <QMutexLocker> #define CATCH_ALL \ @@ -124,6 +125,7 @@ } try { + QMutexLocker lock(&CloseLock); Closed = true; delete Query; Query = 0; @@ -145,6 +147,8 @@ emit done(); disconnect(this, 0, 0, 0); + + QMutexLocker lock(&CloseLock); if(Query && !Closed) Query->cancel(); } Modified: trunk/tora/src/toeventquerytask.h =================================================================== --- trunk/tora/src/toeventquerytask.h 2008-08-15 20:23:25 UTC (rev 2944) +++ trunk/tora/src/toeventquerytask.h 2008-08-15 20:38:38 UTC (rev 2945) @@ -82,7 +82,12 @@ // object was closed volatile bool Closed; + // can't synchronize on query or cancel wouldn't work, but need to + // protect access during close() which may be called from the main + // thread + QMutex CloseLock; + public: // keeps thread from exiting until toEventQuery exits. this This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mrj...@us...> - 2008-08-16 16:48:18
|
Revision: 2946 http://tora.svn.sourceforge.net/tora/?rev=2946&view=rev Author: mrjohnson0 Date: 2008-08-16 16:48:27 +0000 (Sat, 16 Aug 2008) Log Message: ----------- can't modify qtgui objects from another thread Modified Paths: -------------- trunk/tora/src/todebug.cpp trunk/tora/src/todebug.h Modified: trunk/tora/src/todebug.cpp =================================================================== --- trunk/tora/src/todebug.cpp 2008-08-15 20:38:38 UTC (rev 2945) +++ trunk/tora/src/todebug.cpp 2008-08-16 16:48:27 UTC (rev 2946) @@ -425,20 +425,29 @@ { toQuery init(Connection, SQLDebugInit); + // can't use moc from nested class + QMetaObject::invokeMethod(&Parent, + "enableDebugger", + Qt::QueuedConnection, + Q_ARG(bool, true)); + + toLocker lock (Parent.Lock); Parent.DebuggerStarted = true; - Parent.enableDebugger(true); - toLocker lock (Parent.Lock); Parent.TargetID = init.readValue(); Parent.ChildSemaphore.up(); Parent.TargetLog += QString::fromLatin1("Debug session connected\n"); } catch (const QString &exc) { + QMetaObject::invokeMethod(&Parent, + "enableDebugger", + Qt::QueuedConnection, + Q_ARG(bool, false)); + toLocker lock (Parent.Lock); Parent.TargetLog += QString::fromLatin1("Couldn't start debugging:"); Parent.TargetLog += exc; Parent.DebuggerStarted = false; - Parent.enableDebugger(false); Parent.ChildSemaphore.up(); return ; } @@ -506,7 +515,10 @@ TOCATCH toLocker lock (Parent.Lock); Parent.DebuggerStarted = false; - Parent.enableDebugger(false); + QMetaObject::invokeMethod(&Parent, + "enableDebugger", + Qt::QueuedConnection, + Q_ARG(bool, false)); Parent.TargetLog += QString::fromLatin1("Closing debug session\n"); Parent.TargetThread = NULL; Parent.ChildSemaphore.up(); Modified: trunk/tora/src/todebug.h =================================================================== --- trunk/tora/src/todebug.h 2008-08-15 20:38:38 UTC (rev 2945) +++ trunk/tora/src/todebug.h 2008-08-16 16:48:27 UTC (rev 2946) @@ -147,48 +147,44 @@ toTreeWidget *Contents; // Debug pane - QTabWidget *DebugTabs; + QTabWidget *DebugTabs; toTreeWidget *Breakpoints; toTreeWidget *StackTrace; toTreeWidget *Watch; toTreeWidget *Parameters; - toOutput *Output; + toOutput *Output; toMarkedText *RuntimeLog; // Editors QTabWidget *Editors; // Must hold lock before reading or writing to these - toLock Lock; - toSemaphore TargetSemaphore; - toSemaphore ChildSemaphore; - toSemaphore StartedSemaphore; - toThread *TargetThread; - QString TargetSQL; - QString TargetLog; - QString TargetException; - toQList InputData; - toQList OutputData; - int ColumnSize; - bool RunningTarget; - bool DebuggerStarted; + toLock Lock; + toSemaphore TargetSemaphore; + toSemaphore ChildSemaphore; + toSemaphore StartedSemaphore; + toThread *TargetThread; + QString TargetSQL; + QString TargetLog; + QString TargetException; + toQList InputData; + toQList OutputData; + int ColumnSize; + bool RunningTarget; + bool DebuggerStarted; // Can be read after thread startup - QString TargetID; + QString TargetID; // End of lock stuff - toTimer StartTimer; + toTimer StartTimer; - /*! \brief Enable/disable debugging related actions (steps etc.). - It's set to false when DBMS_DEBUG related calls fail. - */ - void enableDebugger(bool); - -class targetTask : public toTask + class targetTask : public toTask { toDebug &Parent; + public: - targetTask(toDebug &parent) - : Parent(parent) + targetTask(toDebug &parent) : Parent(parent) { } + virtual void run(void); }; @@ -233,6 +229,12 @@ private slots: void startTarget(void); + + /*! \brief Enable/disable debugging related actions (steps etc.). + It's set to false when DBMS_DEBUG related calls fail. + */ + void enableDebugger(bool); + public: toDebug(QWidget *parent, toConnection &connection); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mrj...@us...> - 2008-08-16 18:23:16
|
Revision: 2947 http://tora.svn.sourceforge.net/tora/?rev=2947&view=rev Author: mrjohnson0 Date: 2008-08-16 18:23:22 +0000 (Sat, 16 Aug 2008) Log Message: ----------- convert to mergesort. is pretty fast and has the advantage of being a stable sort Modified Paths: -------------- trunk/tora/src/toqvalue.cpp trunk/tora/src/toqvalue.h trunk/tora/src/toresultmodel.cpp trunk/tora/src/toresultmodel.h Modified: trunk/tora/src/toqvalue.cpp =================================================================== --- trunk/tora/src/toqvalue.cpp 2008-08-16 16:48:27 UTC (rev 2946) +++ trunk/tora/src/toqvalue.cpp 2008-08-16 18:23:22 UTC (rev 2947) @@ -118,6 +118,39 @@ } +bool toQValue::operator<=(const toQValue &other) const +{ + if (isInt() && other.isInt()) + return toInt() <= other.toInt(); + if (isDouble() && other.isDouble()) + return toDouble() <= other.toDouble(); + if (isLong() && other.isLong()) + return toLong() <= other.toLong(); + if (isuLong() && other.isuLong()) + return touLong() <= other.touLong(); + if (isBinary() && other.isBinary()) + return Value.toByteArray() <= other.Value.toByteArray(); + + // otherwise, try to convert to double for comparison + bool ok; + double d1 = toString().toDouble(&ok); + if (ok) + { + double d2 = other.toString().toDouble(&ok); + if (ok) + return d1 <= d2; + } + + return toString() <= other.toString(); +} + + +bool toQValue::operator>=(const toQValue &other) const +{ + return !operator<=(other); +} + + const toQValue &toQValue::operator = (const toQValue & copy) { Value = copy.Value; Modified: trunk/tora/src/toqvalue.h =================================================================== --- trunk/tora/src/toqvalue.h 2008-08-16 16:48:27 UTC (rev 2946) +++ trunk/tora/src/toqvalue.h 2008-08-16 18:23:22 UTC (rev 2947) @@ -99,6 +99,14 @@ */ bool operator>(const toQValue &other) const; + /** Less than operator + */ + bool operator<=(const toQValue &other) const; + + /** greater than operator + */ + bool operator>=(const toQValue &other) const; + /** Check a value for equality. Requires same type and same value. NULL is equal to other NULL values. */ bool operator == (const toQValue &) const; Modified: trunk/tora/src/toresultmodel.cpp =================================================================== --- trunk/tora/src/toresultmodel.cpp 2008-08-16 16:48:27 UTC (rev 2946) +++ trunk/tora/src/toresultmodel.cpp 2008-08-16 18:23:22 UTC (rev 2947) @@ -513,59 +513,56 @@ } -int toResultModel::partition(int left, - int right, - int pivot, - int column, - Qt::SortOrder order) +void toResultModel::sort(int column, Qt::SortOrder order) { - Rows.move(pivot, right); // move to end + if (column > Headers.size() - 1) + return; - int store = left; - toQValue key = Rows.at(right).at(column); // pivot value for - // comparisons - - for (int i = left; i < right; i++) - { - if ((order == Qt::AscendingOrder && (Rows.at(i).at(column) < key)) || - (order == Qt::DescendingOrder && (Rows.at(i).at(column) > key))) - Rows.swap(i, store++); - } - - Rows.swap(store, right); - return store; + Rows = mergesort(Rows, column, order); + emit dataChanged(createIndex(0, 0), + createIndex(rowCount(), columnCount())); } -void toResultModel::qsort(int left, - int right, - int column, - Qt::SortOrder order) +toResultModel::RowList toResultModel::mergesort(RowList &rows, + int column, + Qt::SortOrder order) { - // quick sort + if(rows.size() <= 1) + return rows; - // mrj: i'm not an algorithm guy and i don't really want to do - // this, but there's no good way to do this within qt. + RowList left, right; - // i did a quick 'n dirty implementation following - // http://en.wikipedia.org/wiki/Quicksort + int middle = (int) (rows.size() / 2); + left = rows.mid(0, middle); + right = rows.mid(middle); - if (right <= left) - return; + left = mergesort(left, column, order); + right = mergesort(right, column, order); - int pivotIndex = left; - int index = partition(left, right, pivotIndex, column, order); - qsort(left, index - 1, column, order); - qsort(index + 1, right, column, order); + return merge(left, right, column, order); } -void toResultModel::sort(int column, Qt::SortOrder order) +toResultModel::RowList toResultModel::merge(RowList &left, + RowList &right, + int column, + Qt::SortOrder order) { - if (column > Headers.size() - 1) - return; + RowList result; - qsort(0, Rows.size() - 1, column, order); - emit dataChanged(createIndex(0, 0), - createIndex(rowCount(), columnCount())); + while(left.size() > 0 && right.size() > 0) + { + if(order == Qt::AscendingOrder && left.at(0).at(column) <= right.at(0).at(column) || + order == Qt::DescendingOrder && left.at(0).at(column) >= right.at(0).at(column)) + result.append(left.takeAt(0)); + else + result.append(right.takeAt(0)); + } + + if(left.size() > 0) + result << left; + if(right.size() > 0) + result << right; + return result; } Modified: trunk/tora/src/toresultmodel.h =================================================================== --- trunk/tora/src/toresultmodel.h 2008-08-16 16:48:27 UTC (rev 2946) +++ trunk/tora/src/toresultmodel.h 2008-08-16 18:23:22 UTC (rev 2947) @@ -101,9 +101,10 @@ bool ReadAll; // helpers for sort implementation - int partition(int, int, int, int, Qt::SortOrder); - void qsort(int, int, int, Qt::SortOrder); + RowList mergesort(RowList&, int, Qt::SortOrder); + RowList merge(RowList&, RowList&, int, Qt::SortOrder); + private slots: // destroys query, stops timer, good things. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mrj...@us...> - 2008-08-17 18:07:32
|
Revision: 2948 http://tora.svn.sourceforge.net/tora/?rev=2948&view=rev Author: mrjohnson0 Date: 2008-08-17 18:07:41 +0000 (Sun, 17 Aug 2008) Log Message: ----------- remove cache objects usage from todebug and use a model instead. cache objects takes a couple minutes to run on my database and this code will block the main thread until it finishes, then clears it and calls for a refresh. new code simply runs a sql query to get at just the objects we want using toeventquery and is much faster (and doesn't block). Modified Paths: -------------- trunk/tora/src/CMakeLists.txt trunk/tora/src/Makefile.am trunk/tora/src/todebug.cpp trunk/tora/src/todebug.h Added Paths: ----------- trunk/tora/src/tocodemodel.cpp trunk/tora/src/tocodemodel.h Modified: trunk/tora/src/CMakeLists.txt =================================================================== --- trunk/tora/src/CMakeLists.txt 2008-08-16 18:23:22 UTC (rev 2947) +++ trunk/tora/src/CMakeLists.txt 2008-08-17 18:07:41 UTC (rev 2948) @@ -155,6 +155,7 @@ toresultlock.h toresultlong.h toresultmodel.h + tocodemodel.h toresultparam.h toresultpie.h toresultplan.h @@ -298,6 +299,7 @@ toresultlock.cpp toresultlong.cpp toresultmodel.cpp + tocodemodel.cpp toresultparam.cpp toresultpie.cpp toresultplan.cpp Modified: trunk/tora/src/Makefile.am =================================================================== --- trunk/tora/src/Makefile.am 2008-08-16 18:23:22 UTC (rev 2947) +++ trunk/tora/src/Makefile.am 2008-08-17 18:07:41 UTC (rev 2948) @@ -125,6 +125,7 @@ toscript.cpp toscript.h \ toscriptschemawidget.cpp toscriptschemawidget.h \ toscripttreeitem.cpp toscripttreeitem.h \ + tocodemodel.cpp tocodemodel.h \ toscripttreemodel.cpp toscripttreemodel.h \ tosecurity.cpp tosecurity.h \ tosecuritytreemodel.cpp tosecuritytreemodel.h \ @@ -280,6 +281,7 @@ moc_tochartmanager.cpp \ moc_toconnection.cpp \ moc_toconnectionmodel.cpp \ + moc_tocodemodel.cpp \ moc_toconnectionpool.cpp \ moc_toconnectionimport.cpp \ moc_torunnable.cpp \ Added: trunk/tora/src/tocodemodel.cpp =================================================================== --- trunk/tora/src/tocodemodel.cpp (rev 0) +++ trunk/tora/src/tocodemodel.cpp 2008-08-17 18:07:41 UTC (rev 2948) @@ -0,0 +1,275 @@ +/***** +* +* TOra - An Oracle Toolkit for DBA's and developers +* Copyright (C) 2003-2005 Quest Software, Inc +* Portions Copyright (C) 2005 Other Contributors +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; only version 2 of +* the License is valid for this program. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +* +* As a special exception, you have permission to link this program +* with the Oracle Client libraries and distribute executables, as long +* as you follow the requirements of the GNU GPL in regard to all of the +* software in the executable aside from Oracle client libraries. +* +* Specifically you are not permitted to link this program with the +* Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. +* And you are not permitted to distribute binaries compiled against +* these libraries without written consent from Quest Software, Inc. +* Observe that this does not disallow linking to the Qt Free Edition. +* +* You may link this product with any GPL'd Qt library such as Qt/Free +* +* All trademarks belong to their respective owners. +* +*****/ + +#include "config.h" + +#include "tosql.h" +#include "toconnection.h" +#include "tomain.h" +#include "toqvalue.h" +#include "utils.h" +#include "tocodemodel.h" +#include "toeventquery.h" + +static toSQL SQLListObjects("toCode:ListObjects", + "SELECT a.object_name,\n" + " a.object_type\n" + " FROM sys.all_objects a,\n" + " sys.all_tab_comments b\n" + " WHERE a.owner = b.owner ( + )\n" + " AND a.object_name = b.table_name ( + )\n" + " AND a.object_type = b.table_type ( + )\n" + " AND a.object_type IN ( 'FUNCTION',\n" + " 'PACKAGE',\n" + " 'PROCEDURE',\n" + " 'TYPE' )\n" + " AND a.owner = :owner<char[50]>", + "Get list of code objects"); + +toCodeModel::toCodeModel(QObject *parent) : QAbstractItemModel(parent), query(0) +{ + rootItem = new QTreeWidgetItem(); + packageItem = new QTreeWidgetItem(rootItem); + procItem = new QTreeWidgetItem(rootItem); + typeItem = new QTreeWidgetItem(rootItem); + + rootItem->setText(0, tr("Code")); + packageItem->setText(0, tr("Package")); + procItem->setText(0, tr("Procedure")); + typeItem->setText(0, tr("Type")); +} + +toCodeModel::~toCodeModel() +{ + if(rootItem) + delete rootItem; + if(query) + cleanup(); +} + +int toCodeModel::columnCount(const QModelIndex &parent) const +{ + if (parent.isValid()) + return static_cast<QTreeWidgetItem*>(parent.internalPointer())->columnCount(); + else + return rootItem->columnCount(); +} + +QVariant toCodeModel::data(const QModelIndex &index, int role) const +{ + if (!index.isValid()) + return QVariant(); + + if (role != Qt::DisplayRole) + return QVariant(); + + QTreeWidgetItem *item = static_cast<QTreeWidgetItem*>(index.internalPointer()); + if (!item) + return QVariant(); + + return item->text(index.column()); +} + +Qt::ItemFlags toCodeModel::flags(const QModelIndex &index) const +{ + if (!index.isValid()) + return 0; + + return Qt::ItemIsEnabled | Qt::ItemIsSelectable; +} + +QVariant toCodeModel::headerData(int section, Qt::Orientation orientation, + int role) const +{ + if (orientation == Qt::Horizontal && role == Qt::DisplayRole) + return tr("Objects"); + + return QVariant(); +} + +QModelIndex toCodeModel::index(int row, int column, const QModelIndex &parent) + const +{ + if (!hasIndex(row, column, parent)) + return QModelIndex(); + + QTreeWidgetItem *parentItem; + + if (!parent.isValid()) + parentItem = rootItem; + else + parentItem = static_cast<QTreeWidgetItem*>(parent.internalPointer()); + + QTreeWidgetItem *childItem = parentItem->child(row); + if (childItem) + return createIndex(row, column, childItem); + else + return QModelIndex(); +} + +QModelIndex toCodeModel::parent(const QModelIndex &index) const +{ + if (!index.isValid()) + return QModelIndex(); + + QTreeWidgetItem *childItem = static_cast<QTreeWidgetItem*>(index.internalPointer()); + QTreeWidgetItem *parentItem = childItem->parent(); + + if (parentItem == rootItem) + return QModelIndex(); + if (parentItem == packageItem) + return createIndex(1, 0, parentItem); + if (parentItem == procItem) + return createIndex(2, 0, parentItem); + if (parentItem == typeItem) + return createIndex(3, 0, parentItem); + + return QModelIndex(); +} + +int toCodeModel::rowCount(const QModelIndex &parent) const +{ + QTreeWidgetItem *parentItem; + if (parent.column() > 0) + return 0; + + if (!parent.isValid()) + parentItem = rootItem; + else + parentItem = static_cast<QTreeWidgetItem*>(parent.internalPointer()); + + return parentItem->childCount(); +} + + +void toCodeModel::queryError(const toConnection::exception &err) { + toStatusMessage(err); + cleanup(); +} + + +void toCodeModel::refresh(toConnection &conn, const QString &owner) +{ + delete rootItem; + rootItem = new QTreeWidgetItem(); + + packageItem = new QTreeWidgetItem(rootItem); + procItem = new QTreeWidgetItem(rootItem); + typeItem = new QTreeWidgetItem(rootItem); + + rootItem->setText(0, tr("Code")); + packageItem->setText(0, tr("Package")); + procItem->setText(0, tr("Procedure")); + typeItem->setText(0, tr("Type")); + + toQList param; + param.push_back(owner); + + try { + query = new toEventQuery(conn, + toQuery::Long, + toSQL::sql(SQLListObjects, conn), + param); + + qRegisterMetaType<toConnection::exception>("toConnection::exception"); + + connect(query, + SIGNAL(dataAvailable()), + this, + SLOT(readData())); + connect(query, + SIGNAL(error(const toConnection::exception &)), + this, + SLOT(queryError(const toConnection::exception &))); + connect(query, + SIGNAL(done()), + this, + SLOT(readData())); + + query->start(); + } + TOCATCH; +} + +void toCodeModel::cleanup() +{ + if (query) + { + disconnect(query, 0, this, 0); + + query->stop(); + delete query; + } + + query = 0; +} + +void toCodeModel::readData() +{ + if (!query) + { + cleanup(); + return; + } + + while(query->hasMore()) { + QString cname = query->readValueNull().toString(); + QString ctype = query->readValueNull().toString(); + + QTreeWidgetItem *item = 0; + if(ctype == QString("FUNCTION")) + item = new QTreeWidgetItem(procItem); + else if(ctype == QString("PACKAGE")) + item = new QTreeWidgetItem(packageItem); + else if(ctype == QString("PROCEDURE")) + item = new QTreeWidgetItem(procItem); + else if(ctype == QString("TYPE")) + item = new QTreeWidgetItem(typeItem); + + item->setText(0, cname); + } + + reset(); + + if(!query->hasMore() && query->eof()) + { + cleanup(); + return; + } + + query->readAll(); +} Added: trunk/tora/src/tocodemodel.h =================================================================== --- trunk/tora/src/tocodemodel.h (rev 0) +++ trunk/tora/src/tocodemodel.h 2008-08-17 18:07:41 UTC (rev 2948) @@ -0,0 +1,93 @@ +/***** +* +* TOra - An Oracle Toolkit for DBA's and developers +* Copyright (C) 2003-2005 Quest Software, Inc +* Portions Copyright (C) 2005 Other Contributors +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; only version 2 of +* the License is valid for this program. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +* +* As a special exception, you have permission to link this program +* with the Oracle Client libraries and distribute executables, as long +* as you follow the requirements of the GNU GPL in regard to all of the +* software in the executable aside from Oracle client libraries. +* +* Specifically you are not permitted to link this program with the +* Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. +* And you are not permitted to distribute binaries compiled against +* these libraries without written consent from Quest Software, Inc. +* Observe that this does not disallow linking to the Qt Free Edition. +* +* You may link this product with any GPL'd Qt library such as Qt/Free +* +* All trademarks belong to their respective owners. +* +*****/ +#ifndef TOCODEMODEL_H +#define TOCODEMODEL_H + +#include <QAbstractItemModel> +#include <QModelIndex> +#include <QVariant> +#include <QTreeWidgetItem> + +#include "config.h" +#include "toconnection.h" + +class toEventQuery; + + +/*! \brief A tree model for QTreeView used in the sql editor and sql + * debugger tools. + * + */ +class toCodeModel : public QAbstractItemModel +{ + Q_OBJECT + +public: + toCodeModel(QObject *parent = 0); + ~toCodeModel(); + + QVariant data(const QModelIndex &index, int role) const; + Qt::ItemFlags flags(const QModelIndex &index) const; + QVariant headerData(int section, Qt::Orientation orientation, + int role = Qt::DisplayRole) const; + QModelIndex index(int row, int column, + const QModelIndex &parent = QModelIndex()) const; + QModelIndex parent(const QModelIndex &index) const; + int rowCount(const QModelIndex &parent = QModelIndex()) const; + int columnCount(const QModelIndex &parent = QModelIndex()) const; + + /** + * Run query for model + * + */ + void refresh(toConnection &conn, const QString &owner); + +private slots: + void cleanup(void); + void readData(void); + void queryError(const toConnection::exception &); + +private: + //! An universal root item. It's deleted and recreated in setupModelData() + QTreeWidgetItem *rootItem; + QTreeWidgetItem *packageItem; + QTreeWidgetItem *procItem; + QTreeWidgetItem *typeItem; + toEventQuery *query; +}; + +#endif Modified: trunk/tora/src/todebug.cpp =================================================================== --- trunk/tora/src/todebug.cpp 2008-08-16 18:23:22 UTC (rev 2947) +++ trunk/tora/src/todebug.cpp 2008-08-17 18:07:41 UTC (rev 2948) @@ -51,6 +51,7 @@ #include "tosql.h" #include "tosqlparse.h" #include "totool.h" +#include "tocodemodel.h" #include <stack> @@ -72,6 +73,7 @@ #include <QMdiArea> #include <QMessageBox> #include <QButtonGroup> +#include <QTreeView> #include "icons/addwatch.xpm" #include "icons/changewatch.xpm" @@ -1754,8 +1756,8 @@ } toDebug::toDebug(QWidget *main, toConnection &connection) - : toToolWidget(DebugTool, "debugger.html", main, connection, "toDebug"), - TargetThread() + : toToolWidget(DebugTool, "debugger.html", main, connection, "toDebug"), + TargetThread() { createActions(); QToolBar *toolbar = toAllocBar(this, tr("Debugger")); @@ -1829,15 +1831,19 @@ QSplitter *objSplitter = new QSplitter(Qt::Vertical, hsplitter); - Objects = new toListView(objSplitter); - Objects->addColumn(tr("Objects")); - Objects->setRootIsDecorated(true); - Objects->setTreeStepSize(10); - Objects->setSorting(0); - Objects->setSelectionMode(toTreeWidget::Single); - Objects->setResizeMode(toTreeWidget::AllColumns); - connect(Objects, SIGNAL(selectionChanged(toTreeWidgetItem *)), - this, SLOT(changePackage(toTreeWidgetItem *))); + Objects = new QTreeView(objSplitter); + CodeModel = new toCodeModel(Objects); + Objects->setModel(CodeModel); + QString selected = Schema->currentText(); + if(!selected.isEmpty()) + CodeModel->refresh(connection, selected); +// Objects->setSelectionMode(toTreeWidget::Single); +// Objects->setResizeMode(toTreeWidget::AllColumns); + connect(Objects->selectionModel(), + SIGNAL(currentChanged(const QModelIndex &, const QModelIndex &)), + this, + SLOT(changePackage(const QModelIndex &, const QModelIndex &))); + Contents = new toListView(objSplitter); Contents->addColumn(tr("Contents")); Contents->setRootIsDecorated(true); @@ -2230,66 +2236,16 @@ } if (!selected.isEmpty()) { + for (int i = 0;i < Schema->count();i++) { - for (int i = 0;i < Schema->count();i++) - if (Schema->itemText(i) == selected) - { - Schema->setCurrentIndex(i); - break; - } - } - Objects->clear(); - - // refresh the objects - connection().rereadCache(); - std::list<toConnection::objectName> &objs = connection().objects(true); - - std::map<QString, toTreeWidgetItem *> typeItems; - bool any = false; - for (std::list<toConnection::objectName>::iterator i = objs.begin(); - i != objs.end();i++) - { - if ((*i).Owner == selected) + if (Schema->itemText(i) == selected) { - any = true; - QString type = (*i).Type; - if (type == QString::fromLatin1("FUNCTION") || - type == QString::fromLatin1("PACKAGE") || - type == QString::fromLatin1("PROCEDURE") || - type == QString::fromLatin1("TYPE")) - { - toTreeWidgetItem *typeItem; - std::map<QString, toTreeWidgetItem *>::iterator j = typeItems.find(type); - if (j == typeItems.end()) - { - typeItem = new toTreeWidgetItem(Objects, type); - typeItems[type] = typeItem; -#ifndef AUTOEXPAND - - typeItem->setSelectable(false); -#endif - - } - else - typeItem = (*j).second; - - QString bodyType(type); - bodyType += QString::fromLatin1(" BODY"); - QString name = (*i).Name; - toTreeWidgetItem *item = new toTreeWidgetItem(typeItem, name, type); - if (selected == currentEditor()->schema() && - (type == currentEditor()->type() || - bodyType == currentEditor()->type()) && - name == currentEditor()->object()) - { - Objects->setOpen(typeItem, true); - Objects->setSelected(item, true); - } - } - } - else if (any) + Schema->setCurrentIndex(i); break; + } } + + CodeModel->refresh(connection(), selected); } } TOCATCH @@ -2426,14 +2382,21 @@ // qDebug() << "toDebug::updateCurrent 2"; } -void toDebug::changePackage(toTreeWidgetItem *item) +void toDebug::changePackage(const QModelIndex ¤t, const QModelIndex &previous) { // qDebug() << "toDebug::changePackage 1"; + QTreeWidgetItem *item = static_cast<QTreeWidgetItem*>(current.internalPointer()); if (item && item->parent()) { - viewSource(Schema->currentText(), item->text(0), item->text(1), 0); - if (item->text(1) == "PACKAGE" || item->text(1) == "TYPE") - viewSource(Schema->currentText(), item->text(0), item->text(1) + " BODY", 0); + QString ctype = item->parent()->text(0); + if(ctype.isEmpty() || ctype == "Code") + return; + ctype = ctype.toUpper(); + + if (ctype == "PACKAGE" || ctype == "TYPE") + ctype += " BODY"; + + viewSource(Schema->currentText(), item->text(0), ctype, 0); } #ifdef AUTOEXPAND else if (item && !item->parent()) @@ -3034,10 +2997,10 @@ } } - if (Objects->selectedItem() && - Objects->selectedItem()->text(0) == editor->object() && - Schema->currentText() == editor->schema()) - Objects->clearSelection(); +// if (Objects->selectedItem() && +// Objects->selectedItem()->text(0) == editor->object() && +// Schema->currentText() == editor->schema()) +// Objects->clearSelection(); Editors->removeTab(Editors->indexOf(editor)); delete editor; Modified: trunk/tora/src/todebug.h =================================================================== --- trunk/tora/src/todebug.h 2008-08-16 18:23:22 UTC (rev 2947) +++ trunk/tora/src/todebug.h 2008-08-17 18:07:41 UTC (rev 2948) @@ -84,16 +84,18 @@ #define TO_BREAK_HANDLER 2048 #define TO_ABORT_EXECUTION 8192 +class QButtonGroup; class QComboBox; -class toTreeWidget; -class toTreeWidgetItem; class QTabWidget; +class QTreeView; class QToolButton; +class toCodeModel; class toConnection; class toDebugText; class toMarkedText; class toOutput; -class QButtonGroup; +class toTreeWidget; +class toTreeWidgetItem; class toDebug : public toToolWidget { @@ -143,7 +145,8 @@ QMenu *ToolMenu; // Content pane - toTreeWidget *Objects; + QTreeView *Objects; + toCodeModel *CodeModel; toTreeWidget *Contents; // Debug pane @@ -263,7 +266,7 @@ void compile(void); void refresh(void); void changeSchema(int); - void changePackage(toTreeWidgetItem *); + void changePackage(const QModelIndex &, const QModelIndex &); void showDebug(bool); void prevError(void); void nextError(void); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |