From: <ibr...@us...> - 2010-02-11 14:35:00
|
Revision: 3402 http://tora.svn.sourceforge.net/tora/?rev=3402&view=rev Author: ibre5041 Date: 2010-02-11 14:34:53 +0000 (Thu, 11 Feb 2010) Log Message: ----------- use new logging, new toConnection Modified Paths: -------------- branches/tora-trotl/src/trotl_test0.cpp branches/tora-trotl/src/trotl_test1.cpp branches/tora-trotl/src/trotl_test2.cpp Added Paths: ----------- branches/tora-trotl/src/trotl_test3.cpp Modified: branches/tora-trotl/src/trotl_test0.cpp =================================================================== --- branches/tora-trotl/src/trotl_test0.cpp 2010-02-11 14:19:39 UTC (rev 3401) +++ branches/tora-trotl/src/trotl_test0.cpp 2010-02-11 14:34:53 UTC (rev 3402) @@ -23,10 +23,10 @@ #endif } -class my_log : public internal_thread_safe_log +class my_log : public internal_thread_safe_log_ownthread { protected: - typedef internal_thread_safe_log super; + typedef internal_thread_safe_log_ownthread super; public: thread_safe_log log() { return thread_safe_log(*this); }; my_log() : super( std::cerr) @@ -70,18 +70,6 @@ } }; -thread_safe_log get_log() -{ - //static char *delim = "--------------------------------------------------------------------------------\n"; - // static std::ofstream out( "out.txt"); - static internal_thread_safe_log log( std::cout); - //thread_safe_log x( log); - //x.ts() << delim; - //return x; - //return (thread_safe_log( log).ts() << delim ); - return thread_safe_log( log); -} - B z; int main(int argc, char **argv) Modified: branches/tora-trotl/src/trotl_test1.cpp =================================================================== --- branches/tora-trotl/src/trotl_test1.cpp 2010-02-11 14:19:39 UTC (rev 3401) +++ branches/tora-trotl/src/trotl_test1.cpp 2010-02-11 14:34:53 UTC (rev 3402) @@ -14,13 +14,6 @@ #endif } -thread_safe_log get_log() -{ - // static std::ofstream out( "out.txt"); - static internal_thread_safe_log log( std::cout); - return thread_safe_log( log); -} - int main(int argc, char **argv) { QString provider, username, password, host, database, schema; Modified: branches/tora-trotl/src/trotl_test2.cpp =================================================================== --- branches/tora-trotl/src/trotl_test2.cpp 2010-02-11 14:19:39 UTC (rev 3401) +++ branches/tora-trotl/src/trotl_test2.cpp 2010-02-11 14:34:53 UTC (rev 3402) @@ -17,16 +17,6 @@ #endif } -thread_safe_log get_log() -{ - //static std::ofstream out( "out.txt"); - //static internal_thread_safe_log log( out); - static internal_thread_safe_log log( std::cerr ); -// static std::ofstream out( "c:\\out.txt"); -// static internal_thread_safe_log log( out); - return thread_safe_log( log); -} - int main(int argc, char **argv) { QString provider("Oracle"), @@ -48,6 +38,7 @@ host, database, schema, + "", options); get_log().ts<toDecorator>( __HERE__) << "Version: " << oraCon->version().toUtf8().constData() << std::endl; //sleep(600); Added: branches/tora-trotl/src/trotl_test3.cpp =================================================================== --- branches/tora-trotl/src/trotl_test3.cpp (rev 0) +++ branches/tora-trotl/src/trotl_test3.cpp 2010-02-11 14:34:53 UTC (rev 3402) @@ -0,0 +1,191 @@ + +/* BEGIN_COMMON_COPYRIGHT_HEADER + * + * TOra - An Oracle Toolkit for DBA's and developers + * + * Shared/mixed copyright is held throughout files in this product + * + * Portions Copyright (C) 2000-2001 Underscore AB + * Portions Copyright (C) 2003-2005 Quest Software, Inc. + * Portions Copyright (C) 2004-2009 Numerous Other Contributors + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; only version 2 of + * the License is valid for this program. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * As a special exception, you have permission to link this program + * with the Oracle Client libraries and distribute executables, as long + * as you follow the requirements of the GNU GPL in regard to all of the + * software in the executable aside from Oracle client libraries. + * + * Specifically you are not permitted to link this program with the + * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. + * And you are not permitted to distribute binaries compiled against + * these libraries. + * + * You may link this product with any GPL'd Qt library. + * + * All trademarks belong to their respective owners. + * + * END_COMMON_COPYRIGHT_HEADER */ + +#include "utils.h" +#include "tologger.h" + +#include "toabout.h" +#include "toconf.h" +#include "toconnection.h" +#include "tohighlightedtext.h" +#include "tomain.h" +#include "tosql.h" +#include "totool.h" + +// qt4 in via the qtranslator +// #include "tora_toad.h" + +#ifndef Q_OS_WIN32 +#include <unistd.h> +#endif + +#include <stdio.h> +#include <stdlib.h> +#include <QDateTime> + +#include <memory> +#include <iostream> + +#include <qapplication.h> +#include <qmessagebox.h> +#include <qtextcodec.h> + +#include <QString> +#include <QTranslator> +#include <QStyleFactory> + + +bool toMonolithic(void) +{ +#ifdef TOMONOLITHIC + return true; +#else + + return false; +#endif +} + + +// void toUpdateIndicateEmpty(void); + +int main(int argc, char **argv) +{ + toConfiguration::setQSettingsEnv(); + + QApplication app(argc, argv); + + try + { + + try + { + toSQL::loadSQL(toConfigurationSingle::Instance().sqlFile()); + } + catch (...) + { + std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + } + toConnectionProvider::initializeAll(); + + { + QString nls = getenv("NLS_LANG"); + if (nls.isEmpty()) + nls = "american_america.UTF8"; + else + { + int pos = nls.lastIndexOf('.'); + if (pos > 0) + nls = nls.left(pos); + nls += ".UTF8"; + } + toSetEnv("NLS_LANG", nls); + } + + if (toConfigurationSingle::Instance().lastVersion() != TOVERSION) + { + std::auto_ptr<toAbout> about ( new toAbout(toAbout::About, NULL, "About " TOAPPNAME, true)); + if (!about->exec()) + { + exit (2); + } + toConfigurationSingle::Instance().setLastVersion(TOVERSION); + } + + + if (toConfigurationSingle::Instance().firstInstall().isEmpty()) + { + toConfigurationSingle::Instance().setFirstInstall( + QDateTime::currentDateTime().toString()); + } + + toQValue::setNumberFormat( + toConfigurationSingle::Instance().numberFormat(), + toConfigurationSingle::Instance().numberDecimals()); + + if (qApp->argc() > 2 || (qApp->argc() == 2 && qApp->argv()[1][0] == '-')) + { + printf("Usage:\n\n tora [{X options}] [connectstring]\n\n"); + exit(2); + } + else if (qApp->argc() == 2) + { + QString connect = QString::fromLatin1(qApp->argv()[1]); + QString user; + int pos = connect.indexOf(QString::fromLatin1("@")); + if (pos > -1) + { + user = connect.left(pos); + connect = connect.right(connect.length() - pos - 1); + } + else + { + user = connect; + if (getenv("ORACLE_SID")) + connect = QString::fromLatin1(getenv("ORACLE_SID")); + } + if (!connect.isEmpty()) + toConfigurationSingle::Instance().setDefaultDatabase(connect); + pos = user.indexOf(QString::fromLatin1("/")); + if (pos > -1) + { + toConfigurationSingle::Instance().setDefaultPassword(user.right(user.length() - pos - 1)); + user = user.left(pos); + } + if (!user.isEmpty()) + toConfigurationSingle::Instance().setDefaultUser(user); + } + + //new toMain; + int ret = qApp->exec(); + return ret; + } + catch (const QString &str) + { + fprintf(stderr, + "Unhandled exception:\n\n%s\n", + (const char *) str.toLatin1()); + TOMessageBox::critical(NULL, + qApp->translate("main", "Unhandled exception"), + str, + qApp->translate("main", "Exit")); + } + return 1; +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2010-02-11 21:50:46
|
Revision: 3408 http://tora.svn.sourceforge.net/tora/?rev=3408&view=rev Author: ibre5041 Date: 2010-02-11 21:50:38 +0000 (Thu, 11 Feb 2010) Log Message: ----------- log all ignored exceptions - very usefull for threads troubleshooting Modified Paths: -------------- branches/tora-trotl/src/icons/awrtool.xpm branches/tora-trotl/src/main.cpp branches/tora-trotl/src/toalert.cpp branches/tora-trotl/src/toanalyze.cpp branches/tora-trotl/src/toawr.cpp branches/tora-trotl/src/tobackup.cpp branches/tora-trotl/src/tobrowser.cpp branches/tora-trotl/src/tobrowsertable.cpp branches/tora-trotl/src/tochartmanager.cpp branches/tora-trotl/src/toconnection.cpp branches/tora-trotl/src/toconnectionpool.cpp branches/tora-trotl/src/todebug.cpp branches/tora-trotl/src/toeditextensions.cpp branches/tora-trotl/src/toeventquery.cpp branches/tora-trotl/src/toeventquerytask.cpp branches/tora-trotl/src/tofyracleconnection.cpp branches/tora-trotl/src/tohighlightedtext.cpp branches/tora-trotl/src/toinvalid.cpp branches/tora-trotl/src/tologger.h branches/tora-trotl/src/tomain.cpp branches/tora-trotl/src/tonewconnection.cpp branches/tora-trotl/src/tonoblockquery.cpp branches/tora-trotl/src/tooracleconnection.cpp branches/tora-trotl/src/tooracleextract.cpp branches/tora-trotl/src/tooutput.cpp branches/tora-trotl/src/topiechart.cpp branches/tora-trotl/src/toqsqlconnection.cpp branches/tora-trotl/src/toresult.cpp branches/tora-trotl/src/toresultmodel.cpp branches/tora-trotl/src/toresultplan.cpp branches/tora-trotl/src/toresultstats.cpp branches/tora-trotl/src/toresultstorage.cpp branches/tora-trotl/src/toresultview.cpp branches/tora-trotl/src/torollback.cpp branches/tora-trotl/src/toscheduler.cpp branches/tora-trotl/src/toscripttreemodel.cpp branches/tora-trotl/src/totableselect.cpp branches/tora-trotl/src/totemplate.cpp branches/tora-trotl/src/totemplateprovider.cpp branches/tora-trotl/src/tothread.cpp branches/tora-trotl/src/totool.cpp branches/tora-trotl/src/tounittest.cpp branches/tora-trotl/src/toworksheet.cpp branches/tora-trotl/src/trotl_test0.cpp branches/tora-trotl/src/trotl_test2.cpp branches/tora-trotl/src/trotl_test3.cpp branches/tora-trotl/src/ts_log/decorator.h branches/tora-trotl/src/utils.cpp branches/tora-trotl/src/utils.h Modified: branches/tora-trotl/src/icons/awrtool.xpm =================================================================== --- branches/tora-trotl/src/icons/awrtool.xpm 2010-02-11 20:26:52 UTC (rev 3407) +++ branches/tora-trotl/src/icons/awrtool.xpm 2010-02-11 21:50:38 UTC (rev 3408) @@ -1,5 +1,5 @@ /* XPM */ -static char * awrtool_xpm[] = { +static const char * awrtool_xpm[] = { "16 16 6 1", " c None", ". c #000000", Modified: branches/tora-trotl/src/main.cpp =================================================================== --- branches/tora-trotl/src/main.cpp 2010-02-11 20:26:52 UTC (rev 3407) +++ branches/tora-trotl/src/main.cpp 2010-02-11 21:50:38 UTC (rev 3408) @@ -40,6 +40,7 @@ * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" +#include "tologger.h" #include "toabout.h" #include "toconf.h" @@ -199,7 +200,7 @@ } catch (...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; } toConnectionProvider::initializeAll(); Modified: branches/tora-trotl/src/toalert.cpp =================================================================== --- branches/tora-trotl/src/toalert.cpp 2010-02-11 20:26:52 UTC (rev 3407) +++ branches/tora-trotl/src/toalert.cpp 2010-02-11 21:50:38 UTC (rev 3408) @@ -42,6 +42,8 @@ #include "toalert.h" #include "utils.h" +#include "tologger.h" + #include "toconf.h" #include "tomain.h" #include "tomemoeditor.h" @@ -140,7 +142,7 @@ } catch (...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; } def += connection.user(); @@ -226,7 +228,7 @@ } catch (...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; toStatusMessage(tr("Failed to start polling thread, try closing " "some other tools and restart Alert Messenger")); } @@ -411,7 +413,7 @@ } catch (...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; } Parent.State = Done; Parent.Semaphore.up(); Modified: branches/tora-trotl/src/toanalyze.cpp =================================================================== --- branches/tora-trotl/src/toanalyze.cpp 2010-02-11 20:26:52 UTC (rev 3407) +++ branches/tora-trotl/src/toanalyze.cpp 2010-02-11 21:50:38 UTC (rev 3408) @@ -40,6 +40,7 @@ * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" +#include "tologger.h" #include "toanalyze.h" #include "toconf.h" @@ -727,7 +728,7 @@ } catch (...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; } } } Modified: branches/tora-trotl/src/toawr.cpp =================================================================== --- branches/tora-trotl/src/toawr.cpp 2010-02-11 20:26:52 UTC (rev 3407) +++ branches/tora-trotl/src/toawr.cpp 2010-02-11 21:50:38 UTC (rev 3408) @@ -319,7 +319,7 @@ // toQList params; // params.push_back(fsnaps); // params.push_back(tsnaps); - get_log().ts<toDecorator>( __HERE__) + get_log(0).ts<toDecorator>( __HERE__) << "Dbid:" << dbids.toAscii().constData() << ' ' << "Inst:" << insts.toAscii().constData() << ' ' << "fsnap:" << fsnaps.toAscii().constData() << ' ' @@ -397,7 +397,7 @@ { s << ":\'" << (*i).toAscii().constData() << '\''; } - get_log().ts<toDecorator>( __HERE__) << "Instance changed:" << pos << s.str() << std::endl; + get_log(0).ts<toDecorator>( __HERE__) << "Instance changed:" << pos << s.str() << std::endl; QString dbid = l.at(0); QString inst = l.at(1); try Modified: branches/tora-trotl/src/tobackup.cpp =================================================================== --- branches/tora-trotl/src/tobackup.cpp 2010-02-11 20:26:52 UTC (rev 3407) +++ branches/tora-trotl/src/tobackup.cpp 2010-02-11 21:50:38 UTC (rev 3408) @@ -40,6 +40,7 @@ * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" +#include "tologger.h" #include "tobackup.h" #include "tochangeconnection.h" @@ -422,7 +423,7 @@ } catch (...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; } if (val == 0) LastLabel->setText(tr("This appears to be a cold backup database")); Modified: branches/tora-trotl/src/tobrowser.cpp =================================================================== --- branches/tora-trotl/src/tobrowser.cpp 2010-02-11 20:26:52 UTC (rev 3407) +++ branches/tora-trotl/src/tobrowser.cpp 2010-02-11 21:50:38 UTC (rev 3408) @@ -1,10 +1,4 @@ -#include <QtDebug> //?? TODO -#include <iomanip> -#include <iostream> -#include <string> -#include <sstream> - /* BEGIN_COMMON_COPYRIGHT_HEADER * * TOra - An Oracle Toolkit for DBA's and developers @@ -46,6 +40,7 @@ * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" +#include "tologger.h" #include "tobrowser.h" #include "tobrowsertable.h" @@ -89,6 +84,7 @@ #include <qtoolbar.h> #include <qtoolbutton.h> #include <qtooltip.h> +#include <QDebug> #include <QList> #include <QMdiArea> #include <QMdiSubWindow> @@ -511,7 +507,7 @@ } catch (...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; } Tablespaces->setSelectionMode(toTreeWidget::Multi); } @@ -1824,7 +1820,7 @@ } catch (...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; return QString::null; } } Modified: branches/tora-trotl/src/tobrowsertable.cpp =================================================================== --- branches/tora-trotl/src/tobrowsertable.cpp 2010-02-11 20:26:52 UTC (rev 3407) +++ branches/tora-trotl/src/tobrowsertable.cpp 2010-02-11 21:50:38 UTC (rev 3408) @@ -40,6 +40,7 @@ * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" +#include "tologger.h" #include "tobrowsertable.h" #include "toconnection.h" @@ -370,7 +371,7 @@ } catch (...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; TablespaceLabel->hide(); Tablespace->hide(); } Modified: branches/tora-trotl/src/tochartmanager.cpp =================================================================== --- branches/tora-trotl/src/tochartmanager.cpp 2010-02-11 20:26:52 UTC (rev 3407) +++ branches/tora-trotl/src/tochartmanager.cpp 2010-02-11 21:50:38 UTC (rev 3408) @@ -41,6 +41,7 @@ #include "tochartmanager.h" #include "utils.h" +#include "tologger.h" #include "tobarchart.h" #include "toconf.h" @@ -284,7 +285,7 @@ } catch (...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; } return LastName; } Modified: branches/tora-trotl/src/toconnection.cpp =================================================================== --- branches/tora-trotl/src/toconnection.cpp 2010-02-11 20:26:52 UTC (rev 3407) +++ branches/tora-trotl/src/toconnection.cpp 2010-02-11 21:50:38 UTC (rev 3408) @@ -123,7 +123,7 @@ } catch (...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; } } @@ -280,7 +280,7 @@ Connection->ConnectionPool->release(ConnectionSub); throw; } - get_log().ts<toDecorator>( __HERE__) << "setQuery:'" << SQL.toAscii().constData() << "'" << std::endl; + get_log(0).ts<toDecorator>( __HERE__) << "setQuery:'" << SQL.toAscii().constData() << "'" << std::endl; ConnectionSub->setQuery(this); } @@ -356,7 +356,7 @@ Connection->ConnectionPool->release(ConnectionSub); throw; } - get_log().ts<toDecorator>( __HERE__) << "setQuery:'" << SQL.toAscii().constData() << "'" << std::endl; + get_log(0).ts<toDecorator>( __HERE__) << "setQuery:'" << SQL.toAscii().constData() << "'" << std::endl; ConnectionSub->setQuery(this); } @@ -382,7 +382,7 @@ Connection->ConnectionPool->release(ConnectionSub); throw; } - get_log().ts<toDecorator>( __HERE__) << "setQuery:'" << SQL.toAscii().constData() << "'" << std::endl; + get_log(0).ts<toDecorator>( __HERE__) << "setQuery:'" << SQL.toAscii().constData() << "'" << std::endl; ConnectionSub->setQuery(this); } @@ -411,7 +411,7 @@ Query = NULL; throw; } - get_log().ts<toDecorator>( __HERE__) << "setQuery:'" << SQL.toAscii().constData() << "'" << std::endl; + get_log(0).ts<toDecorator>( __HERE__) << "setQuery:'" << SQL.toAscii().constData() << "'" << std::endl; ConnectionSub->setQuery(this); } @@ -437,7 +437,7 @@ Connection->ConnectionPool->release(ConnectionSub); throw; } - get_log().ts<toDecorator>( __HERE__) << "setQuery:'" << SQL.toAscii().constData() << "'" << std::endl; + get_log(0).ts<toDecorator>( __HERE__) << "setQuery:'" << SQL.toAscii().constData() << "'" << std::endl; ConnectionSub->setQuery(this); } @@ -468,7 +468,7 @@ Connection->ConnectionPool->release(ConnectionSub); throw; } - get_log().ts<toDecorator>( __HERE__) << "setQuery:'" << SQL.toAscii().constData() << "'" << std::endl; + get_log(0).ts<toDecorator>( __HERE__) << "setQuery:'" << SQL.toAscii().constData() << "'" << std::endl; ConnectionSub->setQuery(this); } @@ -499,7 +499,7 @@ Connection->ConnectionPool->release(ConnectionSub); throw; } - get_log().ts<toDecorator>( __HERE__) << "setQuery:'" << SQL.toAscii().constData() << "'" << std::endl; + get_log(0).ts<toDecorator>( __HERE__) << "setQuery:'" << SQL.toAscii().constData() << "'" << std::endl; ConnectionSub->setQuery(this); } @@ -523,7 +523,7 @@ Query = NULL; throw; } - get_log().ts<toDecorator>( __HERE__) << "setQuery:'" << SQL.toAscii().constData() << "'" << std::endl; + get_log(0).ts<toDecorator>( __HERE__) << "setQuery:'" << SQL.toAscii().constData() << "'" << std::endl; ConnectionSub->setQuery(this); } @@ -577,7 +577,7 @@ { if (ConnectionSub->query() == this) { - get_log().ts<toDecorator>( __HERE__) << "setQuery: NULL" << std::endl; + get_log(0).ts<toDecorator>( __HERE__) << "setQuery: NULL" << std::endl; ConnectionSub->setQuery(NULL); } if (Mode != Test && Connection && Connection->ConnectionPool) @@ -585,7 +585,7 @@ } catch (...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; } } @@ -707,7 +707,7 @@ toQValue toQuery::readValue(void) { - //get_log().ts<toDecorator>( __HERE__) << this->sql().left(50).toUtf8().constData() << std::endl; + //get_log(0).ts<toDecorator>( __HERE__) << this->sql().left(50).toUtf8().constData() << std::endl; if (!Connection) return toQValue(0); @@ -720,7 +720,7 @@ toQValue toQuery::readValueNull(void) { //TODO - //get_log().ts<toDecorator>( __HERE__) << this->sql().left(50).toUtf8().constData() << std::endl; + //get_log(0).ts<toDecorator>( __HERE__) << this->sql().left(50).toUtf8().constData() << std::endl; if (!Connection) return toQValue(0); @@ -1446,7 +1446,7 @@ } catch (...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; if (Connection->ReadingValues.getValue() == 0) Connection->ReadingValues.up(); } @@ -1473,7 +1473,7 @@ } catch (...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; ReadingCache = false; } } Modified: branches/tora-trotl/src/toconnectionpool.cpp =================================================================== --- branches/tora-trotl/src/toconnectionpool.cpp 2010-02-11 20:26:52 UTC (rev 3407) +++ branches/tora-trotl/src/toconnectionpool.cpp 2010-02-11 21:50:38 UTC (rev 3408) @@ -78,17 +78,17 @@ void toConnectionPoolTest::test() { for(int i = 0; Pool && i < Pool->size(); i++) { - get_log().ts<toDecorator>( __HERE__) << "Pool member id:" << i << std::endl; + get_log(0).ts<toDecorator>( __HERE__) << "Pool member id:" << i << std::endl; toConnectionPool::PooledState state = Pool->test(i); if(state == toConnectionPool::Busy) { - get_log().ts<toDecorator>( __HERE__) << "Pool member id:" << i << " Busy" << std::endl; + get_log(0).ts<toDecorator>( __HERE__) << "Pool member id:" << i << " Busy" << std::endl; continue; } if(state == toConnectionPool::Broken) { - get_log().ts<toDecorator>( __HERE__) << "Pool member id:" << i << " Broken" << std::endl; + get_log(0).ts<toDecorator>( __HERE__) << "Pool member id:" << i << " Broken" << std::endl; Pool->fix(i); } } @@ -198,7 +198,7 @@ } catch(...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; } if(psub->Sub) @@ -228,7 +228,7 @@ } catch(...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; state = Broken; } @@ -246,10 +246,10 @@ PooledSub *psub = (*ptr)[member]; if(psub->State != Free) { - get_log().ts<toDecorator>( __HERE__) << "Pool member:" << member << " is NOT free" << std::endl; + get_log(0).ts<toDecorator>( __HERE__) << "Pool member:" << member << " is NOT free" << std::endl; return psub->State; } - get_log().ts<toDecorator>( __HERE__) << "Pool member" << member << " is free" << std::endl; + get_log(0).ts<toDecorator>( __HERE__) << "Pool member" << member << " is free" << std::endl; psub->State = Busy; ptr.unlock(); @@ -266,7 +266,7 @@ PooledState state = Free; try { QString sql = toSQL::string("Global:Now", *Connection); - //get_log().ts<toDecorator>( __HERE__) << sql.toUtf8().constData() << std::endl; + //get_log(0).ts<toDecorator>( __HERE__) << sql.toUtf8().constData() << std::endl; if(sql.isEmpty()) return state; @@ -278,7 +278,7 @@ } catch(...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; state = Broken; } Modified: branches/tora-trotl/src/todebug.cpp =================================================================== --- branches/tora-trotl/src/todebug.cpp 2010-02-11 20:26:52 UTC (rev 3407) +++ branches/tora-trotl/src/todebug.cpp 2010-02-11 21:50:38 UTC (rev 3408) @@ -41,6 +41,7 @@ #include <QtDebug> #include "utils.h" +#include "tologger.h" #include "toconf.h" #include "todebug.h" @@ -586,7 +587,7 @@ } catch (...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; toLocker lock (Parent.Lock); Parent.TargetLog += QString::fromLatin1("Couldn't enable debugging for target session\n"); } @@ -2488,7 +2489,7 @@ } catch (...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; toStatusMessage(tr("Failed to start target task thread, close some other tools and try again")); return ; } Modified: branches/tora-trotl/src/toeditextensions.cpp =================================================================== --- branches/tora-trotl/src/toeditextensions.cpp 2010-02-11 20:26:52 UTC (rev 3407) +++ branches/tora-trotl/src/toeditextensions.cpp 2010-02-11 21:50:38 UTC (rev 3408) @@ -40,6 +40,7 @@ * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" +#include "tologger.h" #include "toconf.h" #include "toconnection.h" @@ -301,7 +302,7 @@ } catch (...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; res = toSQLParse::indent(ind + mrk); } t = Current->text(line2); @@ -335,7 +336,7 @@ } catch (...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; Current->insert(toSQLParse::indent(text.mid(pos))); } } Modified: branches/tora-trotl/src/toeventquery.cpp =================================================================== --- branches/tora-trotl/src/toeventquery.cpp 2010-02-11 20:26:52 UTC (rev 3407) +++ branches/tora-trotl/src/toeventquery.cpp 2010-02-11 21:50:38 UTC (rev 3408) @@ -40,6 +40,7 @@ * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" +#include "tologger.h" #include "toconf.h" #include "toeventquery.h" @@ -50,7 +51,7 @@ toQValue toEventQuery::readValueNull() { - //get_log().ts<toDecorator>( __HERE__) << std::endl; + //get_log(0).ts<toDecorator>( __HERE__) << std::endl; if(Values.isEmpty()) throw tr("Read past end of query"); @@ -153,7 +154,7 @@ } } catch(...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; ; // ignored } } @@ -181,7 +182,7 @@ Statistics->refreshStats(false); } catch(...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; // ignored } } Modified: branches/tora-trotl/src/toeventquerytask.cpp =================================================================== --- branches/tora-trotl/src/toeventquerytask.cpp 2010-02-11 20:26:52 UTC (rev 3407) +++ branches/tora-trotl/src/toeventquerytask.cpp 2010-02-11 21:50:38 UTC (rev 3408) @@ -40,6 +40,7 @@ * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" +#include "tologger.h" #include "toconf.h" #include "toeventquerytask.h" @@ -76,7 +77,7 @@ } \ } \ catch(...) { \ - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; \ + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; \ if(!Closed) { \ emit error(tr("Unknown exception.")); \ close(); \ @@ -140,7 +141,7 @@ Statistics->changeSession(*Query); } catch(...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; // ignored } @@ -151,7 +152,7 @@ Query = 0; } catch(...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; // ignored } @@ -180,7 +181,7 @@ Query->cancel(); } catch(...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; // noop } Modified: branches/tora-trotl/src/tofyracleconnection.cpp =================================================================== --- branches/tora-trotl/src/tofyracleconnection.cpp 2010-02-11 20:26:52 UTC (rev 3407) +++ branches/tora-trotl/src/tofyracleconnection.cpp 2010-02-11 21:50:38 UTC (rev 3408) @@ -457,7 +457,7 @@ } catch (...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; } toQDescList ret; Modified: branches/tora-trotl/src/tohighlightedtext.cpp =================================================================== --- branches/tora-trotl/src/tohighlightedtext.cpp 2010-02-11 20:26:52 UTC (rev 3407) +++ branches/tora-trotl/src/tohighlightedtext.cpp 2010-02-11 21:50:38 UTC (rev 3408) @@ -40,6 +40,7 @@ * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" +#include "tologger.h" #include "toconf.h" #include "toconnection.h" @@ -769,7 +770,7 @@ } catch (...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; } } @@ -1019,7 +1020,7 @@ } catch (...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; qDebug() << "toHighlightedText::getCompletionList: Unknown error."; } } Modified: branches/tora-trotl/src/toinvalid.cpp =================================================================== --- branches/tora-trotl/src/toinvalid.cpp 2010-02-11 20:26:52 UTC (rev 3407) +++ branches/tora-trotl/src/toinvalid.cpp 2010-02-11 21:50:38 UTC (rev 3408) @@ -40,6 +40,7 @@ * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" +#include "tologger.h" #include "tochangeconnection.h" #include "toconf.h" @@ -219,7 +220,7 @@ } catch (...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; } } Modified: branches/tora-trotl/src/tologger.h =================================================================== --- branches/tora-trotl/src/tologger.h 2010-02-11 20:26:52 UTC (rev 3407) +++ branches/tora-trotl/src/tologger.h 2010-02-11 21:50:38 UTC (rev 3408) @@ -20,10 +20,31 @@ charDecorator<'\n'> )> toDecorator; -inline thread_safe_log get_log() +template< int idxLog> +thread_safe_log templ_get_log_ownthread( int_to_type< idxLog> * = NULL ) { + /* static std::ofstream out( get_out_name< idxLog>( false).c_str() ); */ static internal_thread_safe_log_ownthread log( std::cout ); return thread_safe_log( log); } +/* +thread_safe_log templ_get_log_ownthread<1>( int_to_type< 1> * = NULL ) +{ + static std::ofstream out( get_out_name< idxLog>( false).c_str() ); + static internal_thread_safe_log_ownthread log( out); + return thread_safe_log( log); +} +*/ + +inline thread_safe_log get_log( int idxLog) +{ + switch( idxLog) + { + case 0: return templ_get_log_ownthread< 0>(); // tooracleconnection log + case 1: return templ_get_log_ownthread< 1>(); // exception log + default: assert( false); + } +} + #endif Modified: branches/tora-trotl/src/tomain.cpp =================================================================== --- branches/tora-trotl/src/tomain.cpp 2010-02-11 20:26:52 UTC (rev 3407) +++ branches/tora-trotl/src/tomain.cpp 2010-02-11 21:50:38 UTC (rev 3408) @@ -40,6 +40,7 @@ * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" +#include "tologger.h" #include "toabout.h" #include "tobackgroundlabel.h" @@ -1458,7 +1459,7 @@ } catch(...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; } std::map<QString, toTool *> &tools = toTool::tools(); Modified: branches/tora-trotl/src/tonewconnection.cpp =================================================================== --- branches/tora-trotl/src/tonewconnection.cpp 2010-02-11 20:26:52 UTC (rev 3407) +++ branches/tora-trotl/src/tonewconnection.cpp 2010-02-11 21:50:38 UTC (rev 3408) @@ -40,6 +40,7 @@ * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" +#include "tologger.h" #include "toconf.h" #include "toconnection.h" @@ -585,7 +586,7 @@ } catch (...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; } } Modified: branches/tora-trotl/src/tonoblockquery.cpp =================================================================== --- branches/tora-trotl/src/tonoblockquery.cpp 2010-02-11 20:26:52 UTC (rev 3407) +++ branches/tora-trotl/src/tonoblockquery.cpp 2010-02-11 21:50:38 UTC (rev 3408) @@ -90,7 +90,7 @@ toLocker lock (Parent.Lock) ; Parent.ReadingValues.insert(Parent.ReadingValues.end(), value); - get_log().ts<toDecorator>( __HERE__) + get_log(0).ts<toDecorator>( __HERE__) << "Value read:" << value.toString().toUtf8().constData() << std::endl; @@ -133,21 +133,21 @@ } catch (const toConnection::exception &str) { - get_log().ts<toDecorator>( __HERE__) << "Exception caught(a)" << std::endl; + get_log(0).ts<toDecorator>( __HERE__) << "Exception caught(a)" << std::endl; toLocker lock (Parent.Lock) ; Parent.Error = str; } catch (const QString &str) { - get_log().ts<toDecorator>( __HERE__) << "Exception caught(b)" << std::endl; + get_log(0).ts<toDecorator>( __HERE__) << "Exception caught(b)" << std::endl; toLocker lock (Parent.Lock) ; Parent.Error = str; } catch (...) { - get_log().ts<toDecorator>( __HERE__) << "Exception caught(c): " << std::endl; + get_log(0).ts<toDecorator>( __HERE__) << "Exception caught(c): " << std::endl; toLocker lock (Parent.Lock) ; Parent.Error = qApp->translate("toNoBlockQuery", "Unknown exception"); @@ -162,18 +162,18 @@ } catch (...) { - get_log().ts<toDecorator>( __HERE__) << "Unhandled exception: " << std::endl; + get_log(0).ts<toDecorator>( __HERE__) << "Unhandled exception: " << std::endl; } delete Parent.Query; Parent.Query = NULL; Parent.Running.up(); Parent.EOQ = true; - get_log().ts<toDecorator>( __HERE__) << "toNoBlockQuery::queryTask::run finished." << std::endl; + get_log(0).ts<toDecorator>( __HERE__) << "toNoBlockQuery::queryTask::run finished." << std::endl; } toQValue toNoBlockQuery::readValueNull() { - //get_log().ts<toDecorator>( __HERE__) << std::endl; + //get_log(0).ts<toDecorator>( __HERE__) << std::endl; if (CurrentValue == Values.end()) { @@ -187,7 +187,7 @@ Values = ReadingValues; CurrentValue = Values.begin(); ReadingValues.clear(); - get_log().ts<toDecorator>( __HERE__) + get_log(0).ts<toDecorator>( __HERE__) << "Value read: '" << (*CurrentValue).toString().toUtf8().constData() << "'" << std::endl; @@ -237,7 +237,7 @@ } catch (...) { -// get_log().ts<toDecorator>( __HERE__) +// get_log(0).ts<toDecorator>( __HERE__) // << "Unhandled exception: " << __HERE__ << std::endl; Statistics = NULL; } @@ -257,7 +257,7 @@ } catch (...) { -// get_log().ts<toDecorator>( __HERE__) +// get_log(0).ts<toDecorator>( __HERE__) // << "Unhandled exception: " << __HERE__ << std::endl; Error = qApp->translate("toNoBlockQuery", "Failed to start background query thread"); while (Running.getValue()) @@ -299,7 +299,7 @@ } catch (...) { -// get_log().ts<toDecorator>( __HERE__) +// get_log(0).ts<toDecorator>( __HERE__) // << "Unhandled exception: " << __HERE__ << std::endl; Statistics = NULL; } @@ -319,7 +319,7 @@ } catch (...) { - // get_log().ts<toDecorator>( __HERE__) << "Unhandled exception: " << __HERE__ << std::endl; + // get_log(0).ts<toDecorator>( __HERE__) << "Unhandled exception: " << __HERE__ << std::endl; Error = qApp->translate("toNoBlockQuery", "Failed to start background query thread"); while (Running.getValue()) Running.down(); @@ -345,7 +345,7 @@ // bool cv = (CurrentValue == Values.end()); // bool sz = !(ReadingValues.size()); // toQValue ret = *CurrentValue; -// get_log().ts<toDecorator>( __HERE__) +// get_log(0).ts<toDecorator>( __HERE__) // << "cv: " << cv << "\'" << (CurrentValue!=Values.end() ? (*CurrentValue).toUtf8().toAscii().constData(): "NULL") << "'\t" // << "sz: " << Values.size() << '\t' << "rs: " << ReadingValues.size() << '\t' // << "EOQ: " << EOQ << '\t' << "Processed: " << Processed << std::endl; @@ -441,7 +441,7 @@ ReadingValues.clear(); Values.clear(); CurrentValue = Values.end(); - get_log().ts<toDecorator>( __HERE__) << "CurrentValue=Values.end()" << std::endl; + get_log(0).ts<toDecorator>( __HERE__) << "CurrentValue=Values.end()" << std::endl; Quit = EOQ = false; Processed = 0; @@ -454,7 +454,7 @@ } catch (...) { - get_log().ts<toDecorator>( __HERE__) << "Exception(a): toNoBlockQuery::poll()" << std::endl; + get_log(0).ts<toDecorator>( __HERE__) << "Exception(a): toNoBlockQuery::poll()" << std::endl; Statistics = NULL; } @@ -463,7 +463,7 @@ } catch (...) { - get_log().ts<toDecorator>( __HERE__) << "Exception(b): toNoBlockQuery::poll()" << std::endl; + get_log(0).ts<toDecorator>( __HERE__) << "Exception(b): toNoBlockQuery::poll()" << std::endl; Error = qApp->translate("toNoBlockQuery", "Failed to start background query thread"); while (Running.getValue()) Running.down(); Modified: branches/tora-trotl/src/tooracleconnection.cpp =================================================================== --- branches/tora-trotl/src/tooracleconnection.cpp 2010-02-11 20:26:52 UTC (rev 3407) +++ branches/tora-trotl/src/tooracleconnection.cpp 2010-02-11 21:50:38 UTC (rev 3408) @@ -106,7 +106,7 @@ static void ThrowException(const ::trotl::OciException &exc) { - get_log().ts<toDecorator>( __HERE__) + get_log(0).ts<toDecorator>( __HERE__) << "What:" << exc.what() << std::endl << exc.get_sql() << std::endl << "--------------------------------------------------------------------------------" @@ -174,7 +174,7 @@ } catch(...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; } _conn = 0; _login = 0; @@ -187,7 +187,7 @@ virtual void throwExtendedException(toConnection &conn, const ::trotl::OciException &exc) { - get_log().ts<toDecorator>( __HERE__) + get_log(0).ts<toDecorator>( __HERE__) << "What:" << exc.what() << std::endl << exc.get_sql() << std::endl << "--------------------------------------------------------------------------------" @@ -252,7 +252,7 @@ if(BP.is_null(_last_buff_row)) { value = toQValue(); - get_log().ts<toDecorator>( __HERE__) << "Just read: NULL" << std::endl; + get_log(0).ts<toDecorator>( __HERE__) << "Just read: NULL" << std::endl; } else { switch(BP.dty) { case SQLT_NUM: @@ -272,7 +272,7 @@ &i); oci_check_error(__HERE__, _errh, res); value = toQValue(i); - get_log().ts<toDecorator>( __HERE__) << "Just read: " << i << std::endl; + get_log(0).ts<toDecorator>( __HERE__) << "Just read: " << i << std::endl; } else { double d; sword res = OCINumberToReal(_errh, @@ -281,7 +281,7 @@ &d); oci_check_error(__HERE__, _errh, res); value = toQValue(d); - get_log().ts<toDecorator>( __HERE__) << "Just read: " << d << std::endl; + get_log(0).ts<toDecorator>( __HERE__) << "Just read: " << d << std::endl; } } break; @@ -291,11 +291,11 @@ if((xmlnode*)bpx->_xmlvaluep[_last_buff_row] == NULL) { value = toQValue(); - get_log().ts<toDecorator>( __HERE__) << "Just read: NULL XML" << std::endl; + get_log(0).ts<toDecorator>( __HERE__) << "Just read: NULL XML" << std::endl; } else { std::string s(BP.get_string(_last_buff_row)); value = toQValue(QString(s.c_str())); - get_log().ts<toDecorator>( __HERE__) << "Just read: \"" << s << "\"" << std::endl; + get_log(0).ts<toDecorator>( __HERE__) << "Just read: \"" << s << "\"" << std::endl; } } break; @@ -310,7 +310,7 @@ default: std::string s(BP.get_string(_last_buff_row)); value = toQValue(QString(s.c_str())); - get_log().ts<toDecorator>( __HERE__) << "Just read: \"" << s << "\"" << std::endl; + get_log(0).ts<toDecorator>( __HERE__) << "Just read: \"" << s << "\"" << std::endl; } } @@ -326,7 +326,7 @@ oracleQuery(toQuery *query, oracleSub *) : toQuery::queryImpl(query) { - get_log().ts<toDecorator>( __HERE__) << std::endl; + get_log(0).ts<toDecorator>( __HERE__) << std::endl; Running = Cancel = false; SaveInPool = false; Query = NULL; @@ -358,7 +358,7 @@ // { // int i; // (*Query) >> i; -// get_log().ts<toDecorator>( __HERE__) << +// get_log(0).ts<toDecorator>( __HERE__) << // "d:\t" << bp.dty << // "\ti:\t'" << i << '\'' << std::endl; // return toQValue(i); @@ -367,18 +367,18 @@ // { // std::string val; // (*Query) >> val; -// get_log().ts<toDecorator>( __HERE__) << +// get_log(0).ts<toDecorator>( __HERE__) << // "d:\t" << bp.dty << // "\ts:\t'" << val << '\'' << std::endl; // return toQValue(val.c_str()); // } // } // } catch (::trotl::OciException e) { -// get_log().ts<toDecorator>( __HERE__) << +// get_log(0).ts<toDecorator>( __HERE__) << // e.what() << std::endl; // return QString(); // } catch (...) { -// get_log().ts<toDecorator>( __HERE__) << +// get_log(0).ts<toDecorator>( __HERE__) << // "Unknown exception" << std::endl; // return QString(); // } @@ -550,17 +550,17 @@ virtual bool eof(void) { if (!Query || Cancel) { - get_log().ts<toDecorator>( __HERE__) << "eof - (1) true" << std::endl; + get_log(0).ts<toDecorator>( __HERE__) << "eof - (1) true" << std::endl; return true; } try { bool e = Query->eof(); - get_log().ts<toDecorator>( __HERE__) << "eof - (2) " << Query->row_count() << '\t' << e << std::endl; + get_log(0).ts<toDecorator>( __HERE__) << "eof - (2) " << Query->row_count() << '\t' << e << std::endl; return e; //Query->eof(); } catch (const ::trotl::OciException &exc) { - get_log().ts<toDecorator>( __HERE__) << "eof - (e) true" << std::endl; + get_log(0).ts<toDecorator>( __HERE__) << "eof - (e) true" << std::endl; if(query()) { oracleSub *conn = dynamic_cast<oracleSub *>(query()->connectionSub()); @@ -573,13 +573,13 @@ virtual int rowsProcessed(void) { - get_log().ts<toDecorator>( __HERE__) << "TODO: rowsProcessed A:" << std::endl; + get_log(0).ts<toDecorator>( __HERE__) << "TODO: rowsProcessed A:" << std::endl; if (!Query) return 0; //return Query->get_last_row(); ???? unsigned i = Query->get_last_row(); - get_log().ts<toDecorator>( __HERE__) << "TODO: rowsProcessed B: " << i << std::endl; + get_log(0).ts<toDecorator>( __HERE__) << "TODO: rowsProcessed B: " << i << std::endl; return i; } @@ -587,28 +587,28 @@ { //int descriptionLen; //Query->describe_select(descriptionLen); - get_log().ts<toDecorator>( __HERE__) << "TODO: columns:" << Query->get_column_count() << std::endl; + get_log(0).ts<toDecorator>( __HERE__) << "TODO: columns:" << Query->get_column_count() << std::endl; return Query->get_column_count(); } virtual std::list<toQuery::queryDescribe> describe(void) { - get_log().ts<toDecorator>( __HERE__) << std::endl; + get_log(0).ts<toDecorator>( __HERE__) << std::endl; std::list<toQuery::queryDescribe> ret; int datatypearg1 = 0; int datatypearg2 = 0; - get_log().ts<toDecorator>( __HERE__) << "TODO describe:" << std::endl; + get_log(0).ts<toDecorator>( __HERE__) << "TODO describe:" << std::endl; // TODO trotl should return const iterator const std::vector<trotl::ColumnType> &col = Query->get_columns(); if(col.empty()) return ret; std::vector<trotl::ColumnType>::const_iterator it = col.begin(); ++it; // starts with 1st - //get_log().ts<toDecorator>( __HERE__) << "Columns: " << q1.get_column_count() << std::endl; + //get_log(0).ts<toDecorator>( __HERE__) << "Columns: " << q1.get_column_count() << std::endl; for(; it != col.end(); ++it) { - get_log().ts<toDecorator>( __HERE__) << "Var: " << (*it).get_type_str(true) << std::endl; + get_log(0).ts<toDecorator>( __HERE__) << "Var: " << (*it).get_type_str(true) << std::endl; toQuery::queryDescribe desc; desc.AlignRight = false; desc.Name = QString::fromUtf8( (*it)._column_name.c_str() ); @@ -682,7 +682,7 @@ cur.Comment = objects.readValueNull(); ret.insert(ret.end(), cur); } - get_log().ts<toDecorator>( __HERE__) + get_log(0).ts<toDecorator>( __HERE__) << "++++ objectNames +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" << std::endl; @@ -714,7 +714,7 @@ (*i).Synonyms.insert((*i).Synonyms.end(), synonym); } } - get_log().ts<toDecorator>( __HERE__) + get_log(0).ts<toDecorator>( __HERE__) << "++++ synonymMap ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" << std::endl; @@ -782,7 +782,7 @@ } catch (...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; } return ret; } @@ -799,7 +799,7 @@ } catch (...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; } try @@ -883,11 +883,11 @@ return QString(version.str().c_str()); } catch (::trotl::OciException e) { - get_log().ts<toDecorator>( __HERE__) << e.what() << std::endl; + get_log(0).ts<toDecorator>( __HERE__) << e.what() << std::endl; } catch (...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; // Ignore any errors here } return QString::QString(); @@ -906,7 +906,7 @@ virtual void execute(toConnectionSub *sub, const QString &sql, toQList ¶ms) { oracleSub *conn = oracleConv(sub); - get_log().ts<toDecorator>( __HERE__) << std::endl; + get_log(0).ts<toDecorator>( __HERE__) << std::endl; if ( params.empty() ) { try @@ -916,7 +916,7 @@ query.execute_internal(::trotl::g_OCIPL_BULK_ROWS, OCI_DEFAULT); //otl_cursor::direct_exec(*(conn->Connection), sql.toUtf8().constData()); //TODO - get_log().ts<toDecorator>( __HERE__) << "TODO: otl_cursor::direct_exec" << std::endl; + get_log(0).ts<toDecorator>( __HERE__) << "TODO: otl_cursor::direct_exec" << std::endl; } catch (const ::trotl::OciException &exc) { @@ -959,7 +959,7 @@ _envp = new ::trotl::OciEnv(*_envallocp); - //get_log().ts<toDecorator>( __HERE__) << "TODO: initialize" << std::endl << __HERE__ << std::endl; + //get_log(0).ts<toDecorator>( __HERE__) << "TODO: initialize" << std::endl << __HERE__ << std::endl; addProvider("Oracle"); } @@ -1121,7 +1121,7 @@ void toOracleProvider::oracleQuery::execute(void) { - get_log().ts<toDecorator>( __HERE__) << std::endl; + get_log(0).ts<toDecorator>( __HERE__) << std::endl; oracleSub *conn = dynamic_cast<oracleSub *>(query()->connectionSub()); if (!conn) @@ -1139,7 +1139,7 @@ QString sql = this->query()->sql(); sql.replace(stripnl, ""); - get_log().ts<toDecorator>( __HERE__) << "SQL:" << ::std::string(sql.toUtf8().constData()) << std::endl; + get_log(0).ts<toDecorator>( __HERE__) << "SQL:" << ::std::string(sql.toUtf8().constData()) << std::endl; //Query = new oracleQuery::oracleSqlStatement(*conn->_conn, sql.toUtf8().constData()); Query = new oracleQuery::trotlQuery(*conn->_conn, ::std::string(sql.toUtf8().constData())); @@ -1172,19 +1172,19 @@ if( bp.bind_typename == "int" /*&& (*i).isInt()*/ ) { (*Query) << (*i).toInt(); - get_log().ts<toDecorator>( __HERE__) + get_log(0).ts<toDecorator>( __HERE__) << "VERY VERY TODO: bind param(i):'" << bp.bind_name << "'\t" << (*i).toInt() << " of:" << query()->params().size() << std::endl; } else if( (bp.bind_typename == "char" || bp.bind_typename == "varchar") && (*i).isString()) { std::string param((const char*)((*i).toString().toUtf8().constData())); - get_log().ts<toDecorator>( __HERE__) + get_log(0).ts<toDecorator>( __HERE__) << "VERY VERY TODO: bind param(s):'" << bp.bind_name << "'\t" << param << " of:" << query()->params().size() << std::endl; (*Query) << ::std::string((const char*)((*i).toString().toUtf8().constData())); - get_log().ts<toDecorator>( __HERE__) + get_log(0).ts<toDecorator>( __HERE__) << "VERY VERY TODO: bind param:" << ::std::string((const char*)((*i).toString().toUtf8().constData())) << std::endl; } else { @@ -1334,7 +1334,7 @@ (ub4) session_mode); conn = new ::trotl::OciConnection(_env, *login); - ::get_log().ts<toDecorator>( __HERE__) << "Oracle database version: " + ::get_log(0).ts<toDecorator>( __HERE__) << "Oracle database version: " << ::std::hex << ::std::showbase << ::std::setw(10) << ::std::setfill('0') << ::std::internal << login->_server._version << ::std::endl @@ -1349,7 +1349,7 @@ } catch (const ::trotl::OciException &exc) { - get_log().ts<toDecorator>( __HERE__) + get_log(0).ts<toDecorator>( __HERE__) << "TODO: catch" << std::endl << __HERE__ << std::endl; if (toThread::mainThread() && exc.get_code() == 28001) { @@ -1391,7 +1391,7 @@ connection().setPassword(newpass); } else { - get_log().ts<toDecorator>( __HERE__) << std::endl; + get_log(0).ts<toDecorator>( __HERE__) << std::endl; throw exc; } // (toThread::mainThread() && exc.get_code() == 28001) } // catch (const ::trotl::OciException &exc) @@ -1524,7 +1524,7 @@ } catch (...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; } } Modified: branches/tora-trotl/src/tooracleextract.cpp =================================================================== --- branches/tora-trotl/src/tooracleextract.cpp 2010-02-11 20:26:52 UTC (rev 3407) +++ branches/tora-trotl/src/tooracleextract.cpp 2010-02-11 21:50:38 UTC (rev 3408) @@ -42,6 +42,7 @@ #include "tooracleextract.h" #include "utils.h" +#include "tologger.h" #include "toconf.h" #include "toconnection.h" @@ -401,7 +402,7 @@ } catch (...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; isDBA = false; } ql << "DATASTORE" << "FILTER" << "LEXER" << "WORDLIST" << "STORAGE"; @@ -7542,7 +7543,7 @@ } catch (...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; DbaSegments = QString("(select '%1' owner,user_segments.* from sys.user_segments)"). arg(CONNECTION.user().toUpper()); } @@ -7555,7 +7556,7 @@ } catch (...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; toQList ret = toQuery::readQueryNull(CONNECTION, SQLSetSizingFallback); if (ret.empty()) ret = toQuery::readQueryNull(CONNECTION, SQLSetSizingFallback2); Modified: branches/tora-trotl/src/tooutput.cpp =================================================================== --- branches/tora-trotl/src/tooutput.cpp 2010-02-11 20:26:52 UTC (rev 3407) +++ branches/tora-trotl/src/tooutput.cpp 2010-02-11 21:50:38 UTC (rev 3408) @@ -40,6 +40,7 @@ * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" +#include "tologger.h" #include "toconf.h" #include "toconnection.h" @@ -339,7 +340,7 @@ } catch (...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; toStatusMessage(tr("Couldn't enable/disable output for session")); } } Modified: branches/tora-trotl/src/topiechart.cpp =================================================================== --- branches/tora-trotl/src/topiechart.cpp 2010-02-11 20:26:52 UTC (rev 3407) +++ branches/tora-trotl/src/topiechart.cpp 2010-02-11 21:50:38 UTC (rev 3408) @@ -40,6 +40,7 @@ * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" +#include "tologger.h" #include "toconf.h" #include "tolinechart.h" @@ -474,7 +475,7 @@ } catch (...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; } if (Flow) Modified: branches/tora-trotl/src/toqsqlconnection.cpp =================================================================== --- branches/tora-trotl/src/toqsqlconnection.cpp 2010-02-11 20:26:52 UTC (rev 3407) +++ branches/tora-trotl/src/toqsqlconnection.cpp 2010-02-11 21:50:38 UTC (rev 3408) @@ -40,6 +40,7 @@ * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" +#include "tologger.h" #include "toconnection.h" #include "tohighlightedtext.h" @@ -1266,7 +1267,7 @@ } catch (...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; } } } @@ -1544,7 +1545,7 @@ } catch (...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; } } } @@ -1598,7 +1599,7 @@ } catch (...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; } return ret; @@ -1620,7 +1621,7 @@ } catch (...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; } try @@ -1653,7 +1654,7 @@ } catch (...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; } toQDescList ret; @@ -1713,7 +1714,7 @@ } catch (...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; } return ret; } @@ -1962,7 +1963,7 @@ } catch (...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; } return ret; } Modified: branches/tora-trotl/src/toresult.cpp =================================================================== --- branches/tora-trotl/src/toresult.cpp 2010-02-11 20:26:52 UTC (rev 3407) +++ branches/tora-trotl/src/toresult.cpp 2010-02-11 21:50:38 UTC (rev 3408) @@ -40,6 +40,7 @@ * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" +#include "tologger.h" #include "toconf.h" #include "toresult.h" @@ -97,7 +98,7 @@ } catch (...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; Handled = false; } if (last != Handled) @@ -119,7 +120,7 @@ } catch (...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; setHandle(false); } } @@ -156,7 +157,7 @@ } catch (...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; setHandle(false); } } @@ -172,7 +173,7 @@ } catch (...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; setHandle(false); } } @@ -195,7 +196,7 @@ } catch (...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; // qDebug() << "setSQL failed:" << sql.name(); setHandle(false); } @@ -244,7 +245,7 @@ } catch (...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; } try { @@ -253,7 +254,7 @@ } catch (...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; Result->Handled = false; } if (!Result->Handled) Modified: branches/tora-trotl/src/toresultmodel.cpp =================================================================== --- branches/tora-trotl/src/toresultmodel.cpp 2010-02-11 20:26:52 UTC (rev 3407) +++ branches/tora-trotl/src/toresultmodel.cpp 2010-02-11 21:50:38 UTC (rev 3408) @@ -40,9 +40,11 @@ * END_COMMON_COPYRIGHT_HEADER */ #include "config.h" +#include "utils.h" +#include "tologger.h" + #include "toresultmodel.h" #include "toconf.h" -#include "utils.h" #include "toconfiguration.h" #include "toqvalue.h" #include "toeventquery.h" @@ -672,7 +674,7 @@ } catch (...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; // will catch later ; } Modified: branches/tora-trotl/src/toresultplan.cpp =================================================================== --- branches/tora-trotl/src/toresultplan.cpp 2010-02-11 20:26:52 UTC (rev 3407) +++ branches/tora-trotl/src/toresultplan.cpp 2010-02-11 21:50:38 UTC (rev 3408) @@ -40,6 +40,7 @@ * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" +#include "tologger.h" #include "toconf.h" #include "toconnection.h" @@ -194,7 +195,7 @@ } catch (...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; } throw; } Modified: branches/tora-trotl/src/toresultstats.cpp =================================================================== --- branches/tora-trotl/src/toresultstats.cpp 2010-02-11 20:26:52 UTC (rev 3407) +++ branches/tora-trotl/src/toresultstats.cpp 2010-02-11 21:50:38 UTC (rev 3408) @@ -40,6 +40,7 @@ * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" +#include "tologger.h" #include "toconnection.h" #include "tonoblockquery.h" @@ -97,7 +98,7 @@ } catch (...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; SessionID = -1; } System = false; Modified: branches/tora-trotl/src/toresultstorage.cpp =================================================================== --- branches/tora-trotl/src/toresultstorage.cpp 2010-02-11 20:26:52 UTC (rev 3407) +++ branches/tora-trotl/src/toresultstorage.cpp 2010-02-11 21:50:38 UTC (rev 3408) @@ -664,14 +664,14 @@ if (Tablespaces && Tablespaces->poll()) { int cols = Tablespaces->describe().size(); - //get_log().ts<toDecorator>( __HERE__) << "Cols: " << cols << std::endl; + //get_log(0).ts<toDecorator>( __HERE__) << "Cols: " << cols << std::endl; while (Tablespaces->poll() && !Tablespaces->eof()) { for (int i = 0;i < cols && !Tablespaces->eof();i++) { QString t(Tablespaces->readValue()); toPush(TablespaceValues, t); - //get_log().ts<toDecorator>( __HERE__) << t.toUtf8().constData() << '\t'; + //get_log(0).ts<toDecorator>( __HERE__) << t.toUtf8().constData() << '\t'; } } updateList(); Modified: branches/tora-trotl/src/toresultview.cpp =================================================================== --- branches/tora-trotl/src/toresultview.cpp 2010-02-11 20:26:52 UTC (rev 3407) +++ branches/tora-trotl/src/toresultview.cpp 2010-02-11 21:50:38 UTC (rev 3408) @@ -528,7 +528,7 @@ } catch (...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; } } toTreeWidget::contentsMouseDoubleClickEvent(e); Modified: branches/tora-trotl/src/torollback.cpp =================================================================== --- branches/tora-trotl/src/torollback.cpp 2010-02-11 20:26:52 UTC (rev 3407) +++ branches/tora-trotl/src/torollback.cpp 2010-02-11 21:50:38 UTC (rev 3408) @@ -40,6 +40,7 @@ * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" +#include "tologger.h" #include "tochangeconnection.h" #include "toconf.h" @@ -255,7 +256,7 @@ } catch (...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; } connect(Tablespace, SIGNAL(textChanged(const QString &)), this, SLOT(valueChanged(const QString &))); Modified: branches/tora-trotl/src/toscheduler.cpp =================================================================== --- branches/tora-trotl/src/toscheduler.cpp 2010-02-11 20:26:52 UTC (rev 3407) +++ branches/tora-trotl/src/toscheduler.cpp 2010-02-11 21:50:38 UTC (rev 3408) @@ -164,7 +164,7 @@ } catch (...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; } connect(Schema, SIGNAL(activated(const QString &)), this, SLOT(changeSchema(const QString &))); Modified: branches/tora-trotl/src/toscripttreemodel.cpp =================================================================== --- branches/tora-trotl/src/toscripttreemodel.cpp 2010-02-11 20:26:52 UTC (rev 3407) +++ branches/tora-trotl/src/toscripttreemodel.cpp 2010-02-11 21:50:38 UTC (rev 3408) @@ -39,11 +39,13 @@ * * END_COMMON_COPYRIGHT_HEADER */ +#include "utils.h" +#include "tologger.h" + #include "tosql.h" #include "toconnection.h" #include "tomain.h" #include "toqvalue.h" -#include "utils.h" #include "toscripttreeitem.h" #include "toscripttreemodel.h" @@ -267,7 +269,7 @@ } catch (...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; // qDebug() << "SQLObjectList call failed. Running 'common user' stmt."; qDebug("SQLObjectList call failed. Running 'common user' stmt."); } Modified: branches/tora-trotl/src/totableselect.cpp =================================================================== --- branches/tora-trotl/src/totableselect.cpp 2010-02-11 20:26:52 UTC (rev 3407) +++ branches/tora-trotl/src/totableselect.cpp 2010-02-11 21:50:38 UTC (rev 3408) @@ -40,6 +40,7 @@ * END_COMMON_COPYRIGHT_HEADER */ #include "utils.h" +#include "tologger.h" #include "toconnection.h" #include "toresultcombo.h" @@ -63,7 +64,7 @@ } catch (...) { - std::cerr << "Unhandled exception: " << __HERE__ << std::endl; + get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; } QLabel *label = new QLabel(mysql ? tr("Database") : tr("Schema"), this); label->show(); Modified: branches/tora-trotl/src/totemplate.cpp =================================================================== --- branches/tora-trotl/src/totem... [truncated message content] |
From: <ibr...@us...> - 2010-02-25 09:54:55
|
Revision: 3439 http://tora.svn.sourceforge.net/tora/?rev=3439&view=rev Author: ibre5041 Date: 2010-02-25 09:54:47 +0000 (Thu, 25 Feb 2010) Log Message: ----------- build process cleanup Modified Paths: -------------- branches/tora-trotl/src/CMakeLists.txt branches/tora-trotl/src/trotl/CMakeLists.txt branches/tora-trotl/src/trotl/src/CMakeLists.txt Modified: branches/tora-trotl/src/CMakeLists.txt =================================================================== --- branches/tora-trotl/src/CMakeLists.txt 2010-02-24 21:23:45 UTC (rev 3438) +++ branches/tora-trotl/src/CMakeLists.txt 2010-02-25 09:54:47 UTC (rev 3439) @@ -15,7 +15,6 @@ ADD_SUBDIRECTORY(qscintilla2) ENDIF(WANT_INTERNAL_QSCINTILLA) - # only toad bindings are here. All others qm files will blow the binary too much SET (TORA_I18N_TS i18n/tora_toad.ts @@ -476,7 +475,7 @@ ) IF (ORACLE_INCLUDES) - INCLUDE_DIRECTORIES( ${ORACLE_INCLUDES} ) + INCLUDE_DIRECTORIES( ${ORACLE_INCLUDES} ) ENDIF (ORACLE_INCLUDES) IF (POSTGRESQL_INCLUDE_DIR) @@ -492,6 +491,13 @@ INCLUDE_DIRECTORIES(${QSCINTILLA_INCLUDE_DIR}) ENDIF (WANT_INTERNAL_QSCINTILLA) +# include the stack library in dubug builds only +IF(CMAKE_BUILD_TYPE STREQUAL "Debug") + SET (STACK_LIB "stack_lib") + ADD_SUBDIRECTORY(stack) + INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/src/stack) + LINK_DIRECTORIES(./stack) +ENDIF(CMAKE_BUILD_TYPE STREQUAL "Debug") # Handle win/mac special stuff - it's left empty for linux/unix SET (GUI_TYPE) Modified: branches/tora-trotl/src/trotl/CMakeLists.txt =================================================================== --- branches/tora-trotl/src/trotl/CMakeLists.txt 2010-02-24 21:23:45 UTC (rev 3438) +++ branches/tora-trotl/src/trotl/CMakeLists.txt 2010-02-25 09:54:47 UTC (rev 3439) @@ -4,15 +4,12 @@ # Mostly copied from Tora # #Set our CMake minimum version -#Require 2.4.2 for Qt finding -#Require 2.4.3 for moc change detection and rpath updates for custom cairo install CMAKE_MINIMUM_REQUIRED(VERSION 2.6.0 FATAL_ERROR) -# FIXME: dont't forget to change CMP0005 policy to NEW after 2.6.0 minimum required! # handle new cmake versions correctly if(COMMAND cmake_policy) cmake_policy(SET CMP0003 NEW) - cmake_policy(SET CMP0005 NEW) # FIXME change it to new when there will be cmake 2.6.x in most distros + cmake_policy(SET CMP0005 NEW) endif(COMMAND cmake_policy) @@ -25,12 +22,6 @@ SET(CMAKE_INCLUDE_CURRENT_DIR TRUE) -INCLUDE(CheckIncludeFile) -INCLUDE(CheckCCompilerFlag) -INCLUDE(CheckCXXCompilerFlag) -INCLUDE(CheckTypeSize) -INCLUDE(TestBigEndian) - #Set the custom CMake module directory where our include/lib finders are SET(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/modules") @@ -47,48 +38,14 @@ SET (LIB_NAME "trotl") -#Convert our simpler command line option to the CMake style -#None, Debug, Release, .. or custom ones -IF(WANT_DEBUG) - SET(CMAKE_BUILD_TYPE Debug) -ELSE(WANT_DEBUG) - SET(CMAKE_BUILD_TYPE RELEASE) -ENDIF(WANT_DEBUG) +IF (CMAKE_COMPILER_IS_GNUCC) + SET(CXX_WARNINGS "-Wall") + SET(CMAKE_CXX_FLAGS_RELEASE "-O2 ${CXX_WARNINGS} -rdynamic -fvisibility-inlines-hidden") + SET(CMAKE_C_FLAGS_RELEASE "-O2 ${CXX_WARNINGS} -rdynamic -fvisibility-inlines-hidden") + SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -ggdb3 -fno-inline ${CXX_WARNINGS} -fstrict-aliasing -rdynamic") + SET(CMAKE_C_FLAGS_DEBUG "-O0 -ggbb3 -fno-inline ${CXX_WARNINGS} -fstrict-aliasing -rdynamic") +ENDIF (CMAKE_COMPILER_IS_GNUCC) -############################################################################################################## -########## check for the arch we build for ########## - -IF (GCC) -EXECUTE_PROCESS( - COMMAND ${CMAKE_C_COMPILER} -dumpmachine - OUTPUT_VARIABLE MACHINE - OUTPUT_STRIP_TRAILING_WHITESPACE -) -MESSAGE(STATUS "Building for target ${MACHINE}") - -STRING(REGEX MATCH "(i?86-*)|(athlon-*)|(pentium-*)" _machine_x86 "${MACHINE}") -IF (_machine_x86) - MESSAGE(STATUS "Found target X86") - SET(ARCH_X86 1) -ENDIF (_machine_x86) - -STRING(REGEX MATCH "(x86_64-*)|(X86_64-*)|(AMD64-*)|(amd64-*)" _machine_x86_64 "${MACHINE}") -IF (_machine_x86_64) - MESSAGE(STATUS "Found target X86_64") - SET(ARCH_X86_64 1) -ENDIF (_machine_x86_64) - -STRING(REGEX MATCH "(ppc-*)" _machine_ppc "${MACHINE}") -IF (_machine_ppc) - MESSAGE(STATUS "Found target PPC") - SET(ARCH_PPC 1) -ENDIF (_machine_ppc) - -SET(CXX_WARNINGS "-Wall") -SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -ggdb3 -fno-inline ${CXX_WARNINGS} -fstrict-aliasing -rdynamic") -SET(CMAKE_C_FLAGS_DEBUG "-O0 -ggbb3 -fno-inline ${CXX_WARNINGS} -fstrict-aliasing -rdynamic") -ENDIF (GCC) - # Lets disable Wall warnings due the MSVC too much talkative # output. # MSVC, MSVC_IDE, MSVC60, MSVC70, MSVC71, MSVC80, CMAKE_COMPILER_2005 @@ -113,15 +70,6 @@ ENDIF (MSVC) -#Based on our build type, setup our build options -IF(APPLE) - SET( ENV{MACOSX_DEPLOYMENT_TARGET} 10.3 ) - SET( ENV{LD_PREBIND} 1 ) - SET( ENV{LD_PREBIND_ALLOW_OVERLAP} 1 ) - SET(CMAKE_CXX_FLAGS_DEBUG "") - SET(CMAKE_C_FLAGS_DEBUG "") -ENDIF(APPLE) - IF(ORACLE_FOUND) MESSAGE("-- Oracle OCI Library Found OK") ELSE(ORACLE_FOUND) @@ -135,32 +83,20 @@ ENDIF(ORACLE_HAS_XML) -SET (QT_MT_REQUIRED true) -SET (QT_MIN_VERSION "4.4.0") -FIND_PACKAGE(Qt4 REQUIRED) -INCLUDE( ${QT_USE_FILE} ) -IF (QT_FOUND) - MESSAGE("-- Qt4 Found OK") - #Add our Qt definitions - ADD_DEFINITIONS( - ${QT_DEFINITIONS} - -DQT_CORE_LIB - -DQT_THREAD_LIB - ) -ELSE(QT_FOUND) - MESSAGE(STATUS "-- No Qt4 found") -ENDIF(QT_FOUND) +# SET (QT_MT_REQUIRED true) +# SET (QT_MIN_VERSION "4.4.0") +# FIND_PACKAGE(Qt4 REQUIRED) +# INCLUDE( ${QT_USE_FILE} ) +# IF (QT_FOUND) +# MESSAGE("-- Qt4 Found OK") +# #Add our Qt definitions +# ADD_DEFINITIONS( +# ${QT_DEFINITIONS} +# -DQT_CORE_LIB +# -DQT_THREAD_LIB +# ) +# ELSE(QT_FOUND) +# MESSAGE(STATUS "-- No Qt4 found") +# ENDIF(QT_FOUND) -############################################################################################################## -########## Include Setup ########## - -#TEST_BIG_ENDIAN(WORDS_BIGENDIAN) - -#Create configure files.. config.h and uninstall -#config.h -# INCLUDE (ConfigureChecks.cmake) -##CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h) -##ADD_DEFINITIONS("-DHAVE_CONFIG_H") - -#Add our source subdirs ADD_SUBDIRECTORY(src) Modified: branches/tora-trotl/src/trotl/src/CMakeLists.txt =================================================================== --- branches/tora-trotl/src/trotl/src/CMakeLists.txt 2010-02-24 21:23:45 UTC (rev 3438) +++ branches/tora-trotl/src/trotl/src/CMakeLists.txt 2010-02-25 09:54:47 UTC (rev 3439) @@ -1,10 +1,3 @@ -## TODO if want debug? -IF(CMAKE_BUILD_TYPE STREQUAL "Debug") -ADD_SUBDIRECTORY(stack) -SET (STACK_LIB "stack_lib") -LINK_DIRECTORIES(./stack) -ENDIF(CMAKE_BUILD_TYPE STREQUAL "Debug") - SET(TROTL_DLL_DEFINES "-DLOKI_STATIC -DEXPLICIT_EXPORT -DTROTL_MAKE_DLL") SET(TROTL_CLIENT_DEFINES "-DLOKI_STATIC -DEXPLICIT_EXPORT -DTROTL_DLL") @@ -12,8 +5,10 @@ INCLUDE_DIRECTORIES( ${ORACLE_INCLUDES} + ${CMAKE_SOURCE_DIR}/src ) + SET(TROTL_SOURCES trotl_aq.cpp trotl_conn.cpp @@ -53,5 +48,3 @@ SET_SOURCE_FILES_PROPERTIES(${TROTL_SOURCES} COMPILE_FLAGS ${TROTL_DLL_DEFINES}) ADD_LIBRARY(${LIB_NAME} SHARED ${TROTL_SOURCES}) TARGET_LINK_LIBRARIES(${LIB_NAME} ${ORACLE_LIBRARIES} ${STACK_LIB}) -#TARGET_LINK_LIBRARIES(${LIB_NAME} ${STACK_LIB} ) -#TARGET_LINK_LIBRARIES(${LIB_NAME} -lboost_thread-mt ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2010-02-25 09:56:41
|
Revision: 3440 http://tora.svn.sourceforge.net/tora/?rev=3440&view=rev Author: ibre5041 Date: 2010-02-25 09:56:34 +0000 (Thu, 25 Feb 2010) Log Message: ----------- build process cleanup Added Paths: ----------- branches/tora-trotl/src/stack/ Removed Paths: ------------- branches/tora-trotl/src/trotl/src/stack/ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2010-02-25 13:24:35
|
Revision: 3443 http://tora.svn.sourceforge.net/tora/?rev=3443&view=rev Author: ibre5041 Date: 2010-02-25 13:24:12 +0000 (Thu, 25 Feb 2010) Log Message: ----------- widows compile fix Modified Paths: -------------- branches/tora-trotl/src/CMakeLists.txt branches/tora-trotl/src/trotl/src/CMakeLists.txt Added Paths: ----------- branches/tora-trotl/src/trotl/src/stack/ branches/tora-trotl/src/trotl/src/stack/CMakeLists.txt branches/tora-trotl/src/trotl/src/stack/LICENSE_1_0.txt branches/tora-trotl/src/trotl/src/stack/stack.cpp branches/tora-trotl/src/trotl/src/stack/stack.hpp Removed Paths: ------------- branches/tora-trotl/src/stack/ branches/tora-trotl/src/trotl/src/stack/CMakeLists.txt branches/tora-trotl/src/trotl/src/stack/LICENSE_1_0.txt branches/tora-trotl/src/trotl/src/stack/stack.cpp branches/tora-trotl/src/trotl/src/stack/stack.hpp Modified: branches/tora-trotl/src/CMakeLists.txt =================================================================== --- branches/tora-trotl/src/CMakeLists.txt 2010-02-25 13:22:06 UTC (rev 3442) +++ branches/tora-trotl/src/CMakeLists.txt 2010-02-25 13:24:12 UTC (rev 3443) @@ -459,14 +459,6 @@ SET (WINDOWS_LIB "windows_lib") ENDIF (WIN32) -# include the stack library in dubug builds only -IF(CMAKE_BUILD_TYPE STREQUAL "Debug") - SET (STACK_LIB "stack_lib") - ADD_SUBDIRECTORY(stack) - INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/src/stack) - LINK_DIRECTORIES(./stack) -ENDIF(CMAKE_BUILD_TYPE STREQUAL "Debug") - SET (TROTL_LIB "trotl") SET (TORA_MOC_LIB "tora_moc_lib") @@ -556,10 +548,6 @@ LIST(APPEND TORA_LIBS ${TROTL_LIB}) -IF(CMAKE_BUILD_TYPE STREQUAL "Debug") - LIST(APPEND TORA_LIBS ${STACK_LIB}) -ENDIF(CMAKE_BUILD_TYPE STREQUAL "Debug") - ADD_EXECUTABLE(${EXE_NAME} ${GUI_TYPE} # ${TORA_I18N_QM} # ${TORA_MOC_SOURCES} Modified: branches/tora-trotl/src/trotl/src/CMakeLists.txt =================================================================== --- branches/tora-trotl/src/trotl/src/CMakeLists.txt 2010-02-25 13:22:06 UTC (rev 3442) +++ branches/tora-trotl/src/trotl/src/CMakeLists.txt 2010-02-25 13:24:12 UTC (rev 3443) @@ -1,13 +1,17 @@ SET(TROTL_DLL_DEFINES "-DLOKI_STATIC -DEXPLICIT_EXPORT -DTROTL_MAKE_DLL") SET(TROTL_CLIENT_DEFINES "-DLOKI_STATIC -DEXPLICIT_EXPORT -DTROTL_DLL") -ADD_DEFINITIONS(-DORACLE_CS=DEVEL) - INCLUDE_DIRECTORIES( - ${ORACLE_INCLUDES} - ${CMAKE_SOURCE_DIR}/src + ${ORACLE_INCLUDES} ) +# include the stack library in dubug builds only +IF(CMAKE_BUILD_TYPE STREQUAL "Debug") + SET (STACK_LIB "stack_lib") + ADD_SUBDIRECTORY(stack) + INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/src/stack) + LINK_DIRECTORIES(./stack) +ENDIF(CMAKE_BUILD_TYPE STREQUAL "Debug") SET(TROTL_SOURCES trotl_aq.cpp Deleted: branches/tora-trotl/src/trotl/src/stack/CMakeLists.txt =================================================================== --- branches/tora-trotl/src/trotl/src/stack/CMakeLists.txt 2010-02-25 09:54:47 UTC (rev 3439) +++ branches/tora-trotl/src/trotl/src/stack/CMakeLists.txt 2010-02-25 13:24:12 UTC (rev 3443) @@ -1,18 +0,0 @@ -INCLUDE_DIRECTORIES( -${CMAKE_SOURCE_DIR}/src/stack/ -) - -SET(STACK_LIB_SOURCES -stack.hpp -stack.cpp -) - -SET(STACK_LIB "stack_lib") - -ADD_LIBRARY(${STACK_LIB} STATIC ${STACK_LIB_SOURCES}) - -IF("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86_64") - SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -fPIC" ) - SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fPIC" ) - SET_TARGET_PROPERTIES( stack_lib PROPERTIES COMPILE_FLAGS -fPIC) -ENDIF("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86_64") Copied: branches/tora-trotl/src/trotl/src/stack/CMakeLists.txt (from rev 3439, branches/tora-trotl/src/trotl/src/stack/CMakeLists.txt) =================================================================== --- branches/tora-trotl/src/trotl/src/stack/CMakeLists.txt (rev 0) +++ branches/tora-trotl/src/trotl/src/stack/CMakeLists.txt 2010-02-25 13:24:12 UTC (rev 3443) @@ -0,0 +1,18 @@ +INCLUDE_DIRECTORIES( +${CMAKE_SOURCE_DIR}/src/stack/ +) + +SET(STACK_LIB_SOURCES +stack.hpp +stack.cpp +) + +SET(STACK_LIB "stack_lib") + +ADD_LIBRARY(${STACK_LIB} STATIC ${STACK_LIB_SOURCES}) + +IF("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86_64") + SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -fPIC" ) + SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fPIC" ) + SET_TARGET_PROPERTIES( stack_lib PROPERTIES COMPILE_FLAGS -fPIC) +ENDIF("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86_64") Deleted: branches/tora-trotl/src/trotl/src/stack/LICENSE_1_0.txt =================================================================== --- branches/tora-trotl/src/trotl/src/stack/LICENSE_1_0.txt 2010-02-25 09:54:47 UTC (rev 3439) +++ branches/tora-trotl/src/trotl/src/stack/LICENSE_1_0.txt 2010-02-25 13:24:12 UTC (rev 3443) @@ -1,23 +0,0 @@ -Boost Software License - Version 1.0 - August 17th, 2003 - -Permission is hereby granted, free of charge, to any person or organization -obtaining a copy of the software and accompanying documentation covered by -this license (the "Software") to use, reproduce, display, distribute, -execute, and transmit the Software, and to prepare derivative works of the -Software, and to permit third-parties to whom the Software is furnished to -do so, all subject to the following: - -The copyright notices in the Software and this entire statement, including -the above license grant, this restriction and the following disclaimer, -must be included in all copies of the Software, in whole or in part, and -all derivative works of the Software, unless such copies or derivative -works are solely in the form of machine-executable object code generated by -a source language processor. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT -SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE -FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. Copied: branches/tora-trotl/src/trotl/src/stack/LICENSE_1_0.txt (from rev 3439, branches/tora-trotl/src/trotl/src/stack/LICENSE_1_0.txt) =================================================================== --- branches/tora-trotl/src/trotl/src/stack/LICENSE_1_0.txt (rev 0) +++ branches/tora-trotl/src/trotl/src/stack/LICENSE_1_0.txt 2010-02-25 13:24:12 UTC (rev 3443) @@ -0,0 +1,23 @@ +Boost Software License - Version 1.0 - August 17th, 2003 + +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software, unless such copies or derivative +works are solely in the form of machine-executable object code generated by +a source language processor. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. Deleted: branches/tora-trotl/src/trotl/src/stack/stack.cpp =================================================================== --- branches/tora-trotl/src/trotl/src/stack/stack.cpp 2010-02-25 09:54:47 UTC (rev 3439) +++ branches/tora-trotl/src/trotl/src/stack/stack.cpp 2010-02-25 13:24:12 UTC (rev 3443) @@ -1,433 +0,0 @@ -// Copyright 2007 Edd Dawson. -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) - -#include <iomanip> -#include <sstream> -#include <ostream> -#include <iostream> -#include <cassert> -#include <cstdlib> - -#include "stack.hpp" - -#if defined(_WIN32) - #include <windows.h> - #include <imagehlp.h> - - #if defined(__MINGW32__) - #include <bfd.h> // link against libbfd and libiberty - #include <psapi.h> // link against psapi - #include <cxxabi.h> - #endif - -#elif defined(__GNUC__) - #include <string.h> - #include <dlfcn.h> - #include <cxxabi.h> -#endif - -namespace -{ - -#if defined(__GNUC__) - std::string demangle(const char *name) - { - //this just does not work - some QT's private symbols cannot be resolved - //if (!name) throws dbg::stack_error then "use -rdynamic"; - if(!name) return "uknown symbol"; - int status = 0; - char *d = 0; - std::string ret = name; - try { if ((d = abi::__cxa_demangle(name, 0, 0, &status))) ret = d; } - catch(...) { } - std::free(d); - return ret; - } -#endif - -#if defined(_WIN32) - - class uncopyable - { - public: - uncopyable() { } - - private: - uncopyable(const uncopyable &); // remains undefined - uncopyable &operator= (const uncopyable &); // remains undefined - }; - - #if defined(__MINGW32__) - - class bfd_context : uncopyable - { - private: - struct find_data - { - std::string func; - asymbol **symbol_table; - bfd_vma counter; - }; - - public: - bfd_context() : - abfd_(0), - sec_(0), - symbol_table_(0) - { - char procname[MAX_PATH]; - GetModuleFileNameEx(GetCurrentProcess(), NULL, procname, sizeof procname); - - bfd_init(); - abfd_ = bfd_openr(procname, 0); - if (!abfd_) - throw dbg::stack_error("Failed to parse object data for the executable"); - - char **formats = 0; - bool b1 = bfd_check_format(abfd_, bfd_object); - bool b2 = bfd_check_format_matches(abfd_, bfd_object, &formats); - bool b3 = bfd_get_file_flags(abfd_) & HAS_SYMS; - - if (!(b1 && b2 && b3)) - { - bfd_close(abfd_); - free(formats); - throw dbg::stack_error("Failed to parse object data for the executable"); - } - free(formats); - - // Load symbol table - unsigned dummy = 0; - if (bfd_read_minisymbols(abfd_, FALSE, (void **)&symbol_table_, &dummy) == 0 && - bfd_read_minisymbols(abfd_, TRUE, (void **)&symbol_table_, &dummy) < 0) - { - free(symbol_table_); - bfd_close(abfd_); - throw dbg::stack_error("Failed to parse object data for the executable"); - } - } - - ~bfd_context() - { - free(symbol_table_); - bfd_close(abfd_); - } - - std::string get_function_name(DWORD offset) - { - find_data data; - data.symbol_table = symbol_table_; - data.counter = offset; - - bfd_map_over_sections(abfd_, &find_function_name_in_section, &data); - - return data.func; - } - - private: - static void find_function_name_in_section(bfd *abfd, asection *sec, void *opaque_data) - { - assert(sec); - assert(opaque_data); - find_data &data = *static_cast<find_data *>(opaque_data); - - if (!data.func.empty()) return; // already found it - - if (!(bfd_get_section_flags(abfd, sec) & SEC_ALLOC)) return; - - bfd_vma vma = bfd_get_section_vma(abfd, sec); - if (data.counter < vma || vma + bfd_get_section_size(sec) <= data.counter) return; - - const char *func = 0; - const char *file = 0; - unsigned line = 0; - - if (bfd_find_nearest_line(abfd, sec, data.symbol_table, data.counter - vma, &file, &func, &line) && func) - data.func = demangle(func); - } - - private: - bfd *abfd_; - asection *sec_; - asymbol **symbol_table_; - }; - - #endif // __MINGW32__ - - class auto_cast_function_ptr - { - public: - template<typename FuncPtr> - explicit auto_cast_function_ptr(FuncPtr f) : fptr_(reinterpret_cast<void (*)(void)>(f)) { } - - template<typename FuncPtr> - operator FuncPtr() const { return reinterpret_cast<FuncPtr>(fptr_); } - - private: - void (*fptr_)(void); - }; - - class windows_dll : uncopyable - { - public: - explicit windows_dll(const std::string &libname) : - name_(libname), - lib_(LoadLibrary(name_.c_str())) - { - if (!lib_) throw dbg::stack_error("Failed to load dll " + name_); - } - - ~windows_dll() { FreeLibrary(lib_); } - - const std::string &name() const { return name_; } - - auto_cast_function_ptr function(const std::string &func_name) const - { - FARPROC proc = GetProcAddress(lib_, func_name.c_str()); - if (!proc) throw dbg::stack_error("failed to load function " + func_name + " from library " + name_); - - return auto_cast_function_ptr(proc); - } - - private: - std::string name_; - HMODULE lib_; - }; - - class symbol_context : uncopyable - { - public: - symbol_context() { SymInitialize(GetCurrentProcess(), 0, true); } - ~symbol_context() { SymCleanup(GetCurrentProcess()); } - }; - - - class mutex : uncopyable - { - public: - mutex() { InitializeCriticalSection(&cs_); } - ~mutex() { DeleteCriticalSection(&cs_); } - void lock() { EnterCriticalSection(&cs_); } - void unlock() { LeaveCriticalSection(&cs_); } - - private: - CRITICAL_SECTION cs_; - }; - - class scoped_lock : uncopyable - { - public: - scoped_lock(mutex &m) : m_(m) { m_.lock(); } - ~scoped_lock() { m_.unlock(); } - private: - mutex &m_; - }; - - mutex fill_frames_mtx_; - - - void fill_frames(std::list<dbg::stack_frame> &frames, dbg::stack::depth_type limit) - { - scoped_lock lk(fill_frames_mtx_); - - #if defined(__MINGW32__) - static bfd_context bfdc; - #endif - - symbol_context sc; - - STACKFRAME frame; std::memset(&frame, 0, sizeof frame); - CONTEXT context; std::memset(&context, 0, sizeof(CONTEXT)); - context.ContextFlags = CONTEXT_FULL; - - windows_dll kernel32("kernel32.dll"); - - void (WINAPI *RtlCaptureContext_) (CONTEXT*) = kernel32.function("RtlCaptureContext"); - - RtlCaptureContext_(&context); - - frame.AddrPC.Offset = context.Eip; - frame.AddrPC.Mode = AddrModeFlat; - frame.AddrStack.Offset = context.Esp; - frame.AddrStack.Mode = AddrModeFlat; - frame.AddrFrame.Offset = context.Ebp; - frame.AddrFrame.Mode = AddrModeFlat; - - HANDLE process = GetCurrentProcess(); - HANDLE thread = GetCurrentThread(); - - dbg::stack::depth_type skip = 0; - bool has_limit = limit != 0; - char symbol_buffer[sizeof(IMAGEHLP_SYMBOL) + 255]; - char module_name_raw[MAX_PATH]; - - while(StackWalk(IMAGE_FILE_MACHINE_I386, process, thread, - &frame, &context, 0, SymFunctionTableAccess, SymGetModuleBase, 0 )) - { - if (skip < 1) - { - ++skip; - continue; - } - - if (has_limit && limit-- == 0) break; - - IMAGEHLP_SYMBOL *symbol = reinterpret_cast<IMAGEHLP_SYMBOL *>(symbol_buffer); - symbol->SizeOfStruct = (sizeof *symbol) + 255; - symbol->MaxNameLength = 254; - - DWORD module_base = SymGetModuleBase(process, frame.AddrPC.Offset); - std::string module_name = "[unknown module]"; - if( module_base && GetModuleFileName(reinterpret_cast<HINSTANCE>(module_base), module_name_raw, MAX_PATH)) - module_name = module_name_raw; - - #if defined(__MINGW32__) - std::string func = bfdc.get_function_name(frame.AddrPC.Offset); - - if (func.empty()) - { - DWORD displacement = 0; // dummy variable - BOOL got_symbol = SymGetSymFromAddr(process, frame.AddrPC.Offset, &displacement, symbol); - func = got_symbol ? symbol->Name : "[unknown function]"; - } - #else - DWORD displacement = 0; // dummy variable - BOOL got_symbol = SymGetSymFromAddr(process, frame.AddrPC.Offset, &displacement, symbol); - std::string func = got_symbol ? symbol->Name : "[unknown function]"; - #endif - - dbg::stack_frame f(reinterpret_cast<const void *>(frame.AddrPC.Offset), func + " in " + module_name); - frames.push_back(f); - } - } -#pragma comment(lib, "DBGHELP") -#elif defined(__GNUC__) - #if defined(__i386__) || defined( __x86_64__ ) - void fill_frames(std::list<dbg::stack_frame> &frames, dbg::stack::depth_type limit) - { - // Based on code found at: - // http://www.tlug.org.za/wiki/index.php/Obtaining_a_stack_trace_in_C_upon_SIGSEGV - - Dl_info info; - void **frame = static_cast<void **>(__builtin_frame_address(0)); - void **bp = static_cast<void **>(*frame); - void *ip = frame[1]; - - bool has_limit = limit != 0; - dbg::stack::depth_type skip = 0; - - while(bp && ip && dladdr(ip, &info)) - { - if (skip < 1) - ++skip; - else - { - if (has_limit && limit-- == 0) break; - frames.push_back(dbg::stack_frame(ip, demangle(info.dli_sname) + " in " + info.dli_fname)); - - if(info.dli_sname && !strcmp(info.dli_sname, "main")) break; - } - - ip = bp[1]; - bp = static_cast<void**>(bp[0]); - } - } - - #elif defined(__ppc__) - - void fill_frames(std::list<dbg::stack_frame> &frames, dbg::stack::depth_type limit) - { - // Based on code found at: - // http://www.informit.com/articles/article.aspx?p=606582&seqNum=4&rl=1 - - void *ip = __builtin_return_address(0); - void **frame = static_cast<void **>(__builtin_frame_address(1)); - bool has_limit = limit != 0; - Dl_info info; - - do - { - if (has_limit && limit-- == 0) break; - - if (dladdr(ip, &info)) - frames.push_back(dbg::stack_frame(ip, demangle(info.dli_sname) + " in " + info.dli_fname)); - - if (frame && (frame = static_cast<void**>(*frame))) ip = *(frame + 2); - } - while (frame && ip); - } - - #else - // GNU, but neither x86 or PPC - #error "Sorry but dbg::stack is not supported on this architecture" - #endif -#else - // Unsupported compiler - #error "Sorry but dbg::stack is not supported on this compiler" -#endif -} - - - -namespace dbg -{ - stack_error::stack_error(const std::string &what) : - what_(what) - { - } - - stack_error::~stack_error() throw() - { - } - - const char *stack_error::what() const throw() - { - return what_.c_str(); - } - - - stack_frame::stack_frame(const void *instruction, const std::string &function) : - instruction_(instruction), - function_(function) - { - } - - const void *stack_frame::instruction() const - { - return instruction_; - } - - const std::string &stack_frame::function() const - { - return function_; - } - - std::ostream &operator<< (std::ostream &out, const stack_frame &frame) - { - return out << frame.instruction() << ": " << frame.function(); - } - - stack::stack(depth_type limit) - { - fill_frames(frames_, limit); - } - - stack::const_iterator stack::begin() const - { - return frames_.begin(); - } - - stack::const_iterator stack::end() const - { - return frames_.end(); - } - - stack::depth_type stack::depth() const - { - return frames_.size(); - } - -} // close namespace dbg - Copied: branches/tora-trotl/src/trotl/src/stack/stack.cpp (from rev 3439, branches/tora-trotl/src/trotl/src/stack/stack.cpp) =================================================================== --- branches/tora-trotl/src/trotl/src/stack/stack.cpp (rev 0) +++ branches/tora-trotl/src/trotl/src/stack/stack.cpp 2010-02-25 13:24:12 UTC (rev 3443) @@ -0,0 +1,433 @@ +// Copyright 2007 Edd Dawson. +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +#include <iomanip> +#include <sstream> +#include <ostream> +#include <iostream> +#include <cassert> +#include <cstdlib> + +#include "stack.hpp" + +#if defined(_WIN32) + #include <windows.h> + #include <imagehlp.h> + + #if defined(__MINGW32__) + #include <bfd.h> // link against libbfd and libiberty + #include <psapi.h> // link against psapi + #include <cxxabi.h> + #endif + +#elif defined(__GNUC__) + #include <string.h> + #include <dlfcn.h> + #include <cxxabi.h> +#endif + +namespace +{ + +#if defined(__GNUC__) + std::string demangle(const char *name) + { + //this just does not work - some QT's private symbols cannot be resolved + //if (!name) throws dbg::stack_error then "use -rdynamic"; + if(!name) return "uknown symbol"; + int status = 0; + char *d = 0; + std::string ret = name; + try { if ((d = abi::__cxa_demangle(name, 0, 0, &status))) ret = d; } + catch(...) { } + std::free(d); + return ret; + } +#endif + +#if defined(_WIN32) + + class uncopyable + { + public: + uncopyable() { } + + private: + uncopyable(const uncopyable &); // remains undefined + uncopyable &operator= (const uncopyable &); // remains undefined + }; + + #if defined(__MINGW32__) + + class bfd_context : uncopyable + { + private: + struct find_data + { + std::string func; + asymbol **symbol_table; + bfd_vma counter; + }; + + public: + bfd_context() : + abfd_(0), + sec_(0), + symbol_table_(0) + { + char procname[MAX_PATH]; + GetModuleFileNameEx(GetCurrentProcess(), NULL, procname, sizeof procname); + + bfd_init(); + abfd_ = bfd_openr(procname, 0); + if (!abfd_) + throw dbg::stack_error("Failed to parse object data for the executable"); + + char **formats = 0; + bool b1 = bfd_check_format(abfd_, bfd_object); + bool b2 = bfd_check_format_matches(abfd_, bfd_object, &formats); + bool b3 = bfd_get_file_flags(abfd_) & HAS_SYMS; + + if (!(b1 && b2 && b3)) + { + bfd_close(abfd_); + free(formats); + throw dbg::stack_error("Failed to parse object data for the executable"); + } + free(formats); + + // Load symbol table + unsigned dummy = 0; + if (bfd_read_minisymbols(abfd_, FALSE, (void **)&symbol_table_, &dummy) == 0 && + bfd_read_minisymbols(abfd_, TRUE, (void **)&symbol_table_, &dummy) < 0) + { + free(symbol_table_); + bfd_close(abfd_); + throw dbg::stack_error("Failed to parse object data for the executable"); + } + } + + ~bfd_context() + { + free(symbol_table_); + bfd_close(abfd_); + } + + std::string get_function_name(DWORD offset) + { + find_data data; + data.symbol_table = symbol_table_; + data.counter = offset; + + bfd_map_over_sections(abfd_, &find_function_name_in_section, &data); + + return data.func; + } + + private: + static void find_function_name_in_section(bfd *abfd, asection *sec, void *opaque_data) + { + assert(sec); + assert(opaque_data); + find_data &data = *static_cast<find_data *>(opaque_data); + + if (!data.func.empty()) return; // already found it + + if (!(bfd_get_section_flags(abfd, sec) & SEC_ALLOC)) return; + + bfd_vma vma = bfd_get_section_vma(abfd, sec); + if (data.counter < vma || vma + bfd_get_section_size(sec) <= data.counter) return; + + const char *func = 0; + const char *file = 0; + unsigned line = 0; + + if (bfd_find_nearest_line(abfd, sec, data.symbol_table, data.counter - vma, &file, &func, &line) && func) + data.func = demangle(func); + } + + private: + bfd *abfd_; + asection *sec_; + asymbol **symbol_table_; + }; + + #endif // __MINGW32__ + + class auto_cast_function_ptr + { + public: + template<typename FuncPtr> + explicit auto_cast_function_ptr(FuncPtr f) : fptr_(reinterpret_cast<void (*)(void)>(f)) { } + + template<typename FuncPtr> + operator FuncPtr() const { return reinterpret_cast<FuncPtr>(fptr_); } + + private: + void (*fptr_)(void); + }; + + class windows_dll : uncopyable + { + public: + explicit windows_dll(const std::string &libname) : + name_(libname), + lib_(LoadLibrary(name_.c_str())) + { + if (!lib_) throw dbg::stack_error("Failed to load dll " + name_); + } + + ~windows_dll() { FreeLibrary(lib_); } + + const std::string &name() const { return name_; } + + auto_cast_function_ptr function(const std::string &func_name) const + { + FARPROC proc = GetProcAddress(lib_, func_name.c_str()); + if (!proc) throw dbg::stack_error("failed to load function " + func_name + " from library " + name_); + + return auto_cast_function_ptr(proc); + } + + private: + std::string name_; + HMODULE lib_; + }; + + class symbol_context : uncopyable + { + public: + symbol_context() { SymInitialize(GetCurrentProcess(), 0, true); } + ~symbol_context() { SymCleanup(GetCurrentProcess()); } + }; + + + class mutex : uncopyable + { + public: + mutex() { InitializeCriticalSection(&cs_); } + ~mutex() { DeleteCriticalSection(&cs_); } + void lock() { EnterCriticalSection(&cs_); } + void unlock() { LeaveCriticalSection(&cs_); } + + private: + CRITICAL_SECTION cs_; + }; + + class scoped_lock : uncopyable + { + public: + scoped_lock(mutex &m) : m_(m) { m_.lock(); } + ~scoped_lock() { m_.unlock(); } + private: + mutex &m_; + }; + + mutex fill_frames_mtx_; + + + void fill_frames(std::list<dbg::stack_frame> &frames, dbg::stack::depth_type limit) + { + scoped_lock lk(fill_frames_mtx_); + + #if defined(__MINGW32__) + static bfd_context bfdc; + #endif + + symbol_context sc; + + STACKFRAME frame; std::memset(&frame, 0, sizeof frame); + CONTEXT context; std::memset(&context, 0, sizeof(CONTEXT)); + context.ContextFlags = CONTEXT_FULL; + + windows_dll kernel32("kernel32.dll"); + + void (WINAPI *RtlCaptureContext_) (CONTEXT*) = kernel32.function("RtlCaptureContext"); + + RtlCaptureContext_(&context); + + frame.AddrPC.Offset = context.Eip; + frame.AddrPC.Mode = AddrModeFlat; + frame.AddrStack.Offset = context.Esp; + frame.AddrStack.Mode = AddrModeFlat; + frame.AddrFrame.Offset = context.Ebp; + frame.AddrFrame.Mode = AddrModeFlat; + + HANDLE process = GetCurrentProcess(); + HANDLE thread = GetCurrentThread(); + + dbg::stack::depth_type skip = 0; + bool has_limit = limit != 0; + char symbol_buffer[sizeof(IMAGEHLP_SYMBOL) + 255]; + char module_name_raw[MAX_PATH]; + + while(StackWalk(IMAGE_FILE_MACHINE_I386, process, thread, + &frame, &context, 0, SymFunctionTableAccess, SymGetModuleBase, 0 )) + { + if (skip < 1) + { + ++skip; + continue; + } + + if (has_limit && limit-- == 0) break; + + IMAGEHLP_SYMBOL *symbol = reinterpret_cast<IMAGEHLP_SYMBOL *>(symbol_buffer); + symbol->SizeOfStruct = (sizeof *symbol) + 255; + symbol->MaxNameLength = 254; + + DWORD module_base = SymGetModuleBase(process, frame.AddrPC.Offset); + std::string module_name = "[unknown module]"; + if( module_base && GetModuleFileName(reinterpret_cast<HINSTANCE>(module_base), module_name_raw, MAX_PATH)) + module_name = module_name_raw; + + #if defined(__MINGW32__) + std::string func = bfdc.get_function_name(frame.AddrPC.Offset); + + if (func.empty()) + { + DWORD displacement = 0; // dummy variable + BOOL got_symbol = SymGetSymFromAddr(process, frame.AddrPC.Offset, &displacement, symbol); + func = got_symbol ? symbol->Name : "[unknown function]"; + } + #else + DWORD displacement = 0; // dummy variable + BOOL got_symbol = SymGetSymFromAddr(process, frame.AddrPC.Offset, &displacement, symbol); + std::string func = got_symbol ? symbol->Name : "[unknown function]"; + #endif + + dbg::stack_frame f(reinterpret_cast<const void *>(frame.AddrPC.Offset), func + " in " + module_name); + frames.push_back(f); + } + } +#pragma comment(lib, "DBGHELP") +#elif defined(__GNUC__) + #if defined(__i386__) || defined( __x86_64__ ) + void fill_frames(std::list<dbg::stack_frame> &frames, dbg::stack::depth_type limit) + { + // Based on code found at: + // http://www.tlug.org.za/wiki/index.php/Obtaining_a_stack_trace_in_C_upon_SIGSEGV + + Dl_info info; + void **frame = static_cast<void **>(__builtin_frame_address(0)); + void **bp = static_cast<void **>(*frame); + void *ip = frame[1]; + + bool has_limit = limit != 0; + dbg::stack::depth_type skip = 0; + + while(bp && ip && dladdr(ip, &info)) + { + if (skip < 1) + ++skip; + else + { + if (has_limit && limit-- == 0) break; + frames.push_back(dbg::stack_frame(ip, demangle(info.dli_sname) + " in " + info.dli_fname)); + + if(info.dli_sname && !strcmp(info.dli_sname, "main")) break; + } + + ip = bp[1]; + bp = static_cast<void**>(bp[0]); + } + } + + #elif defined(__ppc__) + + void fill_frames(std::list<dbg::stack_frame> &frames, dbg::stack::depth_type limit) + { + // Based on code found at: + // http://www.informit.com/articles/article.aspx?p=606582&seqNum=4&rl=1 + + void *ip = __builtin_return_address(0); + void **frame = static_cast<void **>(__builtin_frame_address(1)); + bool has_limit = limit != 0; + Dl_info info; + + do + { + if (has_limit && limit-- == 0) break; + + if (dladdr(ip, &info)) + frames.push_back(dbg::stack_frame(ip, demangle(info.dli_sname) + " in " + info.dli_fname)); + + if (frame && (frame = static_cast<void**>(*frame))) ip = *(frame + 2); + } + while (frame && ip); + } + + #else + // GNU, but neither x86 or PPC + #error "Sorry but dbg::stack is not supported on this architecture" + #endif +#else + // Unsupported compiler + #error "Sorry but dbg::stack is not supported on this compiler" +#endif +} + + + +namespace dbg +{ + stack_error::stack_error(const std::string &what) : + what_(what) + { + } + + stack_error::~stack_error() throw() + { + } + + const char *stack_error::what() const throw() + { + return what_.c_str(); + } + + + stack_frame::stack_frame(const void *instruction, const std::string &function) : + instruction_(instruction), + function_(function) + { + } + + const void *stack_frame::instruction() const + { + return instruction_; + } + + const std::string &stack_frame::function() const + { + return function_; + } + + std::ostream &operator<< (std::ostream &out, const stack_frame &frame) + { + return out << frame.instruction() << ": " << frame.function(); + } + + stack::stack(depth_type limit) + { + fill_frames(frames_, limit); + } + + stack::const_iterator stack::begin() const + { + return frames_.begin(); + } + + stack::const_iterator stack::end() const + { + return frames_.end(); + } + + stack::depth_type stack::depth() const + { + return frames_.size(); + } + +} // close namespace dbg + Deleted: branches/tora-trotl/src/trotl/src/stack/stack.hpp =================================================================== --- branches/tora-trotl/src/trotl/src/stack/stack.hpp 2010-02-25 09:54:47 UTC (rev 3439) +++ branches/tora-trotl/src/trotl/src/stack/stack.hpp 2010-02-25 13:24:12 UTC (rev 3443) @@ -1,64 +0,0 @@ -// Copyright 2007 Edd Dawson. -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) - -#ifndef STACK_HPP_0022_01092007 -#define STACK_HPP_0022_01092007 - -#include <string> -#include <list> -#include <stdexcept> -#include <iosfwd> - - -namespace dbg -{ - class stack_error : public std::exception - { - public: - stack_error(const std::string &what); - ~stack_error() throw(); - - const char *what() const throw(); - - private: - std::string what_; - }; - - class stack_frame - { - public: - stack_frame(const void *instruction, const std::string &function); - - const void *instruction() const; - const std::string &function() const; - - private: - const void *instruction_; - const std::string function_; - }; - - std::ostream &operator<< (std::ostream &out, const stack_frame &frame); - - class stack - { - public: - typedef std::list<stack_frame>::size_type depth_type; - typedef std::list<stack_frame>::const_iterator const_iterator; - - stack(depth_type limit = 0); - - const_iterator begin() const; - const_iterator end() const; - - depth_type depth() const; - - private: - std::list<stack_frame> frames_; - }; - - -} // close namespace dbg - -#endif // STACK_HPP_0022_01092007 Copied: branches/tora-trotl/src/trotl/src/stack/stack.hpp (from rev 3439, branches/tora-trotl/src/trotl/src/stack/stack.hpp) =================================================================== --- branches/tora-trotl/src/trotl/src/stack/stack.hpp (rev 0) +++ branches/tora-trotl/src/trotl/src/stack/stack.hpp 2010-02-25 13:24:12 UTC (rev 3443) @@ -0,0 +1,64 @@ +// Copyright 2007 Edd Dawson. +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +#ifndef STACK_HPP_0022_01092007 +#define STACK_HPP_0022_01092007 + +#include <string> +#include <list> +#include <stdexcept> +#include <iosfwd> + + +namespace dbg +{ + class stack_error : public std::exception + { + public: + stack_error(const std::string &what); + ~stack_error() throw(); + + const char *what() const throw(); + + private: + std::string what_; + }; + + class stack_frame + { + public: + stack_frame(const void *instruction, const std::string &function); + + const void *instruction() const; + const std::string &function() const; + + private: + const void *instruction_; + const std::string function_; + }; + + std::ostream &operator<< (std::ostream &out, const stack_frame &frame); + + class stack + { + public: + typedef std::list<stack_frame>::size_type depth_type; + typedef std::list<stack_frame>::const_iterator const_iterator; + + stack(depth_type limit = 0); + + const_iterator begin() const; + const_iterator end() const; + + depth_type depth() const; + + private: + std::list<stack_frame> frames_; + }; + + +} // close namespace dbg + +#endif // STACK_HPP_0022_01092007 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2010-06-26 13:53:45
|
Revision: 3592 http://tora.svn.sourceforge.net/tora/?rev=3592&view=rev Author: ibre5041 Date: 2010-06-26 13:53:38 +0000 (Sat, 26 Jun 2010) Log Message: ----------- more usability for AWR report tool Modified Paths: -------------- branches/tora-trotl/src/toawr.cpp branches/tora-trotl/src/toawr.h Modified: branches/tora-trotl/src/toawr.cpp =================================================================== --- branches/tora-trotl/src/toawr.cpp 2010-06-25 11:29:04 UTC (rev 3591) +++ branches/tora-trotl/src/toawr.cpp 2010-06-26 13:53:38 UTC (rev 3592) @@ -67,7 +67,7 @@ #include "icons/awrtool.xpm" // -- Instances in this Workload Repository schema -// => inst_num +// => instnum // => dbid static toSQL SQLDBInstances("toAWR:DBInstances", "select distinct \n" @@ -92,6 +92,7 @@ // -- // -- Error reporting +// -- Plus query max_snap_time // whenever sqlerror exit; // variable max_snap_time char(10); @@ -99,13 +100,12 @@ // cursor cidnum is // select 'X' // from dba_hist_database_instance -// where instance_number = :inst_num +// where instance_number = :instnum // and dbid = :dbid; - // cursor csnapid is // select to_char(max(end_interval_time),'dd/mm/yyyy') // from dba_hist_snapshot -// where instance_number = :inst_num +// where instance_number = :instnum // and dbid = :dbid; // vx char(1); // begin @@ -114,7 +114,7 @@ // fetch cidnum into vx; // if cidnum%notfound then // raise_application_error(-20200, -// 'Database/Instance ' || :dbid || '/' || :inst_num || +// 'Database/Instance ' || :dbid || '/' || :instnum || // ' does not exist in DBA_HIST_DATABASE_INSTANCE'); // end if; // close cidnum; @@ -123,7 +123,7 @@ // fetch csnapid into :max_snap_time; // if csnapid%notfound then // raise_application_error(-20200, -// 'No snapshots exist for Database/Instance '||:dbid||'/'||:inst_num); +// 'No snapshots exist for Database/Instance '||:dbid||'/'||:instnum); // end if; // close csnapid; // end; @@ -131,13 +131,13 @@ // whenever sqlerror continue; // tohle asi muzu preskocit -// - validni kombinace <inst_num,dbid> je uz znama +// - validni kombinace <instnum,dbid> je uz znama // - <snapid,end_interval_time> nactu do komboboxu (anebo tam bude "No snaps") // -- List available snapshots static toSQL SQLSnaps("toAWR:Snaps", - " select to_char(s.end_interval_time,'dd Mon YYYY HH24:mi') snapdat \n" + " select to_char(s.end_interval_time,'HH24:mi') snapdat \n" " , di.instance_name inst_name \n" " , di.db_name db_name \n" " , s.snap_id snap_id \n" @@ -152,6 +152,8 @@ " and di.dbid = s.dbid \n" " and di.instance_number = s.instance_number \n" " and di.startup_time = s.startup_time \n" + " and s.end_interval_time between trunc(to_date(:sdate<varchar[11],in>, 'YYYY:MM:DD')) \n" + " and trunc(to_date(:edate<varchar[11],in>, 'YYYY:MM:DD')+1) \n" // " and s.end_interval_time >= decode( &num_days " // " , 0 , to_date('31-JAN-9999','DD-MON-YYYY') " // " , 3.14, s.end_interval_time " @@ -269,21 +271,27 @@ dbid = new toResultCombo(toolbar, "AWR toolbar"); fsnap = new toResultCombo(toolbar, "AWR toolbar"); tsnap = new toResultCombo(toolbar, "AWR toolbar"); + + startdate = new QDateTimeEdit(QDate::currentDate()); startdate->setCalendarPopup(true); + enddate = new QDateTimeEdit(QDate::currentDate()); enddate->setCalendarPopup(true); + connect(dbid, SIGNAL(activated(int)), this, SLOT(instanceChanged(int))); connect(dbid, SIGNAL(done()), this, SLOT(instanceRead())); + connect(startdate, SIGNAL(dateChanged(QDate)), this, SLOT(startDateChanged(QDate))); + connect(enddate, SIGNAL(dateChanged(QDate)), this, SLOT(endDateChanged(QDate))); + toolbar->addWidget(dbid); + toolbar->addWidget(startdate); toolbar->addWidget(fsnap); + toolbar->addWidget(enddate); toolbar->addWidget(tsnap); + try { dbid->query(toSQL::sql("toAWR:DBInstances", connection())); } TOCATCH; - QDateTimeEdit *st = new QDateTimeEdit(QDate::currentDate()); st->setCalendarPopup(true); - QDateTimeEdit *et = new QDateTimeEdit(QDate::currentDate()); st->setCalendarPopup(false); - toolbar->addWidget(st); - toolbar->addWidget(et); toolbar->addAction(QIcon(QPixmap(const_cast<const char**>(execute_xpm))), tr("Generate report"), this, @@ -361,7 +369,7 @@ //tb->setFontFamily("Courier"); vbox->addWidget(tb); - Tabs->addTab(box, tr("Redo Switches")); + Tabs->addTab(box, tr("AWR Report")); } catch (const toConnection::exception &t ) { TOMessageBox::information(this, t, t); @@ -388,8 +396,11 @@ event->accept(); } -void toAWR::instanceChanged(int pos) +void toAWR::startDateChanged(QDate date) { + std::cerr << "startDateChanged:" << date.toString() << std::endl; + + int pos = dbid->currentIndex(); QVariant d = dbid->itemData(pos); QStringList l = d.toStringList(); std::stringstream s; @@ -397,7 +408,7 @@ { s << ":\'" << (*i).toAscii().constData() << '\''; } - get_log(0).ts<toDecorator>( __HERE__) << "Instance changed:" << pos << s.str() << std::endl; + get_log(0).ts<toDecorator>( __HERE__) << "start date changed:" << date.toString("YYYY:MM:DD") << std::endl; QString dbid = l.at(0); QString inst = l.at(1); try @@ -405,10 +416,72 @@ toQList params; params.push_back(dbid); params.push_back(inst); + params.push_back(date.toString("yyyy:MM:dd")); + params.push_back(date.toString("yyyy:MM:dd")); fsnap->query(toSQL::sql("toAWR:Snaps", connection()), const_cast<const toQList&>(params ) ); + fsnap->refresh(); + } + TOCATCH; +} + +void toAWR::endDateChanged(QDate date) +{ + std::cerr << "endDateChanged:" << date.toString() << std::endl; + + int pos = dbid->currentIndex(); + QVariant d = dbid->itemData(pos); + QStringList l = d.toStringList(); + std::stringstream s; + for(QList<QString>::iterator i=l.begin(); i!=l.end(); ++i) + { + s << ":\'" << (*i).toAscii().constData() << '\''; + } + get_log(0).ts<toDecorator>( __HERE__) << "end date changed:" << date.toString("YYYY:MM:DD") << std::endl; + QString dbid = l.at(0); + QString inst = l.at(1); + try + { + toQList params; + params.push_back(dbid); + params.push_back(inst); + params.push_back(date.toString("yyyy:MM:dd")); + params.push_back(date.toString("yyyy:MM:dd")); tsnap->query(toSQL::sql("toAWR:Snaps", connection()), const_cast<const toQList&>(params ) ); + tsnap->refresh(); } TOCATCH; + +} + +void toAWR::instanceChanged(int pos) +{ + QVariant d = dbid->itemData(pos); + QStringList l = d.toStringList(); + std::stringstream s; + for(QList<QString>::iterator i=l.begin(); i!=l.end(); ++i) + { + s << ":\'" << (*i).toAscii().constData() << '\''; + } + get_log(0).ts<toDecorator>( __HERE__) << "Instance changed:" << pos << s.str() << std::endl; + QString dbid = l.at(0); + QString inst = l.at(1); + try + { + toQList sparams, eparams; + sparams.push_back(dbid); + sparams.push_back(inst); + sparams.push_back(startdate->date().toString("yyyy:MM:dd")); + sparams.push_back(startdate->date().toString("yyyy:MM:dd")); + fsnap->query(toSQL::sql("toAWR:Snaps", connection()), const_cast<const toQList&>(sparams ) ); + fsnap->refresh(); + eparams.push_back(dbid); + eparams.push_back(inst); + eparams.push_back(enddate->date().toString("yyyy:MM:dd")); + eparams.push_back(enddate->date().toString("yyyy:MM:dd")); + tsnap->query(toSQL::sql("toAWR:Snaps", connection()), const_cast<const toQList&>(eparams ) ); + tsnap->refresh(); + } + TOCATCH; }; void toAWR::instanceRead(void) Modified: branches/tora-trotl/src/toawr.h =================================================================== --- branches/tora-trotl/src/toawr.h 2010-06-25 11:29:04 UTC (rev 3591) +++ branches/tora-trotl/src/toawr.h 2010-06-26 13:53:38 UTC (rev 3592) @@ -64,6 +64,7 @@ QTextBrowser *tb; toResultCombo *dbid, *fsnap, *tsnap; + QDateTimeEdit *startdate, *enddate; public: toAWR(/*toTool *tool,*/ QWidget *parent,toConnection &connection); virtual ~toAWR(); @@ -75,6 +76,8 @@ void execute(void); void instanceChanged(int); void instanceRead(void); + void startDateChanged(QDate); + void endDateChanged(QDate); }; #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2010-06-28 18:29:42
|
Revision: 3596 http://tora.svn.sourceforge.net/tora/?rev=3596&view=rev Author: ibre5041 Date: 2010-06-28 18:29:36 +0000 (Mon, 28 Jun 2010) Log Message: ----------- sync with tora trunk Modified Paths: -------------- branches/tora-trotl/src/toawr.cpp branches/tora-trotl/src/toresultcombo.cpp branches/tora-trotl/src/toresultcombo.h Modified: branches/tora-trotl/src/toawr.cpp =================================================================== --- branches/tora-trotl/src/toawr.cpp 2010-06-28 18:28:55 UTC (rev 3595) +++ branches/tora-trotl/src/toawr.cpp 2010-06-28 18:29:36 UTC (rev 3596) @@ -145,15 +145,15 @@ " , to_char(s.startup_time,'dd Mon \"at\" HH24:mi:ss') instart_fmt \n" "from dba_hist_snapshot s \n" " , dba_hist_database_instance di \n" - "where s.dbid = :dbid<varchar[40],in> \n" - " and di.dbid = :dbid<varchar[40],in> \n" - " and s.instance_number = :instnum<varchar[40],in> \n" - " and di.instance_number = :instnum<varchar[40],in> \n" + "where s.dbid = :db_id<char[40],in> \n" + " and di.dbid = s.dbid \n" + " and s.instance_number = :instnum<char[40],in> \n" + " and di.instance_number = s.instance_number \n" " and di.dbid = s.dbid \n" " and di.instance_number = s.instance_number \n" " and di.startup_time = s.startup_time \n" - " and s.end_interval_time between trunc(to_date(:sdate<varchar[11],in>, 'YYYY:MM:DD')) \n" - " and trunc(to_date(:edate<varchar[11],in>, 'YYYY:MM:DD')+1) \n" + " and s.end_interval_time between trunc(to_date(:sdate<char[11],in>, 'YYYY:MM:DD')) \n" + " and trunc(to_date(:edate<char[11],in>, 'YYYY:MM:DD')+1) \n" // " and s.end_interval_time >= decode( &num_days " // " , 0 , to_date('31-JAN-9999','DD-MON-YYYY') " // " , 3.14, s.end_interval_time " @@ -173,37 +173,37 @@ " , startup_time \n" " from dba_hist_snapshot \n" " where snap_id = vspid \n" - " and dbid = :dbid<varchar[40],in> \n" - " and instance_number = :inst<varchar[40],in>; \n" + " and dbid = :dbid<char[40],in> \n" + " and instance_number = :inst<char[40],in>; \n" " bsnapt dba_hist_snapshot.end_interval_time%type; \n" " bstart dba_hist_snapshot.startup_time%type; \n" " esnapt dba_hist_snapshot.end_interval_time%type; \n" " estart dba_hist_snapshot.startup_time%type; \n" " begin \n" " -- Check Begin Snapshot id is valid, get corresponding instance startup time \n" - " open cspid(:fsnap<varchar[40],in>); \n" + " open cspid(:fsnap<char[40],in>); \n" " fetch cspid into bsnapt, bstart; \n" " if cspid%notfound then \n" " raise_application_error(-20200, \n" - " 'Begin Snapshot Id '||:fsnap<varchar[40],in>||' does not exist for this database/instance'); \n" + " 'Begin Snapshot Id '||:fsnap<char[40],in>||' does not exist for this database/instance'); \n" " end if; \n" " close cspid; \n" " -- Check End Snapshot id is valid and get corresponding instance startup time \n" - " open cspid(:tsnap<varchar[40],in>); \n" + " open cspid(:tsnap<char[40],in>); \n" " fetch cspid into esnapt, estart; \n" " if cspid%notfound then \n" " raise_application_error(-20200, \n" - " 'End Snapshot Id '||:tsnap<varchar[40],in>||' does not exist for this database/instance'); \n" + " 'End Snapshot Id '||:tsnap<char[40],in>||' does not exist for this database/instance'); \n" " end if; \n" " if esnapt <= bsnapt then \n" " raise_application_error(-20200, \n" - " 'End Snapshot Id '||:tsnap<varchar[40],in>||' must be greater than Begin Snapshot Id '||:fsnap<varchar[40],in>); \n" + " 'End Snapshot Id '||:tsnap<char[40],in>||' must be greater than Begin Snapshot Id '||:fsnap<char[40],in>); \n" " end if; \n" " close cspid; \n" " -- Check startup time is same for begin and end snapshot ids \n" " if ( bstart != estart) then \n" " raise_application_error(-20200, \n" - " 'The instance was shutdown between snapshots '||:fsnap<varchar[40],in>||' and '||:tsnap<varchar[40],in>); \n" + " 'The instance was shutdown between snapshots '||:fsnap<char[40],in>||' and '||:tsnap<char[40],in>); \n" " end if; \n" " end; \n", "Check if the pair of snap ids is valid" ); @@ -221,7 +221,7 @@ { } virtual const char *menuItem() { - return "Simple Query"; + return "AWR Report"; } virtual bool canHandle(toConnection &conn) @@ -269,8 +269,8 @@ toolbar->addWidget(new QLabel("Inst:", toolbar)); dbid = new toResultCombo(toolbar, "AWR toolbar"); - fsnap = new toResultCombo(toolbar, "AWR toolbar"); - tsnap = new toResultCombo(toolbar, "AWR toolbar"); + fsnap = new toResultCombo(toolbar, "AWR toolbar"); fsnap->setSelectionPolicy(toResultCombo::LastButOne); + tsnap = new toResultCombo(toolbar, "AWR toolbar"); tsnap->setSelectionPolicy(toResultCombo::Last); startdate = new QDateTimeEdit(QDate::currentDate()); startdate->setCalendarPopup(true); enddate = new QDateTimeEdit(QDate::currentDate()); enddate->setCalendarPopup(true); @@ -340,10 +340,10 @@ "select NVL(output,' ') \n" //"from table(dbms_workload_repository.awr_report_text( \n" "from table(dbms_workload_repository.awr_report_html( \n" - " :dbid<varchar[40],in>, \n" - " :inst<varchar[40],in>, \n" - " :f<varchar[40],in>, \n" - " :t<varchar[40],in>, 0))", + " :dbid<char[40],in>, \n" + " :inst<char[40],in>, \n" + " :f<char[40],in>, \n" + " :t<char[40],in>, 0))", dbids, insts, fsnaps, tsnaps); QString reports; @@ -383,6 +383,8 @@ delete dbid; delete fsnap; delete tsnap; + delete startdate; + delete enddate; } void toAWR::closeEvent(QCloseEvent *event) @@ -418,6 +420,7 @@ params.push_back(inst); params.push_back(date.toString("yyyy:MM:dd")); params.push_back(date.toString("yyyy:MM:dd")); + fsnap->setSelectionPolicy(toResultCombo::None); fsnap->query(toSQL::sql("toAWR:Snaps", connection()), const_cast<const toQList&>(params ) ); fsnap->refresh(); } @@ -446,6 +449,7 @@ params.push_back(inst); params.push_back(date.toString("yyyy:MM:dd")); params.push_back(date.toString("yyyy:MM:dd")); + fsnap->setSelectionPolicy(toResultCombo::None); tsnap->query(toSQL::sql("toAWR:Snaps", connection()), const_cast<const toQList&>(params ) ); tsnap->refresh(); } @@ -472,12 +476,14 @@ sparams.push_back(inst); sparams.push_back(startdate->date().toString("yyyy:MM:dd")); sparams.push_back(startdate->date().toString("yyyy:MM:dd")); + get_log(1).ts<toDecorator>( __HERE__) << "FSNAP: (" << sparams.size() << ")" << std::endl; fsnap->query(toSQL::sql("toAWR:Snaps", connection()), const_cast<const toQList&>(sparams ) ); fsnap->refresh(); eparams.push_back(dbid); eparams.push_back(inst); eparams.push_back(enddate->date().toString("yyyy:MM:dd")); eparams.push_back(enddate->date().toString("yyyy:MM:dd")); + get_log(1).ts<toDecorator>( __HERE__) << "TSNAP: (" << eparams.size() << ")" << std::endl; tsnap->query(toSQL::sql("toAWR:Snaps", connection()), const_cast<const toQList&>(eparams ) ); tsnap->refresh(); } Modified: branches/tora-trotl/src/toresultcombo.cpp =================================================================== --- branches/tora-trotl/src/toresultcombo.cpp 2010-06-28 18:28:55 UTC (rev 3595) +++ branches/tora-trotl/src/toresultcombo.cpp 2010-06-28 18:29:36 UTC (rev 3596) @@ -48,8 +48,9 @@ #include "tosql.h" #include "totool.h" + toResultCombo::toResultCombo(QWidget *parent, const char *name) - : QComboBox(parent), Query(0) + : QComboBox(parent), Query(0), SelectionPolicy(None) { setObjectName(name); connect(&Poll, SIGNAL(timeout()), this, SLOT(poll())); @@ -76,7 +77,7 @@ setCurrentIndex(i); Query = new toNoBlockQuery(connection(), toQuery::Background, sql, param); - Poll.start(1000); + Poll.start(100); } TOCATCH } @@ -93,14 +94,10 @@ if (!toCheckModal(this)) return ; - toNoBlockQuery &q = *Query; - bool e = q.eof(); - //std::cerr << "Query::eof():" << e << std::endl; - if (Query && Query->poll()) { - while (Query->poll() && !Query->eof()) - { + while (Query->poll() && !Query->eof()) + { QString t = Query->readValue(); QStringList l; for(unsigned i=1; i<Query->describe().size(); ++i) @@ -111,15 +108,31 @@ addItem(t, QVariant(l)); if (t == Selected) setCurrentIndex(count() - 1); - } + } if (Query->eof()) { - Poll.stop(); - setFont(font()); // Small hack to invalidate size hint of combobox which should resize to needed size. - updateGeometry(); - std::cerr << "Done emit:" << std::endl; - emit done(); + Poll.stop(); + switch(SelectionPolicy) + { + case First: + if (currentIndex() != 0) + setCurrentIndex(0); + break; + case Last: + if (currentIndex() != count()-1) + setCurrentIndex(count()-1); + break; + case LastButOne: + if (currentIndex() != count()-2) + setCurrentIndex(count()-2); + break; + case None: + ; + }; + setFont(font()); // Small hack to invalidate size hint of combobox which should resize to needed size. + updateGeometry(); + emit done(); } } } @@ -127,7 +140,6 @@ { Poll.stop(); emit done(); - std::cerr << "Done emit:" << std::endl; toStatusMessage(exc); } } Modified: branches/tora-trotl/src/toresultcombo.h =================================================================== --- branches/tora-trotl/src/toresultcombo.h 2010-06-28 18:28:55 UTC (rev 3595) +++ branches/tora-trotl/src/toresultcombo.h 2010-06-28 18:29:36 UTC (rev 3596) @@ -70,7 +70,16 @@ QString Selected; QStringList Additional; + public: + enum selectionPolicy { + LastButOne = -1, + Last = 0, + First = 1, + None + }; + selectionPolicy SelectionPolicy; + /** Create the widget. * @param parent Parent widget. * @param name Name of widget. @@ -117,6 +126,11 @@ return Selected; } + void setSelectionPolicy(selectionPolicy pol) + { + SelectionPolicy = pol; + } + // Why are these needed? #if 1 /** Set the SQL statement of this list This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2010-07-08 21:40:24
|
Revision: 3607 http://tora.svn.sourceforge.net/tora/?rev=3607&view=rev Author: ibre5041 Date: 2010-07-08 21:40:17 +0000 (Thu, 08 Jul 2010) Log Message: ----------- sync with Tora trunk Modified Paths: -------------- branches/tora-trotl/src/tobrowserbasewidget.cpp branches/tora-trotl/src/utils.cpp Modified: branches/tora-trotl/src/tobrowserbasewidget.cpp =================================================================== --- branches/tora-trotl/src/tobrowserbasewidget.cpp 2010-07-08 21:30:38 UTC (rev 3606) +++ branches/tora-trotl/src/tobrowserbasewidget.cpp 2010-07-08 21:40:17 UTC (rev 3607) @@ -49,9 +49,7 @@ #include "utils.h" toBrowserBaseWidget::toBrowserBaseWidget(QWidget * parent) - : QTabWidget(parent), - m_schema(0), - m_object(0) + : QTabWidget(parent) { setObjectName("toBrowserBaseWidget"); Modified: branches/tora-trotl/src/utils.cpp =================================================================== --- branches/tora-trotl/src/utils.cpp 2010-07-08 21:30:38 UTC (rev 3606) +++ branches/tora-trotl/src/utils.cpp 2010-07-08 21:40:17 UTC (rev 3607) @@ -128,13 +128,12 @@ static toSQL SQLUserNamesTD( toSQL::TOSQL_USERLIST, - "SELECT DISTINCT ( db.databasename )\n" - " FROM dbc.AccessRights ar,\n" - " dbc.dbase db\n" - " WHERE ar.userid IN ( SELECT userid\n" - " FROM dbc.sessiontbl\n" - " WHERE sessionno = SESSION )\n" - " AND ar.databaseid = db.databaseid", + "SELECT trim ( databasename )\n" + " FROM dbc.UserRights\n" + " UNION\n" + "SELECT trim ( databasename )\n" + " FROM dbc.UserRoleRights\n" + " GROUP BY 1", "", "", "Teradata"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2010-07-09 17:06:46
|
Revision: 3622 http://tora.svn.sourceforge.net/tora/?rev=3622&view=rev Author: ibre5041 Date: 2010-07-09 17:06:38 +0000 (Fri, 09 Jul 2010) Log Message: ----------- logging simplified Modified Paths: -------------- branches/tora-trotl/src/main.cpp branches/tora-trotl/src/toalert.cpp branches/tora-trotl/src/toanalyze.cpp branches/tora-trotl/src/toawr.cpp branches/tora-trotl/src/tobackup.cpp branches/tora-trotl/src/tobrowser.cpp branches/tora-trotl/src/tobrowserbasewidget.cpp branches/tora-trotl/src/tobrowsertable.cpp branches/tora-trotl/src/tochartmanager.cpp branches/tora-trotl/src/toconnection.cpp branches/tora-trotl/src/toconnectionpool.cpp branches/tora-trotl/src/toeditextensions.cpp branches/tora-trotl/src/toeventquery.cpp branches/tora-trotl/src/toeventquerytask.cpp branches/tora-trotl/src/tofyracleconnection.cpp branches/tora-trotl/src/tohighlightedtext.cpp branches/tora-trotl/src/toinvalid.cpp branches/tora-trotl/src/tologger.h branches/tora-trotl/src/tomain.cpp branches/tora-trotl/src/tomarkedtext.cpp branches/tora-trotl/src/tonewconnection.cpp branches/tora-trotl/src/tonoblockquery.cpp branches/tora-trotl/src/tooracleconnection.cpp branches/tora-trotl/src/tooracleextract.cpp branches/tora-trotl/src/tooutput.cpp branches/tora-trotl/src/topiechart.cpp branches/tora-trotl/src/toplsqleditor.cpp branches/tora-trotl/src/toplsqltext.cpp branches/tora-trotl/src/toqsqlconnection.cpp branches/tora-trotl/src/toresult.cpp branches/tora-trotl/src/toresultmodel.cpp branches/tora-trotl/src/toresultplan.cpp branches/tora-trotl/src/toresultstats.cpp branches/tora-trotl/src/toresultstorage.cpp branches/tora-trotl/src/toresultview.cpp branches/tora-trotl/src/torollback.cpp branches/tora-trotl/src/toscheduler.cpp branches/tora-trotl/src/toscript.cpp branches/tora-trotl/src/toscriptschemawidget.cpp branches/tora-trotl/src/toscripttreemodel.cpp branches/tora-trotl/src/tosearchreplace.cpp branches/tora-trotl/src/totableselect.cpp branches/tora-trotl/src/totemplate.cpp branches/tora-trotl/src/totemplateprovider.cpp branches/tora-trotl/src/tothread.cpp branches/tora-trotl/src/totool.cpp branches/tora-trotl/src/tounittest.cpp branches/tora-trotl/src/toworksheet.cpp branches/tora-trotl/src/trotl/src/trotl_common.h branches/tora-trotl/src/trotl_test2.cpp branches/tora-trotl/src/trotl_test3.cpp branches/tora-trotl/src/ts_log/ts_log_utils.h branches/tora-trotl/src/utils.cpp Modified: branches/tora-trotl/src/main.cpp =================================================================== --- branches/tora-trotl/src/main.cpp 2010-07-09 16:59:27 UTC (rev 3621) +++ branches/tora-trotl/src/main.cpp 2010-07-09 17:06:38 UTC (rev 3622) @@ -200,7 +200,7 @@ } catch (...) { - get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; + TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; } toConnectionProvider::initializeAll(); Modified: branches/tora-trotl/src/toalert.cpp =================================================================== --- branches/tora-trotl/src/toalert.cpp 2010-07-09 16:59:27 UTC (rev 3621) +++ branches/tora-trotl/src/toalert.cpp 2010-07-09 17:06:38 UTC (rev 3622) @@ -142,7 +142,7 @@ } catch (...) { - get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; + TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; } def += connection.user(); @@ -228,7 +228,7 @@ } catch (...) { - get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; + TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; toStatusMessage(tr("Failed to start polling thread, try closing " "some other tools and restart Alert Messenger")); } @@ -413,7 +413,7 @@ } catch (...) { - get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; + TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; } Parent.State = Done; Parent.Semaphore.up(); Modified: branches/tora-trotl/src/toanalyze.cpp =================================================================== --- branches/tora-trotl/src/toanalyze.cpp 2010-07-09 16:59:27 UTC (rev 3621) +++ branches/tora-trotl/src/toanalyze.cpp 2010-07-09 17:06:38 UTC (rev 3622) @@ -728,7 +728,7 @@ } catch (...) { - get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; + TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; } } } Modified: branches/tora-trotl/src/toawr.cpp =================================================================== --- branches/tora-trotl/src/toawr.cpp 2010-07-09 16:59:27 UTC (rev 3621) +++ branches/tora-trotl/src/toawr.cpp 2010-07-09 17:06:38 UTC (rev 3622) @@ -327,7 +327,7 @@ // toQList params; // params.push_back(fsnaps); // params.push_back(tsnaps); - get_log(0).ts<toDecorator>( __HERE__) + TLOG(0,toDecorator,__HERE__) << "Dbid:" << dbids.toAscii().constData() << ' ' << "Inst:" << insts.toAscii().constData() << ' ' << "fsnap:" << fsnaps.toAscii().constData() << ' ' @@ -410,7 +410,7 @@ { s << ":\'" << (*i).toAscii().constData() << '\''; } - get_log(0).ts<toDecorator>( __HERE__) << "start date changed:" << date.toString("YYYY:MM:DD") << std::endl; + TLOG(0,toDecorator,__HERE__) << "start date changed:" << date.toString("YYYY:MM:DD") << std::endl; QString dbid = l.at(0); QString inst = l.at(1); try @@ -439,7 +439,7 @@ { s << ":\'" << (*i).toAscii().constData() << '\''; } - get_log(0).ts<toDecorator>( __HERE__) << "end date changed:" << date.toString("YYYY:MM:DD") << std::endl; + TLOG(0,toDecorator,__HERE__) << "end date changed:" << date.toString("YYYY:MM:DD") << std::endl; QString dbid = l.at(0); QString inst = l.at(1); try @@ -466,7 +466,7 @@ { s << ":\'" << (*i).toAscii().constData() << '\''; } - get_log(0).ts<toDecorator>( __HERE__) << "Instance changed:" << pos << s.str() << std::endl; + TLOG(0,toDecorator,__HERE__) << "Instance changed:" << pos << s.str() << std::endl; QString dbid = l.at(0); QString inst = l.at(1); try @@ -476,14 +476,14 @@ sparams.push_back(inst); sparams.push_back(startdate->date().toString("yyyy:MM:dd")); sparams.push_back(startdate->date().toString("yyyy:MM:dd")); - get_log(1).ts<toDecorator>( __HERE__) << "FSNAP: (" << sparams.size() << ")" << std::endl; + TLOG(1,toDecorator,__HERE__) << "FSNAP: (" << sparams.size() << ")" << std::endl; fsnap->query(toSQL::sql("toAWR:Snaps", connection()), const_cast<const toQList&>(sparams ) ); fsnap->refresh(); eparams.push_back(dbid); eparams.push_back(inst); eparams.push_back(enddate->date().toString("yyyy:MM:dd")); eparams.push_back(enddate->date().toString("yyyy:MM:dd")); - get_log(1).ts<toDecorator>( __HERE__) << "TSNAP: (" << eparams.size() << ")" << std::endl; + TLOG(1,toDecorator,__HERE__) << "TSNAP: (" << eparams.size() << ")" << std::endl; tsnap->query(toSQL::sql("toAWR:Snaps", connection()), const_cast<const toQList&>(eparams ) ); tsnap->refresh(); } Modified: branches/tora-trotl/src/tobackup.cpp =================================================================== --- branches/tora-trotl/src/tobackup.cpp 2010-07-09 16:59:27 UTC (rev 3621) +++ branches/tora-trotl/src/tobackup.cpp 2010-07-09 17:06:38 UTC (rev 3622) @@ -423,7 +423,7 @@ } catch (...) { - get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; + TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; } if (val == 0) LastLabel->setText(tr("This appears to be a cold backup database")); Modified: branches/tora-trotl/src/tobrowser.cpp =================================================================== --- branches/tora-trotl/src/tobrowser.cpp 2010-07-09 16:59:27 UTC (rev 3621) +++ branches/tora-trotl/src/tobrowser.cpp 2010-07-09 17:06:38 UTC (rev 3622) @@ -507,7 +507,7 @@ } catch (...) { - get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; + TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; } Tablespaces->setSelectionMode(toTreeWidget::Multi); } @@ -1854,7 +1854,7 @@ changeItem(); } else - get_log(2).ts<toDecorator>( __HERE__) << "mainTab_currentChanged unhandled index:" << ix; + TLOG(2,toDecorator,__HERE__) << "mainTab_currentChanged unhandled index:" << ix; } void toBrowser::windowActivated(QMdiSubWindow *widget) @@ -1895,7 +1895,7 @@ } catch (...) { - get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; + TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; return QString::null; } } @@ -2059,7 +2059,7 @@ } } else - get_log(2).ts<toDecorator>( __HERE__) << "changeItem() unhandled index" << ix; + TLOG(2,toDecorator,__HERE__) << "changeItem() unhandled index" << ix; } void toBrowser::changeItem(const QModelIndex &) @@ -2486,7 +2486,7 @@ return; } // TODO/FIXME: implement deleting from table tab - get_log(2).ts<toDecorator>( __HERE__) << "toBrowser::dropIndex()" << "indexes can be dropped only directly from indexes tab"; + TLOG(2,toDecorator,__HERE__) << "toBrowser::dropIndex()" << "indexes can be dropped only directly from indexes tab"; // for (toResultTableView::iterator it(FirstTab); (*it).isValid(); it++) // { @@ -2529,7 +2529,7 @@ void toBrowser::exportData(std::map<QString, QString> &data, const QString &prefix) { // TODO/FIXME - get_log(2).ts<toDecorator>( __HERE__) << "void toBrowser::exportData(std::map<QString, QString> &data, const QString &prefix)"; + TLOG(2,toDecorator,__HERE__) << "void toBrowser::exportData(std::map<QString, QString> &data, const QString &prefix)"; /* data[prefix + ":Schema"] = Schema->selected(); data[prefix + ":FirstTab"] = TopTab->currentWidget()->objectName(); data[prefix + ":SecondText"] = SecondText; @@ -2553,7 +2553,7 @@ void toBrowser::importData(std::map<QString, QString> &data, const QString &prefix) { // TODO/FIXME - get_log(2).ts<toDecorator>( __HERE__) << "void toBrowser::importData(std::map<QString, QString> &data, const QString &prefix)"; + TLOG(2,toDecorator,__HERE__) << "void toBrowser::importData(std::map<QString, QString> &data, const QString &prefix)"; /* disconnect(Schema, SIGNAL(activated(int)), this, SLOT(changeSchema(int))); disconnect(TopTab, SIGNAL(currentTabChanged(QWidget *)), this, SLOT(changeTab(QWidget *))); Modified: branches/tora-trotl/src/tobrowserbasewidget.cpp =================================================================== --- branches/tora-trotl/src/tobrowserbasewidget.cpp 2010-07-09 16:59:27 UTC (rev 3621) +++ branches/tora-trotl/src/tobrowserbasewidget.cpp 2010-07-09 17:06:38 UTC (rev 3622) @@ -78,7 +78,7 @@ toResult * r = dynamic_cast<toResult*>(page); -// get_log(2).ts<toDecorator>( __HERE__) << objectName() << label << page; +// TLOG(2,toDecorator,__HERE__) << objectName() << label << page; Q_ASSERT_X(r, "toBrowserBaseWidget::addTab", "new tab is not toResult child"); Modified: branches/tora-trotl/src/tobrowsertable.cpp =================================================================== --- branches/tora-trotl/src/tobrowsertable.cpp 2010-07-09 16:59:27 UTC (rev 3621) +++ branches/tora-trotl/src/tobrowsertable.cpp 2010-07-09 17:06:38 UTC (rev 3622) @@ -342,7 +342,7 @@ } catch (...) { - get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; + TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; TablespaceLabel->hide(); Tablespace->hide(); } @@ -664,7 +664,7 @@ column++; } // while #ifdef DEBUG - get_log(2).ts<toDecorator>( __HERE__) << "Could not find column to delete."; + TLOG(2,toDecorator,__HERE__) << "Could not find column to delete."; #endif } // removeColumn Modified: branches/tora-trotl/src/tochartmanager.cpp =================================================================== --- branches/tora-trotl/src/tochartmanager.cpp 2010-07-09 16:59:27 UTC (rev 3621) +++ branches/tora-trotl/src/tochartmanager.cpp 2010-07-09 17:06:38 UTC (rev 3622) @@ -285,7 +285,7 @@ } catch (...) { - get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; + TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; } return LastName; } Modified: branches/tora-trotl/src/toconnection.cpp =================================================================== --- branches/tora-trotl/src/toconnection.cpp 2010-07-09 16:59:27 UTC (rev 3621) +++ branches/tora-trotl/src/toconnection.cpp 2010-07-09 17:06:38 UTC (rev 3622) @@ -123,7 +123,7 @@ } catch (...) { - get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; + TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; } } @@ -281,7 +281,7 @@ Connection->ConnectionPool->release(ConnectionSub); throw; } - get_log(0).ts<toDecorator>( __HERE__) << "setQuery:'" << SQL.toAscii().constData() << "'" << std::endl; + TLOG(0,toDecorator,__HERE__) << "setQuery:'" << SQL.toAscii().constData() << "'" << std::endl; ConnectionSub->setQuery(this); } @@ -358,7 +358,7 @@ Connection->ConnectionPool->release(ConnectionSub); throw; } - get_log(0).ts<toDecorator>( __HERE__) << "setQuery:'" << SQL.toAscii().constData() << "'" << std::endl; + TLOG(0,toDecorator,__HERE__) << "setQuery:'" << SQL.toAscii().constData() << "'" << std::endl; ConnectionSub->setQuery(this); } @@ -385,7 +385,7 @@ Connection->ConnectionPool->release(ConnectionSub); throw; } - get_log(0).ts<toDecorator>( __HERE__) << "setQuery:'" << SQL.toAscii().constData() << "'" << std::endl; + TLOG(0,toDecorator,__HERE__) << "setQuery:'" << SQL.toAscii().constData() << "'" << std::endl; ConnectionSub->setQuery(this); } @@ -415,7 +415,7 @@ Query = NULL; throw; } - get_log(0).ts<toDecorator>( __HERE__) << "setQuery:'" << SQL.toAscii().constData() << "'" << std::endl; + TLOG(0,toDecorator,__HERE__) << "setQuery:'" << SQL.toAscii().constData() << "'" << std::endl; ConnectionSub->setQuery(this); } @@ -442,7 +442,7 @@ Connection->ConnectionPool->release(ConnectionSub); throw; } - get_log(0).ts<toDecorator>( __HERE__) << "setQuery:'" << SQL.toAscii().constData() << "'" << std::endl; + TLOG(0,toDecorator,__HERE__) << "setQuery:'" << SQL.toAscii().constData() << "'" << std::endl; ConnectionSub->setQuery(this); } @@ -474,7 +474,7 @@ Connection->ConnectionPool->release(ConnectionSub); throw; } - get_log(0).ts<toDecorator>( __HERE__) << "setQuery:'" << SQL.toAscii().constData() << "'" << std::endl; + TLOG(0,toDecorator,__HERE__) << "setQuery:'" << SQL.toAscii().constData() << "'" << std::endl; ConnectionSub->setQuery(this); } @@ -506,7 +506,7 @@ Connection->ConnectionPool->release(ConnectionSub); throw; } - get_log(0).ts<toDecorator>( __HERE__) << "setQuery:'" << SQL.toAscii().constData() << "'" << std::endl; + TLOG(0,toDecorator,__HERE__) << "setQuery:'" << SQL.toAscii().constData() << "'" << std::endl; ConnectionSub->setQuery(this); } @@ -531,7 +531,7 @@ Query = NULL; throw; } - get_log(0).ts<toDecorator>( __HERE__) << "setQuery:'" << SQL.toAscii().constData() << "'" << std::endl; + TLOG(0,toDecorator,__HERE__) << "setQuery:'" << SQL.toAscii().constData() << "'" << std::endl; ConnectionSub->setQuery(this); } @@ -585,7 +585,7 @@ { if (ConnectionSub->query() == this) { - get_log(0).ts<toDecorator>( __HERE__) << "setQuery: NULL" << std::endl; + TLOG(0,toDecorator,__HERE__) << "setQuery: NULL" << std::endl; ConnectionSub->setQuery(NULL); } if (Mode != Test && Connection && Connection->ConnectionPool) @@ -593,7 +593,7 @@ } catch (...) { - get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; + TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; } } @@ -715,7 +715,7 @@ toQValue toQuery::readValue(void) { - //get_log(0).ts<toDecorator>( __HERE__) << this->sql().left(50).toUtf8().constData() << std::endl; + //TLOG(0,toDecorator,__HERE__) << this->sql().left(50).toUtf8().constData() << std::endl; if (!Connection) return toQValue(0); @@ -728,7 +728,7 @@ toQValue toQuery::readValueNull(void) { //TODO - //get_log(0).ts<toDecorator>( __HERE__) << this->sql().left(50).toUtf8().constData() << std::endl; + //TLOG(0,toDecorator,__HERE__) << this->sql().left(50).toUtf8().constData() << std::endl; if (!Connection) return toQValue(0); @@ -1457,7 +1457,7 @@ } catch (...) { - get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; + TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; if (Connection->ReadingValues.getValue() == 0) Connection->ReadingValues.up(); } @@ -1484,7 +1484,7 @@ } catch (...) { - get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; + TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; ReadingCache = false; } } Modified: branches/tora-trotl/src/toconnectionpool.cpp =================================================================== --- branches/tora-trotl/src/toconnectionpool.cpp 2010-07-09 16:59:27 UTC (rev 3621) +++ branches/tora-trotl/src/toconnectionpool.cpp 2010-07-09 17:06:38 UTC (rev 3622) @@ -73,17 +73,17 @@ void toConnectionPoolTest::test() { for(int i = 0; Pool && i < Pool->size(); i++) { - get_log(0).ts<toDecorator>( __HERE__) << "Pool member id:" << i << std::endl; + TLOG(0,toDecorator,__HERE__) << "Pool member id:" << i << std::endl; toConnectionPool::PooledState state = Pool->test(i); if(state == toConnectionPool::Busy) { - get_log(0).ts<toDecorator>( __HERE__) << "Pool member id:" << i << " Busy" << std::endl; + TLOG(0,toDecorator,__HERE__) << "Pool member id:" << i << " Busy" << std::endl; continue; } if(state == toConnectionPool::Broken) { - get_log(0).ts<toDecorator>( __HERE__) << "Pool member id:" << i << " Broken" << std::endl; + TLOG(0,toDecorator,__HERE__) << "Pool member id:" << i << " Broken" << std::endl; Pool->fix(i); } } @@ -201,7 +201,7 @@ } catch(...) { - get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; + TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; } if(psub->Sub) @@ -231,7 +231,7 @@ } catch(...) { - get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; + TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; state = Broken; } @@ -249,10 +249,10 @@ PooledSub *psub = (*ptr)[member]; if(psub->State != Free) { - get_log(0).ts<toDecorator>( __HERE__) << "Pool member:" << member << " is NOT free" << std::endl; + TLOG(0,toDecorator,__HERE__) << "Pool member:" << member << " is NOT free" << std::endl; return psub->State; } - get_log(0).ts<toDecorator>( __HERE__) << "Pool member" << member << " is free" << std::endl; + TLOG(0,toDecorator,__HERE__) << "Pool member" << member << " is free" << std::endl; psub->State = Busy; ptr.unlock(); @@ -269,7 +269,7 @@ PooledState state = Free; try { QString sql = toSQL::string("Global:Now", *Connection); - //get_log(0).ts<toDecorator>( __HERE__) << sql.toUtf8().constData() << std::endl; + //TLOG(0,toDecorator,__HERE__) << sql.toUtf8().constData() << std::endl; if(sql.isEmpty()) return state; @@ -281,7 +281,7 @@ } catch(...) { - get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; + TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; state = Broken; } Modified: branches/tora-trotl/src/toeditextensions.cpp =================================================================== --- branches/tora-trotl/src/toeditextensions.cpp 2010-07-09 16:59:27 UTC (rev 3621) +++ branches/tora-trotl/src/toeditextensions.cpp 2010-07-09 17:06:38 UTC (rev 3622) @@ -302,7 +302,7 @@ } catch (...) { - get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; + TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; res = toSQLParse::indent(ind + mrk); } t = Current->text(line2); @@ -336,7 +336,7 @@ } catch (...) { - get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; + TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; Current->insert(toSQLParse::indent(text.mid(pos))); } } Modified: branches/tora-trotl/src/toeventquery.cpp =================================================================== --- branches/tora-trotl/src/toeventquery.cpp 2010-07-09 16:59:27 UTC (rev 3621) +++ branches/tora-trotl/src/toeventquery.cpp 2010-07-09 17:06:38 UTC (rev 3622) @@ -51,7 +51,7 @@ toQValue toEventQuery::readValueNull() { - //get_log(0).ts<toDecorator>( __HERE__) << std::endl; + //TLOG(0,toDecorator,__HERE__) << std::endl; if(Values.isEmpty()) throw tr("Read past end of query"); @@ -154,7 +154,7 @@ } } catch(...) { - get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; + TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; ; // ignored } } @@ -182,7 +182,7 @@ Statistics->refreshStats(false); } catch(...) { - get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; + TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; // ignored } } Modified: branches/tora-trotl/src/toeventquerytask.cpp =================================================================== --- branches/tora-trotl/src/toeventquerytask.cpp 2010-07-09 16:59:27 UTC (rev 3621) +++ branches/tora-trotl/src/toeventquerytask.cpp 2010-07-09 17:06:38 UTC (rev 3622) @@ -77,7 +77,7 @@ } \ } \ catch(...) { \ - get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; \ + TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; \ if(!Closed) { \ emit error(tr("Unknown exception.")); \ close(); \ @@ -141,7 +141,7 @@ Statistics->changeSession(*Query); } catch(...) { - get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; + TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; // ignored } @@ -152,7 +152,7 @@ Query = 0; } catch(...) { - get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; + TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; // ignored } @@ -181,7 +181,7 @@ Query->cancel(); } catch(...) { - get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; + TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; // noop } Modified: branches/tora-trotl/src/tofyracleconnection.cpp =================================================================== --- branches/tora-trotl/src/tofyracleconnection.cpp 2010-07-09 16:59:27 UTC (rev 3621) +++ branches/tora-trotl/src/tofyracleconnection.cpp 2010-07-09 17:06:38 UTC (rev 3622) @@ -457,7 +457,7 @@ } catch (...) { - get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; + TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; } toQDescList ret; Modified: branches/tora-trotl/src/tohighlightedtext.cpp =================================================================== --- branches/tora-trotl/src/tohighlightedtext.cpp 2010-07-09 16:59:27 UTC (rev 3621) +++ branches/tora-trotl/src/tohighlightedtext.cpp 2010-07-09 17:06:38 UTC (rev 3622) @@ -775,7 +775,7 @@ } catch (...) { - get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; + TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; } } @@ -900,7 +900,7 @@ { if (i.key() < 0) { - get_log(2).ts<toDecorator>( __HERE__) + TLOG(2,toDecorator,__HERE__) << "toHighlightedText::setErrors errLine:" << i.key() << " value:" << i.value() << std::endl; continue; } @@ -1036,12 +1036,12 @@ } catch (QString e) { - get_log(2).ts<toDecorator>( __HERE__) << "toHighlightedText::getCompletionList:" << e << std::endl; + TLOG(2,toDecorator,__HERE__) << "toHighlightedText::getCompletionList:" << e << std::endl; } catch (...) { - get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; - get_log(2).ts<toDecorator>( __HERE__) << "toHighlightedText::getCompletionList: Unknown error."; + TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; + TLOG(2,toDecorator,__HERE__) << "toHighlightedText::getCompletionList: Unknown error."; } } // if is toReturn empty fill it with keywords... Modified: branches/tora-trotl/src/toinvalid.cpp =================================================================== --- branches/tora-trotl/src/toinvalid.cpp 2010-07-09 16:59:27 UTC (rev 3621) +++ branches/tora-trotl/src/toinvalid.cpp 2010-07-09 17:06:38 UTC (rev 3622) @@ -213,14 +213,14 @@ while (l >= 0 && (sql.at(l) == ';' || sql.at(l).isSpace())) l--; #ifdef DEBUG - get_log(2).ts<toDecorator>( __HERE__) << "statement=" << sql.mid(0, l + 1); + TLOG(2,toDecorator,__HERE__) << "statement=" << sql.mid(0, l + 1); #endif if (l >= 0) conn.execute(sql.mid(0, l + 1)); } catch (...) { - get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; + TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; } } Modified: branches/tora-trotl/src/tologger.h =================================================================== --- branches/tora-trotl/src/tologger.h 2010-07-09 16:59:27 UTC (rev 3621) +++ branches/tora-trotl/src/tologger.h 2010-07-09 17:06:38 UTC (rev 3622) @@ -1,21 +1,23 @@ - #ifndef __TORA_LOGGER__ #define __TORA_LOGGER__ + +#ifdef DEBUG + #define USE_QT_THREAD_MANAGER #include "ts_log/critical_section.h" #include "ts_log/message_handler_log.h" #include "ts_log/thread_safe_log.h" #include "ts_log/ts_log_utils.h" #include "ts_log/decorator.h" - #include <iostream> - #include <boost/iostreams/device/null.hpp> #include <boost/iostreams/stream.hpp> using namespace boost; using namespace boost::iostreams; +#define TLOG(lognumber, decorator, where) get_log(lognumber).ts<decorator>( where) + typedef Tdecorator< TSLOG_TYPELIST_6(dashDecorator<4>, tidDecorator<qt_thread_manager>, @@ -48,7 +50,7 @@ return thread_safe_log( log); } -// tonoblockquery<3> - debugging disabled +// tonoblockquery<3> - debugging(disabled) template<> inline thread_safe_log templ_get_log_ownthread(int_to_type<3>*) { @@ -58,7 +60,7 @@ return thread_safe_log( log); } -// tonoblockquery<4> - debugging disabled +// tonoblockquery<4> - data read(disabled) template<> inline thread_safe_log templ_get_log_ownthread(int_to_type<4>*) { @@ -90,6 +92,52 @@ } } +#else // no DEBUGing at all + +#include "ts_log/ts_log_utils.h" +#include "ts_log/decorator.h" + +class NullLogger; + +template<typename C> +inline NullLogger& operator<<( NullLogger& stream, const C &str); +//template<typename C> +//inline NullLogger& operator<<( NullLogger& stream, const C str); + +class NullLogger : public NullType +{ +public: + inline NullLogger& operator<<(std::ostream& (*f)(std::ostream&)) + { + return *this; + } + template<class C> friend NullLogger& operator<<(NullLogger& stream, const C &str); +// template<class C> friend NullLogger& operator<<(NullLogger& stream, const C str); +}; + +template<typename C> +inline NullLogger& operator<<( NullLogger& stream, const C &str) +{ + return stream; +}; + +//template<typename C> +//inline NullLogger& operator<<( NullLogger& stream, const C str) +//{ +// return stream; +//}; + +inline NullLogger& get_null_log() +{ + static NullLogger null; + return null; +} + +#define TLOG(lognumber, decorator, where) get_null_log() + +#endif + + // TODO add some comment on this MSVC inline std::ostream& operator<<( std::ostream & stream, const QString & str) { // TODO review this @@ -99,4 +147,5 @@ return stream; } + #endif Modified: branches/tora-trotl/src/tomain.cpp =================================================================== --- branches/tora-trotl/src/tomain.cpp 2010-07-09 16:59:27 UTC (rev 3621) +++ branches/tora-trotl/src/tomain.cpp 2010-07-09 17:06:38 UTC (rev 3622) @@ -1033,7 +1033,7 @@ if (w) { w->setSelectionType(selectionType); - get_log(2).ts<toDecorator>( __HERE__) << "setting" << w << selectionType; + TLOG(2,toDecorator,__HERE__) << "setting" << w << selectionType; } } SelectionLabel->setText(action->isChecked() ? "Sel: Block" : "Sel: Normal"); @@ -1468,7 +1468,7 @@ } catch(...) { - get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; + TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; } std::map<QString, toTool *> &tools = toTool::tools(); Modified: branches/tora-trotl/src/tomarkedtext.cpp =================================================================== --- branches/tora-trotl/src/tomarkedtext.cpp 2010-07-09 16:59:27 UTC (rev 3621) +++ branches/tora-trotl/src/tomarkedtext.cpp 2010-07-09 17:06:38 UTC (rev 3622) @@ -799,9 +799,9 @@ // TODO: this part is waiting for QScintilla backend feature (yet unimplemented). void toMarkedText::setSelectionType(int aType) { - get_log(2).ts<toDecorator>( __HERE__) << "setSelectionType" << SendScintilla(SCI_GETSELECTIONMODE) << aType; - get_log(2).ts<toDecorator>( __HERE__) << SendScintilla(SCI_SETSELECTIONMODE, aType); - get_log(2).ts<toDecorator>( __HERE__) << "setSelectionType" << SendScintilla(SCI_GETSELECTIONMODE) << aType; + TLOG(2,toDecorator,__HERE__) << "setSelectionType" << SendScintilla(SCI_GETSELECTIONMODE) << aType; + TLOG(2,toDecorator,__HERE__) << SendScintilla(SCI_SETSELECTIONMODE, aType); + TLOG(2,toDecorator,__HERE__) << "setSelectionType" << SendScintilla(SCI_GETSELECTIONMODE) << aType; } #endif Modified: branches/tora-trotl/src/tonewconnection.cpp =================================================================== --- branches/tora-trotl/src/tonewconnection.cpp 2010-07-09 16:59:27 UTC (rev 3621) +++ branches/tora-trotl/src/tonewconnection.cpp 2010-07-09 17:06:38 UTC (rev 3622) @@ -602,7 +602,7 @@ } catch (...) { - get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; + TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; } } Modified: branches/tora-trotl/src/tonoblockquery.cpp =================================================================== --- branches/tora-trotl/src/tonoblockquery.cpp 2010-07-09 16:59:27 UTC (rev 3621) +++ branches/tora-trotl/src/tonoblockquery.cpp 2010-07-09 17:06:38 UTC (rev 3622) @@ -90,7 +90,7 @@ toLocker lock (Parent.Lock) ; Parent.ReadingValues.insert(Parent.ReadingValues.end(), value); - get_log(3).ts<toDecorator>( __HERE__) + TLOG(3,toDecorator,__HERE__) << "Value read:" << value.toString().toUtf8().constData() << std::endl; @@ -133,21 +133,21 @@ } catch (const toConnection::exception &str) { - get_log(3).ts<toDecorator>( __HERE__) << "Exception caught(a)" << std::endl; + TLOG(3,toDecorator,__HERE__) << "Exception caught(a)" << std::endl; toLocker lock (Parent.Lock) ; Parent.Error = str; } catch (const QString &str) { - get_log(3).ts<toDecorator>( __HERE__) << "Exception caught(b)" << std::endl; + TLOG(3,toDecorator,__HERE__) << "Exception caught(b)" << std::endl; toLocker lock (Parent.Lock) ; Parent.Error = str; } catch (...) { - get_log(3).ts<toDecorator>( __HERE__) << "Exception caught(c): " << std::endl; + TLOG(3,toDecorator,__HERE__) << "Exception caught(c): " << std::endl; toLocker lock (Parent.Lock) ; Parent.Error = qApp->translate("toNoBlockQuery", "Unknown exception"); @@ -162,18 +162,18 @@ } catch (...) { - get_log(3).ts<toDecorator>( __HERE__) << "Unhandled exception: " << std::endl; + TLOG(3,toDecorator,__HERE__) << "Unhandled exception: " << std::endl; } delete Parent.Query; Parent.Query = NULL; Parent.Running.up(); Parent.EOQ = true; - get_log(3).ts<toDecorator>( __HERE__) << "toNoBlockQuery::queryTask::run finished." << std::endl; + TLOG(3,toDecorator,__HERE__) << "toNoBlockQuery::queryTask::run finished." << std::endl; } toQValue toNoBlockQuery::readValueNull() { - //get_log(3).ts<toDecorator>( __HERE__) << std::endl; + //TLOG(3,toDecorator,__HERE__) << std::endl; if (CurrentValue == Values.end()) { @@ -187,7 +187,7 @@ Values = ReadingValues; CurrentValue = Values.begin(); ReadingValues.clear(); - get_log(3).ts<toDecorator>( __HERE__) + TLOG(3,toDecorator,__HERE__) << "Value read: '" << (*CurrentValue).toString().toUtf8().constData() << "'" << std::endl; @@ -237,7 +237,7 @@ } catch (...) { -// get_log(3).ts<toDecorator>( __HERE__) +// TLOG(3,toDecorator,__HERE__) // << "Unhandled exception: " << __HERE__ << std::endl; Statistics = NULL; } @@ -257,7 +257,7 @@ } catch (...) { -// get_log(3).ts<toDecorator>( __HERE__) +// TLOG(3,toDecorator,__HERE__) // << "Unhandled exception: " << __HERE__ << std::endl; Error = qApp->translate("toNoBlockQuery", "Failed to start background query thread"); while (Running.getValue()) @@ -299,7 +299,7 @@ } catch (...) { -// get_log(3).ts<toDecorator>( __HERE__) +// TLOG(3,toDecorator,__HERE__) // << "Unhandled exception: " << __HERE__ << std::endl; Statistics = NULL; } @@ -319,7 +319,7 @@ } catch (...) { - // get_log(3).ts<toDecorator>( __HERE__) << "Unhandled exception: " << __HERE__ << std::endl; + // TLOG(3,toDecorator,__HERE__) << "Unhandled exception: " << __HERE__ << std::endl; Error = qApp->translate("toNoBlockQuery", "Failed to start background query thread"); while (Running.getValue()) Running.down(); @@ -434,7 +434,7 @@ ReadingValues.clear(); Values.clear(); CurrentValue = Values.end(); - get_log(3).ts<toDecorator>( __HERE__) << "CurrentValue=Values.end()" << std::endl; + TLOG(3,toDecorator,__HERE__) << "CurrentValue=Values.end()" << std::endl; Quit = EOQ = false; Processed = 0; @@ -447,7 +447,7 @@ } catch (...) { - get_log(3).ts<toDecorator>( __HERE__) << "Exception(a): toNoBlockQuery::poll()" << std::endl; + TLOG(3,toDecorator,__HERE__) << "Exception(a): toNoBlockQuery::poll()" << std::endl; Statistics = NULL; } @@ -456,7 +456,7 @@ } catch (...) { - get_log(3).ts<toDecorator>( __HERE__) << "Exception(b): toNoBlockQuery::poll()" << std::endl; + TLOG(3,toDecorator,__HERE__) << "Exception(b): toNoBlockQuery::poll()" << std::endl; Error = qApp->translate("toNoBlockQuery", "Failed to start background query thread"); while (Running.getValue()) Running.down(); Modified: branches/tora-trotl/src/tooracleconnection.cpp =================================================================== --- branches/tora-trotl/src/tooracleconnection.cpp 2010-07-09 16:59:27 UTC (rev 3621) +++ branches/tora-trotl/src/tooracleconnection.cpp 2010-07-09 17:06:38 UTC (rev 3622) @@ -108,7 +108,7 @@ static void ThrowException(const ::trotl::OciException &exc) { - get_log(0).ts<toDecorator>( __HERE__) + TLOG(0,toDecorator,__HERE__) << "What:" << exc.what() << std::endl << exc.get_sql() << std::endl << "--------------------------------------------------------------------------------" @@ -176,7 +176,7 @@ } catch(...) { - get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; + TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; } _conn = 0; _login = 0; @@ -185,11 +185,12 @@ virtual void cancel(void) { _conn->cancel(); + TLOG(0,toDecorator,__HERE__) << "oracleSub::cancel(this=" << _conn << ")" << std::endl; } virtual void throwExtendedException(toConnection &conn, const ::trotl::OciException &exc) { - get_log(0).ts<toDecorator>( __HERE__) + TLOG(0,toDecorator,__HERE__) << "What:" << exc.what() << std::endl << exc.get_sql() << std::endl << "--------------------------------------------------------------------------------" @@ -262,7 +263,7 @@ if(BP.is_null(_last_buff_row)) { value = toQValue(); - get_log(4).ts<toDecorator>( __HERE__) << "Just read: NULL" << std::endl; + TLOG(4,toDecorator,__HERE__) << "Just read: NULL" << std::endl; } else { switch(BP.dty) { case SQLT_NUM: @@ -284,7 +285,7 @@ &i); oci_check_error(__HERE__, _errh, res); value = toQValue(i); - get_log(4).ts<toDecorator>( __HERE__) << "Just read: " << i << std::endl; + TLOG(4,toDecorator,__HERE__) << "Just read: " << i << std::endl; } else { double d; sword res = OCINumberToReal(_errh, @@ -293,7 +294,7 @@ &d); oci_check_error(__HERE__, _errh, res); value = toQValue(d); - get_log(4).ts<toDecorator>( __HERE__) << "Just read: " << d << std::endl; + TLOG(4,toDecorator,__HERE__) << "Just read: " << d << std::endl; } } catch(const ::trotl::OciException &e) { text str_buf[65]; @@ -321,11 +322,11 @@ if((xmlnode*)bpx->_xmlvaluep[_last_buff_row] == NULL) { value = toQValue(); - get_log(4).ts<toDecorator>( __HERE__) << "Just read: NULL XML" << std::endl; + TLOG(4,toDecorator,__HERE__) << "Just read: NULL XML" << std::endl; } else { std::string s(BP.get_string(_last_buff_row)); value = toQValue(QString(s.c_str())); - get_log(4).ts<toDecorator>( __HERE__) << "Just read: \"" << s << "\"" << std::endl; + TLOG(4,toDecorator,__HERE__) << "Just read: \"" << s << "\"" << std::endl; } } break; @@ -341,7 +342,7 @@ default: std::string s(BP.get_string(_last_buff_row)); value = toQValue(QString(s.c_str())); - get_log(4).ts<toDecorator>( __HERE__) << "Just read: \"" << s << "\"" << std::endl; + TLOG(4,toDecorator,__HERE__) << "Just read: \"" << s << "\"" << std::endl; } } @@ -360,7 +361,7 @@ oracleQuery(toQuery *query, oracleSub *) : toQuery::queryImpl(query) { - get_log(0).ts<toDecorator>( __HERE__) << std::endl; + TLOG(0,toDecorator,__HERE__) << std::endl; Running = Cancel = false; SaveInPool = false; Query = NULL; @@ -388,18 +389,21 @@ virtual bool eof(void) { if (!Query || Cancel) { - get_log(0).ts<toDecorator>( __HERE__) << "eof - on canceled query" << std::endl; + TLOG(0,toDecorator,__HERE__) << "eof - on canceled query" << std::endl; return true; } try { bool e = Query->eof(); if(e) - get_log(0).ts<toDecorator>( __HERE__) << "eof(" << Query->row_count() << ')' << std::endl; + { + Running = false; + TLOG(0,toDecorator,__HERE__) << "eof(" << Query->row_count() << ')' << std::endl; + } return e; //Query->eof(); } catch (const ::trotl::OciException &exc) { - get_log(0).ts<toDecorator>( __HERE__) << "eof(e) - " << exc.what() << std::endl; + TLOG(0,toDecorator,__HERE__) << "eof(e) - " << exc.what() << std::endl; if(query()) { oracleSub *conn = dynamic_cast<oracleSub *>(query()->connectionSub()); @@ -414,12 +418,12 @@ { if (!Query) { - get_log(0).ts<toDecorator>( __HERE__) << "rowsProcessed() - non-query" << std::endl; + TLOG(0,toDecorator,__HERE__) << "rowsProcessed() - non-query" << std::endl; return 0; } //return Query->get_last_row(); ???? unsigned i = Query->get_last_row(); - get_log(0).ts<toDecorator>( __HERE__) << "rowsProcessed(" << i << ")" << std::endl; + TLOG(0,toDecorator,__HERE__) << "rowsProcessed(" << i << ")" << std::endl; return i; } @@ -427,28 +431,28 @@ { //int descriptionLen; //Query->describe_select(descriptionLen); - get_log(0).ts<toDecorator>( __HERE__) << "columns(" << Query->get_column_count() << ")" << std::endl; + TLOG(0,toDecorator,__HERE__) << "columns(" << Query->get_column_count() << ")" << std::endl; return Query->get_column_count(); } virtual std::list<toQuery::queryDescribe> describe(void) { - get_log(0).ts<toDecorator>( __HERE__) << std::endl; + TLOG(0,toDecorator,__HERE__) << std::endl; std::list<toQuery::queryDescribe> ret; int datatypearg1 = 0; int datatypearg2 = 0; - get_log(0).ts<toDecorator>( __HERE__) << "TODO describe:" << std::endl; + TLOG(0,toDecorator,__HERE__) << "TODO describe:" << std::endl; // TODO trotl should return const iterator const std::vector<trotl::ColumnType> &col = Query->get_columns(); if(col.empty()) return ret; std::vector<trotl::ColumnType>::const_iterator it = col.begin(); ++it; // starts with 1st - //get_log(0).ts<toDecorator>( __HERE__) << "Columns: " << q1.get_column_count() << std::endl; + //TLOG(0,toDecorator,__HERE__) << "Columns: " << q1.get_column_count() << std::endl; for(; it != col.end(); ++it) { - get_log(0).ts<toDecorator>( __HERE__) << "Var: " << (*it).get_type_str(true) << std::endl; + TLOG(0,toDecorator,__HERE__) << "Var: " << (*it).get_type_str(true) << std::endl; toQuery::queryDescribe desc; desc.AlignRight = false; desc.Name = QString::fromUtf8( (*it)._column_name.c_str() ); @@ -549,7 +553,7 @@ cur.Comment = objects.readValueNull(); ret.insert(ret.end(), cur); } - get_log(0).ts<toDecorator>( __HERE__) + TLOG(0,toDecorator,__HERE__) << "++++ objectNames +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" << std::endl; @@ -581,7 +585,7 @@ (*i).Synonyms.insert((*i).Synonyms.end(), synonym); } } - get_log(0).ts<toDecorator>( __HERE__) + TLOG(0,toDecorator,__HERE__) << "++++ synonymMap ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" << std::endl; @@ -649,7 +653,7 @@ } catch (...) { - get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; + TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; } return ret; } @@ -666,7 +670,7 @@ } catch (...) { - get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; + TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; } try @@ -750,11 +754,11 @@ return QString(version.str().c_str()); } catch (::trotl::OciException e) { - get_log(0).ts<toDecorator>( __HERE__) << e.what() << std::endl; + TLOG(0,toDecorator,__HERE__) << e.what() << std::endl; } catch (...) { - get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; + TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; // Ignore any errors here } return QString::QString(); @@ -773,7 +777,7 @@ virtual void execute(toConnectionSub *sub, const QString &sql, toQList ¶ms) { oracleSub *conn = oracleConv(sub); - get_log(0).ts<toDecorator>( __HERE__) << std::endl; + TLOG(0,toDecorator,__HERE__) << std::endl; if ( params.empty() ) { try @@ -783,7 +787,7 @@ query.execute_internal(::trotl::g_OCIPL_BULK_ROWS, OCI_DEFAULT); //otl_cursor::direct_exec(*(conn->Connection), sql.toUtf8().constData()); //TODO - get_log(0).ts<toDecorator>( __HERE__) << "TODO: otl_cursor::direct_exec" << std::endl; + TLOG(0,toDecorator,__HERE__) << "TODO: otl_cursor::direct_exec" << std::endl; } catch (const ::trotl::OciException &exc) { @@ -826,7 +830,7 @@ _envp = new ::trotl::OciEnv(*_envallocp); - //get_log(0).ts<toDecorator>( __HERE__) << "TODO: initialize" << std::endl << __HERE__ << std::endl; + //TLOG(0,toDecorator,__HERE__) << "TODO: initialize" << std::endl << __HERE__ << std::endl; addProvider("Oracle"); } @@ -1006,7 +1010,7 @@ //Query = new oracleQuery::oracleSqlStatement(*conn->_conn, sql.toUtf8().constData()); Query = new oracleQuery::trotlQuery(*conn->_conn, ::std::string(sql.toUtf8().constData())); - get_log(0).ts<toDecorator>( __HERE__) << "SQL(this=" << Query << "): " << ::std::string(sql.toUtf8().constData()) << std::endl; + TLOG(0,toDecorator,__HERE__) << "SQL(conn=" << conn->_conn << ", this=" << Query << "): " << ::std::string(sql.toUtf8().constData()) << std::endl; // TODO autocommit ?? // Query->set_commit(0); //if (toQValue::numberFormat() == 0) @@ -1036,8 +1040,8 @@ if( bp.bind_typename == "int" /*&& (*i).isInt()*/ ) { (*Query) << (*i).toInt(); - get_log(0).ts<toDecorator>( __HERE__) - << "<<(this=" << Query << ")" + TLOG(0,toDecorator,__HERE__) + << "<<(conn=" << conn->_conn << ", this=" << Query << ")" << "::operator<<(" << bp.type_name << " ftype=" << bp.dty << ", placeholder=" << bp.bind_name << ", value=" << (*i).toInt() << ");" @@ -1045,8 +1049,8 @@ } else if( (bp.bind_typename == "char" || bp.bind_typename == "varchar") && (*i).isString()) { std::string param((const char*)((*i).toString().toUtf8().constData())); (*Query) << ::std::string((const char*)((*i).toString().toUtf8().constData())); - get_log(0).ts<toDecorator>( __HERE__) - << "<<(this=" << Query << ")" + TLOG(0,toDecorator,__HERE__) + << "<<(conn=" << conn->_conn << ", this=" << Query << ")" << "::operator<<(" << bp.type_name << " ftype=" << bp.dty << ", placeholder=" << bp.bind_name << ", value=" << ::std::string((const char*)((*i).toString().toUtf8().constData())) << ");" @@ -1111,10 +1115,11 @@ */ } - Running = false; + //Running = false; } catch (const ::trotl::OciException &exc) { + conn->_conn->reset(); delete Query; Query = NULL; @@ -1125,15 +1130,21 @@ void toOracleProvider::oracleQuery::cancel(void) { + oracleSub *conn = dynamic_cast<oracleSub *>(query()->connectionSub()); if(!Running || Cancel) + { + TLOG(0,toDecorator,__HERE__) << ":oracleQuery::cancel(conn=" << conn->_conn << ", this=" << Query << ") on non-running query" << std::endl; return; - - oracleSub *conn = dynamic_cast<oracleSub *>(query()->connectionSub()); + } + if (!conn) throw QString::fromLatin1("Internal error, not oracle sub connection"); conn->_conn->cancel(); + conn->_conn->reset(); Cancel = true; + Running = false; + TLOG(0,toDecorator,__HERE__) << ":oracleQuery::cancel(conn=" << conn->_conn << ", this=" << Query << ")" << std::endl; } @@ -1198,7 +1209,7 @@ (ub4) session_mode); conn = new ::trotl::OciConnection(_env, *login); - ::get_log(0).ts<toDecorator>( __HERE__) << "Oracle database version: " + TLOG(0,toDecorator,__HERE__) << "Oracle database version: " << ::std::hex << ::std::showbase << ::std::setw(10) << ::std::setfill('0') << ::std::internal << login->_server._version << ::std::endl @@ -1213,7 +1224,7 @@ } catch (const ::trotl::OciException &exc) { - get_log(0).ts<toDecorator>( __HERE__) + TLOG(0,toDecorator,__HERE__) << "TODO: catch" << std::endl << __HERE__ << std::endl; if (toThread::mainThread() && exc.get_code() == 28001) { @@ -1255,7 +1266,7 @@ connection().setPassword(newpass); } else { - get_log(0).ts<toDecorator>( __HERE__) << std::endl; + TLOG(0,toDecorator,__HERE__) << std::endl; throw exc; } // (toThread::mainThread() && exc.get_code() == 28001) } // catch (const ::trotl::OciException &exc) @@ -1388,7 +1399,7 @@ } catch (...) { - get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; + TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; } } Modified: branches/tora-trotl/src/tooracleextract.cpp =================================================================== --- branches/tora-trotl/src/tooracleextract.cpp 2010-07-09 16:59:27 UTC (rev 3621) +++ branches/tora-trotl/src/tooracleextract.cpp 2010-07-09 17:06:38 UTC (rev 3622) @@ -401,7 +401,7 @@ } catch (...) { - get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; + TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; isDBA = false; } ql << "DATASTORE" << "FILTER" << "LEXER" << "WORDLIST" << "STORAGE"; @@ -7542,7 +7542,7 @@ } catch (...) { - get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; + TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; DbaSegments = QString("(select '%1' owner,user_segments.* from sys.user_segments)"). arg(CONNECTION.user().toUpper()); } @@ -7555,7 +7555,7 @@ } catch (...) { - get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; + TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; toQList ret = toQuery::readQueryNull(CONNECTION, SQLSetSizingFallback); if (ret.empty()) ret = toQuery::readQueryNull(CONNECTION, SQLSetSizingFallback2); Modified: branches/tora-trotl/src/tooutput.cpp =================================================================== --- branches/tora-trotl/src/tooutput.cpp 2010-07-09 16:59:27 UTC (rev 3621) +++ branches/tora-trotl/src/tooutput.cpp 2010-07-09 17:06:38 UTC (rev 3622) @@ -340,7 +340,7 @@ } catch (...) { - get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; + TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; toStatusMessage(tr("Couldn't enable/disable output for session")); } } Modified: branches/tora-trotl/src/topiechart.cpp =================================================================== --- branches/tora-trotl/src/topiechart.cpp 2010-07-09 16:59:27 UTC (rev 3621) +++ branches/tora-trotl/src/topiechart.cpp 2010-07-09 17:06:38 UTC (rev 3622) @@ -475,7 +475,7 @@ } catch (...) { - get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; + TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; } if (Flow) Modified: branches/tora-trotl/src/toplsqleditor.cpp =================================================================== --- branches/tora-trotl/src/toplsqleditor.cpp 2010-07-09 16:59:27 UTC (rev 3621) +++ branches/tora-trotl/src/toplsqleditor.cpp 2010-07-09 17:06:38 UTC (rev 3622) @@ -482,7 +482,7 @@ { toBusy busy; -// get_log(2).ts<toDecorator>( __HERE__) << "toDebug::changePackage 1"; +// TLOG(2,toDecorator,__HERE__) << "toDebug::changePackage 1"; toCodeModelItem *item = static_cast<toCodeModelItem*>(current.internalPointer()); if (item && item->parent()) { @@ -500,7 +500,7 @@ else if (item && !item->parent()) item->setOpen(true); #endif -// get_log(2).ts<toDecorator>( __HERE__) << "toDebug::changePackage 2"; +// TLOG(2,toDecorator,__HERE__) << "toDebug::changePackage 2"; } void toPLSQLEditor::compileWarn() @@ -698,21 +698,21 @@ if (!toWriteFile(tf.fileName(), currentEditor()->editor()->text())) { #ifdef DEBUG - get_log(2).ts<toDecorator>( __HERE__) << "Unable to write file (" + tf.fileName() + ")"; + TLOG(2,toDecorator,__HERE__) << "Unable to write file (" + tf.fileName() + ")"; #endif return; } else { #ifdef DEBUG - get_log(2).ts<toDecorator>( __HERE__) << "Success!!! Temporary file " + tf.fileName(); + TLOG(2,toDecorator,__HERE__) << "Success!!! Temporary file " + tf.fileName(); #endif } } QString program = toConfigurationSingle::Instance().staticChecker().arg(tf.fileName()); #ifdef DEBUG - get_log(2).ts<toDecorator>( __HERE__) << "program to be executed: " + program; + TLOG(2,toDecorator,__HERE__) << "program to be executed: " + program; #endif QProcess staticCheck(qApp); @@ -724,29 +724,29 @@ if (exit_code != 0) { #ifdef DEBUG - get_log(2).ts<toDecorator>( __HERE__) << "Error executing static check. Exit code = " << exit_code; + TLOG(2,toDecorator,__HERE__) << "Error executing static check. Exit code = " << exit_code; int run_error = staticCheck.error(); // error values taken from Qt4.6 documentation for QProcess switch (run_error) { case 0: - get_log(2).ts<toDecorator>( __HERE__) << "The process failed to start. Either the invoked program is missing, or you may have insufficient permissions to invoke the program."; + TLOG(2,toDecorator,__HERE__) << "The process failed to start. Either the invoked program is missing, or you may have insufficient permissions to invoke the program."; break; case 1: - get_log(2).ts<toDecorator>( __HERE__) << "The process crashed some time after starting successfully."; + TLOG(2,toDecorator,__HERE__) << "The process crashed some time after starting successfully."; break; case 5: - get_log(2).ts<toDecorator>( __HERE__) << "An unknown error occurred."; + TLOG(2,toDecorator,__HERE__) << "An unknown error occurred."; break; default: - get_log(2).ts<toDecorator>( __HERE__) << "Error code: " << run_error << "--" << staticCheck.errorString(); + TLOG(2,toDecorator,__HERE__) << "Error code: " << run_error << "--" << staticCheck.errorString(); } // switch #endif return; } QString qq = staticCheck.readAllStandardOutput(); #ifdef DEBUG - get_log(2).ts<toDecorator>( __HERE__) << "stdout" << qq; + TLOG(2,toDecorator,__HERE__) << "stdout" << qq; #endif QMultiMap<int, QString> Observations; Modified: branches/tora-trotl/src/toplsqltext.cpp =================================================================== --- branches/tora-trotl/src/toplsqltext.cpp 2010-07-09 16:59:27 UTC (rev 3621) +++ branches/tora-trotl/src/toplsqltext.cpp 2010-07-09 17:06:38 UTC (rev 3622) @@ -701,7 +701,7 @@ m_staticItem = new QTreeWidgetItem(m_result, QStringList() << tr("Static check") << ""); item = m_staticItem; } else - get_log(2).ts<toDecorator>( __HERE__) << "Unknown type " << type << " in toPLSQLWidget::applyResult"; + TLOG(2,toDecorator,__HERE__) << "Unknown type " << type << " in toPLSQLWidget::applyResult"; // add new items to the list QMap<int, QString>::const_iterator i = values.constBegin(); Modified: branches/tora-trotl/src/toqsqlconnection.cpp =================================================================== --- branches/tora-trotl/src/toqsqlconnection.cpp 2010-07-09 16:59:27 UTC (rev 3621) +++ branches/tora-trotl/src/toqsqlconnection.cpp 2010-07-09 17:06:38 UTC (rev 3622) @@ -1284,7 +1284,7 @@ } catch (...) { - get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; + TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; } } } @@ -1562,7 +1562,7 @@ } catch (...) { - get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; + TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; } } } @@ -1616,7 +1616,7 @@ } catch (...) { - get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; + TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; } return ret; @@ -1638,7 +1638,7 @@ } catch (...) { - get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; + TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; } try @@ -1671,7 +1671,7 @@ } catch (...) { - get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; + TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; } toQDescList ret; @@ -1731,7 +1731,7 @@ } catch (...) { - get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; + TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; } return ret; } @@ -1980,7 +1980,7 @@ } catch (...) { - get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; + TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; } return ret; } Modified: branches/tora-trotl/src/toresult.cpp =================================================================== --- branches/tora-trotl/src/toresult.cpp 2010-07-09 16:59:27 UTC (rev 3621) +++ branches/tora-trotl/src/toresult.cpp 2010-07-09 17:06:38 UTC (rev 3622) @@ -98,7 +98,7 @@ } catch (...) { - get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; + TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; Handled = false; } if (last != Handled) @@ -120,7 +120,7 @@ } catch (...) { - get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; + TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; setHandle(false); } } @@ -157,7 +157,7 @@ } catch (...) { - get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; + TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; setHandle(false); } } @@ -173,31 +173,31 @@ } catch (...) { - get_log(1).ts<toDecorator>( __HERE__) << " Ignored exception." << std::endl; + TLOG(1,toDecorator,__HERE__) << " Ignored exceptio... [truncated message content] |
From: <ibr...@us...> - 2010-07-29 11:39:34
|
Revision: 3641 http://tora.svn.sourceforge.net/tora/?rev=3641&view=rev Author: ibre5041 Date: 2010-07-29 11:39:28 +0000 (Thu, 29 Jul 2010) Log Message: ----------- More verbose output for ignored exceptions Modified Paths: -------------- branches/tora-trotl/src/toconnection.cpp branches/tora-trotl/src/totool.cpp Modified: branches/tora-trotl/src/toconnection.cpp =================================================================== --- branches/tora-trotl/src/toconnection.cpp 2010-07-28 22:47:00 UTC (rev 3640) +++ branches/tora-trotl/src/toconnection.cpp 2010-07-29 11:39:28 UTC (rev 3641) @@ -1455,6 +1455,13 @@ } } } + catch (std::exception const &e) + { + TLOG(1,toDecorator,__HERE__) << " Ignored exception:" << std::endl + << e.what() << std::endl; + if (Connection->ReadingValues.getValue() == 0) + Connection->ReadingValues.up(); + } catch (...) { TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; Modified: branches/tora-trotl/src/totool.cpp =================================================================== --- branches/tora-trotl/src/totool.cpp 2010-07-28 22:47:00 UTC (rev 3640) +++ branches/tora-trotl/src/totool.cpp 2010-07-29 11:39:28 UTC (rev 3641) @@ -129,6 +129,11 @@ if (tool) connect(tool, SIGNAL(connectionChange()), this, SLOT(parentConnection())); } + catch (std::exception const &e) + { + TLOG(1,toDecorator,__HERE__) << " Ignored exception:" << std::endl + << e.what() << std::endl; + } catch (...) { TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2010-08-05 21:28:03
|
Revision: 3646 http://tora.svn.sourceforge.net/tora/?rev=3646&view=rev Author: ibre5041 Date: 2010-08-05 21:27:56 +0000 (Thu, 05 Aug 2010) Log Message: ----------- class complexType added, this provides a connector between a connection provider and the class toResultModel/toResultEditor Modified Paths: -------------- branches/tora-trotl/src/tomodeleditor.cpp branches/tora-trotl/src/tooracleconnection.cpp branches/tora-trotl/src/toqvalue.cpp branches/tora-trotl/src/toqvalue.h branches/tora-trotl/src/toresultmodel.cpp Modified: branches/tora-trotl/src/tomodeleditor.cpp =================================================================== --- branches/tora-trotl/src/tomodeleditor.cpp 2010-08-05 21:23:10 UTC (rev 3645) +++ branches/tora-trotl/src/tomodeleditor.cpp 2010-08-05 21:27:56 UTC (rev 3646) @@ -332,10 +332,20 @@ void toModelEditor::changePosition(QModelIndex index) { Current = index; + QVariant const &data = Model->data(Current, Qt::UserRole); + if(data.type() == QVariant::UserType) + { + toQValue::complexType *i = data.value<toQValue::complexType*>(); + setText(i->summary()); + return; + } + if(Editable) - setText(Model->data(Current, Qt::EditRole).toString()); + setText(Model->data(Current, Qt::EditRole).toString()); else - setText(Model->data(Current, Qt::DisplayRole).toString()); + { + setText(Model->data(Current, Qt::DisplayRole).toString()); + } } void toModelEditor::firstColumn() Modified: branches/tora-trotl/src/tooracleconnection.cpp =================================================================== --- branches/tora-trotl/src/tooracleconnection.cpp 2010-08-05 21:23:10 UTC (rev 3645) +++ branches/tora-trotl/src/tooracleconnection.cpp 2010-08-05 21:27:56 UTC (rev 3646) @@ -51,6 +51,7 @@ #endif #include <trotl.h> +#include <trotl_convertor.h> #include "toconf.h" #include "toconfiguration.h" @@ -153,6 +154,80 @@ } } +class toOracleClob: public toQValue::complexType +{ +public: + toOracleClob(trotl::OciConnection &_conn) + : toQValue::complexType(), + data(_conn) + {}; + /* virtual */ bool isBinary() const + { + return false; + } + /* virtual */ bool isLarge() const + { + return false; + } + /* virtual */ QString summary() const + { + return QString("Datape: Oracle [N]CLOB\n" + "Size: %1B\n").arg(data.get_length()); + } + /* virtual */ QString dataTypeName() const + { + return QString("clob"); + } + ~toOracleClob() + { + TLOG(1,toDecorator,__HERE__) << "toOracleClob DELETED:" << this << std::endl; + } + + mutable trotl::SqlClob data; +protected: + toOracleClob(toOracleClob const&); + toOracleClob operator=(toOracleClob const&); + //TODO copying prohibited +}; +//Q_DECLARE_METATYPE(toOracleClob*) + +class toOracleBlob: public toQValue::complexType +{ +public: + toOracleBlob(trotl::OciConnection &_conn) + : toQValue::complexType(), + data(_conn) + {}; + /* virtual */ bool isBinary() const + { + return false; + } + /* virtual */ bool isLarge() const + { + return false; + } + /* virtual */ QString summary() const + { + return QString("Datape: Oracle BLOB\n" + "Size: %1B\n").arg(data.get_length()); + } + /* virtual */ QString dataTypeName() const + { + return QString("blob"); + } + ~toOracleBlob() + { + TLOG(1,toDecorator,__HERE__) << "toOracleBlob DELETED:" << this << std::endl; + } + + mutable trotl::SqlBlob data; +protected: + toOracleBlob(toOracleBlob const&); + toOracleBlob operator=(toOracleBlob const&); + //TODO copying prohibited +}; +//Q_DECLARE_METATYPE(toOracleBlob*) + class toOracleProvider : public toConnectionProvider { ::trotl::OciEnv *_envp; @@ -332,11 +407,24 @@ break; #endif case SQLT_CLOB: { - value = toQValue(QString("<CLOB>")); + toOracleClob *i = new toOracleClob(_conn); + trotl::ConvertorForRead c(_last_buff_row); + trotl::DispatcherForRead::Go(BP, i->data, c); + QVariant v; + v.setValue((toQValue::complexType*)i); + value = toQValue::fromVariant(v); + //int id = qMetaTypeId<toQValue::complexType*>(); + TLOG(4,toDecorator,__HERE__) << "Just read: \"CLOB\"" << std::endl; } break; case SQLT_BLOB: { - value = toQValue(QString("<BLOB>")); + toOracleBlob *i = new toOracleBlob(_conn); + trotl::ConvertorForRead c(_last_buff_row); + trotl::DispatcherForRead::Go(BP, i->data, c); + QVariant v; + v.setValue((toQValue::complexType*)i); + value = toQValue::fromVariant(v); + TLOG(4,toDecorator,__HERE__) << "Just read: \"BLOB\"" << std::endl; } break; default: @@ -1030,7 +1118,6 @@ } try { - //otl_null null; for (toQList::iterator i = query()->params().begin();i != query()->params().end();i++) { const trotlQuery::BindPar& bp = (*Query).get_curr_in_bindpar(); @@ -1060,59 +1147,7 @@ throw toConnection::exception( QString::fromLatin1("Fatal pruser error - unsupported BindPar:") + bp.bind_typename.c_str()); exit(-1); - } - - - // TODO - /* - if ((*i).isNull()) - (*Query) << null; - else - { - otl_var_desc *next = Query->describe_next_in_var(); - if (next) - { - switch (next->ftype) - { - case otl_var_double: - case otl_var_float: - (*Query) << (*i).toDouble(); - break; - case otl_var_int: - case otl_var_unsigned_int: - case otl_var_short: - case otl_var_long_int: - (*Query) << (*i).toInt(); - break; - case otl_var_raw_long: - case otl_var_blob: - if ((*i).isBinary()) - { - QByteArray arr = (*i).toByteArray(); - otl_long_string str(arr, arr.size(), arr.size()); - (*Query) << str; - break; - } - // Intentially left out break - case otl_var_varchar_long: - case otl_var_clob: - { - QString buf = (*i).toUtf8(); - otl_long_string str(buf.toUtf8().constData(), buf.length(), buf.length()); - (*Query) << str; - } - break; - default: - (*Query) << (*i).toUtf8().toUtf8().constData(); - break; - } - } - else - { - printf("ERROR: More parameters than binds\n"); - } - } - */ + } } //Running = false; Modified: branches/tora-trotl/src/toqvalue.cpp =================================================================== --- branches/tora-trotl/src/toqvalue.cpp 2010-08-05 21:23:10 UTC (rev 3645) +++ branches/tora-trotl/src/toqvalue.cpp 2010-08-05 21:27:56 UTC (rev 3646) @@ -76,8 +76,28 @@ toQValue::toQValue(const toQValue ©) { Value = copy.Value; + /** Be destructive only if complexType is held + * There should be no copying of data read from a query, + * but toQValue is also used for query parameters(toQList and others) + * and these are copyined often (toNoBlockQuery.Params => toQuery.Params) + */ + if(isUserType()) + const_cast<toQValue&>(copy).Value = "deleted value(clone)"; } +const toQValue &toQValue::operator = (const toQValue & copy) +{ + Value = copy.Value; + /** Be destructive only if complexType is held + * There should be no copying of data read from a query, + * but toQValue is also used for query parameters(toQList and others) + * and these are copyined often (toNoBlockQuery.Params => toQuery.Params) + */ + if(isUserType()) + const_cast<toQValue&>(copy).Value = "deleted value(assign)"; + return *this; +} + toQValue::toQValue(const QString &str) { Value = str; @@ -89,6 +109,12 @@ toQValue::~toQValue() { + if(isUserType()) + { + complexType *i = Value.value<toQValue::complexType*>(); + if(i) + delete i; + } } bool toQValue::operator<(const toQValue &other) const @@ -156,13 +182,6 @@ return !operator<=(other); } - -const toQValue &toQValue::operator = (const toQValue & copy) -{ - Value = copy.Value; - return *this; -} - bool toQValue::isNumber() const { return isInt() || isDouble() || isLong() || isuLong(); @@ -173,7 +192,7 @@ return Value == val.Value; } -QVariant toQValue::toQVariant() const +QVariant const& toQValue::toQVariant() const { return Value; } @@ -208,6 +227,11 @@ return Value.type() == QVariant::ByteArray; } +bool toQValue::isUserType(void) const +{ + return Value.type() == QVariant::UserType; +} + bool toQValue::isNull() const { return Value.isNull(); @@ -220,12 +244,18 @@ QString toQValue::toUtf8() const { - return Value.toString(); + if(isUserType()) + return QString("U UserType"); + else + return Value.toString(); } QString toQValue::toString() const { - return Value.toString(); + if(isUserType()) + return QString("T UserType"); + else + return Value.toString(); } int toQValue::toInt() const @@ -358,7 +388,10 @@ toQValue::operator QString() const { - return Value.toString(); + if(isUserType()) + return QString("O UserType"); + else + return Value.toString(); } @@ -393,6 +426,9 @@ case 4: s.append("T"); break; + case 5: + s.append("P"); + break; default: s.append("E"); } Modified: branches/tora-trotl/src/toqvalue.h =================================================================== --- branches/tora-trotl/src/toqvalue.h 2010-08-05 21:23:10 UTC (rev 3645) +++ branches/tora-trotl/src/toqvalue.h 2010-08-05 21:27:56 UTC (rev 3646) @@ -60,6 +60,23 @@ QVariant Value; public: + /** + * This is helper class for visualization of complex types + * like: CLOB, BLOB, XML, vector of strings, image... + * This class should be subclassed in tooracleconnection and other + * connection providers. Subclasses then will be registered + * into QT's metatype system using Q_DECLARE_METATYPE and stored inside QVariant + */ + class complexType + { + public: + virtual bool isBinary() const = 0; + virtual bool isLarge() const = 0; + virtual QString summary() const = 0; + virtual QString dataTypeName() const = 0; + virtual ~complexType() {}; + }; + /** Create null value. */ toQValue(void); @@ -133,7 +150,10 @@ /** Check if this value is binary. */ bool isBinary(void) const; - + /** Check if this value holds "custom" user type + */ + bool isUserType(void) const; + /** Get toUtf8 format of this value. */ QString toUtf8(void) const; @@ -160,7 +180,7 @@ /** Convert value to a QVariant */ - QVariant toQVariant(void) const; + QVariant const& toQVariant(void) const; /** Get binary representation of value. Can only be called when the data is actually binary. */ @@ -204,6 +224,7 @@ */ static toQValue fromVariant(const QVariant &); }; +Q_DECLARE_METATYPE(toQValue::complexType*) /** A short representation of list<toQuery::queryValue> */ Modified: branches/tora-trotl/src/toresultmodel.cpp =================================================================== --- branches/tora-trotl/src/toresultmodel.cpp 2010-08-05 21:23:10 UTC (rev 3645) +++ branches/tora-trotl/src/toresultmodel.cpp 2010-08-05 21:27:56 UTC (rev 3646) @@ -494,28 +494,33 @@ if (index.row() > Rows.size() - 1 || index.column() > Headers.size() - 1) return QVariant(); - toQValue data = Rows.at(index.row()).at(index.column()); + toQValue const &data = Rows.at(index.row()).at(index.column()); - if (role == Qt::DisplayRole) + switch(role) { - if (data.isNull()) - return toNull(data).toQVariant(); - - return data.toQVariant(); - } - if (role == Qt::EditRole) - return data.toQVariant(); - if (role == Qt::ToolTipRole) - return data.toQVariant(); - if (role == Qt::BackgroundRole) - { - if (data.isNull() && toConfigurationSingle::Instance().indicateEmpty()) - return QVariant(QColor(toConfigurationSingle::Instance().indicateEmptyColor())); - return QVariant(); - } - if (role == Qt::TextAlignmentRole) - return (int) Headers.at(index.column()).align; - + case Qt::DisplayRole: + if (data.isNull()) + return toNull(data).toQVariant(); + if (data.isUserType()) + { + toQValue::complexType *i = data.toQVariant().value<toQValue::complexType*>(); + return QVariant(QString("{%1}").arg(i->dataTypeName())); + } + return data.toQVariant(); + case Qt::EditRole: + case Qt::ToolTipRole: + return data.toQVariant(); + case Qt::BackgroundRole: + if (data.isNull() && toConfigurationSingle::Instance().indicateEmpty()) + return QVariant(QColor(toConfigurationSingle::Instance().indicateEmptyColor())); + return QVariant(); + case Qt::TextAlignmentRole: + return (int) Headers.at(index.column()).align; + case Qt::UserRole: + return data.toQVariant(); + default: + return QVariant(); + } return QVariant(); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2010-08-31 20:31:32
|
Revision: 3678 http://tora.svn.sourceforge.net/tora/?rev=3678&view=rev Author: ibre5041 Date: 2010-08-31 20:31:26 +0000 (Tue, 31 Aug 2010) Log Message: ----------- fix for bug #3047401, by zeroj Modified Paths: -------------- branches/tora-trotl/src/tonewconnection.cpp branches/tora-trotl/src/tonewconnection.h Modified: branches/tora-trotl/src/tonewconnection.cpp =================================================================== --- branches/tora-trotl/src/tonewconnection.cpp 2010-08-31 20:09:57 UTC (rev 3677) +++ branches/tora-trotl/src/tonewconnection.cpp 2010-08-31 20:31:26 UTC (rev 3678) @@ -337,18 +337,19 @@ void toNewConnection::done(int r) { - writeSettings(); - if (!r) { + writeSettings(false); QDialog::done(r); return; } - NewConnection = makeConnection(true); + NewConnection = makeConnection(); if (!NewConnection) return; + writeSettings(true); + QDialog::done(r); } @@ -522,7 +523,7 @@ void toNewConnection::testConnectionButton_clicked() { - toConnection * c = makeConnection(false); + toConnection * c = makeConnection(); if (c) { QMessageBox::information(this->parentWidget(), @@ -533,7 +534,7 @@ } } -toConnection* toNewConnection::makeConnection(bool savePrefs) +toConnection* toNewConnection::makeConnection() { try { @@ -616,9 +617,6 @@ colorComboBox->itemData(colorComboBox->currentIndex()).toString(), options); - if (savePrefs) - writeSettings(true); - return retCon; } catch (const QString &exc) Modified: branches/tora-trotl/src/tonewconnection.h =================================================================== --- branches/tora-trotl/src/tonewconnection.h 2010-08-31 20:09:57 UTC (rev 3677) +++ branches/tora-trotl/src/tonewconnection.h 2010-08-31 20:31:26 UTC (rev 3678) @@ -156,7 +156,7 @@ // fills form with data from previous connection at param row void loadPrevious(const QModelIndex & current); - toConnection* makeConnection(bool savePrefs); + toConnection* makeConnection(); public slots: virtual void done(int r); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2010-09-30 08:34:03
|
Revision: 3706 http://tora.svn.sourceforge.net/tora/?rev=3706&view=rev Author: ibre5041 Date: 2010-09-30 08:33:57 +0000 (Thu, 30 Sep 2010) Log Message: ----------- display value of SYS.ANYDATA Modified Paths: -------------- branches/tora-trotl/src/tooracleconnection.cpp branches/tora-trotl/src/trotl/src/trotl_anydata.h Modified: branches/tora-trotl/src/tooracleconnection.cpp =================================================================== --- branches/tora-trotl/src/tooracleconnection.cpp 2010-09-29 15:24:31 UTC (rev 3705) +++ branches/tora-trotl/src/tooracleconnection.cpp 2010-09-30 08:33:57 UTC (rev 3706) @@ -52,6 +52,7 @@ #include <trotl.h> #include <trotl_convertor.h> +#include <trotl_anydata.h> #include "toconf.h" #include "toconfiguration.h" @@ -391,18 +392,27 @@ } break; #ifdef ORACLE_HAS_XML - case SQLT_NTY: { // NOTE: Only one SQLT_NTY is supported - SYS.XMLTYPE - ::trotl::BindParXML const *bpx = dynamic_cast<const trotl::BindParXML *>(&BP); - assert(bpx); - if((xmlnode*)bpx->_xmlvaluep[_last_buff_row] == NULL) + case SQLT_NTY: { + if( ::trotl::BindParXML const *bpx = dynamic_cast<const trotl::BindParXML *>(&BP)) { - value = toQValue(); - TLOG(4,toDecorator,__HERE__) << "Just read: NULL XML" << std::endl; - } else { - std::string s(BP.get_string(_last_buff_row)); - value = toQValue(QString(s.c_str())); - TLOG(4,toDecorator,__HERE__) << "Just read: \"" << s << "\"" << std::endl; - } + if((xmlnode*)bpx->_xmlvaluep[_last_buff_row] == NULL) + { + value = toQValue(); + TLOG(4,toDecorator,__HERE__) << "Just read: NULL XML" << std::endl; + } else { + std::string s(BP.get_string(_last_buff_row)); + value = toQValue(QString(s.c_str())); + TLOG(4,toDecorator,__HERE__) << "Just read: \"" << s << "\"" << std::endl; + } + } else if( ::trotl::BindParANYDATA const *bpa = dynamic_cast<const trotl::BindParANYDATA *>(&BP)) { + if( bpa->_oan_buffer[_last_buff_row] == NULL) + { + value = toQValue(); + } else { + std::string s(BP.get_string(_last_buff_row)); + value = toQValue(QString(s.c_str())); + } + } } break; #endif Modified: branches/tora-trotl/src/trotl/src/trotl_anydata.h =================================================================== --- branches/tora-trotl/src/trotl/src/trotl_anydata.h 2010-09-29 15:24:31 UTC (rev 3705) +++ branches/tora-trotl/src/trotl/src/trotl_anydata.h 2010-09-30 08:33:57 UTC (rev 3706) @@ -97,7 +97,7 @@ virtual void bind_hook(SqlStatement &stmt); -private: +//private: std::stringstream _stringrepres; OCIType *_anydatatdo; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2010-10-04 21:08:19
|
Revision: 3720 http://tora.svn.sourceforge.net/tora/?rev=3720&view=rev Author: ibre5041 Date: 2010-10-04 21:08:12 +0000 (Mon, 04 Oct 2010) Log Message: ----------- display value of collection Modified Paths: -------------- branches/tora-trotl/src/tooracleconnection.cpp branches/tora-trotl/src/toqvalue.h Modified: branches/tora-trotl/src/tooracleconnection.cpp =================================================================== --- branches/tora-trotl/src/tooracleconnection.cpp 2010-10-04 21:05:51 UTC (rev 3719) +++ branches/tora-trotl/src/tooracleconnection.cpp 2010-10-04 21:08:12 UTC (rev 3720) @@ -168,7 +168,7 @@ } /* virtual */ bool isLarge() const { - return false; + return true; } /* virtual */ QString summary() const { @@ -179,8 +179,22 @@ { return QString("clob"); } - ~toOracleClob() + /* virtual */ QByteArray read() const { + char buffer[4096]; + unsigned int bytes_read; + { + ::trotl::SqlOpenLob clob_open(data, OCI_LOB_READONLY); + bytes_read = data.read(&buffer[0], sizeof(buffer), 1, sizeof(buffer)); + buffer[bytes_read] = '\0'; + } + return QByteArray(buffer, bytes_read); + } + /* virtual */ void write(QByteArray const &data) + { + } + /* virtual */~toOracleClob() + { TLOG(1,toDecorator,__HERE__) << "toOracleClob DELETED:" << this << std::endl; } @@ -205,7 +219,7 @@ } /* virtual */ bool isLarge() const { - return false; + return true; } /* virtual */ QString summary() const { @@ -215,9 +229,23 @@ /* virtual */ QString dataTypeName() const { return QString("blob"); - } - ~toOracleBlob() + } + /* virtual */ QByteArray read() const { + char buffer[4096]; + unsigned int bytes_read; + { + ::trotl::SqlOpenLob blob_open(data, OCI_LOB_READONLY); + bytes_read = data.read(&buffer[0], sizeof(buffer), 1, sizeof(buffer)); + buffer[bytes_read] = '\0'; + } + return QByteArray(buffer, bytes_read); + } + /* virtual */ void write(QByteArray const &data) + { + } + /* virtual */~toOracleBlob() + { TLOG(1,toDecorator,__HERE__) << "toOracleBlob DELETED:" << this << std::endl; } @@ -229,6 +257,50 @@ }; //Q_DECLARE_METATYPE(toOracleBlob*) +class toOracleCollection: public toQValue::complexType +{ +public: + toOracleCollection(trotl::OciConnection &_conn) + : toQValue::complexType() + , data(_conn) + {}; + /* virtual */ bool isBinary() const + { + return false; + } + /* virtual */ bool isLarge() const + { + return false; + } + /* virtual */ QString summary() const + { + return QString("Datape: user type collection %1\n\%2") + .arg(data._data_type_name.c_str()) + .arg(((::trotl::tstring)data).c_str()); + } + /* virtual */ QString dataTypeName() const + { + return QString(data._data_type_name.c_str()); + } + /* virtual */ QByteArray read() const + { + } + /* virtual */ void write(QByteArray const &data) + { + } + /* virtual */ ~toOracleCollection() + { + TLOG(1,toDecorator,__HERE__) << "toOracleCollection DELETED:" << this << std::endl; + } + + mutable trotl::SqlCollection data; +protected: + toOracleCollection(toOracleCollection const&); + toOracleCollection operator=(toOracleCollection const&); + //TODO copying prohibited +}; +//Q_DECLARE_METATYPE(toOracleCollection*) + class toOracleProvider : public toConnectionProvider { ::trotl::OciEnv *_envp; @@ -343,7 +415,8 @@ } else { switch(BP.dty) { case SQLT_NUM: - case SQLT_VNU: { + case SQLT_VNU: + { OCINumber* vnu = (OCINumber*) &((char*)BP.valuep)[_last_buff_row * BP.value_sz ]; sword res; boolean isint; @@ -390,9 +463,10 @@ value = toQValue(QString((const char*)str_buf)); } } - break; -#ifdef ORACLE_HAS_XML - case SQLT_NTY: { + break; + case SQLT_NTY: + { +#ifdef ORACLE_HAS_XML if( ::trotl::BindParXML const *bpx = dynamic_cast<const trotl::BindParXML *>(&BP)) { if((xmlnode*)bpx->_xmlvaluep[_last_buff_row] == NULL) @@ -404,7 +478,10 @@ value = toQValue(QString(s.c_str())); TLOG(4,toDecorator,__HERE__) << "Just read: \"" << s << "\"" << std::endl; } - } else if( ::trotl::BindParANYDATA const *bpa = dynamic_cast<const trotl::BindParANYDATA *>(&BP)) { + } +#endif + if( ::trotl::BindParANYDATA const *bpa = dynamic_cast<const trotl::BindParANYDATA *>(&BP)) + { if( bpa->_oan_buffer[_last_buff_row] == NULL) { value = toQValue(); @@ -412,11 +489,29 @@ std::string s(BP.get_string(_last_buff_row)); value = toQValue(QString(s.c_str())); } - } + } else if( ::trotl::BindParCollectionTabNum const *bpc = dynamic_cast<const trotl::BindParCollectionTabNum *>(&BP)) + { + if( *(sb2*)(bpc->_collection_indp[_last_buff_row]) == OCI_IND_NULL) + { + value = toQValue(); + TLOG(4,toDecorator,__HERE__) << "Just read: NULL collection" << std::endl; + } else { + toOracleCollection *i = new toOracleCollection(_conn); + trotl::ConvertorForRead c(_last_buff_row); + trotl::DispatcherForRead::Go(BP, i->data, c); + QVariant v; + v.setValue((toQValue::complexType*)i); + value = toQValue::fromVariant(v); + TLOG(4,toDecorator,__HERE__) << "Just read: collection:" + << (::trotl::tstring)i->data + << std::endl; + } + } + } - break; -#endif - case SQLT_CLOB: { + break; + case SQLT_CLOB: + { toOracleClob *i = new toOracleClob(_conn); trotl::ConvertorForRead c(_last_buff_row); trotl::DispatcherForRead::Go(BP, i->data, c); @@ -426,8 +521,9 @@ //int id = qMetaTypeId<toQValue::complexType*>(); TLOG(4,toDecorator,__HERE__) << "Just read: \"CLOB\"" << std::endl; } - break; - case SQLT_BLOB: { + break; + case SQLT_BLOB: + { toOracleBlob *i = new toOracleBlob(_conn); trotl::ConvertorForRead c(_last_buff_row); trotl::DispatcherForRead::Go(BP, i->data, c); @@ -436,7 +532,7 @@ value = toQValue::fromVariant(v); TLOG(4,toDecorator,__HERE__) << "Just read: \"BLOB\"" << std::endl; } - break; + break; default: std::string s(BP.get_string(_last_buff_row)); value = toQValue(QString(s.c_str())); Modified: branches/tora-trotl/src/toqvalue.h =================================================================== --- branches/tora-trotl/src/toqvalue.h 2010-10-04 21:05:51 UTC (rev 3719) +++ branches/tora-trotl/src/toqvalue.h 2010-10-04 21:08:12 UTC (rev 3720) @@ -74,6 +74,8 @@ virtual bool isLarge() const = 0; virtual QString summary() const = 0; virtual QString dataTypeName() const = 0; + virtual QByteArray read() const = 0; + virtual void write(QByteArray const &) = 0; virtual ~complexType() {}; }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2010-10-05 12:08:05
|
Revision: 3731 http://tora.svn.sourceforge.net/tora/?rev=3731&view=rev Author: ibre5041 Date: 2010-10-05 12:07:59 +0000 (Tue, 05 Oct 2010) Log Message: ----------- Modified Paths: -------------- branches/tora-trotl/src/tomodeleditor.cpp branches/tora-trotl/src/tooracleconnection.cpp branches/tora-trotl/src/toqvalue.h branches/tora-trotl/src/toresultmodel.cpp branches/tora-trotl/src/trotl/src/trotl_exc.cpp Modified: branches/tora-trotl/src/tomodeleditor.cpp =================================================================== --- branches/tora-trotl/src/tomodeleditor.cpp 2010-10-05 11:36:30 UTC (rev 3730) +++ branches/tora-trotl/src/tomodeleditor.cpp 2010-10-05 12:07:59 UTC (rev 3731) @@ -353,7 +353,7 @@ if(data.type() == QVariant::UserType) { toQValue::complexType *i = data.value<toQValue::complexType*>(); - setText(i->summary()); + setText(i->editData()); return; } Modified: branches/tora-trotl/src/tooracleconnection.cpp =================================================================== --- branches/tora-trotl/src/tooracleconnection.cpp 2010-10-05 11:36:30 UTC (rev 3730) +++ branches/tora-trotl/src/tooracleconnection.cpp 2010-10-05 12:07:59 UTC (rev 3731) @@ -78,6 +78,8 @@ #include <QString> #include <QTextStream> +static int toMaxLong = toConfigurationSingle::Instance().maxLong(); + static toSQL SQLComment("toOracleConnection:Comments", "SELECT Column_name,Comments FROM sys.All_Col_Comments\n" " WHERE Owner = :f1<char[100]>\n" @@ -159,8 +161,9 @@ { public: toOracleClob(trotl::OciConnection &_conn) - : toQValue::complexType(), - data(_conn) + : toQValue::complexType() + , data(_conn) + , _length(0) {}; /* virtual */ bool isBinary() const { @@ -170,14 +173,42 @@ { return true; } - /* virtual */ QString summary() const + + /* virtual */ QString displayData() const { + if(getLength() < toMaxLong) + { + ::trotl::SqlOpenLob clob_open(data, OCI_LOB_READONLY); + char buffer[toMaxLong]; + unsigned int bytes_read; + bytes_read = data.read(&buffer[0], sizeof(buffer), 1, sizeof(buffer)); + buffer[bytes_read] = '\0'; + return QString(buffer); + } + else + return QString("clob"); + } + + /* virtual */ QString editData() const + { + return QString("edit data Datape: Oracle [N]CLOB\n" + "Size: %1B\n").arg(getLength()); + } + + /* virtual */ QString userData() const + { return QString("Datape: Oracle [N]CLOB\n" - "Size: %1B\n").arg(data.get_length()); + "Size: %1B\n").arg(getLength()); } + + /* virtual */ QString tooltipData() const + { + return QString("Datape: Oracle [N]CLOB\n" "Size: %1B\n").arg(getLength()); + } + /* virtual */ QString dataTypeName() const { - return QString("clob"); + return QString("CLOB"); } /* virtual */ QByteArray read() const { @@ -200,6 +231,14 @@ mutable trotl::SqlClob data; protected: + ub4 getLength() const + { + if(!_length) + _length = data.get_length(); + return _length; + }; + + mutable ub4 _length; // NOTE: OCILobGetLength makes one roundtrip to the server toOracleClob(toOracleClob const&); toOracleClob operator=(toOracleClob const&); //TODO copying prohibited @@ -221,11 +260,31 @@ { return true; } - /* virtual */ QString summary() const + + /* virtual */ QString displayData() const { return QString("Datape: Oracle BLOB\n" "Size: %1B\n").arg(data.get_length()); } + + /* virtual */ QString editData() const + { + return QString("Datape: Oracle BLOB\n" + "Size: %1B\n").arg(data.get_length()); + } + + /* virtual */ QString userData() const + { + return QString("Datape: Oracle BLOB\n" + "Size: %1B\n").arg(data.get_length()); + } + + /* virtual */ QString tooltipData() const + { + return QString("Datape: Oracle BLOB\n" + "Size: %1B\n").arg(data.get_length()); + } + /* virtual */ QString dataTypeName() const { return QString("blob"); @@ -272,12 +331,28 @@ { return false; } - /* virtual */ QString summary() const + + + /* virtual */ QString displayData() const { - return QString("Datape: user type collection %1\n\%2") - .arg(data._data_type_name.c_str()) - .arg(((::trotl::tstring)data).c_str()); + return QString("collection"); } + + /* virtual */ QString editData() const + { + return QString("collection"); + } + + /* virtual */ QString userData() const + { + return QString("collection"); + } + + /* virtual */ QString tooltipData() const + { + return QString("collection"); + } + /* virtual */ QString dataTypeName() const { return QString(data._data_type_name.c_str()); @@ -1018,7 +1093,7 @@ virtual void initialize(void) { - //toMaxLong = toConfigurationSingle::Instance().maxLong(); + toMaxLong = toConfigurationSingle::Instance().maxLong(); ::trotl::g_OCIPL_MAX_LONG = ( toConfigurationSingle::Instance().maxLong() == -1 ? ::trotl::g_OCIPL_MAX_LONG : toConfigurationSingle::Instance().maxLong() ); ::trotl::OciEnvAlloc *_envallocp = new ::trotl::OciEnvAlloc; @@ -1585,13 +1660,13 @@ */ if (Unlimited->isChecked()) { - //toMaxLong = -1; toConfigurationSingle::Instance().setMaxLong(-1); + toMaxLong = 30000; } else { toConfigurationSingle::Instance().setMaxLong(MaxLong->text().toInt()); - //toMaxLong = MaxLong->text().toInt(); + toMaxLong = MaxLong->text().toInt(); } } Modified: branches/tora-trotl/src/toqvalue.h =================================================================== --- branches/tora-trotl/src/toqvalue.h 2010-10-05 11:36:30 UTC (rev 3730) +++ branches/tora-trotl/src/toqvalue.h 2010-10-05 12:07:59 UTC (rev 3731) @@ -72,8 +72,14 @@ public: virtual bool isBinary() const = 0; virtual bool isLarge() const = 0; - virtual QString summary() const = 0; + + virtual QString displayData() const = 0; + virtual QString editData() const = 0; + virtual QString userData() const = 0; + virtual QString tooltipData() const = 0; + virtual QString dataTypeName() const = 0; + virtual QByteArray read() const = 0; virtual void write(QByteArray const &) = 0; virtual ~complexType() {}; Modified: branches/tora-trotl/src/toresultmodel.cpp =================================================================== --- branches/tora-trotl/src/toresultmodel.cpp 2010-10-05 11:36:30 UTC (rev 3730) +++ branches/tora-trotl/src/toresultmodel.cpp 2010-10-05 12:07:59 UTC (rev 3731) @@ -498,15 +498,23 @@ switch(role) { + case Qt::ToolTipRole: case Qt::EditRole: - case Qt::ToolTipRole: + if (data.isNull()) + return toNull(data).toQVariant(); + if (data.isUserType()) + { + toQValue::complexType *i = data.toQVariant().value<toQValue::complexType*>(); + return QVariant(i->editData()); + } + return data.toQVariant(); case Qt::DisplayRole: if (data.isNull()) return toNull(data).toQVariant(); if (data.isUserType()) { toQValue::complexType *i = data.toQVariant().value<toQValue::complexType*>(); - return QVariant(QString("{%1}").arg(i->dataTypeName())); + return QVariant(i->displayData()); } return data.toQVariant(); case Qt::BackgroundRole: Modified: branches/tora-trotl/src/trotl/src/trotl_exc.cpp =================================================================== --- branches/tora-trotl/src/trotl/src/trotl_exc.cpp 2010-10-05 11:36:30 UTC (rev 3730) +++ branches/tora-trotl/src/trotl/src/trotl_exc.cpp 2010-10-05 12:07:59 UTC (rev 3731) @@ -115,8 +115,7 @@ _parse_offset = 0; } -//OciException::OciException(tstring where, OCIError* errh, SqlStatement& stmt) - OciException::OciException(tstring where, SqlStatement& stmt) : +OciException::OciException(tstring where, SqlStatement& stmt) : _where(where), _mess(where) { #ifdef DEBUG @@ -171,7 +170,7 @@ const char* sql = _last_sql.c_str(); size_t l = strlen(buffer); - int line = 1; + unsigned line = 1; const char* s = sql; const char* e = sql + _parse_offset; const char* lp = sql; @@ -191,7 +190,7 @@ //#ifdef __STDC_WANT_SECURE_LIB__ // char* b = buffer+l + snprintf_s(buffer+l, sizeof(buffer)-l, _TRUNCATE, "\nerror at SQL position %d [%d.%d]:\n", _parse_offset, line, column); //#else - char* b = buffer+l + snprintf(buffer+l, sizeof(buffer)-l-1, "\nerror at SQL position %d [%d.%d]:\n", _parse_offset, line, column); + char* b = buffer+l + snprintf(buffer+l, sizeof(buffer)-l-1, "\nerror at SQL position %u [%u.%zu]:\n", (unsigned)_parse_offset, line, column); //#endif char* p = b; s = lp; @@ -226,26 +225,27 @@ } OciException::OciException(tstring where, const char* msg) : - _where(where), _mess(where), _parse_offset(0), _last_sql("") + _where(where), _mess(where), _last_sql(""), _parse_offset(0) { #ifdef DEBUG dbg::stack s; std::copy(s.begin(), s.end(), std::ostream_iterator<dbg::stack_frame>(_stack, "\n")); - _mess += "\n" + _stack.str() + msg; -#endif + _mess += "\n" + _stack.str(); +#endif + _mess += msg; } -OciException::OciException(const OciException& other): - _sql_error_code(other._sql_error_code), - _where(other._where), - _mess(other._mess), - _stack(), - _last_sql(other._last_sql), - _parse_offset(other._parse_offset) - { - //throw std::logic_error("OciException should not be copied"); - //std::cerr << __TROTL_HERE__ << "OciException should not be copied" << std::endl; - } +OciException::OciException(const OciException& other) + : _sql_error_code(other._sql_error_code) + , _where() //_where(other._where) + , _stack() + , _mess(other._mess) + , _last_sql(other._last_sql) + , _parse_offset() // _parse_offset(other._parse_offset) +{ + //throw std::logic_error("OciException should not be copied"); + //std::cerr << __TROTL_HERE__ << "OciException should not be copied" << std::endl; +} OciException& OciException::arg(int d) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2010-10-05 12:15:46
|
Revision: 3732 http://tora.svn.sourceforge.net/tora/?rev=3732&view=rev Author: ibre5041 Date: 2010-10-05 12:15:40 +0000 (Tue, 05 Oct 2010) Log Message: ----------- windows compile fix deleteObject is WIN32 API function Modified Paths: -------------- branches/tora-trotl/src/toanalyze.cpp branches/tora-trotl/src/utils.h Modified: branches/tora-trotl/src/toanalyze.cpp =================================================================== --- branches/tora-trotl/src/toanalyze.cpp 2010-10-05 12:07:59 UTC (rev 3731) +++ branches/tora-trotl/src/toanalyze.cpp 2010-10-05 12:15:40 UTC (rev 3732) @@ -715,7 +715,7 @@ { try { - for_each(Running.begin(), Running.end(), DeleteObject()); + for_each(Running.begin(), Running.end(), deleteObject()); Running.clear(); Pending.clear(); Stop->setEnabled(false); Modified: branches/tora-trotl/src/utils.h =================================================================== --- branches/tora-trotl/src/utils.h 2010-10-05 12:07:59 UTC (rev 3731) +++ branches/tora-trotl/src/utils.h 2010-10-05 12:15:40 UTC (rev 3732) @@ -467,7 +467,7 @@ /** * functor for cleanup containers of pointers */ -struct DeleteObject +struct deleteObject { template <typename T> void operator()(const T* ptr) const This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2010-10-07 10:04:42
|
Revision: 3754 http://tora.svn.sourceforge.net/tora/?rev=3754&view=rev Author: ibre5041 Date: 2010-10-07 10:04:34 +0000 (Thu, 07 Oct 2010) Log Message: ----------- sync with tora trunk Modified Paths: -------------- branches/tora-trotl/src/tooracleconnection.cpp branches/tora-trotl/src/tooracleconnection_trotl.cpp Added Paths: ----------- branches/tora-trotl/src/tosimplequery.cpp branches/tora-trotl/src/tosimplequery.h Modified: branches/tora-trotl/src/tooracleconnection.cpp =================================================================== --- branches/tora-trotl/src/tooracleconnection.cpp 2010-10-07 09:41:59 UTC (rev 3753) +++ branches/tora-trotl/src/tooracleconnection.cpp 2010-10-07 10:04:34 UTC (rev 3754) @@ -57,6 +57,7 @@ #include <trotl_convertor.h> #include <trotl_anydata.h> +#include "utils.h" #include "toconf.h" #include "toconfiguration.h" #include "toconnection.h" @@ -78,8 +79,10 @@ #include <qspinbox.h> #include <qvalidator.h> +#include <QFileInfo> #include <QString> #include <QTextStream> +#include <QVector> #define MAXTOMAXLONG 30000 #define MAXLOBSHOWN 256 @@ -1238,40 +1241,23 @@ const QString &, const QString &) { - QString str; + QVector<QString> tnsnames; #ifdef Q_OS_WIN32 - CRegistry registry; - DWORD siz = 1024; - char buffer[1024]; - try { - if (registry.GetStringValue(HKEY_LOCAL_MACHINE, - "SOFTWARE\\ORACLE\\HOME0", - "TNS_ADMIN", - buffer, siz)) - { - if (siz > 0) - str = buffer; - else - throw 0; - } - else - throw 0; - } - catch (...) - { + QString str; + + CRegistry registry; + DWORD siz = 1024; + char buffer[1024]; try { if (registry.GetStringValue(HKEY_LOCAL_MACHINE, "SOFTWARE\\ORACLE\\HOME0", - "ORACLE_HOME", + "TNS_ADMIN", buffer, siz)) { if (siz > 0) - { str = buffer; - str += "\\network\\admin"; - } else throw 0; } @@ -1280,82 +1266,135 @@ } catch (...) { - if (GetEnvironmentVariableA("TNS_ADMIN", buffer, siz) > 0) - str = buffer; + try + { + if (registry.GetStringValue(HKEY_LOCAL_MACHINE, + "SOFTWARE\\ORACLE\\HOME0", + "ORACLE_HOME", + buffer, siz)) + { + if (siz > 0) + { + str = buffer; + str += "\\network\\admin"; + } + else + throw 0; + } + else + throw 0; + } + catch (...) + { + if (GetEnvironmentVariableA("TNS_ADMIN", buffer, siz) > 0) + str = buffer; + } } + str.append(QString::fromLatin1("/tnsnames.ora")); + tnsnames.push_back(str); } - str.append(QString::fromLatin1("/tnsnames.ora")); #else - if (getenv("TNS_ADMIN")) { - str = getenv("TNS_ADMIN"); - } - else - { - str = getenv("ORACLE_HOME"); - str.append(QString::fromLatin1("/network/admin")); - } + QString str; - str.append(QString::fromLatin1("/tnsnames.ora")); + str = toExpandFile("$HOME/.tnsnames.ora"); + QFileInfo home(str); + if(home.exists() && home.isFile() && home.isReadable()) + tnsnames.push_back(str); - - str = QString("/home/ibrezina/.tnsnames.ora"); + str = "/etc/tnsnames.ora"; + QFileInfo etc(str); + if(etc.exists() && etc.isFile() && etc.isReadable()) + tnsnames.push_back(str); + + if (getenv("TNS_ADMIN")) + { + str = getenv("TNS_ADMIN"); + } + else + { + str = getenv("ORACLE_HOME"); + str.append(QString::fromLatin1("/network/admin")); + } + str.append(QString::fromLatin1("/tnsnames.ora")); + QFileInfo ohome_net_adm(str); + if(ohome_net_adm.exists() && ohome_net_adm.isFile() && ohome_net_adm.isReadable()) + tnsnames.push_back(str); + } #endif std::list<QString> ret; - QFile file(str); - if (!file.open(QIODevice::ReadOnly)) - return ret; - - QTextStream in(&file); - QByteArray barray = in.readAll().toUtf8(); - const char *buf = barray.constData(); - - int begname = -1; - int parambeg = -1; - int pos = 0; - int param = 0; - while (pos < barray.size()) + foreach(QString str, tnsnames) { - if (buf[pos] == '#') - { - while (pos < barray.size() && buf[pos] != '\n') - pos++; + QFile file(str); + int begname = -1; + int parambeg = -1; + int pos = 0; + int param = 0; + QByteArray barray; + const char *buf; + + try { + barray = toReadFileB(str); + buf = barray.constData(); + TLOG(0,toDecorator,__HERE__) + << "--------------------------------------------------------------------------------" << std::endl + << "File read: " << str << std::endl; + } catch( QString const &e ) { + TOMessageBox::warning( + toMainWidget(), + QT_TRANSLATE_NOOP("toReadFileB", "File error"), + QT_TRANSLATE_NOOP("toReadFileB", QString("Couldn't open %1 for readonly") + .arg(str).toAscii().constData())); + goto next; } - else if (buf[pos] == '=') + + while (pos < barray.size()) { - if (param == 0) + if (buf[pos] == '#') { - if (begname >= 0 && !host.isEmpty()) - ret.insert(ret.end(), QString::fromLatin1(buf + begname, pos - begname)); + while (pos < barray.size() && buf[pos] != '\n') + pos++; } - } - else if (buf[pos] == '(') - { - begname = -1; - parambeg = pos + 1; - param++; - } - else if (buf[pos] == ')') - { - if (parambeg >= 0 && host.isEmpty()) + else if (buf[pos] == '=') { - QString tmp = QString::fromLatin1(buf + parambeg, pos - parambeg); - tmp.replace(QRegExp(QString::fromLatin1("\\s+")), QString::null); - if (tmp.toLower().startsWith(QString::fromLatin1("sid="))) - ret.insert(ret.end(), tmp.mid(4)); + if (param == 0) + { + if (begname >= 0 && !host.isEmpty()) + ret.insert(ret.end(), QString::fromLatin1(buf + begname, pos - begname)); + } } - begname = -1; - parambeg = -1; - param--; + else if (buf[pos] == '(') + { + begname = -1; + parambeg = pos + 1; + param++; + } + else if (buf[pos] == ')') + { + if (parambeg >= 0 && host.isEmpty()) + { + QString tmp = QString::fromLatin1(buf + parambeg, pos - parambeg); + tmp.replace(QRegExp(QString::fromLatin1("\\s+")), QString::null); + if (tmp.toLower().startsWith(QString::fromLatin1("sid="))) + ret.insert(ret.end(), tmp.mid(4)); + } + begname = -1; + parambeg = -1; + param--; + } + else if (!isspace(buf[pos]) && begname < 0) + { + begname = pos; + } + pos++; } - else if (!isspace(buf[pos]) && begname < 0) - { - begname = pos; - } - pos++; - } + next: + ;; + } // foreach(QString str, tnsnames) + + ret.sort(); return ret; } Modified: branches/tora-trotl/src/tooracleconnection_trotl.cpp =================================================================== --- branches/tora-trotl/src/tooracleconnection_trotl.cpp 2010-10-07 09:41:59 UTC (rev 3753) +++ branches/tora-trotl/src/tooracleconnection_trotl.cpp 2010-10-07 10:04:34 UTC (rev 3754) @@ -48,6 +48,9 @@ #ifdef Q_OS_WIN32 # include "windows/cregistry.h" #include <Windows.h> +#define MIN min +#else +#define MIN std::min #endif #include <trotl.h> @@ -204,17 +207,17 @@ QString retval = QString("Datatyp pe: Oracle [N]CLOB\nSize: %1B\n").arg(getLength()); char buffer[MAXTOMAXLONG]; ub4 chunk_size = data.get_chunk_size(); - unsigned bytes_read, offset = 0; + unsigned offset = 0; while(offset < MAXTOMAXLONG) { - unsigned to_read = ::std::min(MAXTOMAXLONG - offset, chunk_size); + unsigned to_read = MIN(MAXTOMAXLONG - offset, chunk_size); unsigned bytes_read = data.read(&buffer[offset], MAXTOMAXLONG - offset, offset+1, to_read); offset += bytes_read; if(bytes_read == 0) // end of LOB reached break; } - buffer[::std::min(offset,(unsigned)MAXTOMAXLONG)] = '\0'; + buffer[MIN(offset,(unsigned)MAXTOMAXLONG)] = '\0'; if(offset == MAXTOMAXLONG) return QString(buffer) + "\n...<TRUNCATED>"; @@ -321,11 +324,11 @@ QString retval = QString("Datatyp pe: Oracle BLOB\nSize: %1B\n").arg(getLength()); unsigned char buffer[MAXTOMAXLONG]; ub4 chunk_size = data.get_chunk_size(); - unsigned bytes_read, offset = 0; + unsigned offset = 0; while(offset < MAXTOMAXLONG) { - unsigned to_read = ::std::min(MAXTOMAXLONG - offset, chunk_size); + unsigned to_read = MIN(MAXTOMAXLONG - offset, chunk_size); unsigned bytes_read = data.read(&buffer[offset], MAXTOMAXLONG - offset, offset+1, to_read); if(bytes_read == 0) // end of LOB reached @@ -721,7 +724,6 @@ if(_out_pos == _column_count && BP._bind_type == BP.DEFINE_SELECT) ++_last_buff_row; -<<<<<<< .working if(_out_pos == _out_cnt && get_stmt_type() != STMT_SELECT ) _state |= EOF_DATA; @@ -743,13 +745,6 @@ { if (!Query) return; -======= - toStatusMessage(QObject::tr("Data exists past configured maximum LOB length (Preferences)", - "toOracleConnection")); - } - buffer[data.len()] = 0; - Running = false; ->>>>>>> .merge-right.r3675 Query->close(); delete Query; Added: branches/tora-trotl/src/tosimplequery.cpp =================================================================== --- branches/tora-trotl/src/tosimplequery.cpp (rev 0) +++ branches/tora-trotl/src/tosimplequery.cpp 2010-10-07 10:04:34 UTC (rev 3754) @@ -0,0 +1,110 @@ +#include <list> + +#include <qtoolbar.h> +#include <qlabel.h> +#include <qtoolbutton.h> +#include <qlineedit.h> + +#include "totool.h" +#include "toawr.h" +#include "toresultview.h" +#include "toparamget.h" +#include "tochangeconnection.h" + +//#include "tosimplequery.moc" + +static const char * execute_xpm[] = { + "16 16 3 1", + " c None", + ". c #000000", + "+ c #0FFE14", + " ", + " ", + " ", + " . ", + " .. ", + " .+. ", + " .++. ", + " .+++. ", + " .+++. ", + " .++. ", + " .+. ", + " .. ", + " . ", + " ", + " ", + " "}; + +static const char * tosimplequery_xpm[] = { + "16 16 3 1", + " c None", + ". c #000000", + "+ c #FFFFFF", + " ...... ", + " ..++++. ", + " .+.++++. ", + " .++.++++. ", + " .....++++. ", + " .++++++++. ", + " .++++++++. ", + " .++++++++. ", + " .++++++++. ", + " .++++++++. ", + " .++++++++. ", + " .++++++++. ", + " .++++++++. ", + " .++++++++. ", + " .++++++++. ", + " .......... "}; + +class toAWRTool : public toTool { +protected: + virtual const char **pictureXPM(void); +public: + toAWRTool() + : toTool(10003,"AWR") + { } + virtual const char *menuItem() + { return "Simple Query"; } + virtual QWidget *toolWindow(QWidget *parent,toConnection &connection) + { + return new toAWR(/*this,*/ parent, connection); + } + virtual void closeWindow(toConnection &connection){}; +}; + +const char **toAWRTool::pictureXPM(void) { return tosimplequery_xpm; }; + + +static toAWRTool AWRTool; + +toAWR::toAWR(/*toTool *tool,*/ QWidget *parent, toConnection &connection) + : toToolWidget(/* *tool*/AWRTool, "simplequery.html", parent, connection, "toAWR") +{ + QToolBar *toolbar=toAllocBar(this, tr("Simple Query")); + layout()->addWidget(toolbar); + + QAction *executeAct = new QAction(QPixmap(execute_xpm), tr("Execute_ current statement"), this); + executeAct->setShortcut(QKeySequence::Refresh); + connect(executeAct, SIGNAL(triggered()), this, SLOT(refresh(void))); + + new toChangeConnection(toolbar); + + Statement=new QLineEdit(this); + layout()->addWidget(Statement); + Result=new toResultView(this); + layout()->addWidget(Result); + connect(Statement, SIGNAL(returnPressed()), this, SLOT(execute())); +} + +void toAWR::execute(void) +{ + try { + QString sql=Statement->text(); + //toQList params=toParamGet::getParam(this,sql); + //Result->query(sql,params); + Result->query(sql,toQList()); + } TOCATCH +} + +toAWR::~toAWR() {}; Added: branches/tora-trotl/src/tosimplequery.h =================================================================== --- branches/tora-trotl/src/tosimplequery.h (rev 0) +++ branches/tora-trotl/src/tosimplequery.h 2010-10-07 10:04:34 UTC (rev 3754) @@ -0,0 +1,25 @@ +#ifndef TOAWR_H +#define TOAWR_H + +#include "totool.h" + +class toResultView; +class QLineEdit; +class toConnection; + +class toAWR : public toToolWidget { + Q_OBJECT; + + toResultView *Result; + QLineEdit *Statement; + QAction *updateAct; +public: + toAWR(/*toTool *tool,*/ QWidget *parent,toConnection &connection); + virtual ~toAWR(); + +private slots: + void execute(void); +}; + +#endif + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2010-10-07 13:34:39
|
Revision: 3756 http://tora.svn.sourceforge.net/tora/?rev=3756&view=rev Author: ibre5041 Date: 2010-10-07 13:34:33 +0000 (Thu, 07 Oct 2010) Log Message: ----------- more verbose error handling, plus we must catch all exceptions in signal handlers Modified Paths: -------------- branches/tora-trotl/src/toresulttableviewedit.cpp branches/tora-trotl/src/toresulttableviewedit.h Modified: branches/tora-trotl/src/toresulttableviewedit.cpp =================================================================== --- branches/tora-trotl/src/toresulttableviewedit.cpp 2010-10-07 13:15:07 UTC (rev 3755) +++ branches/tora-trotl/src/toresulttableviewedit.cpp 2010-10-07 13:34:33 UTC (rev 3756) @@ -49,6 +49,7 @@ #include "toconnection.h" #include "tomemoeditor.h" #include "tomain.h" +#include "tologger.h" #include <QClipboard> #include <QScrollBar> @@ -195,7 +196,7 @@ } -void toResultTableViewEdit::commitDelete(ChangeSet &change, toConnection &conn) +unsigned toResultTableViewEdit::commitDelete(ChangeSet &change, toConnection &conn) { const toResultModel::HeaderList Headers = Model->headers(); bool oracle = toIsOracle(conn); @@ -233,7 +234,7 @@ if (!where) { toStatusMessage(tr("This table contains only LOB/LONG columns and can not be edited")); - return; + return 0; } toQList args; @@ -246,16 +247,31 @@ } } - conn.execute(sql, args); + try { + toQuery q(conn, sql, args); - if (toConfigurationSingle::Instance().autoCommit()) - conn.commit(); - else - toMainWidget()->setNeedCommit(conn); + if (toConfigurationSingle::Instance().autoCommit()) + conn.commit(); + else + toMainWidget()->setNeedCommit(conn); + return q.rowsProcessed(); + } catch(const toConnection::exception &str) { + toStatusMessage(str); + } + catch(const QString &str) { + toStatusMessage(str); + } + catch(std::exception const &e) { + toStatusMessage(e.what()); + } + catch(...) { + TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; + } + return 0; } -void toResultTableViewEdit::commitAdd(ChangeSet &change, toConnection &conn) +unsigned toResultTableViewEdit::commitAdd(ChangeSet &change, toConnection &conn) { const toResultModel::HeaderList Headers = Model->headers(); @@ -305,16 +321,31 @@ for (int i = 1; i < change.row.size(); i++) toPush(args, change.row[i]); - toQuery q(conn, sql, args); - - if (toConfigurationSingle::Instance().autoCommit()) - conn.commit(); - else - toMainWidget()->setNeedCommit(conn); + try { + toQuery q(conn, sql, args); + + if (toConfigurationSingle::Instance().autoCommit()) + conn.commit(); + else + toMainWidget()->setNeedCommit(conn); + return q.rowsProcessed(); + } catch(const toConnection::exception &str) { + toStatusMessage(str); + } + catch(const QString &str) { + toStatusMessage(str); + } + catch(std::exception const &e) { + toStatusMessage(e.what()); + } + catch(...) { + TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; + } + return 0; } -void toResultTableViewEdit::commitUpdate(ChangeSet &change, toConnection &conn) +unsigned toResultTableViewEdit::commitUpdate(ChangeSet &change, toConnection &conn) { const toResultModel::HeaderList Headers = Model->headers(); bool oracle = toIsOracle(conn); @@ -384,6 +415,11 @@ sql += ("<char[4000],in>)"); } } + else if ((*j).isUserType()) + { + toStatusMessage(tr("This table contains complex/user defined columns and can not be edited")); + return 0; + } else { sql += " = :c"; @@ -400,7 +436,7 @@ { toStatusMessage(tr("This table contains only LOB/LONG " "columns and can not be edited")); - return; + return 0; } toQList args; @@ -428,11 +464,26 @@ } } - toQuery q(conn, sql, args); - if (toConfigurationSingle::Instance().autoCommit()) - conn.commit(); - else - toMainWidget()->setNeedCommit(conn); + try { + toQuery q(conn, sql, args); + if (toConfigurationSingle::Instance().autoCommit()) + conn.commit(); + else + toMainWidget()->setNeedCommit(conn); + return q.rowsProcessed(); + } catch(const toConnection::exception &str) { + toStatusMessage(str); + } + catch(const QString &str) { + toStatusMessage(str); + } + catch(std::exception const &e) { + toStatusMessage(e.what()); + } + catch(...) { + TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; + } + return 0; } @@ -455,6 +506,7 @@ this); bool error = false; + unsigned updated=0, added=0, deleted=0; for (int changeIndex = 0; changeIndex < Changes.size(); changeIndex++) { progress.setValue(changeIndex); @@ -469,13 +521,13 @@ switch (change.kind) { case Delete: - commitDelete(change, conn); + deleted += commitDelete(change, conn); break; case Add: - commitAdd(change, conn); + added += commitAdd(change, conn); break; case Update: - commitUpdate(change, conn); + updated += commitUpdate(change, conn); break; default: toStatusMessage(tr("Internal error.")); @@ -489,8 +541,12 @@ } } - toStatusMessage(tr("Saved %1 changes").arg(Changes.size(), 0, 10), false, false); - + toStatusMessage(tr("Saved %1 changes(updated %2, added %3, deleted %4)") + .arg(Changes.size(), 0, 10) + .arg(updated, 0, 10) + .arg(added, 0, 10) + .arg(deleted, 0, 10) + , false, false); if (error) refresh(); else Modified: branches/tora-trotl/src/toresulttableviewedit.h =================================================================== --- branches/tora-trotl/src/toresulttableviewedit.h 2010-10-07 13:15:07 UTC (rev 3755) +++ branches/tora-trotl/src/toresulttableviewedit.h 2010-10-07 13:34:33 UTC (rev 3756) @@ -88,9 +88,9 @@ //QString Owner; // defined in parent - toResultTableView //QString Table; // defined in parent - toResultTableView - void commitDelete(ChangeSet &change, toConnection &conn); - void commitAdd(ChangeSet &change, toConnection &conn); - void commitUpdate(ChangeSet &change, toConnection &conn); + unsigned commitDelete(ChangeSet &change, toConnection &conn); + unsigned commitAdd(ChangeSet &change, toConnection &conn); + unsigned commitUpdate(ChangeSet &change, toConnection &conn); public: /** This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2010-11-03 12:14:53
|
Revision: 3798 http://tora.svn.sourceforge.net/tora/?rev=3798&view=rev Author: ibre5041 Date: 2010-11-03 12:14:46 +0000 (Wed, 03 Nov 2010) Log Message: ----------- fix for bug reported by A.Piesk - date format is ignored Modified Paths: -------------- branches/tora-trotl/src/tooracleconnection.cpp branches/tora-trotl/src/trotl/src/trotl_anydata.cpp branches/tora-trotl/src/trotl/src/trotl_date.cpp branches/tora-trotl/src/trotl/src/trotl_stat.cpp branches/tora-trotl/src/trotl/src/trotl_var.h Modified: branches/tora-trotl/src/tooracleconnection.cpp =================================================================== --- branches/tora-trotl/src/tooracleconnection.cpp 2010-11-02 20:33:32 UTC (rev 3797) +++ branches/tora-trotl/src/tooracleconnection.cpp 2010-11-03 12:14:46 UTC (rev 3798) @@ -451,7 +451,7 @@ } /* virtual */ QByteArray read(unsigned offset) const { - return QByteArray(); + return QByteArray(); } /* virtual */ void write(QByteArray const &data) { @@ -472,6 +472,7 @@ class toOracleProvider : public toConnectionProvider { ::trotl::OciEnv *_envp; + QByteArray dateFormat; public: class oracleSub : public toConnectionSub { @@ -1211,12 +1212,12 @@ { toMaxLong = toConfigurationSingle::Instance().maxLong(); ::trotl::g_OCIPL_MAX_LONG = ( toConfigurationSingle::Instance().maxLong() == -1 ? ::trotl::g_OCIPL_MAX_LONG : toConfigurationSingle::Instance().maxLong() ); + dateFormat = toConfigurationSingle::Instance().dateFormat().toAscii(); + ::trotl::g_TROTL_DEFAULT_DATE_FTM = const_cast<char*>(dateFormat.constData()); ::trotl::OciEnvAlloc *_envallocp = new ::trotl::OciEnvAlloc; _envp = new ::trotl::OciEnv(*_envallocp); - //TLOG(0,toDecorator,__HERE__) << "TODO: initialize" << std::endl << __HERE__ << std::endl; - addProvider("Oracle"); } @@ -1502,7 +1503,24 @@ << exc.get_sql() << std::endl << "--------------------------------------------------------------------------------" << std::endl; - conn->_conn->reset(); + try { + conn->_conn->reset(); + } catch(const ::trotl::OciException &e2) { + TLOG(0,toDecorator,__HERE__) + << "Exception in exception What:\n" << e2.what() << std::endl + << e2.get_sql() << std::endl + << "--------------------------------------------------------------------------------" + << std::endl; + } + try { + conn->_conn->reset(); + } catch(const ::trotl::OciException &e2) { + TLOG(0,toDecorator,__HERE__) + << "Exception in exception What:\n" << e2.what() << std::endl + << e2.get_sql() << std::endl + << "--------------------------------------------------------------------------------" + << std::endl; + } delete Query; Query = NULL; @@ -1524,7 +1542,7 @@ throw QString::fromLatin1("Internal error, not oracle sub connection"); conn->_conn->cancel(); -// conn->_conn->reset(); + conn->_conn->reset(); Cancel = true; Running = false; TLOG(0,toDecorator,__HERE__) << ":oracleQuery::cancel(conn=" << conn->_conn << ", this=" << Query << ")" << std::endl; Modified: branches/tora-trotl/src/trotl/src/trotl_anydata.cpp =================================================================== --- branches/tora-trotl/src/trotl/src/trotl_anydata.cpp 2010-11-02 20:33:32 UTC (rev 3797) +++ branches/tora-trotl/src/trotl/src/trotl_anydata.cpp 2010-11-03 12:14:46 UTC (rev 3798) @@ -164,13 +164,13 @@ // OCIDateGetDate( (CONST OCIDate *) date_ptr, &year1, &month1, &day1 ); - const char fmt[] = "YYYY:MM:DD HH24:MI:SS"; + //const char fmt[] = "YYYY:MM:DD HH24:MI:SS"; const char lang_fmt[] = "American"; res1 = OCICALL(OCIDateToText(_stmt._errh, date_ptr, - (CONST text*) fmt, - (ub4) sizeof(fmt)-1, + (CONST text*) g_TROTL_DEFAULT_DATE_FTM, + strlen(g_TROTL_DEFAULT_DATE_FTM), (CONST text*) lang_fmt, (ub4) sizeof(lang_fmt)-1, (ub4 *)&str_len, Modified: branches/tora-trotl/src/trotl/src/trotl_date.cpp =================================================================== --- branches/tora-trotl/src/trotl/src/trotl_date.cpp 2010-11-02 20:33:32 UTC (rev 3797) +++ branches/tora-trotl/src/trotl/src/trotl_date.cpp 2010-11-03 12:14:46 UTC (rev 3798) @@ -66,18 +66,18 @@ text str_buf[200]; ub4 str_len = sizeof(str_buf) / sizeof( *str_buf); - const char fmt[] = "YYYY:MM:DD HH24:MI:SS"; + //const char fmt[] = "YYYY:MM:DD HH24:MI:SS"; const char lang_fmt[] = "American"; sword res = OCICALL(OCIDateToText(_env._errh, - &(((OCIDate*)valuep)[row]), - (CONST text*) fmt, - (ub4) sizeof(fmt)-1, - (CONST text*) lang_fmt, - (ub4) sizeof(lang_fmt)-1, - (ub4 *)&str_len, - str_buf - )); + &(((OCIDate*)valuep)[row]), + (CONST text*) g_TROTL_DEFAULT_DATE_FTM, + strlen(g_TROTL_DEFAULT_DATE_FTM), + (CONST text*) lang_fmt, + (ub4) sizeof(lang_fmt)-1, + (ub4 *)&str_len, + str_buf + )); oci_check_error(__TROTL_HERE__, _env._errh, res); str_buf[ min( (str_len+1) , (unsigned)sizeof(str_buf) ) ] = '\0'; Modified: branches/tora-trotl/src/trotl/src/trotl_stat.cpp =================================================================== --- branches/tora-trotl/src/trotl/src/trotl_stat.cpp 2010-11-02 20:33:32 UTC (rev 3797) +++ branches/tora-trotl/src/trotl/src/trotl_stat.cpp 2010-11-03 12:14:46 UTC (rev 3798) @@ -50,9 +50,9 @@ int TROTL_EXPORT g_OCIPL_BULK_ROWS = 3; int TROTL_EXPORT g_OCIPL_MAX_LONG = 30000; -char TROTL_EXPORT *g_TROTL_DEFAULT_NUM_FTM = "TM\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; - - +char TROTL_EXPORT *g_TROTL_DEFAULT_NUM_FTM = "TM"; +char TROTL_EXPORT *g_TROTL_DEFAULT_DATE_FTM = "YYYY:MM:DD HH24:MI:SS"; + SqlStatement::SqlStatement(OciConnection& conn, const tstring& stmt, ub4 lang, int bulk_rows) : super(conn._env), //_svchp(conn._svc_ctx), Modified: branches/tora-trotl/src/trotl/src/trotl_var.h =================================================================== --- branches/tora-trotl/src/trotl/src/trotl_var.h 2010-11-02 20:33:32 UTC (rev 3797) +++ branches/tora-trotl/src/trotl/src/trotl_var.h 2010-11-03 12:14:46 UTC (rev 3798) @@ -49,10 +49,12 @@ extern int TROTL_EXPORT g_OCIPL_BULK_ROWS; extern int TROTL_EXPORT g_OCIPL_MAX_LONG; extern char TROTL_EXPORT *g_TROTL_DEFAULT_NUM_FTM; +extern char TROTL_EXPORT *g_TROTL_DEFAULT_DATE_FTM; #else int TROTL_EXPORT g_OCIPL_BULK_ROWS; int TROTL_EXPORT g_OCIPL_MAX_LONG; char TROTL_EXPORT *g_TROTL_DEFAULT_NUM_FTM; +char TROTL_EXPORT *g_TROTL_DEFAULT_DATE_FTM; #endif struct Convertor; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2010-11-09 11:18:18
|
Revision: 3802 http://tora.svn.sourceforge.net/tora/?rev=3802&view=rev Author: ibre5041 Date: 2010-11-09 11:18:06 +0000 (Tue, 09 Nov 2010) Log Message: ----------- sync with tora trunk, all references to tonoblockquery are removed Modified Paths: -------------- branches/tora-trotl/src/CMakeLists.txt branches/tora-trotl/src/Makefile.am branches/tora-trotl/src/main.cpp branches/tora-trotl/src/toanalyze.cpp branches/tora-trotl/src/toanalyze.h branches/tora-trotl/src/tobarchart.h branches/tora-trotl/src/tobrowser.cpp branches/tora-trotl/src/tobrowser.h branches/tora-trotl/src/tocodemodel.cpp branches/tora-trotl/src/toconf.h branches/tora-trotl/src/toconfiguration.cpp branches/tora-trotl/src/toconfiguration.h branches/tora-trotl/src/toconnection.cpp branches/tora-trotl/src/toconnection.h branches/tora-trotl/src/toconnectionpool.cpp branches/tora-trotl/src/tocurrent.cpp branches/tora-trotl/src/tocurrent.h branches/tora-trotl/src/toeventquery.cpp branches/tora-trotl/src/toeventquery.h branches/tora-trotl/src/toglobalsetting.cpp branches/tora-trotl/src/tomain.cpp branches/tora-trotl/src/tomodeleditor.cpp branches/tora-trotl/src/tonewconnection.cpp branches/tora-trotl/src/tonewconnection.h branches/tora-trotl/src/tooracleconnection.cpp branches/tora-trotl/src/tooracleconnection_trotl.cpp branches/tora-trotl/src/tooraclesettingui.ui branches/tora-trotl/src/toqvalue.cpp branches/tora-trotl/src/toqvalue.h branches/tora-trotl/src/toresultbar.cpp branches/tora-trotl/src/toresultbar.h branches/tora-trotl/src/toresultcombo.cpp branches/tora-trotl/src/toresultcombo.h branches/tora-trotl/src/toresultdepend.cpp branches/tora-trotl/src/toresultdepend.h branches/tora-trotl/src/toresultfield.cpp branches/tora-trotl/src/toresultfield.h branches/tora-trotl/src/toresultitem.cpp branches/tora-trotl/src/toresultitem.h branches/tora-trotl/src/toresultlabel.cpp branches/tora-trotl/src/toresultlabel.h branches/tora-trotl/src/toresultline.cpp branches/tora-trotl/src/toresultline.h branches/tora-trotl/src/toresultlock.cpp branches/tora-trotl/src/toresultlock.h branches/tora-trotl/src/toresultlong.cpp branches/tora-trotl/src/toresultlong.h branches/tora-trotl/src/toresultmodel.cpp branches/tora-trotl/src/toresultmodel.h branches/tora-trotl/src/toresultpie.cpp branches/tora-trotl/src/toresultpie.h branches/tora-trotl/src/toresultplan.cpp branches/tora-trotl/src/toresultplan.h branches/tora-trotl/src/toresultstats.cpp branches/tora-trotl/src/toresultstats.h branches/tora-trotl/src/toresultstorage.cpp branches/tora-trotl/src/toresultstorage.h branches/tora-trotl/src/totemplate.cpp branches/tora-trotl/src/totemplate.h branches/tora-trotl/src/totuning.cpp branches/tora-trotl/src/totuning.h branches/tora-trotl/src/towaitevents.cpp branches/tora-trotl/src/towaitevents.h branches/tora-trotl/src/trotl_test0.cpp Removed Paths: ------------- branches/tora-trotl/src/tonoblockquery.cpp branches/tora-trotl/src/tonoblockquery.h Modified: branches/tora-trotl/src/CMakeLists.txt =================================================================== --- branches/tora-trotl/src/CMakeLists.txt 2010-11-07 18:02:29 UTC (rev 3801) +++ branches/tora-trotl/src/CMakeLists.txt 2010-11-09 11:18:06 UTC (rev 3802) @@ -116,7 +116,6 @@ todockbar.h topushbutton.h torunnable.h - tonoblockquery.h tocurrent.h todatatype.h todebug.h @@ -156,7 +155,6 @@ tomessage.h # tomysqlkeywords.h tonewconnection.h -# tonoblockquery.h tooutput.h toparamget.h topiechart.h @@ -324,7 +322,6 @@ tomodeleditor.cpp tomessage.cpp tonewconnection.cpp - tonoblockquery.cpp #win only? toocistub.cpp tooracleconnection.cpp tooracleextract.cpp Modified: branches/tora-trotl/src/Makefile.am =================================================================== --- branches/tora-trotl/src/Makefile.am 2010-11-07 18:02:29 UTC (rev 3801) +++ branches/tora-trotl/src/Makefile.am 2010-11-09 11:18:06 UTC (rev 3802) @@ -81,7 +81,6 @@ tomodeleditor.cpp tomodeleditor.h \ tomessage.cpp tomessage.h \ tonewconnection.cpp tonewconnection.h \ - tonoblockquery.cpp tonoblockquery.h \ toeventquery.cpp toeventquery.h \ toeventquerytask.cpp toeventquerytask.h \ toparamget.cpp toparamget.h \ @@ -333,7 +332,6 @@ moc_toconnectionimport.cpp \ moc_todescribe.cpp \ moc_torunnable.cpp \ - moc_tonoblockquery.cpp \ moc_toeventquery.cpp \ moc_toeventquerytask.cpp \ moc_tocurrent.cpp \ Modified: branches/tora-trotl/src/main.cpp =================================================================== --- branches/tora-trotl/src/main.cpp 2010-11-07 18:02:29 UTC (rev 3801) +++ branches/tora-trotl/src/main.cpp 2010-11-09 11:18:06 UTC (rev 3802) @@ -49,6 +49,7 @@ #include "tomain.h" #include "tosql.h" #include "totool.h" +#include "toeventquery.h" // qt4 in via the qtranslator // #include "tora_toad.h" @@ -275,6 +276,10 @@ toMarkedText::setDefaultTabWidth(toConfigurationSingle::Instance().tabStop()); toMarkedText::setDefaultTabSpaces(toConfigurationSingle::Instance().tabSpaces()); + qRegisterMetaType<toQDescList>("toQDescList&"); + qRegisterMetaType<ValuesList>("ValuesList&"); + qRegisterMetaType<toConnection::exception>("toConnection::exception"); + // toUpdateIndicateEmpty(); new toMain; Modified: branches/tora-trotl/src/toanalyze.cpp =================================================================== --- branches/tora-trotl/src/toanalyze.cpp 2010-11-07 18:02:29 UTC (rev 3801) +++ branches/tora-trotl/src/toanalyze.cpp 2010-11-09 11:18:06 UTC (rev 3802) @@ -379,8 +379,6 @@ if (Type) connect(Type, SIGNAL(activated(int)), this, SLOT(refresh())); - connect(&Poll, SIGNAL(timeout()), this, SLOT(poll())); - box->setSpacing(0); box->setContentsMargins(0, 0, 0, 0); container->setLayout(box); @@ -399,7 +397,7 @@ try { Plans->query(toSQL::string(SQLListPlans, connection).arg( - toConfigurationSingle::Instance().planTable())); + toConfigurationSingle::Instance().planTable(connection.user()))); } TOCATCH; @@ -521,67 +519,55 @@ TOCATCH; } -void toAnalyze::poll(void) +void toAnalyze::startQuery(toEventQuery * q) { + connect(q, SIGNAL(dataAvailable(toEventQuery*)), this, SLOT(poll(toEventQuery*))); + connect(q, SIGNAL(done(toEventQuery*)), this, SLOT(queryDone(toEventQuery*))); + q->readAll(); // indicate that all records should be fetched + q->start(); +} // connectSlots + +void toAnalyze::poll(toEventQuery* q) +{ + // This function will probably never be called as table statistics + // calculation is a statement and it does not return any values. try { - int running = 0; - for (std::list<toNoBlockQuery *>::iterator i = Running.begin();i != Running.end();i++) - { - bool eof = false; + int cols = q->describe().size(); + for (int j = 0; j < cols; j++) + q->readValueNull(); // Eat the output if any. - try - { - if ((*i)->poll()) - { - int cols = (*i)->describe().size(); - for (int j = 0;j < cols;j++) - (*i)->readValueNull(); // Eat the output if any. - } + Current->setText(tr("Running %1 Pending %2").arg(Running.size()).arg(Pending.size())); + } + TOCATCH; +} - try - { - eof = (*i)->eof(); - } - catch (const QString &) - { - eof = true; - } - } - catch (const QString &err) - { - toStatusMessage(err); - eof = true; - } - if (eof) - { - QString sql = toShift(Pending); - if (!sql.isEmpty()) - { - delete(*i); - toQList par; - (*i) = new toNoBlockQuery(connection(), sql, par); - running++; - } - } - else - running++; - } - if (!running) - { - Poll.stop(); +void toAnalyze::queryDone(toEventQuery* q) +{ + Running.removeOne(q); + delete q; + + if (!Pending.isEmpty()) + { + QString sql = Pending.takeFirst(); + toQList par; + toEventQuery * q = new toEventQuery(connection(), sql, par); + startQuery(q); + Running.append(q); + Current->setText(tr("Running %1 Pending %2").arg(Running.size()).arg(Pending.size())); + } + else + { + if (Running.isEmpty()) { refresh(); stop(); } - else - Current->setText(tr("Running %1 Pending %2").arg(running).arg(Pending.size())); } - TOCATCH; -} +} // queryDone -std::list<QString> toAnalyze::getSQL(void) +QStringList toAnalyze::getSQL(void) { - std::list<QString> ret; + QStringList ret; for (toResultTableView::iterator it(Statistics); (*it).isValid(); it++) { if (Statistics->isRowSelected((*it))) @@ -627,7 +613,7 @@ sql += QString::fromLatin1("VALIDATE REF UPDATE"); break; } - toPush(ret, + ret.append( sql.arg(Statistics->model()->data((*it).row(), 2).toString()) .arg(Statistics->model()->data((*it).row(), 3).toString()) .arg(Statistics->model()->data((*it).row(), 1).toString())); @@ -652,7 +638,7 @@ QString table = Statistics->model()->data((*it).row(), 3).toString(); QString schema = Statistics->model()->data((*it).row(), 2).toString(); - toPush(ret, sql.arg(schema).arg(table)); + ret.append(sql.arg(schema).arg(table)); } else { @@ -669,8 +655,7 @@ QString owner = Statistics->model()->data((*it).row(), 2).toString(); if (toUnnull(owner).isNull()) owner = Schema->selected(); - toPush(ret, - sql.arg(owner).arg( + ret.append(sql.arg(owner).arg( Statistics->model()->data((*it).row(), 1).toString())); } } @@ -680,47 +665,49 @@ void toAnalyze::displaySQL(void) { - QString txt; - std::list<QString> sql = getSQL(); - for (std::list<QString>::iterator i = sql.begin();i != sql.end();i++) - txt += (*i) + ";\n"; - new toMemoEditor(this, txt, -1, -1, true); + QStringList sql = getSQL(); + new toMemoEditor(this, sql.join(";\n"), -1, -1, true); } void toAnalyze::execute(void) { stop(); - std::list<QString> sql = getSQL(); - for (std::list<QString>::iterator i = sql.begin();i != sql.end();i++) - toPush(Pending, *i); + Pending = getSQL(); + if (Pending.isEmpty()) + return; + try { toQList par; for (int i = 0; i < Parallel->value(); i++) { - QString sql = toShift(Pending); - if (!sql.isEmpty()) - toPush(Running, new toNoBlockQuery(connection(), sql, par)); + if (!Pending.isEmpty()) + { + QString sql = Pending.takeFirst(); + toEventQuery * q = new toEventQuery(connection(), sql, par); + Running.append(q); + startQuery(q); + } } - Poll.start(100); Stop->setEnabled(true); - poll(); } TOCATCH; } void toAnalyze::stop(void) { - try + QList<toEventQuery*>::iterator i; + for (i = Running.begin(); i != Running.end(); i++) + delete *i; + Running.clear(); + Pending.clear(); + Stop->setEnabled(false); + Current->setText(QString::null); + if (!connection().needCommit()) { - for_each(Running.begin(), Running.end(), deleteObject()); - Running.clear(); - Pending.clear(); - Stop->setEnabled(false); - Current->setText(QString::null); - if (!connection().needCommit()) + try { try { @@ -731,9 +718,9 @@ TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; } } + catch (...) { } } - TOCATCH; -} +} // stop void toAnalyze::createTool(void) { Modified: branches/tora-trotl/src/toanalyze.h =================================================================== --- branches/tora-trotl/src/toanalyze.h 2010-11-07 18:02:29 UTC (rev 3801) +++ branches/tora-trotl/src/toanalyze.h 2010-11-09 11:18:06 UTC (rev 3802) @@ -43,12 +43,9 @@ #define TOANALYZE_H #include "config.h" -#include "tobackground.h" -#include "tonoblockquery.h" +#include "toeventquery.h" #include "totool.h" -#include <list> - #include <QAction> #include <QLabel> @@ -78,16 +75,17 @@ QSpinBox *Parallel; QLabel *Current; QToolButton *Stop; - toBackground Poll; toResultTableView *Plans; toResultPlan *CurrentPlan; toWorksheetStatistic *Worksheet; - std::list<toNoBlockQuery *> Running; - std::list<QString> Pending; + QList<toEventQuery *> Running; + QStringList Pending; - std::list<QString> getSQL(void); + QStringList getSQL(void); + void startQuery(toEventQuery * q); + public: toAnalyze(QWidget *parent, toConnection &connection); @@ -99,7 +97,8 @@ virtual void displaySQL(void); virtual void changeOperation(int); virtual void execute(void); - virtual void poll(void); + virtual void poll(toEventQuery *); + virtual void queryDone(toEventQuery *); virtual void stop(void); virtual void refresh(void); virtual void selectPlan(void); Modified: branches/tora-trotl/src/tobarchart.h =================================================================== --- branches/tora-trotl/src/tobarchart.h 2010-11-07 18:02:29 UTC (rev 3801) +++ branches/tora-trotl/src/tobarchart.h 2010-11-09 11:18:06 UTC (rev 3802) @@ -42,7 +42,6 @@ #ifndef TOBARCHART_H #define TOBARCHART_H -#include "config.h" #include "tolinechart.h" /** A widget that displays a barchart. Each line is added onto the next one. Modified: branches/tora-trotl/src/tobrowser.cpp =================================================================== --- branches/tora-trotl/src/tobrowser.cpp 2010-11-07 18:02:29 UTC (rev 3801) +++ branches/tora-trotl/src/tobrowser.cpp 2010-11-09 11:18:06 UTC (rev 3802) @@ -1385,8 +1385,6 @@ toBrowser::toBrowser(QWidget *parent, toConnection &connection) : toToolWidget(BrowserTool, "browser.html", parent, connection, "toBrowser") { - refreshing = false; - Filter = new toBrowserFilter(false); // man toolbar of the tool @@ -1944,9 +1942,7 @@ try { Schema->refresh(); - refreshing = true; // indicate that no object information should be fetched mainTab_currentChanged(m_mainTab->currentIndex()); - refreshing = false; } TOCATCH } @@ -2038,7 +2034,6 @@ m_browsersMap[ix]->changeParams(schema(), currentItemText()); else { - QString obj; // If code browser has been clicked we need to know type of code (function, procedure...) too // as it is not possible to identify code by just schema and object (in MySQL there can be // a function and procedure with the same name in the same schema) @@ -2049,12 +2044,7 @@ return; } - // When refreshing no object information should be displayd - so - // empty object name is passed. Trying to fetch currentItemText - // during refreshing crashes TOra. - if (!refreshing) - obj = currentItemText(); - m_browsersMap[ix]->changeParams(schema(), obj/*currentItemText()*/, browser->objectType()); + m_browsersMap[ix]->changeParams(schema(), currentItemText(), browser->objectType()); } } else Modified: branches/tora-trotl/src/tobrowser.h =================================================================== --- branches/tora-trotl/src/tobrowser.h 2010-11-07 18:02:29 UTC (rev 3801) +++ branches/tora-trotl/src/tobrowser.h 2010-11-09 11:18:06 UTC (rev 3802) @@ -208,19 +208,6 @@ toMySQLUserAccess *AccessPanel; #endif - /* TS 2010-10-10 When refreshing object/schema list TOra crashes somewhere in - toBrowserSchemaCodeBrowser::objectName() as it does get some non null pointer as - "item" but is unable to call any methods of it. - As a workaround this bool is set to true when refreshing object list and thus - object name is set to NULL rather than being fetched from "item". - Test scenario to crash without this bool: - 1. select tab "Code". - 2. select a code (procedure, function etc.). - 3. press "refresh". - TODO: toBrowserSchemaCodeBrowser::objectName() should be fixed and this bool removed. - */ - bool refreshing; - public: toBrowser(QWidget *parent, toConnection &connection); virtual ~toBrowser(); Modified: branches/tora-trotl/src/tocodemodel.cpp =================================================================== --- branches/tora-trotl/src/tocodemodel.cpp 2010-11-07 18:02:29 UTC (rev 3801) +++ branches/tora-trotl/src/tocodemodel.cpp 2010-11-09 11:18:06 UTC (rev 3802) @@ -408,6 +408,7 @@ funcItem = new toCodeModelItem(rootItem, tr("Function")); if (!toIsMySQL(conn)) typeItem = new toCodeModelItem(rootItem, tr("Type")); + this->reset(); toQList param; param.push_back(m_owner); @@ -420,8 +421,6 @@ toSQL::sql(SQLListObjects, conn), param); - qRegisterMetaType<toConnection::exception>("toConnection::exception"); - connect(query, SIGNAL(dataAvailable()), this, Modified: branches/tora-trotl/src/toconf.h =================================================================== --- branches/tora-trotl/src/toconf.h 2010-11-07 18:02:29 UTC (rev 3801) +++ branches/tora-trotl/src/toconf.h 2010-11-09 11:18:06 UTC (rev 3802) @@ -124,6 +124,7 @@ #define DEFAULT_MAX_CONTENT 100 #define CONF_KEEP_PLANS "KeepPlans" // default: false #define CONF_VSQL_PLANS "VSqlPlans" // default: true +#define CONF_SHARED_PLAN "SharedPlan" // default: false #define CONF_RESTORE_SESSION "RestoreSession" #define CONF_DEFAULT_SESSION "DefaultSession" #define DEFAULT_SESSION ".tora.tse" @@ -168,6 +169,9 @@ #define DEFAULT_STYLE "" //"Cleanlooks" // code editor #define CONF_STATIC_CHECKER "StaticChecker" +// connection (general) +#define CONF_CONNECTION_TEST_TIMEOUT "ConnectionTestTimeout" +#define DEFAULT_CONNECTION_TEST_TIMEOUT 0 // tooracleconnection.cpp #define CONF_OPEN_CURSORS "OpenCursors" #define DEFAULT_OPEN_CURSORS 40 // Defined to be able to update tuning view Modified: branches/tora-trotl/src/toconfiguration.cpp =================================================================== --- branches/tora-trotl/src/toconfiguration.cpp 2010-11-07 18:02:29 UTC (rev 3801) +++ branches/tora-trotl/src/toconfiguration.cpp 2010-11-09 11:18:06 UTC (rev 3802) @@ -114,6 +114,7 @@ int m_maxContent; bool m_keepPlans; bool m_vsqlPlans; + bool m_sharedPlan; bool m_restoreSession; QString m_defaultSession; int m_defaultFormat; @@ -137,6 +138,7 @@ int m_smtpPort; QString m_style; QString m_staticChecker; // path+name to static check script (used in code editor) + int m_connectionTestTimeout; // after how many seconds connection should be tested // tooracleconnection int m_openCursors; @@ -359,6 +361,7 @@ m_maxContent = s.value(CONF_MAX_CONTENT, DEFAULT_MAX_CONTENT).toInt(); m_keepPlans = s.value(CONF_KEEP_PLANS, false).toBool(); m_vsqlPlans = s.value(CONF_VSQL_PLANS, true).toBool(); + m_sharedPlan = s.value(CONF_SHARED_PLAN, false).toBool(); m_restoreSession = s.value(CONF_RESTORE_SESSION, false).toBool(); m_defaultSession = s.value(CONF_DEFAULT_SESSION, getSpecialDir() + DEFAULT_SESSION).toString(); // FIXME! @@ -498,6 +501,7 @@ m_syntaxStaticBg = s.value("SyntaxStaticBg", "darkblue").toString(); m_useMaxTextWidthMark = s.value("useMaxTextWidthMark", false).toBool(); m_maxTextWidthMark = s.value("maxTextWidthMark", 75).toInt(); + m_connectionTestTimeout = s.value(CONF_CONNECTION_TEST_TIMEOUT, DEFAULT_CONNECTION_TEST_TIMEOUT).toInt(); s.endGroup(); // main window @@ -589,6 +593,7 @@ s.setValue(CONF_MAX_CONTENT, m_maxContent); s.setValue(CONF_KEEP_PLANS, m_keepPlans); s.setValue(CONF_VSQL_PLANS, m_vsqlPlans); + s.setValue(CONF_SHARED_PLAN, m_sharedPlan); s.setValue(CONF_RESTORE_SESSION, m_restoreSession); s.setValue(CONF_DEFAULT_SESSION, m_defaultSession); s.setValue(CONF_DEFAULT_FORMAT, m_defaultFormat); @@ -736,6 +741,7 @@ s.setValue("SyntaxStaticBg", m_syntaxStaticBg); s.setValue("useMaxTextWidthMark", m_useMaxTextWidthMark); s.setValue("maxTextWidthMark", m_maxTextWidthMark); + s.setValue(CONF_CONNECTION_TEST_TIMEOUT, m_connectionTestTimeout); s.endGroup(); // main window @@ -1072,9 +1078,12 @@ p->m_maxColDisp = v; } -QString toConfiguration::planTable() +QString toConfiguration::planTable(QString schema) { - return p->m_planTable; + if(p->m_sharedPlan || p->m_planTable.contains('.') || schema.isNull()) + return p->m_planTable; + + return schema + '.' + p->m_planTable; } void toConfiguration::setPlanTable(const QString & v) { @@ -1449,6 +1458,15 @@ p->m_vsqlPlans = v; } +bool toConfiguration::sharedPlan() +{ + return p->m_sharedPlan; +} +void toConfiguration::setSharedPlan(bool v) +{ + p->m_sharedPlan = v; +} + bool toConfiguration::restoreSession() { return p->m_restoreSession; @@ -2180,6 +2198,16 @@ p->m_maxTextWidthMark = v; } +int toConfiguration::connectionTestTimeout() +{ + return p->m_connectionTestTimeout; +} + +void toConfiguration::setConnectionTestTimeout(int v) +{ + p->m_connectionTestTimeout; +} + QByteArray toConfiguration::mainWindowGeometry() { return p->m_mainWindowGeometry; Modified: branches/tora-trotl/src/toconfiguration.h =================================================================== --- branches/tora-trotl/src/toconfiguration.h 2010-11-07 18:02:29 UTC (rev 3801) +++ branches/tora-trotl/src/toconfiguration.h 2010-11-09 11:18:06 UTC (rev 3802) @@ -88,7 +88,7 @@ int maxColDisp(); void setMaxColDisp(int v); - QString planTable(); + QString planTable(QString schema); void setPlanTable(const QString & v); QString planCheckpoint(); @@ -213,6 +213,9 @@ bool vsqlPlans(); void setVsqlPlans(bool v); + bool sharedPlan(); + void setSharedPlan(bool v); + bool restoreSession(); void setRestoreSession(bool v); @@ -489,6 +492,9 @@ int maxTextWidthMark(); void setMaxTextWidthMark(int v); + int connectionTestTimeout(); + void setConnectionTestTimeout(int v); + // shortcut editor bool useEditorShortcuts(); void setUseEditorShortcuts(bool v); Modified: branches/tora-trotl/src/toconnection.cpp =================================================================== --- branches/tora-trotl/src/toconnection.cpp 2010-11-07 18:02:29 UTC (rev 3801) +++ branches/tora-trotl/src/toconnection.cpp 2010-11-09 11:18:06 UTC (rev 3802) @@ -541,6 +541,7 @@ SQL = sql(*Connection); Params = params; Query->execute(); + this->connectionSub()->setLastUsed(); } void toQuery::execute(const QString &sql, const toQList ¶ms) @@ -549,6 +550,7 @@ SQL = sql; Params = params; Query->execute(); + this->connectionSub()->setLastUsed(); } void toQuery::execute(const toSQL &sql) @@ -556,6 +558,7 @@ std::list<toQValue> params; params.clear(); execute(sql, params); + this->connectionSub()->setLastUsed(); } void toQuery::execute(const toSQL &sql, const QString ¶m) @@ -564,6 +567,7 @@ params.clear(); params.insert(params.end(), param); execute(sql, params); + this->connectionSub()->setLastUsed(); } void toQuery::execute(const toSQL &sql, const QString ¶m1, const QString ¶m2, const QString ¶m3) @@ -574,6 +578,7 @@ params.insert(params.end(), param2); params.insert(params.end(), param3); execute(sql, params); + this->connectionSub()->setLastUsed(); } toQuery::~toQuery() Modified: branches/tora-trotl/src/toconnection.h =================================================================== --- branches/tora-trotl/src/toconnection.h 2010-11-07 18:02:29 UTC (rev 3801) +++ branches/tora-trotl/src/toconnection.h 2010-11-09 11:18:06 UTC (rev 3802) @@ -54,6 +54,7 @@ #include <QString> #include <QPointer> #include <QMetaType> +#include <QDateTime> class QWidget; class toConnection; @@ -73,6 +74,7 @@ class toConnectionSub { toQuery *Query; + QDateTime LastUsed; // last time this db connection was actually used public: /** Create connection to database. */ @@ -100,6 +102,18 @@ */ virtual void cancel(void) { } + /** Get time when last query on this connection has finished + */ + QDateTime lastUsed(void) + { + return LastUsed; + } + /** Set time when last query on this connection has finished to "now" + */ + void setLastUsed(void) + { + LastUsed = QDateTime::currentDateTime(); + } } ; Modified: branches/tora-trotl/src/toconnectionpool.cpp =================================================================== --- branches/tora-trotl/src/toconnectionpool.cpp 2010-11-07 18:02:29 UTC (rev 3801) +++ branches/tora-trotl/src/toconnectionpool.cpp 2010-11-09 11:18:06 UTC (rev 3802) @@ -47,6 +47,7 @@ #include "tosql.h" #include <QTimer> +#include <QDateTime> #include <QCoreApplication> #include <QApplication> @@ -108,9 +109,9 @@ void toConnectionPoolExec::run() { - toThread::Lock->lock (); - toThread::toThreadInfoStorage.setLocalData(new toThreadInfo(++toThread::lastThreadNumber)); - toThread::Lock->unlock(); + // toThread::Lock->lock (); + // toThread::toThreadInfoStorage.setLocalData(new toThreadInfo(++toThread::lastThreadNumber)); + // toThread::Lock->unlock(); for(int mem = 0; Pool && mem < Pool->size(); mem++) { toConnectionSub *sub = Pool->steal(mem); @@ -264,7 +265,6 @@ return psub->State; } - toConnectionPool::PooledState toConnectionPool::test(PooledSub *sub) { PooledState state = Free; try { @@ -301,11 +301,14 @@ } +/* Checks which connection is available in a pool and then returns it. +*/ toConnectionSub* toConnectionPool::borrow() { { // keep lock here so adding connection below can be sure // there's no current lock in case of exception LockingPtr<SubList> ptr(Pool, PoolLock); + int connectionTestTimeout = toConfigurationSingle::Instance().connectionTestTimeout(); for(int mem = 0; mem < ptr->size(); mem++) { PooledSub *psub = (*ptr)[mem]; @@ -314,8 +317,17 @@ psub->State = Busy; ptr.unlock(); - PooledState state = test(psub); - if(state == Free) + // Check how many seconds have passed since something has been executed + // on this particular database connection. + int diff = psub->Sub->lastUsed().secsTo(QDateTime::currentDateTime()); + PooledState state; + // If more than configured amount has passed - perform a connection + // test - run some simple operation to check if connection is still alive. + if (diff > connectionTestTimeout) + state = test(psub); + else + state = Free; + if (state == Free) return psub->Sub; else { ptr.lock(); Modified: branches/tora-trotl/src/tocurrent.cpp =================================================================== --- branches/tora-trotl/src/tocurrent.cpp 2010-11-07 18:02:29 UTC (rev 3801) +++ branches/tora-trotl/src/tocurrent.cpp 2010-11-09 11:18:06 UTC (rev 3802) @@ -46,7 +46,7 @@ #include "toconf.h" #include "tocurrent.h" #include "tomain.h" -#include "tonoblockquery.h" +#include "toeventquery.h" #include "toresulttableview.h" #include "toresultparam.h" #include "toresultstats.h" @@ -155,8 +155,6 @@ ResourceLimit->setSQL(SQLResourceLimit); Tabs->addTab(ResourceLimit, tr("Resource Limits")); - connect(&Poll, SIGNAL(timeout()), this, SLOT(poll())); - Query = NULL; refresh(); @@ -204,60 +202,51 @@ void toCurrent::addList(bool isrole, toTreeWidgetItem *parent, const QString &type, const toSQL &sql, const QString &role) { - Updates.insert(Updates.end(), update(isrole, parent, type, sql(connection()), role)); + Updates.append(update(isrole, parent, type, sql(connection()), role)); } +void toCurrent::processUpdate() +{ + if (Updates.empty()) + return; + + CurrentUpdate = Updates.takeFirst(); + + toQList param; + if (!CurrentUpdate.Role.isEmpty()) + toPush(param, toQValue(CurrentUpdate.Role)); + Query = new toEventQuery(connection(), + toQuery::Background, + CurrentUpdate.SQL, + param); + connect(Query, SIGNAL(dataAvailable()), this, SLOT(poll())); + connect(Query, SIGNAL(done()), this, SLOT(queryDone())); + Query->readAll(); // indicate that all records should be fetched + Query->start(); +} // processUpdate + void toCurrent::poll() { try { - if (Query) + while (Query->hasMore()) { - while (Query && Query->poll()) + toTreeWidgetItem *item; + if (CurrentUpdate.Parent) + item = new toResultViewItem(CurrentUpdate.Parent, NULL); + else + item = new toResultViewItem(Grants, NULL); + item->setText(0, Query->readValue()); + item->setText(1, CurrentUpdate.Type); + item->setText(2, Query->readValue()); + if (CurrentUpdate.IsRole) { - if (Query->eof()) - { - delete Query; - Query = NULL; - } - else - { - toTreeWidgetItem *item; - if (CurrentUpdate.Parent) - item = new toResultViewItem(CurrentUpdate.Parent, NULL); - else - item = new toResultViewItem(Grants, NULL); - item->setText(0, Query->readValue()); - item->setText(1, CurrentUpdate.Type); - item->setText(2, Query->readValue()); - if (CurrentUpdate.IsRole) - { - addList(false, item, tr("System"), SQLRoleSysPrivs, item->text(0)); - addList(false, item, tr("Object"), SQLRoleTabPrivs, item->text(0)); - addList(true, item, tr("Role"), SQLRoleRolePrivs, item->text(0)); - } - } + // Add details of this role to the query que + addList(false, item, tr("System"), SQLRoleSysPrivs, item->text(0)); + addList(false, item, tr("Object"), SQLRoleTabPrivs, item->text(0)); + addList(true, item, tr("Role"), SQLRoleRolePrivs, item->text(0)); } } - - if (!Query) - { - if ( Updates.empty() ) - { - Poll.stop(); - return ; - } - - CurrentUpdate = toShift(Updates); - - toQList param; - if (!CurrentUpdate.Role.isEmpty()) - toPush(param, toQValue(CurrentUpdate.Role)); - Query = new toNoBlockQuery(connection(), - toQuery::Background, - CurrentUpdate.SQL, - param); - } } catch (const QString &exc) { @@ -267,6 +256,14 @@ } } +void toCurrent::queryDone() +{ + delete Query; + Query = NULL; + processUpdate(); // done with this query, so process the next one! + Grants->resizeColumnsToContents(); +} // queryDone + void toCurrent::refresh() { try @@ -285,8 +282,7 @@ addList(false, NULL, tr("Object"), SQLUserTabPrivs); addList(true, NULL, tr("Role"), SQLUserRolePrivs); - poll(); - Poll.start(100); + processUpdate(); } TOCATCH } Modified: branches/tora-trotl/src/tocurrent.h =================================================================== --- branches/tora-trotl/src/tocurrent.h 2010-11-07 18:02:29 UTC (rev 3801) +++ branches/tora-trotl/src/tocurrent.h 2010-11-09 11:18:06 UTC (rev 3802) @@ -42,15 +42,13 @@ #ifndef TOCURRENT_H #define TOCURRENT_H -#include "config.h" #include "totool.h" #include "tosql.h" -#include "tobackground.h" #include "toresultview.h" class QTabWidget; -class toNoBlockQuery; +class toEventQuery; class toResultParam; class toResultStats; class toResultView; @@ -89,7 +87,7 @@ } }; - std::list<update> Updates; + QList<update> Updates; QTabWidget *Tabs; toResultTableView *Version; @@ -97,16 +95,16 @@ toResultTableView *ResourceLimit; toResultParam *Parameters; toResultStats *Statistics; - toBackground Poll; update CurrentUpdate; - toNoBlockQuery *Query; + toEventQuery *Query; virtual void addList(bool isrole, toTreeWidgetItem *parent, const QString &typ, const toSQL &sql, const QString &role = QString::null); + void processUpdate(void); protected: void closeEvent(QCloseEvent *event); @@ -118,6 +116,7 @@ public slots: void refresh(void); void poll(void); + void queryDone(); }; #endif Modified: branches/tora-trotl/src/toeventquery.cpp =================================================================== --- branches/tora-trotl/src/toeventquery.cpp 2010-11-07 18:02:29 UTC (rev 3801) +++ branches/tora-trotl/src/toeventquery.cpp 2010-11-09 11:18:06 UTC (rev 3802) @@ -107,9 +107,6 @@ Task = new toEventQueryTask(this, *Connection, SQL, Param, Statistics); Task->ThreadAlive.lock(); - qRegisterMetaType<toQDescList>("toQDescList&"); - qRegisterMetaType<ValuesList>("ValuesList&"); - connect(Task, SIGNAL(headers(toQDescList &, int)), this, @@ -175,7 +172,7 @@ void toEventQuery::taskData(ValuesList &values) { Values += values; - emit dataAvailable(); + emit dataAvailable(this); try { if(Statistics) @@ -202,7 +199,7 @@ void toEventQuery::taskFinished() { TaskDone = true; - emit done(); + emit done(this); } Modified: branches/tora-trotl/src/toeventquery.h =================================================================== --- branches/tora-trotl/src/toeventquery.h 2010-11-07 18:02:29 UTC (rev 3801) +++ branches/tora-trotl/src/toeventquery.h 2010-11-09 11:18:06 UTC (rev 3802) @@ -267,21 +267,19 @@ * * @param rows Number of rows to be read */ - void dataAvailable(); + void dataAvailable(toEventQuery * e = NULL); - /** * Emitted with error string * */ void error(const toConnection::exception &); - /** * Emitted when done * */ - void done(); + void done(toEventQuery * e = NULL); }; #endif Modified: branches/tora-trotl/src/toglobalsetting.cpp =================================================================== --- branches/tora-trotl/src/toglobalsetting.cpp 2010-11-07 18:02:29 UTC (rev 3801) +++ branches/tora-trotl/src/toglobalsetting.cpp 2010-11-09 11:18:06 UTC (rev 3802) @@ -346,6 +346,8 @@ // InitialFetch->setValidator(new QIntValidator(InitialFetch)); // MaxContent->setValidator(new QIntValidator(InitialFetch)); + NumberFormat->setCurrentIndex(toConfigurationSingle::Instance().numberFormat()); + Decimals->setValue(toConfigurationSingle::Instance().numberDecimals()); if (NumberFormat->currentIndex() == 2) Decimals->setEnabled(true); Modified: branches/tora-trotl/src/tomain.cpp =================================================================== --- branches/tora-trotl/src/tomain.cpp 2010-11-07 18:02:29 UTC (rev 3801) +++ branches/tora-trotl/src/tomain.cpp 2010-11-09 11:18:06 UTC (rev 3802) @@ -784,7 +784,8 @@ commitAct->setEnabled(hascon); stopAct->setEnabled(hascon); rollbackAct->setEnabled(hascon); - refreshAct->setEnabled(hascon); + // disable reread cache if use caching is disabled + refreshAct->setEnabled(hascon && toConfigurationSingle::Instance().cacheDisk()); closeConn->setEnabled(hascon); updateRecent(); Modified: branches/tora-trotl/src/tomodeleditor.cpp =================================================================== --- branches/tora-trotl/src/tomodeleditor.cpp 2010-11-07 18:02:29 UTC (rev 3801) +++ branches/tora-trotl/src/tomodeleditor.cpp 2010-11-09 11:18:06 UTC (rev 3802) @@ -144,7 +144,7 @@ return; } offset = 0; - bool retval = toWriteLargeFile(file, *this, false, this); + bool retval = toWriteLargeFile(file, *this, /*progressbar*/false, /*parent*/this); if(retval) toMainWidget()->addRecentFile(fn); } else { @@ -195,6 +195,7 @@ Editable = Model->flags(Current) & Qt::ItemIsEditable; Editor->setReadOnly(!Editable); Editor->setFocus(); + Editor->setWordWrap(true); QDialogButtonBox * buttonBox = new QDialogButtonBox(QDialogButtonBox::Close, Qt::Horizontal, this); vbox->addWidget(buttonBox); @@ -256,6 +257,7 @@ QAction * WordWrapAct = new QAction(QIcon(QPixmap(const_cast<const char**>(wordwrap_xpm))), tr("Word Wrap"), Toolbar); WordWrapAct->setCheckable(true); + WordWrapAct->setChecked(true); connect(WordWrapAct, SIGNAL(toggled(bool)), Editor, SLOT(setWordWrap(bool))); Toolbar->addAction(WordWrapAct); Modified: branches/tora-trotl/src/tonewconnection.cpp =================================================================== --- branches/tora-trotl/src/tonewconnection.cpp 2010-11-07 18:02:29 UTC (rev 3801) +++ branches/tora-trotl/src/tonewconnection.cpp 2010-11-09 11:18:06 UTC (rev 3802) @@ -243,7 +243,6 @@ Host->currentText(), Database->currentText(), Schema->text(), - colorComboBox->itemData(colorComboBox->currentIndex()).toString(), Port->value() ); } @@ -286,7 +285,6 @@ const QString &host, const QString &database, const QString &schema, - const QString &color, int port) { QMapIterator<int,toConnectionOptions> i(connectionModel()->availableConnections()); @@ -299,7 +297,6 @@ host == opt.host && database == opt.database && schema == opt.schema && - color == opt.color && port == opt.port) return i.key(); } @@ -506,7 +503,7 @@ foreach (toConnectionOptions opt, dia.availableConnections().values()) { - if (findHistory(opt.provider, opt.username, opt.host, opt.database, opt.schema, opt.color, opt.port) != -1) + if (findHistory(opt.provider, opt.username, opt.host, opt.database, opt.schema, opt.port) != -1) continue; connectionModel()->append(max, opt); Modified: branches/tora-trotl/src/tonewconnection.h =================================================================== --- branches/tora-trotl/src/tonewconnection.h 2010-11-07 18:02:29 UTC (rev 3801) +++ branches/tora-trotl/src/tonewconnection.h 2010-11-09 11:18:06 UTC (rev 3802) @@ -151,7 +151,6 @@ const QString &host, const QString &database, const QString &schema, - const QString &color, int port); // fills form with data from previous connection at param row void loadPrevious(const QModelIndex & current); Deleted: branches/tora-trotl/src/tonoblockquery.cpp =================================================================== --- branches/tora-trotl/src/tonoblockquery.cpp 2010-11-07 18:02:29 UTC (rev 3801) +++ branches/tora-trotl/src/tonoblockquery.cpp 2010-11-09 11:18:06 UTC (rev 3802) @@ -1,488 +0,0 @@ - -/* BEGIN_COMMON_COPYRIGHT_HEADER - * - * TOra - An Oracle Toolkit for DBA's and developers - * - * Shared/mixed copyright is held throughout files in this product - * - * Portions Copyright (C) 2000-2001 Underscore AB - * Portions Copyright (C) 2003-2005 Quest Software, Inc. - * Portions Copyright (C) 2004-2008 Numerous Other Contributors - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; only version 2 of - * the License is valid for this program. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * As a special exception, you have permission to link this program - * with the Oracle Client libraries and distribute executables, as long - * as you follow the requirements of the GNU GPL in regard to all of the - * software in the executable aside from Oracle client libraries. - * - * Specifically you are not permitted to link this program with the - * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. - * And you are not permitted to distribute binaries compiled against - * these libraries. - * - * You may link this product with any GPL'd Qt library. - * - * All trademarks belong to their respective owners. - * - * END_COMMON_COPYRIGHT_HEADER */ - -#include "utils.h" -#include "tologger.h" - -#include "toconf.h" -#include "tonoblockquery.h" -#include "toresultstats.h" -#include "totool.h" - -#include <qapplication.h> - -#include <signal.h> -#include <sys/types.h> -#ifndef Q_OS_WIN32 -#include <unistd.h> -#endif -#include <stdio.h> - -#define PREFETCH_SIZE 5000 - -void toNoBlockQuery::queryTask::run(void) -{ - int Length = 0; - try - { - if (Parent.Query) - Parent.Query->execute(Parent.SQL, Parent.Param); - - bool eof = true; - { - toLocker lock (Parent.Lock) - ; - if (Parent.Query) - { - Parent.Description = Parent.Query->describe(); - Length = Parent.Query->columns(); - eof = Parent.Query->eof(); - } - } - - if (!eof) - { - bool signaled = false; - for (;;) - { - for (int i = 0;i < Length && Parent.Query;i++) - { - toQValue value(Parent.Query->readValueNull()); - { - toLocker lock (Parent.Lock) - ; - Parent.ReadingValues.insert(Parent.ReadingValues.end(), value); - TLOG(3,toDecorator,__HERE__) - << "Value read:" - << value.toString().toUtf8().constData() - << std::endl; - - if (Parent.ReadingValues.size() == 1) - { - if (signaled) - { - Parent.Lock.unlock(); - Parent.Continue.down(); - Parent.Lock.lock(); - } - Parent.Running.up(); - signaled = true; - } - } - } - toLocker lock (Parent.Lock) - ; - if (!Parent.Query || Parent.Query->eof()) - break; - else - { - if (Parent.ReadingValues.size() > PREFETCH_SIZE) - { - Parent.Lock.unlock(); - Parent.Continue.down(); - signaled = false; - Parent.Lock.lock(); - } - } - if (Parent.Quit) - break; - } - } - if (Parent.Query) - Parent.Processed = Parent.Query->rowsProcessed(); - else - Parent.Processed = 0; - } - catch (const toConnection::exception &str) - { - TLOG(3,toDecorator,__HERE__) << "Exception caught(a)" << std::endl; - toLocker lock (Parent.Lock) - ; - Parent.Error = str; - } - catch (const QString &str) - { - TLOG(3,toDecorator,__HERE__) << "Exception caught(b)" << std::endl; - toLocker lock (Parent.Lock) - ; - Parent.Error = str; - } - catch(std::exception const &e) { - toLocker lock (Parent.Lock) - ; - Parent.Error = QString(e.what()); - } - catch (...) - { - TLOG(3,toDecorator,__HERE__) << "Exception caught(c): " << std::endl; - toLocker lock (Parent.Lock) - ; - Parent.Error = qApp->translate("toNoBlockQuery", "Unknown exception"); - } - - toLocker lock (Parent.Lock) - ; - if (!Parent.Error.isNull() && !Parent.Query->eof()) - try - { - Parent.Query->cancel(); - } - catch (...) - { - TLOG(3,toDecorator,__HERE__) << "Unhandled exception: " << std::endl; - } - delete Parent.Query; - Parent.Query = NULL; - Parent.Running.up(); - Parent.EOQ = true; - TLOG(3,toDecorator,__HERE__) << "toNoBlockQuery::queryTask::run finished." << std::endl; -} - -toQValue toNoBlockQuery::readValueNull() -{ - //TLOG(3,toDecorator,__HERE__) << std::endl; - - if (CurrentValue == Values.end()) - { - Lock.lock(); - bool eoq = EOQ; - Lock.unlock(); - if (!eoq) - Running.down(); - toLocker lock (Lock) - ; - Values = ReadingValues; - CurrentValue = Values.begin(); - ReadingValues.clear(); - TLOG(3,toDecorator,__HERE__) - << "Value read: '" - << (*CurrentValue).toString().toUtf8().constData() - << "'" << std::endl; - Continue.up(); - if (CurrentValue == Values.end()) - throw qApp->translate("toNoBlockQuery", "Reading past end of query"); - } - checkError(); - toQValue ret = *CurrentValue; - CurrentValue++; - return ret; -} - -toQValue toNoBlockQuery::readValue() -{ - return toNull(readValueNull()); -} - -toNoBlockQuery::toNoBlockQuery(toConnection &conn, const QString &sql, - const toQList ¶m, toResultStats *stats) - : SQL(sql), - Error(QString::null), - Param(param), - Statistics(stats) -{ - CurrentValue = Values.end(); - Quit = EOQ = false; - Processed = 0; - - try - { - Query = NULL; - Query = new toQuery(conn, toQuery::Long); - } - catch (...) - { - delete Query; - Query = NULL; - Error = qApp->translate("toNoBlockQuery", "Couldn't open query"); - throw; - } - - try - { - if (Statistics) - Statistics->changeSession(*Query); - } - catch (...) - { -// TLOG(3,toDecorator,__HERE__) -// << "Unhandled exception: " << __HERE__ << std::endl; - Statistics = NULL; - } - - int val = toConfigurationSingle::Instance().autoLong(); - if (val != 0) - Started = time(NULL) + val; - else - Started = 0; - - toLocker lock (Lock) - ; - try - { - toThread *thread = new toThread(new queryTask(*this)); - thread->start(); - } - catch (...) - { -// TLOG(3,toDecorator,__HERE__) -// << "Unhandled exception: " << __HERE__ << std::endl; - Error = qApp->translate("toNoBlockQuery", "Failed to start background query thread"); - while (Running.getValue()) - Running.down(); - Quit = EOQ = true; - delete Query; - Query = NULL; - } -} - -toNoBlockQuery::toNoBlockQuery(toConnection &conn, toQuery::queryMode mode, - const QString &sql, const toQList ¶m, toResultStats *stats) - : SQL(sql), - Error(QString::null), - Param(param), - Statistics(stats) -{ - CurrentValue = Values.end(); - Quit = EOQ = false; - Processed = 0; - - try - { - Query = NULL; - Query = new toQuery(conn, mode); - } - catch (...) - { - delete Query; - Query = NULL; - Error = qApp->translate("toNoBlockQuery", "Couldn't open query"); - throw; - } - - try - { - if (Statistics) - Statistics->changeSession(*Query); - } - catch (...) - { -// TLOG(3,toDecorator,__HERE__) -// << "Unhandled exception: " << __HERE__ << std::endl; - Statistics = NULL; - } - - int val = toConfigurationSingle::Instance().autoLong(); - if (val != 0) - Started = time(NULL) + val; - else - Started = 0; - - toLocker lock (Lock) - ; - try - { - toThread *thread = new toThread(new queryTask(*this)); - thread->start(); - } - catch (...) - { - // TLOG(3,toDecorator,__HERE__) << "Unhandled exception: " << __HERE__ << std::endl; - Error = qApp->translate("toNoBlockQuery", "Failed to start background query thread"); - while (Running.getValue()) - Running.down(); - Quit = EOQ = true; - delete Query; - Query = NULL; - } -} - -toQDescList const &toNoBlockQuery::describe(void) const -{ - toLocker lock (Lock) - ; - checkError(); - return Description; -} - -bool toNoBlockQuery::eof(void) -{ - toLocker lock (Lock) - ; - checkError(); - return EOQ && CurrentValue == Values.end() && !ReadingValues.size(); -} - -int toNoBlockQuery::rowsProcessed(void) -{ - toLocker lock (Lock) - ; - checkError(); - return Processed; -} - -void toNoBlockQuery::stop(void) -{ - Lock.lock(); - int sleep = 100; - while (!EOQ) - { - Quit = true; - ReadingValues.clear(); - Continue.up(); - Lock.unlock(); - - toThread::msleep(sleep); - - Lock.lock(); - if (Running.getValue() == 0) - { - if (Query) - { - Query->cancel(); - sleep += 100; - } - } - } - Lock.unlock(); - - if (Statistics) - { - Statistics->refreshStats(false); - } - while (Query) - { - fprintf(stderr, "Internal error, query not deleted after stopping it.\n"); - toThread::msleep(100); - } -} - -toNoBlockQuery::~toNoBlockQuery() -{ - try - { - stop(); - } - TOCATCH -} - -bool toNoBlockQuery::poll(void) -{ - unsigned int count = 0; - for (toQList::iterator i = CurrentValue;i != Values.end();i++) - count++; - if (Running.getValue() > 0) - { - toLocker lock (Lock) - ; - count += ReadingValues.size(); - } - - if ((count >= Description.size() && Description.size() > 0) || eof()) - return true; - - Lock.lock(); - if (Started > 0 && Started < time(NULL) && !Description.size()) - { - if (Query && (Query->mode() == toQuery::Normal || Query->mode() == toQuery::Background)) - { - try - { - toStatusMessage(qApp->translate("toNoBlockQuery", "Restarting query in own connection"), false, false); - toConnection &conn = Query->connection(); - Lock.unlock(); - stop(); - toLocker lock (Lock) - ; - while (Running.getValue() > 0) - Running.down(); - while (Continue.getValue() > 0) - Continue.down(); - Error = QString(); - ReadingValues.clear(); - Values.clear(); - CurrentValue = Values.end(); - TLOG(3,toDecorator,__HERE__) << "CurrentValue=Values.end()" << std::endl; - Quit = EOQ = false; - Processed = 0; - - Query = new toQuery(conn, toQuery::Long); - - try - { - if (Statistics) - Statistics->changeSession(*Query); - } - catch (...) - { - TLOG(3,toDecorator,__HERE__) << "Exception(a): toNoBlockQuery::poll()" << std::endl; - Statistics = NULL; - } - - toThread *thread = new toThread(new queryTask(*this)); - thread->start(); - } - catch (...) - { - TLOG(3,toDecorator,__HERE__) << "Exception(b): toNoBlockQuery::poll()" << std::endl; - Error = qApp->translate("toNoBlockQuery", "Failed to start background query thread"); - while (Running.getValue()) - Running.down(); - Quit = EOQ = true; - delete Query; - Query = NULL; - } - } - else - Lock.unlock(); - } - else - Lock.unlock(); - - return false; -} - -void toNoBlockQuery::checkError() const -{ - if (!Error.isNull()) - { - throw Error; - } -} Deleted: branches/tora-trotl/src/tonoblockquery.h =================================================================== --- branches/tora-trotl/src/tonoblockquery.h 2010-11-07 18:02:29 UTC (rev 3801) +++ branches/tora-trotl/src/tonoblockquery.h 2010-11-09 11:18:06 UTC (rev 3802) @@ -1,195 +0,0 @@ - -/* BEGIN_COMMON_COPYRIGHT_HEADER - * - * TOra - An Oracle Toolkit for DBA's and developers - * - * Shared/mixed copyright is held throughout files in this product - * - * Portions Copyright (C) 2000-2001 Underscore AB - * Portions Copyright (C) 2003-2005 Quest Software, Inc. - * Portions Copyright (C) 2004-2009 Numerous Other Contributors - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; only version 2 of - * the License is valid for this program. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * As a special exception, you have permission to link this program - * with the Oracle Client libraries and distribute executables, as long - * as you follow the requirements of the GNU GPL in regard to all of the - * software in the executable aside from Oracle client libraries. - * - * Specifically you are not permitted to link this program with the - * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. - * And you are not permitted to distribute binaries compiled against - * these libraries. - * - * You may link this product with any GPL'd Qt library. - * - * All trademarks belong to their respective owners. - * - * END_COMMON_COPYRIGHT_HEADER */ - -#ifndef TONOBLOCKQUERY_H -#define TONOBLOCKQUERY_H - -#include "config.h" -#include "toconnection.h" -#include "tothread.h" - -#include <QObject> -#include <time.h> - -class toResultStats; - -/** This is class to be able to run a query in the background without - * blocking until a response is available from OCI. - */ - -class toNoBlockQuery : public QObject -{ - Q_OBJECT; - -private: - /** A task to implement running the query. - */ -class queryTask : public toTask - { - toNoBlockQuery &Parent; - public: - queryTask(toNoBlockQuery &parent) - : Parent(parent) - { } - virtual void run(void); - }; - friend class queryTask; - - /** This semaphore indicates wether the query is still running. - */ - toSemaphore Running; - /** This semaphore indicates wether the child thread should - * continue reading values. - */ - toSemaphore Continue; - /** Lock for all this stuff - */ - mutable toLock Lock; - /** Current location that values are being read. - */ - toQList::iterator CurrentValue; - /** Values read by the task. This can be changed without holding @ref Lock. - */ - toQList ReadingValues; - /** Values ready to be read by client. - */ - toQList Values; - /** Indicator if at end of query. - */ - bool EOQ; - /** Indicator if to quit reading from query. - */ - bool Quit; - /** SQL to execute. - */ - QString SQL; - /** Error string if error occurs. - */ - toConnection::exception Error; - /** Number of rows processed. - */ - int Processed; - /** Parameters to pass to query before execution. - */ - toQList Param; - /** Statistics to be used if any. - */ - QPointer<toResultStats> Statistics; - /** Description of result - */ - toQDescList Description; - /** When query is executed - */ - time_t Started; - /** Query used to run query - */ - toQuery *Query; - /** Throw error if any. - */ - void checkError() const; - /** Stop reading query - */ - void stop(); -public: - /** Create a new query. - * @param conn Connection to run on. - * @param sql SQL to execute. - * @param param Parameters to pass to query. - * @param statistics Optional statistics widget to update with values from query. - */ - toNoBlockQuery(toConnection &conn, - const QString &sql, - const toQList ¶m, - toResultStats *statistics = NULL); - /** Create a new query. - * @param conn Connection to run on. - * @param mode Query mode to execute query in. - * @param sql SQL to execute. - * @param param Parameters to pass to query. - * @param statistics Optional statistics widget to update with values from query. - */ - toNoBlockQuery(toConnection &conn, - toQuery::queryMode mode, - const QString &sql, - const toQList ¶m, - toResultStats *statistics = NULL); - virtual ~toNoBlockQuery(); - - /** Poll if any result is available. - * @return Tr... [truncated message content] |
From: <ibr...@us...> - 2010-11-10 12:31:08
|
Revision: 3806 http://tora.svn.sourceforge.net/tora/?rev=3806&view=rev Author: ibre5041 Date: 2010-11-10 12:31:00 +0000 (Wed, 10 Nov 2010) Log Message: ----------- proposed change in nullity handling Modified Paths: -------------- branches/tora-trotl/src/toanalyze.cpp branches/tora-trotl/src/tobrowserdblinkswidget.cpp branches/tora-trotl/src/tobrowsertable.cpp branches/tora-trotl/src/tocodemodel.cpp branches/tora-trotl/src/toconnection.cpp branches/tora-trotl/src/toconnection.h branches/tora-trotl/src/todebug.cpp branches/tora-trotl/src/toeventquery.cpp branches/tora-trotl/src/toeventquery.h branches/tora-trotl/src/toeventquerytask.cpp branches/tora-trotl/src/tologger.h branches/tora-trotl/src/tooracleconnection.cpp branches/tora-trotl/src/tooracleextract.cpp branches/tora-trotl/src/tooutput.cpp branches/tora-trotl/src/toprofiler.cpp branches/tora-trotl/src/toqsqlconnection.cpp branches/tora-trotl/src/toqvalue.cpp branches/tora-trotl/src/toqvalue.h branches/tora-trotl/src/toresultcols.cpp branches/tora-trotl/src/toresultmodel.cpp branches/tora-trotl/src/toresultpie.cpp branches/tora-trotl/src/toresultplan.cpp branches/tora-trotl/src/toresultstorage.cpp branches/tora-trotl/src/toresulttableviewedit.cpp branches/tora-trotl/src/toscripttreemodel.cpp branches/tora-trotl/src/tosecuritytreemodel.cpp branches/tora-trotl/src/tostorage.cpp branches/tora-trotl/src/totuning.cpp branches/tora-trotl/src/towaitevents.cpp branches/tora-trotl/src/utils.cpp Modified: branches/tora-trotl/src/toanalyze.cpp =================================================================== --- branches/tora-trotl/src/toanalyze.cpp 2010-11-10 12:29:30 UTC (rev 3805) +++ branches/tora-trotl/src/toanalyze.cpp 2010-11-10 12:31:00 UTC (rev 3806) @@ -535,7 +535,7 @@ { int cols = q->describe().size(); for (int j = 0; j < cols; j++) - q->readValueNull(); // Eat the output if any. + q->readValue(); // Eat the output if any. Current->setText(tr("Running %1 Pending %2").arg(Running.size()).arg(Pending.size())); } @@ -653,7 +653,7 @@ break; } QString owner = Statistics->model()->data((*it).row(), 2).toString(); - if (toUnnull(owner).isNull()) + if (owner.isNull()) owner = Schema->selected(); ret.append(sql.arg(owner).arg( Statistics->model()->data((*it).row(), 1).toString())); Modified: branches/tora-trotl/src/tobrowserdblinkswidget.cpp =================================================================== --- branches/tora-trotl/src/tobrowserdblinkswidget.cpp 2010-11-10 12:29:30 UTC (rev 3805) +++ branches/tora-trotl/src/tobrowserdblinkswidget.cpp 2010-11-10 12:31:00 UTC (rev 3806) @@ -103,8 +103,8 @@ toQList resultset; try { - resultset = toQuery::readQueryNull(toCurrentConnection(this), - "SELECT * FROM dual@" + object()); + resultset = toQuery::readQuery(toCurrentConnection(this), + "SELECT * FROM dual@" + object()); } TOCATCH; Modified: branches/tora-trotl/src/tobrowsertable.cpp =================================================================== --- branches/tora-trotl/src/tobrowsertable.cpp 2010-11-10 12:29:30 UTC (rev 3805) +++ branches/tora-trotl/src/tobrowsertable.cpp 2010-11-10 12:31:00 UTC (rev 3806) @@ -334,7 +334,7 @@ toQuery query(connection(), SQLListTablespaces); // TODO: does this create NEW connection??!! while (!query.eof()) { - QString t = query.readValueNull(); + QString t = query.readValue(); Tablespace->addItem(t); if (t == tablespace) Tablespace->setCurrentIndex(Tablespace->count() - 1); Modified: branches/tora-trotl/src/tocodemodel.cpp =================================================================== --- branches/tora-trotl/src/tocodemodel.cpp 2010-11-10 12:29:30 UTC (rev 3805) +++ branches/tora-trotl/src/tocodemodel.cpp 2010-11-10 12:31:00 UTC (rev 3806) @@ -459,8 +459,8 @@ emit layoutAboutToBeChanged(); while (!query.eof()) { - ctype = query.readValueNull(); - cstatus = query.readValueNull(); + ctype = query.readValue(); + cstatus = query.readValue(); new toCodeModelItem(item, ctype, ctype, cstatus); // "inherit" child status for parent if it's required @@ -498,9 +498,9 @@ while(query->hasMore()) { - QString cname = query->readValueNull().toString(); - QString ctype = query->readValueNull().toString(); - QString cstatus = query->readValueNull().toString(); + QString cname = query->readValue(); + QString ctype = query->readValue(); + QString cstatus = query->readValue(); toCodeModelItem *item = 0; if(ctype == QString("PACKAGE")) Modified: branches/tora-trotl/src/toconnection.cpp =================================================================== --- branches/tora-trotl/src/toconnection.cpp 2010-11-10 12:29:30 UTC (rev 3805) +++ branches/tora-trotl/src/toconnection.cpp 2010-11-10 12:31:00 UTC (rev 3806) @@ -669,77 +669,15 @@ return ret; } -toQList toQuery::readQueryNull(toConnection &conn, const toSQL &sql, toQList ¶ms) -{ - toBusy busy; - toQuery query(conn, sql, params); - toQList ret; - while (!query.eof()) - ret.insert(ret.end(), query.readValueNull()); - return ret; -} - -toQList toQuery::readQueryNull(toConnection &conn, const QString &sql, toQList ¶ms) -{ - toQuery query(conn, sql, params); - toQList ret; - while (!query.eof()) - ret.insert(ret.end(), query.readValueNull()); - return ret; -} - -toQList toQuery::readQueryNull(toConnection &conn, const toSQL &sql, - const QString &arg1, const QString &arg2, - const QString &arg3, const QString &arg4, - const QString &arg5, const QString &arg6, - const QString &arg7, const QString &arg8, - const QString &arg9) -{ - toBusy busy; - toQuery query(conn, sql, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9); - toQList ret; - while (!query.eof()) - ret.insert(ret.end(), query.readValueNull()); - return ret; -} - -toQList toQuery::readQueryNull(toConnection &conn, const QString &sql, - const QString &arg1, const QString &arg2, - const QString &arg3, const QString &arg4, - const QString &arg5, const QString &arg6, - const QString &arg7, const QString &arg8, - const QString &arg9) -{ - toBusy busy; - toQuery query(conn, sql, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9); - toQList ret; - while (!query.eof()) - ret.insert(ret.end(), query.readValueNull()); - return ret; -} - toQValue toQuery::readValue(void) { - //TLOG(0,toDecorator,__HERE__) << this->sql().left(50).toUtf8().constData() << std::endl; + TLOG(4,toDecorator,__HERE__) << this->sql().left(50).toUtf8().constData() << std::endl; if (!Connection) return toQValue(0); if (Connection->Abort) throw qApp->translate("toQuery", "Query aborted"); - return toNull(Query->readValue()); -} - -toQValue toQuery::readValueNull(void) -{ - //TODO - //TLOG(0,toDecorator,__HERE__) << this->sql().left(50).toUtf8().constData() << std::endl; - - if (!Connection) - return toQValue(0); - - if (Connection->Abort) - throw qApp->translate("toQuery", "Query aborted"); return Query->readValue(); } Modified: branches/tora-trotl/src/toconnection.h =================================================================== --- branches/tora-trotl/src/toconnection.h 2010-11-10 12:29:30 UTC (rev 3805) +++ branches/tora-trotl/src/toconnection.h 2010-11-10 12:31:00 UTC (rev 3806) @@ -394,14 +394,10 @@ return Mode; } - /** Read a value from the query. Convert the value NULL to the string {null}. + /** Read a value from the query. * @return Value read. */ toQValue readValue(void); - /** Read a value from the query. Nulls are returned as empty @ref toQValue. - * @return Value read. - */ - toQValue readValueNull(void); /** Check if end of query is reached. * @return True if end of query is reached. */ @@ -477,48 +473,7 @@ const QString &arg5 = QString::null, const QString &arg6 = QString::null, const QString &arg7 = QString::null, const QString &arg8 = QString::null, const QString &arg9 = QString::null); - /** Execute a query and return all the values returned by it. - * @param conn Connection to run query on. - * @param sql SQL to run. - * @param params Parameters to pass to query. - * @return A list of @ref toQValues:s read from the query. - */ - static std::list<toQValue> readQueryNull(toConnection &conn, - const toSQL &sql, - std::list<toQValue> ¶ms); - /** Execute a query and return all the values returned by it. - * @param conn Connection to run query on. - * @param sql SQL to run. - * @param params Parameters to pass to query. - * @return A list of @ref toQValues:s read from the query. - */ - static std::list<toQValue> readQueryNull(toConnection &conn, - const QString &sql, - std::list<toQValue> ¶ms); - /** Execute a query and return all the values returned by it. - * @param conn Connection to run query on. - * @param sql SQL to run. - * @param arg1 Parameters to pass to query. - * @return A list of @ref toQValues:s read from the query. - */ - static std::list<toQValue> readQueryNull(toConnection &conn, const toSQL &sql, - const QString &arg1 = QString::null, const QString &arg2 = QString::null, - const QString &arg3 = QString::null, const QString &arg4 = QString::null, - const QString &arg5 = QString::null, const QString &arg6 = QString::null, - const QString &arg7 = QString::null, const QString &arg8 = QString::null, - const QString &arg9 = QString::null); - /** Execute a query and return all the values returned by it. - * @param conn Connection to run query on. - * @param sql SQL to run. - * @param arg1 Parameters to pass to query. - * @return A list of @ref toQValues:s read from the query. - */ - static std::list<toQValue> readQueryNull(toConnection &conn, const QString &sql, - const QString &arg1 = QString::null, const QString &arg2 = QString::null, - const QString &arg3 = QString::null, const QString &arg4 = QString::null, - const QString &arg5 = QString::null, const QString &arg6 = QString::null, - const QString &arg7 = QString::null, const QString &arg8 = QString::null, - const QString &arg9 = QString::null); + /** Cancel the current execution of a query. */ void cancel(void); Modified: branches/tora-trotl/src/todebug.cpp =================================================================== --- branches/tora-trotl/src/todebug.cpp 2010-11-10 12:29:30 UTC (rev 3805) +++ branches/tora-trotl/src/todebug.cpp 2010-11-10 12:31:00 UTC (rev 3806) @@ -140,7 +140,7 @@ #ifdef DEBUG // perform self-check (should probably display scary message and close if this test fails) toQuery selfCheck(connection, SQLDebugSelfCheck); - QString str = selfCheck.readValueNull(); + QString str = selfCheck.readValue(); qDebug() << "DBMS_DEBUG.SELF_CHECK result: " << str; #endif @@ -402,7 +402,7 @@ { outputSession->execute(SQLDebugOutputPoll); ret = outputSession->readValue().toInt(); - QString str = outputSession->readValueNull(); + QString str = outputSession->readValue(); if (ret == 0 || str.length()) insertLine(str); } Modified: branches/tora-trotl/src/toeventquery.cpp =================================================================== --- branches/tora-trotl/src/toeventquery.cpp 2010-11-10 12:29:30 UTC (rev 3805) +++ branches/tora-trotl/src/toeventquery.cpp 2010-11-10 12:31:00 UTC (rev 3806) @@ -50,8 +50,8 @@ #include "torunnable.h" -toQValue toEventQuery::readValueNull() { - //TLOG(0,toDecorator,__HERE__) << std::endl; +toQValue toEventQuery::readValue() { + //TLOG(4,toDecorator,__HERE__) << std::endl; if(Values.isEmpty()) throw tr("Read past end of query"); @@ -65,11 +65,6 @@ } -toQValue toEventQuery::readValue() { - return toNull(readValueNull()); -} - - toEventQuery::toEventQuery(toConnection &conn, const QString &sql, const toQList ¶m, Modified: branches/tora-trotl/src/toeventquery.h =================================================================== --- branches/tora-trotl/src/toeventquery.h 2010-11-10 12:29:30 UTC (rev 3805) +++ branches/tora-trotl/src/toeventquery.h 2010-11-10 12:31:00 UTC (rev 3806) @@ -177,9 +177,9 @@ * * @return The next available value. */ - toQValue readValueNull(void); + //toQValue readValueNull(void); + - /** * Get the number of rows processed. * Modified: branches/tora-trotl/src/toeventquerytask.cpp =================================================================== --- branches/tora-trotl/src/toeventquerytask.cpp 2010-11-10 12:29:30 UTC (rev 3805) +++ branches/tora-trotl/src/toeventquerytask.cpp 2010-11-10 12:31:00 UTC (rev 3806) @@ -212,7 +212,7 @@ for(int row = 0; row < maxRead; row++) { for(int i = 0; i < Columns && !Query->eof(); i++) - values.append(Query->readValueNull()); + values.append(Query->readValue()); } if(values.size() > 0) Modified: branches/tora-trotl/src/tologger.h =================================================================== --- branches/tora-trotl/src/tologger.h 2010-11-10 12:29:30 UTC (rev 3805) +++ branches/tora-trotl/src/tologger.h 2010-11-10 12:31:00 UTC (rev 3806) @@ -67,14 +67,14 @@ } // tonoblockquery<4> - data read(disabled) -template<> -inline thread_safe_log templ_get_log_ownthread(int_to_type<4>*) -{ - static s_null_sink nsink; - static std::ostream out(&nsink); - static internal_thread_safe_log_ownthread log( out ); - return thread_safe_log( log); -} +/* template<> */ +/* inline thread_safe_log templ_get_log_ownthread(int_to_type<4>*) */ +/* { */ +/* static s_null_sink nsink; */ +/* static std::ostream out(&nsink); */ +/* static internal_thread_safe_log_ownthread log( out ); */ +/* return thread_safe_log( log); */ +/* } */ /* thread_safe_log templ_get_log_ownthread<1>( int_to_type< 1> * = NULL ) Modified: branches/tora-trotl/src/tooracleconnection.cpp =================================================================== --- branches/tora-trotl/src/tooracleconnection.cpp 2010-11-10 12:29:30 UTC (rev 3805) +++ branches/tora-trotl/src/tooracleconnection.cpp 2010-11-10 12:31:00 UTC (rev 3806) @@ -933,10 +933,10 @@ toConnection::objectName cur; while (!objects.eof()) { - cur.Owner = objects.readValueNull(); - cur.Name = objects.readValueNull(); - cur.Type = objects.readValueNull(); - cur.Comment = objects.readValueNull(); + cur.Owner = objects.readValue(); + cur.Name = objects.readValue(); + cur.Type = objects.readValue(); + cur.Comment = objects.readValue(); ret.insert(ret.end(), cur); } TLOG(0,toDecorator,__HERE__) @@ -958,9 +958,9 @@ std::list<toConnection::objectName>::iterator i = objects.begin(); while (!synonyms.eof()) { - QString synonym = synonyms.readValueNull(); - cur.Owner = synonyms.readValueNull(); - cur.Name = synonyms.readValueNull(); + QString synonym = synonyms.readValue(); + cur.Owner = synonyms.readValue(); + cur.Name = synonyms.readValue(); while (i != objects.end() && (*i) < cur) i++; if (i == objects.end()) @@ -996,8 +996,8 @@ { QString name = member.readValue(); QString overld = member.readValue(); - QString arg = member.readValueNull(); - QString type = member.readValueNull(); + QString arg = member.readValue(); + QString type = member.readValue(); if (lastName != name || overld != lastOver) { if (hasArgs) @@ -1051,7 +1051,7 @@ while (!comment.eof()) { QString col = comment.readValue(); - comments[col] = comment.readValueNull(); + comments[col] = comment.readValue(); } } catch (...) @@ -1469,13 +1469,13 @@ } else if( (bp.bind_typename == "char" || bp.bind_typename == "varchar") && ((*i).isString() || (*i).isNumber() || (*i).isNull() )) { - std::string param((const char*)((*i).toString().toUtf8().constData())); - (*Query) << ::std::string((const char*)((*i).toString().toUtf8().constData())); + std::string param((const char*)(((QString)*i).toUtf8().constData())); + (*Query) << param; TLOG(0,toDecorator,__HERE__) << "<<(conn=" << conn->_conn << ", this=" << Query << ")" << "::operator<<(" << bp.type_name << " ftype=" << bp.dty << ", placeholder=" << bp.bind_name - << ", value=" << ::std::string((const char*)((*i).toString().toUtf8().constData())) << ");" + << ", value=" << ::std::string((const char*)(((QString)*i).toUtf8().constData())) << ");" << "\t of:" << query()->params().size() << std::endl; } else { TLOG(0,toDecorator,__HERE__) @@ -1484,7 +1484,7 @@ << "<<(conn=" << conn->_conn << ", this=" << Query << ")" << "::operator<<(" << bp.type_name << " ftype=" << bp.dty << ", placeholder=" << bp.bind_name - << ", value=" << ::std::string((const char*)((*i).toString().toUtf8().constData())) << ");" + << ", value=" << ::std::string((const char*)(((QString)*i).toUtf8().constData())) << ");" << "\t of:" << query()->params().size() << std::endl; throw toConnection::exception( QString::fromLatin1("Fatal pruser error - unsupported BindPar:%1\nFor SQL:\n%2\n") Modified: branches/tora-trotl/src/tooracleextract.cpp =================================================================== --- branches/tora-trotl/src/tooracleextract.cpp 2010-11-10 12:29:30 UTC (rev 3805) +++ branches/tora-trotl/src/tooracleextract.cpp 2010-11-10 12:31:00 UTC (rev 3806) @@ -395,9 +395,9 @@ try { // TODO ? - resultset = toQuery::readQueryNull(CONNECTION, - "SELECT * FROM ctxsys.ctx_indexes " - "WHERE idx_owner = 'DUMMY'"); + resultset = toQuery::readQuery(CONNECTION, + "SELECT * FROM ctxsys.ctx_indexes " + "WHERE idx_owner = 'DUMMY'"); } catch (...) { @@ -410,10 +410,10 @@ for (it = ql.begin();it != ql.end();++it) { if (isDBA) - resultset = toQuery::readQueryNull(CONNECTION, SQLContextInfoDBA, + resultset = toQuery::readQuery(CONNECTION, SQLContextInfoDBA, owner, name, *it); else - resultset = toQuery::readQueryNull(CONNECTION, SQLContextInfo, + resultset = toQuery::readQuery(CONNECTION, SQLContextInfo, name, *it); if (!resultset.empty()) { @@ -446,10 +446,10 @@ // some preferences don't have any attributes and // so won't be caught above if (isDBA) - resultset = toQuery::readQueryNull(CONNECTION, SQLContextInfoNoAttrDBA, + resultset = toQuery::readQuery(CONNECTION, SQLContextInfoNoAttrDBA, owner, name, *it); else - resultset = toQuery::readQueryNull(CONNECTION, SQLContextInfoNoAttr, + resultset = toQuery::readQuery(CONNECTION, SQLContextInfoNoAttr, name, *it); if (!resultset.empty()) { @@ -466,10 +466,10 @@ // Now get the stoplist if (isDBA) - resultset = toQuery::readQueryNull(CONNECTION, SQLContextInfoDBA, + resultset = toQuery::readQuery(CONNECTION, SQLContextInfoDBA, owner, name, "STOPLIST"); else - resultset = toQuery::readQueryNull(CONNECTION, SQLContextInfo, + resultset = toQuery::readQuery(CONNECTION, SQLContextInfo, name, "STOPLIST"); pre_name = ""; while (!resultset.empty()) @@ -500,10 +500,10 @@ // When everybody is out to get you paranoia just seems like a good idea. if (isDBA) - resultset = toQuery::readQueryNull(CONNECTION, SQLContextInfoNoAttrDBA, + resultset = toQuery::readQuery(CONNECTION, SQLContextInfoNoAttrDBA, owner, name, "STOPLIST"); else - resultset = toQuery::readQueryNull(CONNECTION, SQLContextInfoNoAttr, + resultset = toQuery::readQuery(CONNECTION, SQLContextInfoNoAttr, name, "STOPLIST"); if (!resultset.empty()) @@ -520,10 +520,10 @@ // get the section_groups if (isDBA) - resultset = toQuery::readQueryNull(CONNECTION, SQLContextInfoDBA, + resultset = toQuery::readQuery(CONNECTION, SQLContextInfoDBA, owner, name, "SECTION_GROUP"); else - resultset = toQuery::readQueryNull(CONNECTION, SQLContextInfo, + resultset = toQuery::readQuery(CONNECTION, SQLContextInfo, name, "SECTION_GROUP"); pre_name = ""; while (!resultset.empty()) @@ -565,10 +565,10 @@ else { if (isDBA) - resultset = toQuery::readQueryNull(CONNECTION, SQLContextInfoNoAttrDBA, + resultset = toQuery::readQuery(CONNECTION, SQLContextInfoNoAttrDBA, owner, name, "SECTION_GROUP"); else - resultset = toQuery::readQueryNull(CONNECTION, SQLContextInfoNoAttr, + resultset = toQuery::readQuery(CONNECTION, SQLContextInfoNoAttr, name, "SECTION_GROUP"); if (!resultset.empty()) { @@ -587,10 +587,10 @@ if (CONNECTION.version() >= "080106") { if (isDBA) - resultset = toQuery::readQueryNull(CONNECTION, SQLContextColumnDBA, + resultset = toQuery::readQuery(CONNECTION, SQLContextColumnDBA, owner, name); else - resultset = toQuery::readQueryNull(CONNECTION, SQLContextColumn, + resultset = toQuery::readQuery(CONNECTION, SQLContextColumn, name); if (!resultset.empty()) { @@ -745,12 +745,12 @@ QString toOracleExtract::createIOT(toExtract &ext, const QString &schema, const QString &owner, const QString &name) const { - toQList storage = toQuery::readQueryNull(CONNECTION, SQLIOTInfo, name, owner); + toQList storage = toQuery::readQuery(CONNECTION, SQLIOTInfo, name, owner); QString ret = createTableText(ext, storage, schema, owner, name); if (ext.getStorage()) { - toQList overflow = toQuery::readQueryNull(CONNECTION, segments(ext, SQLOverflowInfo), name, owner); + toQList overflow = toQuery::readQuery(CONNECTION, segments(ext, SQLOverflowInfo), name, owner); if (overflow.size() == 18) { ret += "OVERFLOW\n"; @@ -791,7 +791,7 @@ ret += tableColumns(ext, owner, name); if (organization == "INDEX" && ext.getStorage()) { - toQList res = toQuery::readQueryNull(CONNECTION, SQLPrimaryKey, name, owner); + toQList res = toQuery::readQuery(CONNECTION, SQLPrimaryKey, name, owner); if (res.size() != 2) throw qApp->translate("toOracleExtract", "Couldn't find primary key of %1.%2").arg(owner).arg(name); QString primary = *(res.begin()); @@ -894,7 +894,7 @@ const QString &name, const QString &type) const { - toQList result = toQuery::readQueryNull(CONNECTION, SQLMViewInfo, name, owner); + toQList result = toQuery::readQuery(CONNECTION, SQLMViewInfo, name, owner); if (result.empty()) throw qApp->translate("toOracleExtract", "Couldn't find materialised table %1.%2"). arg(QUOTE(owner)).arg(QUOTE(name)); @@ -1037,7 +1037,7 @@ const QString &name, const QString &type) const { - toQList result = toQuery::readQueryNull(CONNECTION, SQLSnapshotInfo, name, owner); + toQList result = toQuery::readQuery(CONNECTION, SQLSnapshotInfo, name, owner); if (result.size() != 4) throw qApp->translate("toOracleExtract", "Couldn't find log %1.%2").arg(owner).arg(name); @@ -1301,12 +1301,12 @@ const QString &owner, const QString &name) const { - toQList result = toQuery::readQueryNull(CONNECTION, SQLPartitionedIOTInfo, + toQList result = toQuery::readQuery(CONNECTION, SQLPartitionedIOTInfo, QString::number(ext.getBlockSize()), name, owner); QString ret = createTableText(ext, result, schema, owner, name); if (ext.getStorage()) { - toQList overflow = toQuery::readQueryNull(CONNECTION, segments(ext, SQLOverflowInfo), name, owner); + toQList overflow = toQuery::readQuery(CONNECTION, segments(ext, SQLOverflowInfo), name, owner); if (overflow.size() == 18) { ret += "OVERFLOW\n"; @@ -1542,7 +1542,7 @@ return ""; QString ret = sql; - toQList result = toQuery::readQueryNull(CONNECTION, SQLIndexPartition, + toQList result = toQuery::readQuery(CONNECTION, SQLIndexPartition, QString::number(ext.getBlockSize()), name, owner); QString partitionType = toShift(result); QString subPartitionType = toShift(result); @@ -1872,7 +1872,7 @@ const QString &owner, const QString &name) const { - toQList storage = toQuery::readQueryNull(CONNECTION, SQLPartitionTableInfo, + toQList storage = toQuery::readQuery(CONNECTION, SQLPartitionTableInfo, QString::number(ext.getBlockSize()), name, owner); QString organization; @@ -1889,7 +1889,7 @@ if (ext.getPartition()) { - toQList type = toQuery::readQueryNull(CONNECTION, SQLPartitionType, name, owner); + toQList type = toQuery::readQuery(CONNECTION, SQLPartitionType, name, owner); QString partitionType (toShift(type)); QString partitionCount (toShift(type)); QString subPartitionType (toShift(type)); @@ -1911,7 +1911,7 @@ } ret += "(\n"; - toQList segment = toQuery::readQueryNull(CONNECTION, SQLPartitionSegment, name, owner); + toQList segment = toQuery::readQuery(CONNECTION, SQLPartitionSegment, name, owner); QString comma = " "; while (!segment.empty()) @@ -1934,7 +1934,7 @@ if (subPartitionType == "HASH") { - toQList subs = toQuery::readQueryNull(CONNECTION, SQLSubPartitionName, + toQList subs = toQuery::readQuery(CONNECTION, SQLSubPartitionName, name, partition, owner); bool first = true; ret += " (\n "; @@ -1954,7 +1954,7 @@ } else { - toQList hash = toQuery::readQueryNull(CONNECTION, SQLPartitionName, name, owner); + toQList hash = toQuery::readQuery(CONNECTION, SQLPartitionName, name, owner); bool first = true; ret += "(\n "; while (!hash.empty()) @@ -2027,7 +2027,7 @@ QString ret; if ((typ&1) == 1) { - toQList result = toQuery::readQueryNull(CONNECTION, SQLSystemPrivs, name); + toQList result = toQuery::readQuery(CONNECTION, SQLSystemPrivs, name); while (!result.empty()) { QString priv = QString(toShift(result)).toLower(); @@ -2048,7 +2048,7 @@ if ((typ&2) == 2) { - toQList result = toQuery::readQueryNull(CONNECTION, SQLRolePrivs, name); + toQList result = toQuery::readQuery(CONNECTION, SQLRolePrivs, name); while (!result.empty()) { QString priv = QString(toShift(result)).toLower(); @@ -2069,7 +2069,7 @@ if ((typ&4) == 4) { - toQList result = toQuery::readQueryNull(CONNECTION, SQLObjectPrivs, name); + toQList result = toQuery::readQuery(CONNECTION, SQLObjectPrivs, name); while (!result.empty()) { QString priv = QString(toShift(result)).toLower(); @@ -2267,7 +2267,7 @@ if (!ext.getPartition()) return ""; - toQList result = toQuery::readQueryNull(CONNECTION, SQLRangePartitions, name, owner); + toQList result = toQuery::readQuery(CONNECTION, SQLRangePartitions, name, owner); if (result.empty() || result.size() % 18) throw qApp->translate("toOracleExtract", "Couldn't find partition range %1.%2").arg(owner).arg(name); @@ -2701,7 +2701,7 @@ const QString &owner, const QString &name) const { - toQList cols = toQuery::readQueryNull(CONNECTION, SQLTableColumns, name, owner); + toQList cols = toQuery::readQuery(CONNECTION, SQLTableColumns, name, owner); bool first = true; QString ret; while (!cols.empty()) @@ -2847,21 +2847,21 @@ if (!ext.getGrants()) return ; - toQList result = toQuery::readQueryNull(CONNECTION, SQLRolePrivs, name); + toQList result = toQuery::readQuery(CONNECTION, SQLRolePrivs, name); while (!result.empty()) { QString role = QUOTE(toShift(result)); addDescription(lst, ctx, "GRANT", "ROLE " + role, toShift(result)); } - result = toQuery::readQueryNull(CONNECTION, SQLSystemPrivs, name); + result = toQuery::readQuery(CONNECTION, SQLSystemPrivs, name); while (!result.empty()) { QString priv = QString(toShift(result)).toLower(); addDescription(lst, ctx, "GRANT", priv, toShift(result)); } - result = toQuery::readQueryNull(CONNECTION, SQLObjectPrivs, name); + result = toQuery::readQuery(CONNECTION, SQLObjectPrivs, name); while (!result.empty()) { QString priv = toShift(result); @@ -2879,13 +2879,13 @@ const QString &owner, const QString &name) const { - toQList storage = toQuery::readQueryNull(CONNECTION, SQLIOTInfo, name, owner); + toQList storage = toQuery::readQuery(CONNECTION, SQLIOTInfo, name, owner); describeTableText(ext, lst, ctx, storage, schema, owner, name); describeComments(ext, lst, ctx, owner, name); if (ext.getStorage()) { - toQList overflow = toQuery::readQueryNull(CONNECTION, segments(ext, SQLOverflowInfo), name, owner); + toQList overflow = toQuery::readQuery(CONNECTION, segments(ext, SQLOverflowInfo), name, owner); if (overflow.size() == 18) { ctx.insert(ctx.end(), "OVERFLOW"); @@ -2933,7 +2933,7 @@ const QString &schema, const QString &owner, const QString &name, const QString &type) const { - toQList result = toQuery::readQueryNull(CONNECTION, SQLMViewInfo, name, owner); + toQList result = toQuery::readQuery(CONNECTION, SQLMViewInfo, name, owner); if (result.empty()) throw qApp->translate("toOracleExtract", "Couldn't find materialised table %1.%2"). arg(QUOTE(owner)).arg(QUOTE(name)); @@ -3044,7 +3044,7 @@ const QString &name, const QString &type) const { - toQList result = toQuery::readQueryNull(CONNECTION, SQLSnapshotInfo, name, owner); + toQList result = toQuery::readQuery(CONNECTION, SQLSnapshotInfo, name, owner); if (result.size() != 4) throw qApp->translate("toOracleExtract", "Couldn't find log %1.%2").arg(owner).arg(name); @@ -3128,7 +3128,7 @@ if (!ext.getPartition()) return ; - toQList result = toQuery::readQueryNull(CONNECTION, SQLRangePartitions, name, owner); + toQList result = toQuery::readQuery(CONNECTION, SQLRangePartitions, name, owner); if (result.empty() || result.size() % 18) throw qApp->translate("toOracleExtract", "Couldn't find partition range %1.%2").arg(owner).arg(name); @@ -3171,7 +3171,7 @@ const QString &owner, const QString &name) const { - toQList result = toQuery::readQueryNull(CONNECTION, SQLPartitionedIOTInfo, + toQList result = toQuery::readQuery(CONNECTION, SQLPartitionedIOTInfo, QString::number(ext.getBlockSize()), name, owner); describeTableText(ext, lst, ctx, result, schema, owner, name); if (ext.getPartition()) @@ -3189,7 +3189,7 @@ describeComments(ext, lst, ctx, owner, name); if (ext.getStorage()) { - toQList overflow = toQuery::readQueryNull(CONNECTION, segments(ext, SQLOverflowInfo), name, owner); + toQList overflow = toQuery::readQuery(CONNECTION, segments(ext, SQLOverflowInfo), name, owner); if (overflow.size() == 18) { ctx.insert(ctx.end(), "OVERFLOW"); @@ -3208,7 +3208,7 @@ if (!ext.getPartition()) return ; - toQList result = toQuery::readQueryNull(CONNECTION, SQLIndexPartition, + toQList result = toQuery::readQuery(CONNECTION, SQLIndexPartition, QString::number(ext.getBlockSize()), owner, name); QString partitionType = toShift(result); QString subPartitionType = toShift(result); @@ -3247,7 +3247,7 @@ const QString &owner, const QString &name) const { - toQList storage = toQuery::readQueryNull(CONNECTION, SQLPartitionTableInfo, + toQList storage = toQuery::readQuery(CONNECTION, SQLPartitionTableInfo, QString::number(ext.getBlockSize()), name, owner); QString organization; @@ -3264,7 +3264,7 @@ if (ext.getPartition()) { - toQList type = toQuery::readQueryNull(CONNECTION, SQLPartitionType, name, owner); + toQList type = toQuery::readQuery(CONNECTION, SQLPartitionType, name, owner); QString partitionType (toShift(type)); QString partitionCount (toShift(type)); QString subPartitionType (toShift(type)); @@ -3286,7 +3286,7 @@ addDescription(lst, ctx, subprtstr); } - toQList segment = toQuery::readQueryNull(CONNECTION, SQLPartitionSegment, name, owner); + toQList segment = toQuery::readQuery(CONNECTION, SQLPartitionSegment, name, owner); while (!segment.empty()) { @@ -3307,7 +3307,7 @@ if (subPartitionType == "HASH") { - toQList subs = toQuery::readQueryNull(CONNECTION, SQLSubPartitionName, + toQList subs = toQuery::readQuery(CONNECTION, SQLSubPartitionName, name, partition, owner); while (!subs.empty()) { @@ -3322,7 +3322,7 @@ } else { - toQList hash = toQuery::readQueryNull(CONNECTION, SQLPartitionName, + toQList hash = toQuery::readQuery(CONNECTION, SQLPartitionName, name, owner); while (!hash.empty()) { @@ -3362,7 +3362,7 @@ const QString &owner, const QString &name) const { - toQList cols = toQuery::readQueryNull(CONNECTION, SQLTableColumns, name, owner); + toQList cols = toQuery::readQuery(CONNECTION, SQLTableColumns, name, owner); int num = 1; while (!cols.empty()) { @@ -3669,7 +3669,7 @@ QString sql = toSQL::string(SQLExchangeIndex, CONNECTION). arg(type).arg(blocks); - toQList result = toQuery::readQueryNull(CONNECTION, sql, segment, partition, owner); + toQList result = toQuery::readQuery(CONNECTION, sql, segment, partition, owner); QString degree = toShift(result); QString instances = toShift(result); QString table = toShift(result); @@ -3772,7 +3772,7 @@ QString blocks = inf.readValue(); QString sql = toSQL::string(SQLExchangeTable, CONNECTION).arg(type).arg(blocks); - toQList result = toQuery::readQueryNull(CONNECTION, sql, segment, partition, owner); + toQList result = toQuery::readQuery(CONNECTION, sql, segment, partition, owner); QString ret = createTableText(ext, result, schema, owner, segment); ret += ";\n\n"; return ret; @@ -3990,7 +3990,7 @@ if (!ext.getIndexes()) return ""; - toQList res = toQuery::readQueryNull(CONNECTION, SQLIndexInfo, name, owner); + toQList res = toQuery::readQuery(CONNECTION, SQLIndexInfo, name, owner); if (res.size() != 10) throw qApp->translate("toOracleExtract", "Couldn't find index %1.%2").arg(owner).arg(name); @@ -4005,7 +4005,7 @@ QString domName = toShift(res); QString domParam = toShift(res); - toQList storage = toQuery::readQueryNull(CONNECTION, segments(ext, SQLIndexSegment), name, owner); + toQList storage = toQuery::readQuery(CONNECTION, segments(ext, SQLIndexSegment), name, owner); QString degree = toShift(storage); QString instances = toShift(storage); QString compressed = toShift(storage); @@ -4141,7 +4141,7 @@ const QString &, const QString &name) const { - toQList info = toQuery::readQueryNull(CONNECTION, + toQList info = toQuery::readQuery(CONNECTION, SQLProfileInfo, name); if (info.empty()) @@ -4189,7 +4189,7 @@ const QString &, const QString &name) const { - toQList info = toQuery::readQueryNull(CONNECTION, + toQList info = toQuery::readQuery(CONNECTION, SQLRoleInfo, name); if (info.empty()) @@ -4231,7 +4231,7 @@ const QString &, const QString &name) const { - toQList result = toQuery::readQueryNull(CONNECTION, SQLRollbackSegment, name); + toQList result = toQuery::readQuery(CONNECTION, SQLRollbackSegment, name); QString isPublic = toShift(result); QString tablespaceName = toShift(result); QString initialExtent = toShift(result); @@ -4301,7 +4301,7 @@ const QString &owner, const QString &name) const { - toQList info = toQuery::readQueryNull(CONNECTION, + toQList info = toQuery::readQuery(CONNECTION, SQLSequenceInfo, name, owner); if (info.empty()) @@ -4354,7 +4354,7 @@ const QString &owner, const QString &name) const { - toQList info = toQuery::readQueryNull(CONNECTION, + toQList info = toQuery::readQuery(CONNECTION, SQLSynonymInfo, name, owner); if (info.empty()) @@ -4606,7 +4606,7 @@ else if (partitioned == "YES") return createPartitionedTable(ext, schema, owner, name); - toQList result = toQuery::readQueryNull(CONNECTION, segments(ext, SQLTableInfo), name, owner); + toQList result = toQuery::readQuery(CONNECTION, segments(ext, SQLTableInfo), name, owner); QString ret = createTableText(ext, result, schema, owner, name); ret += ";\n\n"; ret += createComments(ext, schema, owner, name); @@ -4723,8 +4723,8 @@ inf.readValue(); QString iotType(inf.readValue()); - toQList constraints = toQuery::readQueryNull(CONNECTION, SQLTableConstraints, name, owner); - toQList indexes = toQuery::readQueryNull(CONNECTION, SQLIndexNames, name, owner); + toQList constraints = toQuery::readQuery(CONNECTION, SQLTableConstraints, name, owner); + toQList indexes = toQuery::readQuery(CONNECTION, SQLIndexNames, name, owner); while (!indexes.empty()) { @@ -4762,7 +4762,7 @@ ret += createConstraint(ext, schema, owner, name); } - toQList triggers = toQuery::readQueryNull(CONNECTION, SQLTableTriggers, name, owner); + toQList triggers = toQuery::readQuery(CONNECTION, SQLTableTriggers, name, owner); while (!triggers.empty()) ret += createTrigger(ext, schema, owner, toShift(triggers)); return ret; @@ -4818,7 +4818,7 @@ first = false; else line += ","; - QString val = query.readValueNull(); + QString val = query.readValue(); if (dates[i]) { if (val.isNull()) @@ -4863,7 +4863,7 @@ const QString &name) const { QString ret; - toQList constraints = toQuery::readQueryNull(CONNECTION, SQLTableReferences, name, owner); + toQList constraints = toQuery::readQuery(CONNECTION, SQLTableReferences, name, owner); while (!constraints.empty()) ret += createConstraint(ext, schema, owner, toShift(constraints)); return ret; @@ -5018,7 +5018,7 @@ const QString &, const QString &name) const { - toQList info = toQuery::readQueryNull(CONNECTION, + toQList info = toQuery::readQuery(CONNECTION, SQLTablespaceInfo, QString::number(ext.getBlockSize()), name); @@ -5053,7 +5053,7 @@ } ret += sql; - toQList files = toQuery::readQueryNull(CONNECTION, + toQList files = toQuery::readQuery(CONNECTION, SQLDatafileInfo, QString::number(ext.getBlockSize()), name); @@ -5172,7 +5172,7 @@ { if (!ext.getCode()) return ""; - toQList result = toQuery::readQueryNull(CONNECTION, SQLTriggerInfo, name, owner); + toQList result = toQuery::readQuery(CONNECTION, SQLTriggerInfo, name, owner); if (result.size() != 10) throw qApp->translate("toOracleExtract", "Couldn't find trigger %1.%2").arg(owner).arg(name); QString triggerType = toShift(result); @@ -5305,7 +5305,7 @@ const QString &, const QString &name) const { - toQList info = toQuery::readQueryNull(CONNECTION, + toQList info = toQuery::readQuery(CONNECTION, SQLUserInfo, name); @@ -5337,7 +5337,7 @@ if (ext.getStorage()) { - toQList quota = toQuery::readQueryNull(CONNECTION, SQLUserQuotas, name); + toQList quota = toQuery::readQuery(CONNECTION, SQLUserQuotas, name); while (!quota.empty()) { QString siz = toShift(quota); @@ -5376,7 +5376,7 @@ { if (!ext.getCode()) return ""; - toQList source = toQuery::readQueryNull(CONNECTION, + toQList source = toQuery::readQuery(CONNECTION, SQLViewSource, name, owner); if (source.empty()) @@ -5392,7 +5392,7 @@ ret += "\n"; } ret += sql; - toQList cols = toQuery::readQueryNull(CONNECTION, + toQList cols = toQuery::readQuery(CONNECTION, SQLViewColumns, name, owner); ret += "("; @@ -5536,7 +5536,7 @@ QString blocks = inf.readValue(); QString sql = toSQL::string(SQLExchangeIndex, CONNECTION).arg(type).arg(blocks); - toQList result = toQuery::readQueryNull(CONNECTION, sql, segment, partition, owner); + toQList result = toQuery::readQuery(CONNECTION, sql, segment, partition, owner); QString degree = toShift(result); QString instances = toShift(result); QString table = toShift(result); @@ -5583,7 +5583,7 @@ QString blocks = inf.readValue(); QString sql = toSQL::string(SQLExchangeTable, CONNECTION).arg(type).arg(blocks); - toQList result = toQuery::readQueryNull(CONNECTION, sql, segment, partition, owner); + toQList result = toQuery::readQuery(CONNECTION, sql, segment, partition, owner); std::list<QString> ctx; ctx.insert(ctx.end(), schema); ctx.insert(ctx.end(), "EXCHANGE TABLE"); @@ -5610,7 +5610,7 @@ if (!ext.getIndexes()) return ; - toQList res = toQuery::readQueryNull(CONNECTION, SQLIndexInfo, name, owner); + toQList res = toQuery::readQuery(CONNECTION, SQLIndexInfo, name, owner); if (res.size() != 10) throw qApp->translate("toOracleExtract", "Couldn't find index %1.%2").arg(owner).arg(name); @@ -5625,7 +5625,7 @@ QString domName = toShift(res); QString domParam = toShift(res); - toQList storage = toQuery::readQueryNull(CONNECTION, segments(ext, SQLIndexSegment), name, owner); + toQList storage = toQuery::readQuery(CONNECTION, segments(ext, SQLIndexSegment), name, owner); QString degree = toShift(storage); QString instances = toShift(storage); QString compressed = toShift(storage); @@ -5719,7 +5719,7 @@ const QString &, const QString &name) const { - toQList info = toQuery::readQueryNull(CONNECTION, + toQList info = toQuery::readQuery(CONNECTION, SQLProfileInfo, name); if (info.empty()) @@ -5745,7 +5745,7 @@ const QString &, const QString &name) const { - toQList info = toQuery::readQueryNull(CONNECTION, + toQList info = toQuery::readQuery(CONNECTION, SQLRoleInfo, name); if (info.empty()) @@ -5766,7 +5766,7 @@ const QString &, const QString &name) const { - toQList result = toQuery::readQueryNull(CONNECTION, SQLRollbackSegment, name); + toQList result = toQuery::readQuery(CONNECTION, SQLRollbackSegment, name); QString isPublic = toShift(result); QString tablespaceName = toShift(result); QString initialExtent = toShift(result); @@ -5799,7 +5799,7 @@ const QString &owner, const QString &name) const { - toQList info = toQuery::readQueryNull(CONNECTION, + toQList info = toQuery::readQuery(CONNECTION, SQLSequenceInfo, name, owner); if (info.empty()) @@ -5840,7 +5840,7 @@ const QString &owner, const QString &name) const { - toQList info = toQuery::readQueryNull(CONNECTION, + toQList info = toQuery::readQuery(CONNECTION, SQLSynonymInfo, name, owner); if (info.empty()) @@ -5894,7 +5894,7 @@ return ; } - toQList result = toQuery::readQueryNull(CONNECTION, segments(ext, SQLTableInfo), name, owner); + toQList result = toQuery::readQuery(CONNECTION, segments(ext, SQLTableInfo), name, owner); describeTableText(ext, lst, ctx, result, schema, owner, name); describeComments(ext, lst, ctx, owner, name); } @@ -5907,7 +5907,7 @@ { describeTable(ext, lst, schema, owner, name); - toQList indexes = toQuery::readQueryNull(CONNECTION, SQLIndexNames, name, owner); + toQList indexes = toQuery::readQuery(CONNECTION, SQLIndexNames, name, owner); while (!indexes.empty()) { QString indOwner(toShift(indexes)); @@ -5921,17 +5921,17 @@ inf.readValue(); QString iotType(inf.readValue()); - toQList constraints = toQuery::readQueryNull(CONNECTION, SQLTableConstraints, name, owner); + toQList constraints = toQuery::readQuery(CONNECTION, SQLTableConstraints, name, owner); while (!constraints.empty()) { - if (toShift(constraints).toUtf8() != "P" || iotType != "IOT") + if ( (QString)toShift(constraints) != "P" || iotType != "IOT") describeConstraint(ext, lst, schema, owner, toShift(constraints)); else toShift(constraints); toShift(constraints); } - toQList triggers = toQuery::readQueryNull(CONNECTION, SQLTableTriggers, name, owner); + toQList triggers = toQuery::readQuery(CONNECTION, SQLTableTriggers, name, owner); while (!triggers.empty()) describeTrigger(ext, lst, schema, owner, toShift(triggers)); } @@ -5942,7 +5942,7 @@ const QString &owner, const QString &name) const { - toQList constraints = toQuery::readQueryNull(CONNECTION, SQLTableReferences, name, owner); + toQList constraints = toQuery::readQuery(CONNECTION, SQLTableReferences, name, owner); while (!constraints.empty()) describeConstraint(ext, lst, schema, owner, toShift(constraints)); } @@ -5953,7 +5953,7 @@ const QString &, const QString &name) const { - toQList info = toQuery::readQueryNull(CONNECTION, + toQList info = toQuery::readQuery(CONNECTION, SQLTablespaceInfo, QString::number(ext.getBlockSize()), name); @@ -5983,7 +5983,7 @@ addDescription(lst, ctx); - toQList files = toQuery::readQueryNull(CONNECTION, + toQList files = toQuery::readQuery(CONNECTION, SQLDatafileInfo, QString::number(ext.getBlockSize()), name); @@ -6054,7 +6054,7 @@ if (!ext.getCode()) return ; - toQList result = toQuery::readQueryNull(CONNECTION, SQLTriggerInfo, name, owner); + toQList result = toQuery::readQuery(CONNECTION, SQLTriggerInfo, name, owner); if (result.size() != 10) throw qApp->translate("toOracleExtract", "Couldn't find trigger %1.%2").arg(owner).arg(name); QString triggerType = toShift(result); @@ -6151,7 +6151,7 @@ const QString &, const QString &name) const { - toQList info = toQuery::readQueryNull(CONNECTION, + toQList info = toQuery::readQuery(CONNECTION, SQLUserInfo, name); @@ -6180,7 +6180,7 @@ if (ext.getStorage()) { - toQList quota = toQuery::readQueryNull(CONNECTION, SQLUserQuotas, name); + toQList quota = toQuery::readQuery(CONNECTION, SQLUserQuotas, name); while (!quota.empty()) { QString siz = toShift(quota); @@ -6201,7 +6201,7 @@ { if (!ext.getCode()) return ; - toQList source = toQuery::readQueryNull(CONNECTION, + toQList source = toQuery::readQuery(CONNECTION, SQLViewSource, name, owner); if (source.empty()) @@ -6238,7 +6238,7 @@ const QString &, const QString &name) const { - toQList tableName = toQuery::readQueryNull(CONNECTION, + toQList tableName = toQuery::readQuery(CONNECTION, SQLConstraintTable, owner, name); if (tableName.empty()) @@ -7550,15 +7550,15 @@ try { - toQList ret = toQuery::readQueryNull(CONNECTION, SQLSetSizing); + toQList ret = toQuery::readQuery(CONNECTION, SQLSetSizing); ext.setBlockSize(toShift(ret).toInt()); } catch (...) { TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; - toQList ret = toQuery::readQueryNull(CONNECTION, SQLSetSizingFallback); + toQList ret = toQuery::readQuery(CONNECTION, SQLSetSizingFallback); if (ret.empty()) - ret = toQuery::readQueryNull(CONNECTION, SQLSetSizingFallback2); + ret = toQuery::readQuery(CONNECTION, SQLSetSizingFallback2); ext.setBlockSize(toShift(ret).toInt()); } } Modified: branches/tora-trotl/src/tooutput.cpp =================================================================== --- branches/tora-trotl/src/tooutput.cpp 2010-11-10 12:29:30 UTC (rev 3805) +++ branches/tora-trotl/src/tooutput.cpp 2010-11-10 12:31:00 UTC (rev 3806) @@ -384,8 +384,8 @@ any = false; while (!query.eof()) { - QString line = query.readValueNull(); - int status = query.readValueNull().toInt(); + QString line = query.readValue(); + int status = query.readValue().toInt(); if (status == 0) { any = true; Modified: branches/tora-trotl/src/toprofiler.cpp =================================================================== --- branches/tora-trotl/src/toprofiler.cpp 2010-11-10 12:29:30 UTC (rev 3805) +++ branches/tora-trotl/src/toprofiler.cpp 2010-11-10 12:31:00 UTC (rev 3806) @@ -596,10 +596,10 @@ int id = 1; while (!query.eof()) { - QString runid = query.readValueNull(); - QString owner = query.readValueNull(); - QString comment = query.readValueNull(); - double total = query.readValueNull().toDouble() / 1E9; + QString runid = query.readValue(); + QString owner = query.readValue(); + QString comment = query.readValue(); + double total = query.readValue().toDouble() / 1E9; if (!owner.isEmpty()) owner = QString::fromLatin1("(") + owner + QString::fromLatin1(")"); QString timstr = QString::fromLatin1(" [") + FormatTime(total) + QString::fromLatin1("]"); Modified: branches/tora-trotl/src/toqsqlconnection.cpp =================================================================== --- branches/tora-trotl/src/toqsqlconnection.cpp 2010-11-10 12:29:30 UTC (rev 3805) +++ branches/tora-trotl/src/toqsqlconnection.cpp 2010-11-10 12:31:00 UTC (rev 3806) @@ -1541,7 +1541,7 @@ toQuery databases(connection(), SQLListDatabases); while (!databases.eof()) { - QString db = databases.readValueNull(); + QString db = databases.readValue(); cur.Owner = db; cur.Type = "DATABASE"; cur.Name = QString::null; @@ -1551,12 +1551,12 @@ toQuery tables(connection(), SQLListObjectsDatabase, db); while (!tables.eof()) { - cur.Name = tables.readValueNull(); + cur.Name = tables.readValue(); cur.Owner = db; cur.Type = "TABLE"; for (int i = 2;i < tables.columns();i++) // I just wan't the last column except for the first one - tables.readValueNull(); - cur.Comment = tables.readValueNull(); + tables.readValue(); + cur.Comment = tables.readValue(); ret.insert(ret.end(), cur); } } @@ -1571,13 +1571,13 @@ toQuery tables(connection(), SQLListObjects); while (!tables.eof()) { - cur.Name = tables.readValueNull(); + cur.Name = tables.readValue(); if (tables.columns() > 1) - cur.Owner = tables.readValueNull(); + cur.Owner = tables.readValue(); else cur.Owner = connection().database(); if (tables.columns() > 2) - cur.Type = tables.readValueNull(); + cur.Type = tables.readValue(); else cur.Type = QString::fromLatin1("TABLE"); ret.insert(ret.end(), cur); @@ -1600,9 +1600,9 @@ std::list<toConnection::objectName>::iterator i = objects.begin(); while (!synonyms.eof()) { - QString synonym = synonyms.readValueNull(); - cur.Owner = synonyms.readValueNull(); - cur.Name = synonyms.readValueNull(); + QString synonym = synonyms.readValue(); + cur.Owner = synonyms.readValue(); + cur.Name = synonyms.readValue(); while (i != objects.end() && (*i) < cur) i++; if (i == objects.end()) @@ -1633,7 +1633,7 @@ while (!comment.eof()) { QString col = comment.readValue(); - comments[col] = comment.readValueNull(); + comments[col] = comment.readValue(); } } catch (...) Modified: branches/tora-trotl/src/toqvalue.cpp =================================================================== --- branches/tora-trotl/src/toqvalue.cpp 2010-11-10 12:29:30 UTC (rev 3805) +++ branches/tora-trotl/src/toqvalue.cpp 2010-11-10 12:31:00 UTC (rev 3806) @@ -44,6 +44,8 @@ #include "toconf.h" #include "toqvalue.h" +#include "toconfiguration.h" + #include <QVariant> #include <QApplication> @@ -81,7 +83,7 @@ * but toQValue is also used for query parameters(toQList and others) * and these are copyined often (toNoBlockQuery.Params => toQuery.Params) */ - if(isUserType()) + if(isComplexType()) const_cast<toQValue&>(copy).Value = "deleted value(clone)"; } @@ -93,7 +95,7 @@ * but toQValue is also used for query parameters(toQList and others) * and these are copyined often (toNoBlockQuery.Params => toQuery.Params) */ - if(isUserType()) + if(isComplexType()) const_cast<toQValue&>(copy).Value = "deleted value(assign)"; return *this; } @@ -109,7 +111,7 @@ toQValue::~toQValue() { - if(isUserType()) + if(isComplexType()) { complexType *i = Value.value<toQValue::complexType*>(); if(i) @@ -132,15 +134,15 @@ // otherwise, try to convert to double for comparison bool ok; - double d1 = toString().toDouble(&ok); + double d1 = Value.toString().toDouble(&ok); if (ok) { - double d2 = other.toString().toDouble(&ok); + double d2 = other.Value.toString().toDouble(&ok)... [truncated message content] |
From: <ibr...@us...> - 2011-01-05 14:58:46
|
Revision: 3852 http://tora.svn.sourceforge.net/tora/?rev=3852&view=rev Author: ibre5041 Date: 2011-01-05 14:58:38 +0000 (Wed, 05 Jan 2011) Log Message: ----------- - Support for piecewise fetch of LONGs (todo LONG RAW still unsupported) - Some code clanups(define_hook, bind_hook) do now have parameters anymore - Object cache handling synced with trunk Modified Paths: -------------- branches/tora-trotl/src/tooracleconnection.cpp branches/tora-trotl/src/trotl/src/trotl_anydata.cpp branches/tora-trotl/src/trotl/src/trotl_anydata.h branches/tora-trotl/src/trotl/src/trotl_collection.cpp branches/tora-trotl/src/trotl/src/trotl_collection.h branches/tora-trotl/src/trotl/src/trotl_convertor.cpp branches/tora-trotl/src/trotl/src/trotl_convertor.h branches/tora-trotl/src/trotl/src/trotl_int.h branches/tora-trotl/src/trotl/src/trotl_lob.cpp branches/tora-trotl/src/trotl/src/trotl_lob.h branches/tora-trotl/src/trotl/src/trotl_rid.cpp branches/tora-trotl/src/trotl/src/trotl_rid.h branches/tora-trotl/src/trotl/src/trotl_stat.cpp branches/tora-trotl/src/trotl/src/trotl_stat.h branches/tora-trotl/src/trotl/src/trotl_string.cpp branches/tora-trotl/src/trotl/src/trotl_string.h branches/tora-trotl/src/trotl/src/trotl_var.h branches/tora-trotl/src/trotl/src/trotl_xml.cpp branches/tora-trotl/src/trotl/src/trotl_xml.h Modified: branches/tora-trotl/src/tooracleconnection.cpp =================================================================== --- branches/tora-trotl/src/tooracleconnection.cpp 2010-12-31 12:50:17 UTC (rev 3851) +++ branches/tora-trotl/src/tooracleconnection.cpp 2011-01-05 14:58:38 UTC (rev 3852) @@ -56,6 +56,7 @@ #include <trotl.h> #include <trotl_convertor.h> #include <trotl_anydata.h> +#include <trotl_cursor.h> #include "utils.h" #include "toconf.h" @@ -109,7 +110,10 @@ " from sys.all_objects a,\n" " sys.all_tab_comments b\n" " where a.owner = b.owner(+) and a.object_name = b.table_name(+)\n" - " and a.object_type = b.table_type(+) and a.object_type <> 'SYNONYM'", + " and a.object_type = b.table_type(+) and a.object_type != 'SYNONYM'\n" + " and a.owner = nvl(:owner<char[101]>, a.owner)" + " and a.object_type = nvl(:type<char[101]>, a.object_type)" + " and a.object_name = nvl(:name<char[101]>, a.object_name)", "List the objects to cache for a connection, should have same " "columns and binds"); @@ -470,6 +474,67 @@ }; //Q_DECLARE_METATYPE(toOracleCollection*) +class toOracleCursor: public toQValue::complexType +{ +public: + toOracleCursor() {}; + + /* virtual */ bool isBinary() const + { + return false; + } + /* virtual */ bool isLarge() const + { + return true; + } + + + /* virtual */ QString displayData() const + { + return QString("{cursor}"); + } + + /* virtual */ QString editData() const + { + std::string s; + data >> s; + return QString(s.c_str()); + } + + /* virtual */ QString userData() const + { + return QString("cursor"); + } + + /* virtual */ QString tooltipData() const + { + return dataTypeName(); + } + + /* virtual */ QString dataTypeName() const + { + return QString("cursor SQLT_RSET"); + } + /* virtual */ QByteArray read(unsigned offset) const + { + return QByteArray(); + } + /* virtual */ void write(QByteArray const &data) + { + } + /* virtual */ ~toOracleCursor() + { + TLOG(1,toDecorator,__HERE__) << "toOracleCursor DELETED:" << this << std::endl; + } + + mutable trotl::SqlCursor data; +protected: + toOracleCursor(toOracleCursor const&); + toOracleCursor operator=(toOracleCursor const&); + //TODO copying prohibited +}; +//Q_DECLARE_METATYPE(toOracleCursor*) + class toOracleProvider : public toConnectionProvider { ::trotl::OciEnv *_envp; @@ -720,6 +785,16 @@ TLOG(4,toDecorator,__HERE__) << "Just read: \"BLOB\"" << std::endl; } break; + case SQLT_RSET: + { + toOracleCursor *i = new toOracleCursor(); + trotl::ConvertorForRead c(_last_buff_row); + trotl::DispatcherForRead::Go(BP, i->data, c); + QVariant v; + v.setValue((toQValue::complexType*)i); + value = toQValue::fromVariant(v); + TLOG(4,toDecorator,__HERE__) << "Just read: \"CURSOR\"" << std::endl; + } default: std::string s(BP.get_string(_last_buff_row)); value = toQValue(QString(s.c_str())); @@ -924,11 +999,16 @@ return str.toUpper(); } - virtual std::list<toConnection::objectName> objectNames(void) + virtual std::list<toConnection::objectName> objectNames(const QString &owner, + const QString &type, + const QString &name) { std::list<toConnection::objectName> ret; std::list<toQValue> par; + par.insert(par.end(), owner); + par.insert(par.end(), type); + par.insert(par.end(), name); toQuery objects(connection(), toQuery::Long, SQLListObjects, par); toConnection::objectName cur; @@ -1212,8 +1292,9 @@ virtual void initialize(void) { - toMaxLong = toConfigurationSingle::Instance().maxLong(); - ::trotl::g_OCIPL_MAX_LONG = ( toConfigurationSingle::Instance().maxLong() == -1 ? ::trotl::g_OCIPL_MAX_LONG : toConfigurationSingle::Instance().maxLong() ); + toMaxLong = toConfigurationSingle::Instance().maxLong() == -1 ? 0x80000000 : toConfigurationSingle::Instance().maxLong(); + ::trotl::g_OCIPL_MAX_LONG = toMaxLong; + dateFormat = toConfigurationSingle::Instance().dateFormat().toAscii(); ::trotl::g_TROTL_DEFAULT_DATE_FTM = const_cast<char*>(dateFormat.constData()); ::trotl::OciEnvAlloc *_envallocp = new ::trotl::OciEnvAlloc; @@ -1843,21 +1924,20 @@ toConfigurationSingle::Instance().setOpenCursors(OpenCursors->value()); /* - TODO - there is nothing like "unlimited" size for LONG. - max size for LONG col. is 2GB, so we should prepare - at least one 2GB buffer in RAM. - In reality we use 30000B if toMaxLong == -1. + max size for LONG col. is 2GB, so we should prepare at least one 4GB buffer in RAM. + 2GB for trotl's internal buffer + 2GB for toQValue */ if (Unlimited->isChecked()) { toConfigurationSingle::Instance().setMaxLong(-1); - toMaxLong = MAXTOMAXLONG; + toMaxLong = 0x80000000; // 2GB max size for LONG } else { toConfigurationSingle::Instance().setMaxLong(MaxLong->text().toInt()); toMaxLong = MaxLong->text().toInt(); } + ::trotl::g_OCIPL_MAX_LONG = toMaxLong; } Modified: branches/tora-trotl/src/trotl/src/trotl_anydata.cpp =================================================================== --- branches/tora-trotl/src/trotl/src/trotl_anydata.cpp 2010-12-31 12:50:17 UTC (rev 3851) +++ branches/tora-trotl/src/trotl/src/trotl_anydata.cpp 2011-01-05 14:58:38 UTC (rev 3852) @@ -41,7 +41,7 @@ Util::RegisterInFactory<BindParANYDATA, CustDefineParFactTwoParmSing> regCustDefineNTY_ANYDATA("SYS.ANYDATA"); -void BindParANYDATA::init(SqlStatement &stmt) +void BindParANYDATA::init() { sword res; _anydatatdo = 0; @@ -64,19 +64,19 @@ } } -void BindParANYDATA::define_hook(SqlStatement &stmt) +void BindParANYDATA::define_hook() { - sword res = OCICALL(OCIDefineObject(defnpp, stmt._errh, + sword res = OCICALL(OCIDefineObject(defnpp, _stmt._errh, _anydatatdo, (dvoid **) &(_oan_buffer[0]), //(dvoid **) &_oan_buffer, (ub4 *) 0, 0, //(dvoid **) &_any_indp, (ub4 *) 0)); - oci_check_error(__TROTL_HERE__, stmt._errh, res); + oci_check_error(__TROTL_HERE__, _stmt._errh, res); // // TODO OCIDefineArrayOfStruct here ?? } -void BindParANYDATA::bind_hook(SqlStatement &stmt) +void BindParANYDATA::bind_hook() { //TODO throw OciException(__TROTL_HERE__, "Not implemented yet"); Modified: branches/tora-trotl/src/trotl/src/trotl_anydata.h =================================================================== --- branches/tora-trotl/src/trotl/src/trotl_anydata.h 2010-12-31 12:50:17 UTC (rev 3851) +++ branches/tora-trotl/src/trotl/src/trotl_anydata.h 2011-01-05 14:58:38 UTC (rev 3852) @@ -66,7 +66,7 @@ ((ub2*)rlenp)[i] = (ub2) value_sz; } - init(stmt); + init(); } BindParANYDATA(unsigned int pos, SqlStatement &stmt, BindVarDecl &decl) : SqlStatement::BindPar(pos, stmt, decl) @@ -81,7 +81,7 @@ ((ub4*)rlenp)[i] = (ub4) value_sz; } - init(stmt); + init(); } ~BindParANYDATA() @@ -91,10 +91,10 @@ virtual tstring get_string(unsigned int row) const; - void init(SqlStatement &stmt); + void init(); - virtual void define_hook(SqlStatement &stmt); - virtual void bind_hook(SqlStatement &stmt); + virtual void define_hook(); + virtual void bind_hook(); //private: Modified: branches/tora-trotl/src/trotl/src/trotl_collection.cpp =================================================================== --- branches/tora-trotl/src/trotl/src/trotl_collection.cpp 2010-12-31 12:50:17 UTC (rev 3851) +++ branches/tora-trotl/src/trotl/src/trotl_collection.cpp 2011-01-05 14:58:38 UTC (rev 3852) @@ -43,19 +43,19 @@ Util::RegisterInFactory<BindParCollectionTabVarchar, CustDefineParFactTwoParmSing> regCustDefineNTY_VARCHAR_TAB("TABLE OF VARCHAR2"); Util::RegisterInFactory<BindParCollectionTabVarchar, CustDefineParFactTwoParmSing> regCustDefineNTY_CHAR_TAB("TABLE OF CHAR"); -void BindParCollectionTabNum::define_hook(SqlStatement &stmt) +void BindParCollectionTabNum::define_hook() { //ub4 *size = 0; sword res; - res = OCICALL(OCIDefineObject(defnpp, stmt._errh, _collection_tdo, + res = OCICALL(OCIDefineObject(defnpp, _stmt._errh, _collection_tdo, valuep, (ub4 *) NULL, (void**) _collection_indp, //(dvoid **) NULL (ub4 *) 0)); - oci_check_error(__TROTL_HERE__, stmt._errh, res); + oci_check_error(__TROTL_HERE__, _stmt._errh, res); } -void BindParCollectionTabNum::bind_hook(SqlStatement &stmt) +void BindParCollectionTabNum::bind_hook() { //TODO throw OciException(__TROTL_HERE__, "Not implemented yet"); Modified: branches/tora-trotl/src/trotl/src/trotl_collection.h =================================================================== --- branches/tora-trotl/src/trotl/src/trotl_collection.h 2010-12-31 12:50:17 UTC (rev 3851) +++ branches/tora-trotl/src/trotl/src/trotl_collection.h 2011-01-05 14:58:38 UTC (rev 3852) @@ -87,8 +87,8 @@ virtual tstring get_string(unsigned int row) const; - virtual void define_hook(SqlStatement &stmt); - virtual void bind_hook(SqlStatement &stmt); + virtual void define_hook(); + virtual void bind_hook(); //private: Modified: branches/tora-trotl/src/trotl/src/trotl_convertor.cpp =================================================================== --- branches/tora-trotl/src/trotl/src/trotl_convertor.cpp 2010-12-31 12:50:17 UTC (rev 3851) +++ branches/tora-trotl/src/trotl/src/trotl_convertor.cpp 2011-01-05 14:58:38 UTC (rev 3852) @@ -100,32 +100,32 @@ void ConvertorForRead::Fire(const prefferedNumericType &BP, SqlInt<int> &BL) { - throw OciException(__TROTL_HERE__, "Conversion from BindParInt to SqlInt<int> implemented elsewhere"); + throw OciException(__TROTL_HERE__, "Conversion from BindParCInt to SqlInt<int> implemented elsewhere"); }; void ConvertorForRead::Fire(const prefferedNumericType &BP, SqlInt<unsigned int> &BL) { - throw OciException(__TROTL_HERE__, "Conversion from BindParInt to SqlInt<unsigned int> implemented elsewhere"); + throw OciException(__TROTL_HERE__, "Conversion from BindParCInt to SqlInt<unsigned int> implemented elsewhere"); }; void ConvertorForRead::Fire(const prefferedNumericType &BP, SqlInt<long> &BL) { - throw OciException(__TROTL_HERE__, "Conversion from BindParInt to SqlInt<long> implemented elsewhere"); + throw OciException(__TROTL_HERE__, "Conversion from BindParCInt to SqlInt<long> implemented elsewhere"); }; void ConvertorForRead::Fire(const prefferedNumericType &BP, SqlInt<unsigned long> &BL) { - throw OciException(__TROTL_HERE__, "Conversion from BindParInt to SqlInt<unsigned long> implemented elsewhere"); + throw OciException(__TROTL_HERE__, "Conversion from BindParCInt to SqlInt<unsigned long> implemented elsewhere"); }; void ConvertorForRead::Fire(const prefferedNumericType &BP, SqlInt<float> &BL) { - throw OciException(__TROTL_HERE__, "Conversion from BindParInt to SqlInt<float> implemented elsewhere"); + throw OciException(__TROTL_HERE__, "Conversion from BindParCInt to SqlInt<float> implemented elsewhere"); }; void ConvertorForRead::Fire(const prefferedNumericType &BP, SqlInt<double> &BL) { - throw OciException(__TROTL_HERE__, "Conversion from BindParInt to SqlInt<double> implemented elsewhere"); + throw OciException(__TROTL_HERE__, "Conversion from BindParCInt to SqlInt<double> implemented elsewhere"); }; // todo - this relies on the fact that prefferedNumericType is BindParNumber now @@ -238,9 +238,9 @@ BP.indp[_row] = BL._ind; }; -void ConvertorForWrite::Fire(const SqlInt<int> &BL, BindParInt &BP) +void ConvertorForWrite::Fire(const SqlInt<int> &BL, BindParCInt &BP) { - throw OciException(__TROTL_HERE__, "Conversion from SqlInt<int> to BindParInt implemented elsewhere"); + throw OciException(__TROTL_HERE__, "Conversion from SqlInt<int> to BindParCInt implemented elsewhere"); }; #ifdef ORACLE_HAS_XML Modified: branches/tora-trotl/src/trotl/src/trotl_convertor.h =================================================================== --- branches/tora-trotl/src/trotl/src/trotl_convertor.h 2010-12-31 12:50:17 UTC (rev 3851) +++ branches/tora-trotl/src/trotl/src/trotl_convertor.h 2011-01-05 14:58:38 UTC (rev 3852) @@ -207,28 +207,28 @@ void Fire(const SqlDateTime &SV, BindParDate &BP); void Fire(const SqlBlob &SV, BindParBlob &BP); void Fire(const SqlClob &SV, BindParClob &BP); - void Fire(const SqlInt<int> &SV, BindParInt &BP); + void Fire(const SqlInt<int> &SV, BindParCInt &BP); #ifdef ORACLE_HAS_XML void Fire(const SqlXML &SV, BindParXML &BP); #endif void Fire(const SqlDateTime &SV, BindParClob &BP) { OnError(SV, BP); }; void Fire(const SqlDateTime &SV, BindParBlob &BP) { OnError(SV, BP); } - void Fire(const SqlDateTime &SV, BindParInt &BP) { OnError(SV, BP); }; + void Fire(const SqlDateTime &SV, BindParCInt &BP) { OnError(SV, BP); }; #ifdef ORACLE_HAS_XML void Fire(const SqlDateTime &SV, BindParXML &BP) { OnError(SV, BP); }; #endif void Fire(const SqlBlob &SV, BindParDate &BP) { OnError(SV, BP); }; void Fire(const SqlBlob &SV, BindParClob &BP) { OnError(SV, BP); }; - void Fire(const SqlBlob &SV, BindParInt &BP) { OnError(SV, BP); }; + void Fire(const SqlBlob &SV, BindParCInt &BP) { OnError(SV, BP); }; #ifdef ORACLE_HAS_XML void Fire(const SqlBlob &SV, BindParXML &BP) { OnError(SV, BP); }; #endif void Fire(const SqlClob &SV, BindParDate &BP) { OnError(SV, BP); }; void Fire(const SqlClob &SV, BindParBlob &BP) { OnError(SV, BP); }; - void Fire(const SqlClob &SV, BindParInt &BP) { OnError(SV, BP); }; + void Fire(const SqlClob &SV, BindParCInt &BP) { OnError(SV, BP); }; #ifdef ORACLE_HAS_XML void Fire(const SqlClob &SV, BindParXML &BP) { OnError(SV, BP); }; #endif @@ -244,7 +244,7 @@ void Fire(const SqlXML &SV, BindParDate &BP) { OnError(SV, BP); }; void Fire(const SqlXML &SV, BindParBlob &BP) { OnError(SV, BP); }; void Fire(const SqlXML &SV, BindParClob &BP) { OnError(SV, BP); }; - void Fire(const SqlXML &SV, BindParInt &BP) { OnError(SV, BP); }; + void Fire(const SqlXML &SV, BindParCInt &BP) { OnError(SV, BP); }; #endif private: @@ -267,9 +267,9 @@ SqlStatement::BindPar, #ifdef ORACLE_HAS_XML -LOKI_TYPELIST_5(BindParInt, BindParClob, BindParBlob, BindParDate, BindParXML), +LOKI_TYPELIST_5(BindParCInt, BindParClob, BindParBlob, BindParDate, BindParXML), #else -LOKI_TYPELIST_4(BindParInt, BindParClob, BindParBlob, BindParDate), +LOKI_TYPELIST_4(BindParCInt, BindParClob, BindParBlob, BindParDate), #endif void Modified: branches/tora-trotl/src/trotl/src/trotl_int.h =================================================================== --- branches/tora-trotl/src/trotl/src/trotl_int.h 2010-12-31 12:50:17 UTC (rev 3851) +++ branches/tora-trotl/src/trotl/src/trotl_int.h 2011-01-05 14:58:38 UTC (rev 3852) @@ -50,12 +50,12 @@ typedef BindParNumber prefferedNumericType; /* The template TBindPar is defined in trotl_stat.h */ -typedef TROTL_EXPORT TBindParInt<int, SQLT<int>::value> BindParInt; -typedef TROTL_EXPORT TBindParInt<long, SQLT<long>::value> BindParLong; -typedef TROTL_EXPORT TBindParInt<unsigned int, SQLT<unsigned int>::value> BindParUInt; -typedef TROTL_EXPORT TBindParInt<unsigned long, SQLT<unsigned long>::value> BindParULong; -typedef TROTL_EXPORT TBindParInt<double, SQLT<double>::value> BindParDouble; -typedef TROTL_EXPORT TBindParInt<float, SQLT<float>::value> BindParFloat; +typedef TROTL_EXPORT TBindParInt<int, SQLT<int>::value> BindParCInt; +typedef TROTL_EXPORT TBindParInt<long, SQLT<long>::value> BindParCLong; +typedef TROTL_EXPORT TBindParInt<unsigned int, SQLT<unsigned int>::value> BindParCUInt; +typedef TROTL_EXPORT TBindParInt<unsigned long, SQLT<unsigned long>::value> BindParCULong; +typedef TROTL_EXPORT TBindParInt<double, SQLT<double>::value> BindParCDouble; +typedef TROTL_EXPORT TBindParInt<float, SQLT<float>::value> BindParCFloat; namespace Private { Modified: branches/tora-trotl/src/trotl/src/trotl_lob.cpp =================================================================== --- branches/tora-trotl/src/trotl/src/trotl_lob.cpp 2010-12-31 12:50:17 UTC (rev 3851) +++ branches/tora-trotl/src/trotl/src/trotl_lob.cpp 2011-01-05 14:58:38 UTC (rev 3852) @@ -125,13 +125,13 @@ } // TODO add ind skip here -void BindParLob::bind_hook(SqlStatement &stmt) +void BindParLob::bind_hook() { - sword res = OCICALL(OCIBindArrayOfStruct(bindp, stmt._errh, sizeof(OCILobLocator*), 0, 0, 0 )); - oci_check_error(__TROTL_HERE__, stmt._errh, res); + sword res = OCICALL(OCIBindArrayOfStruct(bindp, _stmt._errh, sizeof(OCILobLocator*), 0, 0, 0 )); + oci_check_error(__TROTL_HERE__, _stmt._errh, res); } // TODO add ind skip here -void BindParLob::define_hook(SqlStatement &stmt) +void BindParLob::define_hook() { // sword res = OCICALL(OCIDefineArrayOfStruct(defnpp , _env._errh, sizeof(OCILobLocator*), 0, 0, 0 )); // oci_check_error(__TROTL_HERE__, _env, res); Modified: branches/tora-trotl/src/trotl/src/trotl_lob.h =================================================================== --- branches/tora-trotl/src/trotl/src/trotl_lob.h 2010-12-31 12:50:17 UTC (rev 3851) +++ branches/tora-trotl/src/trotl/src/trotl_lob.h 2011-01-05 14:58:38 UTC (rev 3852) @@ -53,8 +53,8 @@ //return ""; } - virtual void bind_hook(SqlStatement &stmt); - virtual void define_hook(SqlStatement &stmt); + virtual void bind_hook(); + virtual void define_hook(); boolean isTemporary(unsigned row) const; ub4 getChunkSize(unsigned row) const; Modified: branches/tora-trotl/src/trotl/src/trotl_rid.cpp =================================================================== --- branches/tora-trotl/src/trotl/src/trotl_rid.cpp 2010-12-31 12:50:17 UTC (rev 3851) +++ branches/tora-trotl/src/trotl/src/trotl_rid.cpp 2011-01-05 14:58:38 UTC (rev 3852) @@ -89,14 +89,14 @@ } // TODO add ind skip here -void BindParRid::bind_hook(SqlStatement &stmt) +void BindParRid::bind_hook() { // sword res = OCICALL(OCIBindArrayOfStruct(bindp, stmt._errh, sizeof(OCIRowid*), 0, 0, 0 )); // oci_check_error(__TROTL_HERE__, stmt._errh, res); } // TODO add ind skip here -void BindParRid::define_hook(SqlStatement &stmt) +void BindParRid::define_hook() { // sword res = OCICALL(OCIDefineArrayOfStruct(defnpp , _env._errh, sizeof(OCIRowid*), 0, 0, 0 )); // oci_check_error(__TROTL_HERE__, _stmt._errh, res); Modified: branches/tora-trotl/src/trotl/src/trotl_rid.h =================================================================== --- branches/tora-trotl/src/trotl/src/trotl_rid.h 2010-12-31 12:50:17 UTC (rev 3851) +++ branches/tora-trotl/src/trotl/src/trotl_rid.h 2011-01-05 14:58:38 UTC (rev 3852) @@ -48,8 +48,8 @@ virtual tstring get_string(unsigned int) const; - virtual void bind_hook(SqlStatement &stmt); - virtual void define_hook(SqlStatement &stmt); + virtual void bind_hook(); + virtual void define_hook(); private: void descAlloc(void); //TODO OCI_DTYPE_FILE for BFILE, CFILE Modified: branches/tora-trotl/src/trotl/src/trotl_stat.cpp =================================================================== --- branches/tora-trotl/src/trotl/src/trotl_stat.cpp 2010-12-31 12:50:17 UTC (rev 3851) +++ branches/tora-trotl/src/trotl/src/trotl_stat.cpp 2011-01-05 14:58:38 UTC (rev 3852) @@ -49,10 +49,11 @@ namespace trotl { + int TROTL_EXPORT g_OCIPL_BULK_ROWS = 3; -int TROTL_EXPORT g_OCIPL_MAX_LONG = 30000; -char TROTL_EXPORT *g_TROTL_DEFAULT_NUM_FTM = "TM"; -char TROTL_EXPORT *g_TROTL_DEFAULT_DATE_FTM = "YYYY:MM:DD HH24:MI:SS"; +int TROTL_EXPORT g_OCIPL_MAX_LONG = 0x20000; //128 KB +const char TROTL_EXPORT *g_TROTL_DEFAULT_NUM_FTM = "TM"; +const char TROTL_EXPORT *g_TROTL_DEFAULT_DATE_FTM = "YYYY:MM:DD HH24:MI:SS"; SqlStatement::SqlStatement(OciConnection& conn, const tstring& stmt, ub4 lang, int bulk_rows) : super(conn._env), @@ -64,10 +65,10 @@ _state(UNINITIALIZED), _stmt_type(STMT_NONE), _param_count(0), _column_count(0), -_in_cnt(0), _out_cnt(0), _iters(0), +_in_cnt(0), _out_cnt(0), _last_row(-1), _last_fetched_row(-1), -_in_pos(0), _out_pos(0), +_in_pos(0), _out_pos(0), _iters(0), _last_buff_row(0), _buff_size(g_OCIPL_BULK_ROWS), _all_binds(NULL), _in_binds(NULL), _out_binds(NULL), _bound(false) @@ -142,10 +143,10 @@ _state(UNINITIALIZED), _stmt_type(STMT_NONE), _param_count(0), _column_count(0), -_in_cnt(0), _out_cnt(0), _iters(0), +_in_cnt(0), _out_cnt(0), _last_row(-1), _last_fetched_row(-1), -_in_pos(0), _out_pos(0), +_in_pos(0), _out_pos(0), _iters(0), _last_buff_row(0), _buff_size(g_OCIPL_BULK_ROWS), _all_binds(NULL), _in_binds(NULL), _out_binds(NULL), _bound(false) @@ -326,7 +327,7 @@ if( _all_binds == 0 || _out_binds == 0 ) throw OciException(__TROTL_HERE__, "No out Bindpars specified"); - ub4 pos = _out_pos < _out_cnt ? (_out_pos+1) : 1; //Round robin hack + //ub4 pos = _out_pos < _out_cnt ? (_out_pos+1) : 1; //Round robin hack return *_all_binds[_out_binds[_out_pos ? _out_pos : 1 ]]; } @@ -391,6 +392,7 @@ break; _iters = _all_binds[_in_binds[1]]->_cnt; // Loop over input bind vars - insert can have out binds too(i.e. returning clause) + // and check vector lengths for(unsigned i=1; i<=_in_cnt; ++i) if(_all_binds[_in_binds[i]]->_cnt != _iters) throw OciException(__TROTL_HERE__, "Wrong count of bindvars: (%d vs. %d)\n") @@ -422,6 +424,8 @@ } } _bound = true; + + define_all(); // execute and do not fetch sword res = OCICALL(OCIStmtExecute( @@ -465,28 +469,74 @@ } } -bool SqlStatement::fetch(ub4 rows/*=-1*/) +void SqlStatement::fetch(ub4 rows/*=-1*/) { sword res = OCICALL(OCIStmtFetch(_handle, _errh, rows, OCI_FETCH_NEXT, OCI_DEFAULT)); - - _last_row += _last_buff_row; - _last_fetched_row = row_count(); - _last_buff_row = 0; + while (res == OCI_NEED_DATA) + { + // NOTE: idx is ignored here, therefore fetch for TABLE OF LONG will fail + ub1 piece = OCI_FIRST_PIECE, in_out = 0; + dvoid *hdlptr = (dvoid *) 0; + ub4 hdltype = OCI_HTYPE_DEFINE, iter = 0, idx = 0; + BindPar *BPp = 0; + sword res2; + + res2 = OCICALL(OCIStmtGetPieceInfo(_handle, _errh, &hdlptr, &hdltype, &in_out, &iter, &idx, &piece)); + oci_check_error(__TROTL_HERE__, _errh, res2); + + switch(hdltype) + { + case OCI_HTYPE_DEFINE: + for(unsigned i=1; i<=_column_count; ++i) + { + if(_all_defines[i].get()->defnpp == hdlptr) + { + BPp = _all_defines[i].get(); + break; + } + } + break; + case OCI_HTYPE_BIND: + for(unsigned i=1; i<=_param_count; ++i) + { + if(_all_binds[i].get()->bindp == hdlptr) + { + BPp = _all_binds[i].get(); + break; + } + } + break; + } + + ub4 alen = (ub4)BPp->alenp[0]; + sb2 indptr = 0; + ub2 rcode = 0; + + res2 = OCICALL(OCIStmtSetPieceInfo((dvoid *)hdlptr, (ub4)hdltype, _errh, (dvoid *) BPp->valuep, &alen, piece, (dvoid *)&indptr, &rcode)); + oci_check_error(__TROTL_HERE__, _errh, res2); + + res = OCICALL(OCIStmtFetch(_handle, _errh, rows, OCI_FETCH_NEXT, OCI_DEFAULT)); + if(res == OCI_NEED_DATA || res == OCI_NO_DATA || res == OCI_SUCCESS || res == OCI_SUCCESS_WITH_INFO) + BPp->fetch_hook(iter, idx, piece, alen, indptr); + } + switch(res) { + case OCI_NO_DATA: + _state |= EOF_DATA; case OCI_SUCCESS: _state |= FETCHED; - return true; - case OCI_NO_DATA: - _state |= FETCHED | EOF_DATA; - return false; + break; + // case OCI_NEED_DATA: + // break; default: oci_check_error(__TROTL_HERE__, _errh, res); - //oci_check_error(__TROTL_HERE__, *this, res); - return true; } - + + _last_row += _last_buff_row; + _last_fetched_row = row_count(); + _last_buff_row = 0; } ub4 SqlStatement::row_count() const @@ -544,21 +594,21 @@ sword res = OCICALL(OCIBindByName (_handle, - &bp.bindp, - _errh, - (const OraText*)bp.bind_name.c_str(), - bp.bind_name.length(), - bp.valuep, - bp.value_sz, - bp.dty, - bp.indp, - (bp._bind_type == BindPar::BIND_IN ? NULL : bp.alenp), - 0, // *rcodep - //NULL for non-PL/SQL statements - maybe - (((_stmt_type == STMT_DECLARE ||_stmt_type == STMT_BEGIN ) && bp._max_cnt > 1) ? bp._max_cnt : 0), - //NULL for non-PL/SQL statements - (ub4*)(((_stmt_type == STMT_DECLARE ||_stmt_type == STMT_BEGIN ) && bp._max_cnt > 1) ? &bp._cnt : NULL), - OCI_DEFAULT)); + &bp.bindp, + _errh, + (const OraText*)bp.bind_name.c_str(), + bp.bind_name.length(), + bp.valuep, + bp.value_sz, + bp.dty, + bp.indp, + (bp._bind_type == BindPar::BIND_IN ? NULL : bp.alenp), + 0, // *rcodep + //NULL for non-PL/SQL statements - maybe + (((_stmt_type == STMT_DECLARE ||_stmt_type == STMT_BEGIN ) && bp._max_cnt > 1) ? bp._max_cnt : 0), + //NULL for non-PL/SQL statements + (ub4*)(((_stmt_type == STMT_DECLARE ||_stmt_type == STMT_BEGIN ) && bp._max_cnt > 1) ? &bp._cnt : NULL), + OCI_DEFAULT)); oci_check_error(__TROTL_HERE__, _errh, res); // std::cout << std::endl @@ -568,28 +618,28 @@ // << "stmt_type2:" << ((_stmt_type == STMT_DECLARE ||_stmt_type == STMT_BEGIN) ? bp._max_cnt : 0) << std::endl // << "stmt_type3:" << ((_stmt_type == STMT_DECLARE ||_stmt_type == STMT_BEGIN) ? bp._cnt : NULL) << std::endl // << std::endl; - bp.bind_hook(*this); + bp.bind_hook(); //TODO use atribute OCI_ATTR_MAXDATA_SIZE here bp._bound = true; } - void SqlStatement::define(BindPar &dp) - { - sword res = OCICALL(OCIDefineByPos(_handle/*stmtp*/, - &dp.defnpp, // (OCIDefine **) - _errh, // (OCIError*) - dp._pos, // ub4 position - dp.valuep, // dvoid *valuep - dp.value_sz, // sb4 value_sz - dp.dty, // ub2 dty - dp.indp, // dvoid *indp - (ub2*) dp.rlenp, // ub2 *rlenp - NULL, // ub2 *rcodep - dp.mode)); - oci_check_error(__TROTL_HERE__, _errh, res); +void SqlStatement::define(BindPar &dp) +{ + sword res = OCICALL(OCIDefineByPos(_handle/*stmtp*/, + &dp.defnpp, // (OCIDefine **) + _errh, // (OCIError*) + dp._pos, // ub4 position + dp.valuep, // dvoid *valuep + dp.value_sz, // sb4 value_sz + dp.dty, // ub2 dty + dp.indp, // dvoid *indp + (ub2*) dp.rlenp, // ub2 *rlenp + NULL, // ub2 *rcodep + dp.mode)); // ub4 mode (OCI_DEFAULT,OCI_DYNAMIC_FETCH,...) + oci_check_error(__TROTL_HERE__, _errh, res); - dp.define_hook(*this); - } + dp.define_hook(); +} SqlStatement::~SqlStatement() { Modified: branches/tora-trotl/src/trotl/src/trotl_stat.h =================================================================== --- branches/tora-trotl/src/trotl/src/trotl_stat.h 2010-12-31 12:50:17 UTC (rev 3851) +++ branches/tora-trotl/src/trotl/src/trotl_stat.h 2011-01-05 14:58:38 UTC (rev 3852) @@ -172,8 +172,9 @@ * OCIBindArrayOfStructures, OCIBindObject etc, ... * is called *after* OCIDefineByPos */ - virtual void bind_hook(SqlStatement&) {}; - virtual void define_hook(SqlStatement&) {}; + virtual void bind_hook() {}; + virtual void define_hook() {}; + virtual void fetch_hook(ub4 iter, ub4 idx, ub1 piece, ub4, sb2 ind) {}; /* members used for OCI calls */ dvoid **valuep; @@ -182,7 +183,7 @@ OCIInd *indp; // OCIInd aka sb2 ignored for SQL_NTY and SQL_REF void *rlenp; //ub2 *rcodep; - ub2 *alenp; + ub2 *alenp; // (ub2*) in case of Bind op. (ub4*) in case of Define op. ub4 mode; // define mode = OCI_DEFAULT, except for SQLT_LONG => OCI_DYNAMIC_FETCH TODO fix long OCIBind *bindp; OCIDefine *defnpp; //TODO union with OCIBind *bindpp @@ -389,7 +390,7 @@ void execute_describe(); - bool fetch(ub4 rows=-1); + void fetch(ub4 rows=-1); /* OCIBindByPos - for PL/SQL statements */ void bind(BindPar &bp); Modified: branches/tora-trotl/src/trotl/src/trotl_string.cpp =================================================================== --- branches/tora-trotl/src/trotl/src/trotl_string.cpp 2010-12-31 12:50:17 UTC (rev 3851) +++ branches/tora-trotl/src/trotl/src/trotl_string.cpp 2011-01-05 14:58:38 UTC (rev 3852) @@ -49,10 +49,105 @@ Util::RegisterInFactory<BindParVarchar, DefineParFactTwoParmSing, int> regDefineChar1(SQLT_CHR); Util::RegisterInFactory<BindParChar, DefineParFactTwoParmSing, int> regDefineChar2(SQLT_AFC); Util::RegisterInFactory<BindParVarchar, DefineParFactTwoParmSing, int> regDefineVarchar(SQLT_STR); - -Util::RegisterInFactory<BindParChar, DefineParFactTwoParmSing, int> regDefineLong(SQLT_LNG); Util::RegisterInFactory<BindParRaw, DefineParFactTwoParmSing, int> regDefineRaw(SQLT_BIN); +Util::RegisterInFactory<BindParLong, DefineParFactTwoParmSing, int> regDefineLong(SQLT_LNG); + + void BindParLong::fetch_hook(ub4 iter, ub4 idx, ub1 piece, ub4 alen, sb2 ind) + { + if(piece == OCI_FIRST_PIECE) + { + s.at(iter)->clear(); + s.at(iter)->str(""); + } + *s.at(iter) << std::string((char*)valuep, min(g_OCIPL_MAX_LONG - (unsigned)s.at(iter)->tellp(), alen)); + } + + // This is abandonned piece of code. for some unknown reason callback does not work well on LONG datatype + // maybe it will be usefull for some other datatypes + // #define PIECE_SIZE 1000 + // #define DATA_SIZE 5000 + // static text nextpiece[DATA_SIZE]; + // void BindParLong::define_hook() + // { + // // std::cout << "valuep:" << valuep << std::endl; + // // sword res = OCICALL(OCIDefineDynamic(defnpp, _stmt._errh, (void*)this, (OCICallbackDefine)cdf_fetch_buffer)); + // // oci_check_error(__TROTL_HERE__, _env, res); + // } + + // sb4 BindParLong::cdf_fetch_buffer(dvoid *ctx, OCIDefine *defnp, ub4 iter, dvoid **bufpp, ub4 **alenpp, ub1 *piecep, dvoid **indpp, ub2 **rcpp) + // { + // BindParLong *me = (BindParLong*)ctx; + // std::cout << "cdf_fetch_buffer called" << std::endl + // << "dvoid *ctx = " << ctx << std::endl + // << "OCIDefine *defnp = " << defnp << std::endl + // << "ub4 iter = " << iter << std::endl + // << "dvoid **bufpp = " << bufpp << std::endl + // << "ub4 **alenpp = " << alenpp << " " << *alenpp << " " << (*alenpp ? **alenpp:0) << std::endl + // << "ub1 *piecep = " << piecep << " " << (unsigned)*piecep << std::endl + // << "dvoid **indpp =" << indpp << std::endl + // << "ub2 **rcpp = " << rcpp << std::endl + // << "me->valuep = " << (char*)me->valuep << std::endl; + // printf("Getting OCI_%s_PIECE .... \n", + // (piecep[0]==(ub1)OCI_ONE_PIECE) ? "ONE" : + // (piecep[0]==(ub1)OCI_FIRST_PIECE) ? "FIRST" : + // (piecep[0]==(ub1)OCI_NEXT_PIECE) ? "NEXT" : + // (piecep[0]==(ub1)OCI_LAST_PIECE) ? "LAST" : "???"); + // if(me->valuep) + // std::cout << (char*)me->valuep << std::endl; + // if(*bufpp) + // std::cout << (char*)*bufpp << std::endl; + // std::cout << "================================================================================" << std::endl; + + // static ub4 len = DATA_SIZE; + // static sb2 ind = 0; + // static boolean glGetInd = 0; /* global var to control return of ind */ + // static ub2 rc = 0; + // static boolean glGetRc = 0; /* global var to control return of rc */ + + // int i; + + // //*bufpp = (dvoid *) me->valuep; + // *bufpp = (dvoid *) nextpiece; + + // if(*bufpp) + // { + // me->s.at(iter)->clear(); + // me->s.at(iter)->str(""); + + // *me->s.at(iter) << (char*)*bufpp; + // } + + // /*verify the contents of fetched pieces*/ + // // if(piecep[0]==(ub1)OCI_FIRST_PIECE) + // // ; + + // if ((*piecep) == (ub1)OCI_ONE_PIECE) + // *piecep = OCI_FIRST_PIECE; + + // //if ((*piecep) == (ub1)OCI_FIRST_PIECE) + // *piecep = OCI_LAST_PIECE; + + // //len = me->value_sz; + // //*alenpp = (ub4*)me->alenp; + // //*indpp = me->indp; + + // len = PIECE_SIZE; + // *alenpp = &len; + + // ind = 0; + // if (glGetInd) + // *indpp = (dvoid *) &ind; + // else + // *indpp = (dvoid *)0; + + // rc = 0; + // if (glGetRc) + // *rcpp = (ub2 *) &rc; + // else + // *rcpp = (ub2 *)0; + // return OCI_CONTINUE; + // } }; Modified: branches/tora-trotl/src/trotl/src/trotl_string.h =================================================================== --- branches/tora-trotl/src/trotl/src/trotl_string.h 2010-12-31 12:50:17 UTC (rev 3851) +++ branches/tora-trotl/src/trotl/src/trotl_string.h 2011-01-05 14:58:38 UTC (rev 3852) @@ -64,7 +64,7 @@ { /* amount of bytes = (string length +1 ) * (array length) */ valuep = (void**) calloc(_cnt, ct._width + 1); - alenp = (ub2*) calloc(_cnt, sizeof(ub2)); + alenp = (ub2*) calloc(_cnt, sizeof(ub4)); dty = SQLT_STR; value_sz = ct._width + 1; @@ -87,7 +87,7 @@ virtual tstring get_string(unsigned int row) const { - return is_null(row) ? "NULL" : tstring(((char*)valuep)+(row * value_sz)); + return is_null(row) ? "NULL" : tstring(((char*)valuep)+(row * value_sz)); } protected: @@ -101,7 +101,7 @@ BindParChar(unsigned int pos, SqlStatement &stmt, ColumnType &ct) : SqlStatement::BindPar(pos, stmt, ct) { valuep = (void**) calloc(_cnt, ct._width + 1); // TODO +1 ?? why? - alenp = (ub2*) calloc(_cnt, sizeof(ub2)); + alenp = (ub2*) calloc(_cnt, sizeof(ub4)); dty = SQLT_CHR; value_sz = ct._width; @@ -140,7 +140,7 @@ { // amount of bytes = (string length +1 ) * (array length) valuep = (void**) calloc(_cnt, ct._width + 1); - alenp = (ub2*) calloc(_cnt, sizeof(ub2)); + alenp = (ub2*) calloc(_cnt, sizeof(ub4)); dty = SQLT_BIN; value_sz = ct._width; @@ -182,6 +182,66 @@ BindParRaw(const BindParRaw &other); }; +struct TROTL_EXPORT BindParLong: public SqlStatement::BindPar +{ + BindParLong(unsigned int pos, SqlStatement &stmt, ColumnType &ct) : SqlStatement::BindPar(pos, stmt, ct) + { + /* amount of bytes = (string length +1 ) * (array length) */ + valuep = (void**) calloc(8192, 1); + alenp = (ub2*) calloc(_cnt, sizeof(ub4)); + + alenp[0] = 8192; + + dty = SQLT_LNG; + value_sz = 0x10000000; //ct._width + 1; + type_name = typeid(tstring).name(); + mode = OCI_DYNAMIC_FETCH; + + s.reserve(_cnt); + for(unsigned i=0; i<_cnt; ++i) + { + s.push_back(new std::stringstream()); + } + } + + BindParLong(unsigned int pos, SqlStatement &stmt, BindVarDecl &decl) : SqlStatement::BindPar(pos, stmt, decl) + { + // amount of bytes = (string length +1 ) * (array length) + valuep = (void**) calloc(decl.bracket[0]+1, decl.bracket[1]); + alenp = (ub2*) calloc(_cnt, sizeof(ub2)); + + alenp[0] = 16; + + dty = SQLT_LNG; + value_sz = decl.bracket[0]+1; + type_name = typeid(tstring).name(); + } + + + virtual void fetch_hook(ub4 iter, ub4 idx, ub1 piece, ub4 alen, sb2 ind); + + //virtual void define_hook(); + //static sb4 cdf_fetch_buffer(dvoid *ctx, OCIDefine *defnp, ub4 iter, dvoid **bufpp, ub4 **alenpp, ub1 *piecep, dvoid **indpp, ub2 **rcpp); + + ~BindParLong() + { + for(unsigned i=0; i<_cnt; ++i) + { + delete s.at(i); + } + } + + virtual tstring get_string(unsigned int row) const + { + //return is_null(row) ? "NULL" : tstring(((char*)valuep)+(row * value_sz)); + return s.at(row)->str(); + } + +protected: + BindParLong(const BindParLong &other); + std::vector<std::stringstream*> s; }; + +}; #endif Modified: branches/tora-trotl/src/trotl/src/trotl_var.h =================================================================== --- branches/tora-trotl/src/trotl/src/trotl_var.h 2010-12-31 12:50:17 UTC (rev 3851) +++ branches/tora-trotl/src/trotl/src/trotl_var.h 2011-01-05 14:58:38 UTC (rev 3852) @@ -48,13 +48,13 @@ #if defined(TROTL_MAKE_DLL) || defined(__GNUC__) extern int TROTL_EXPORT g_OCIPL_BULK_ROWS; extern int TROTL_EXPORT g_OCIPL_MAX_LONG; -extern char TROTL_EXPORT *g_TROTL_DEFAULT_NUM_FTM; -extern char TROTL_EXPORT *g_TROTL_DEFAULT_DATE_FTM; +extern const char TROTL_EXPORT *g_TROTL_DEFAULT_NUM_FTM; +extern const char TROTL_EXPORT *g_TROTL_DEFAULT_DATE_FTM; #else int TROTL_EXPORT g_OCIPL_BULK_ROWS; int TROTL_EXPORT g_OCIPL_MAX_LONG; -char TROTL_EXPORT *g_TROTL_DEFAULT_NUM_FTM; -char TROTL_EXPORT *g_TROTL_DEFAULT_DATE_FTM; +const char TROTL_EXPORT *g_TROTL_DEFAULT_NUM_FTM; +const char TROTL_EXPORT *g_TROTL_DEFAULT_DATE_FTM; #endif struct Convertor; Modified: branches/tora-trotl/src/trotl/src/trotl_xml.cpp =================================================================== --- branches/tora-trotl/src/trotl/src/trotl_xml.cpp 2010-12-31 12:50:17 UTC (rev 3851) +++ branches/tora-trotl/src/trotl/src/trotl_xml.cpp 2011-01-05 14:58:38 UTC (rev 3852) @@ -87,33 +87,33 @@ // } } -void BindParXML::define_hook(SqlStatement &stmt) +void BindParXML::define_hook() { // xmlsize = 0; // std::cout << "OCIDefineObject" << std::endl; - sword res = OCICALL(OCIDefineObject(defnpp, stmt._errh, - xmltdo, - // TODO If the application wants the buffer to be implicitly allocated in the cache, - // *pgvpp should be passed in as null. - (dvoid **) &(_xmlvaluep[0]), - 0, - 0, //(dvoid **) &xml_ind, - 0)); - oci_check_error(__TROTL_HERE__, stmt._errh, res); + sword res = OCICALL(OCIDefineObject(defnpp, _stmt._errh, + xmltdo, + // TODO If the application wants the buffer to be implicitly allocated in the cache, + // *pgvpp should be passed in as null. + (dvoid **) &(_xmlvaluep[0]), + 0, + 0, //(dvoid **) &xml_ind, + 0)); + oci_check_error(__TROTL_HERE__, _stmt._errh, res); // res = OCICALL(OCIDefineArrayOfStruct(defnpp, stmt._errh, sizeof(OCIXMLType*), 0, 0, 0)); // oci_check_error(__TROTL_HERE__, stmt._errh, res); } -void BindParXML::bind_hook(SqlStatement &stmt) +void BindParXML::bind_hook() { // xmlsize = 0; // std::cout << "OCIBindObject" << std::endl; - sword res = OCICALL(OCIBindObject(bindp, stmt._errh, + sword res = OCICALL(OCIBindObject(bindp, _stmt._errh, xmltdo, // TODO If the application wants the buffer to be implicitly allocated in the cache, // *pgvpp should be passed in as null. @@ -121,7 +121,7 @@ 0, 0, //(dvoid **) &xml_ind, 0)); - oci_check_error(__TROTL_HERE__, stmt._errh, res); + oci_check_error(__TROTL_HERE__, _stmt._errh, res); // TODO // if( _cnt > 1 ) { // res = OCICALL(OCIDefineArrayOfStruct(bindp, conn._env._errh, sizeof(OCIXMLType*), 0, 0, 0)); Modified: branches/tora-trotl/src/trotl/src/trotl_xml.h =================================================================== --- branches/tora-trotl/src/trotl/src/trotl_xml.h 2010-12-31 12:50:17 UTC (rev 3851) +++ branches/tora-trotl/src/trotl/src/trotl_xml.h 2011-01-05 14:58:38 UTC (rev 3852) @@ -86,8 +86,8 @@ void init(SqlStatement &stmt); - virtual void define_hook(SqlStatement &stmt); - virtual void bind_hook(SqlStatement &stmt); + virtual void define_hook(); + virtual void bind_hook(); //private: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2011-01-05 15:00:19
|
Revision: 3853 http://tora.svn.sourceforge.net/tora/?rev=3853&view=rev Author: ibre5041 Date: 2011-01-05 15:00:10 +0000 (Wed, 05 Jan 2011) Log Message: ----------- sync with TOra trunk Modified Paths: -------------- branches/tora-trotl/src/Makefile.am branches/tora-trotl/src/tobrowser.cpp branches/tora-trotl/src/tobrowser.h branches/tora-trotl/src/tobrowserschemawidget.cpp branches/tora-trotl/src/tobrowserschemawidget.h branches/tora-trotl/src/tocache.cpp branches/tora-trotl/src/tocache.h branches/tora-trotl/src/toconnection.cpp branches/tora-trotl/src/toconnection.h branches/tora-trotl/src/todescribe.cpp branches/tora-trotl/src/tooracleconnection_trotl.cpp branches/tora-trotl/src/toqsqlconnection.cpp branches/tora-trotl/src/toresultcombo.cpp branches/tora-trotl/src/toresultcombo.h branches/tora-trotl/src/toresultmodel.cpp branches/tora-trotl/src/toresultmodel.h branches/tora-trotl/src/toresulttableview.cpp branches/tora-trotl/src/toresulttableview.h branches/tora-trotl/src/tosqlparse.cpp branches/tora-trotl/src/tosqlparse.h branches/tora-trotl/src/toteradataconnection.cpp Modified: branches/tora-trotl/src/Makefile.am =================================================================== --- branches/tora-trotl/src/Makefile.am 2011-01-05 14:58:38 UTC (rev 3852) +++ branches/tora-trotl/src/Makefile.am 2011-01-05 15:00:10 UTC (rev 3853) @@ -57,7 +57,10 @@ tobackgroundlabel.cpp tobackgroundlabel.h \ toconfiguration.cpp toconfiguration.h \ toconnection.cpp toconnection.h \ + toquery.cpp toquery.h \ + toqueryimpl.h \ toqvalue.cpp toqvalue.h \ + tocache.cpp tocache.h \ toconnectionimport.cpp toconnectionimport.h \ toconnectionpool.cpp toconnectionpool.h \ todescribe.cpp todescribe.h \ @@ -326,6 +329,9 @@ moc_tochangeconnection.cpp \ moc_tochartmanager.cpp \ moc_toconnection.cpp \ + moc_toquery.cpp \ + moc_toqueryimpl.cpp \ + moc_tocache.cpp \ moc_toconnectionmodel.cpp \ moc_tocodemodel.cpp \ moc_toconnectionpool.cpp \ Modified: branches/tora-trotl/src/tobrowser.cpp =================================================================== --- branches/tora-trotl/src/tobrowser.cpp 2011-01-05 14:58:38 UTC (rev 3852) +++ branches/tora-trotl/src/tobrowser.cpp 2011-01-05 15:00:10 UTC (rev 3853) @@ -736,286 +736,6 @@ "", "", "Teradata"); - -/* static toSQL SQLTableIndex("toBrowser:TableIndex", - "SELECT IND.index_name AS \"Index Name\",\n" - " ind.column_name AS \"Column Name\",\n" - " al.uniqueness AS \"Unique\",\n" - " AL.index_type AS \"Type\",\n" - " EX.column_expression AS \"Column Expression\"\n" - " FROM SYS.ALL_IND_COLUMNS IND,\n" - " SYS.ALL_IND_EXPRESSIONS EX,\n" - " sys.All_Indexes AL\n" - " WHERE IND.INDEX_OWNER = :own<char[101]>\n" - " AND IND.TABLE_NAME = :nam<char[101]>\n" - " AND EX.index_owner ( + ) = IND.index_owner\n" - " AND EX.index_name ( + ) = IND.index_name\n" - " AND IND.index_name = AL.index_name ( + )\n" - " AND IND.index_owner = AL.owner ( + )", - "List the indexes on a table", - "");*/ -/* static toSQL SQLTableIndexSapDB("toBrowser:TableIndex", - "SELECT owner,\n" - " indexname \"Index_Name\",\n" - " 'NORMAL',\n" - " type\n" - " FROM indexes \n" - " WHERE owner = :f1<char[101]> and tablename = :f2<char[101]> \n" - " ORDER by indexname", - "", - "", - "SapDB");*/ -/* static toSQL SQLTableIndexPG("toBrowser:TableIndex", - "SELECT u.usename AS \"Owner\",\n" - " c2.relname AS \"Index Name\",\n" - " pg_get_indexdef(i.indexrelid) as \"Definition\"\n" - " FROM pg_class c,\n" - " pg_class c2,\n" - " pg_index i,\n" - " pg_user u,\n" - " pg_namespace n\n" - " WHERE c.relowner = u.usesysid\n" - " AND n.nspname = :f1\n" - " AND c.relname = :f2\n" - " AND c.relowner = u.usesysid\n" - " AND n.OID = c.relnamespace\n" - " AND c.OID = i.indrelid\n" - " AND i.indexrelid = c2.OID", - "", - "", - "PostgreSQL");*/ -/* static toSQL SQLTableIndexMySQL3("toBrowser:TableIndex", - "SHOW INDEX FROM `:f1<noquote>`.`:tab<noquote>`", - "", - "3.0", - "MySQL");*/ -/* static toSQL SQLTableConstraint( - "toBrowser:TableConstraint", -// "SELECT sub.constraint_name AS \"Constraint Name\",\n" -// " srch.search_condition AS \"Search Condition\",\n" -// " sub.condition AS \"Condition\",\n" -// " sub.status AS \"Status\",\n" -// " sub.constraint_type AS \"Type\",\n" -// " sub.delete_rule AS \"Delete Rule\",\n" -// " sub.GENERATED AS \"Generated\"\n" -// " FROM ( SELECT c.Constraint_Name,\n" -// " DECODE ( constraint_type,\n" -// " 'R',\n" -// " 'foreign key (' || a.column_name || ') references ' " -// "|| a2.owner || '.' || a2.table_name || '(' || a2.column_name || ')',\n" -// " 'P',\n" -// " 'primary key (' || a.column_name || ')',\n" -// " 'U',\n" -// " 'unique (' || a.column_name || ')',\n" -// " NULL ) AS condition,\n" -// " c.Status,\n" -// " c.Constraint_Type,\n" -// " c.Delete_Rule,\n" -// " c.GENERATED\n" -// " FROM sys.All_Constraints c,\n" -// " sys.all_cons_columns a,\n" -// " sys.all_cons_columns a2\n" -// " WHERE c.constraint_name = a.constraint_name\n" -// " AND c.Owner = :f1<char[101]>\n" -// " AND c.Table_Name = :f2<char[101]>\n" -// " AND c.r_constraint_name = a2.constraint_name ( + ) ) sub,\n" -// " sys.all_constraints srch\n" -// " WHERE sub.constraint_name = srch.constraint_name", - "SELECT main.constraint_name AS \"Constraint Name\",\n" - " main.column_name AS \"Column Name\",\n" - " main.search_condition AS \"Search Condition\",\n" - " main.status AS \"Status\",\n" - " main.constraint_type AS \"Type\",\n" - " main.delete_rule AS \"Delete Rule\",\n" - " main.generated AS \"Generated\",\n" - " DECODE ( main.constraint_type,\n" - " 'R',\n" - " 'FK (' || main.column_name || ') ref. ' || refs.owner || '.'\n" - " || refs.table_name || '(' || refs.column_name || ')',\n" - " 'P',\n" - " 'PK (' || main.column_name || ')',\n" - " 'U',\n" - " 'unique (' || main.column_name || ')',\n" - " NULL ) AS \"Condition\"\n" - " FROM\n" - " (\n" - " SELECT\n" - " c.constraint_name,\n" - " a.column_name,\n" - " c.constraint_type,\n" - " c.r_constraint_name,\n" - " c.search_condition,\n" - " c.status,\n" - " c.delete_rule,\n" - " c.generated\n" - " FROM\n" - " sys.All_Constraints c,\n" - " sys.all_cons_columns a\n" - " WHERE\n" - " c.constraint_name = a.constraint_name\n" - " AND c.Owner = :f1<char[101]>\n" - " AND c.Table_Name = :f2<char[101]>\n" - " ORDER BY\n" - " c.constraint_name, a.constraint_name, a.position\n" - " ) main,\n" - " sys.all_cons_columns refs\n" - " WHERE\n" - " main.r_constraint_name = refs.constraint_name (+)\n" - " AND main.column_name = refs.column_name (+)", - "List the constraints on a table", - "");*/ -/* static toSQL SQLTableConstraintPG( - "toBrowser:TableConstraint", - "SELECT conname as \"Constraint Name\",\n" - " pg_catalog.pg_get_constraintdef ( r.OID,\n" - " TRUE ) AS \"Description\"\n" - " FROM pg_catalog.pg_constraint r,\n" - " pg_catalog.pg_class c,\n" - " pg_catalog.pg_namespace n\n" - " WHERE n.nspname = :f1\n" - " AND c.relname = :f2\n" - " AND c.relnamespace = n.OID\n" - " AND c.OID = r.conrelid\n" - " ORDER BY 1", - "", - "", - "PostgreSQL");*/ -/* static toSQL SQLTableReferences( - "toBrowser:TableReferences", - "SELECT a.Owner AS \"Owner\",\n" - " a.Table_Name AS \"Object\",\n" - " a.Constraint_Name AS \"Constraint\",\n" - " 'foreign key (' || c.column_name || ') references ' || r.owner || " - "'.' || r.table_name || '(' || r.column_name || ')' AS \"Condition\",\n" - " a.Status AS \"Status\",\n" - " a.Delete_Rule AS \"Delete Rule\"\n" - " FROM sys.all_constraints a,\n" - " sys.all_cons_columns r,\n" - " sys.all_cons_columns c\n" - " WHERE a.constraint_type = 'R'\n" - " AND a.r_constraint_name IN ( SELECT b.constraint_name\n" - " FROM sys.all_constraints b\n" - " WHERE b.OWNER = :owner<char[101]>\n" - " AND b.TABLE_NAME = :tab<char[101]> )\n" - " AND a.r_constraint_name = r.constraint_name\n" - " AND a.constraint_name = c.constraint_name\n" - " UNION SELECT owner,\n" - " name,\n" - " NULL,\n" - " TYPE || ' ' || dependency_type,\n" - " 'DEPENDENCY',\n" - " NULL\n" - " FROM sys.all_dependencies\n" - " WHERE referenced_owner = :owner<char[101]>\n" - " AND referenced_name = :tab<char[101]>", - "List the references on a table", - "");*/ -/*static toSQL SQLTableTriggerSapDB("toBrowser:TableTrigger", - "SELECT TriggerName,'UPDATE' \"Event\",''\"Column\",'ENABLED' \"Status\",''\"Description\"\n" - " FROM triggers \n" - " WHERE owner = upper(:f1<char[101]>) and tablename = :f2<char[101]>\n" - " and update='YES'\n" - "UNION\n" - "SELECT TriggerName,'INSERT','','ENABLED',''\n" - " FROM triggers \n" - " WHERE owner = upper(:f1<char[101]>) and tablename = :f2<char[101]>\n" - " and insert='YES'\n" - "UNION\n" - "SELECT TriggerName,'DELETE','','ENABLED',''\n" - " FROM triggers \n" - " WHERE owner = upper(:f1<char[101]>) and tablename = :f2<char[101]>\n" - " and delete='YES'\n" - " ORDER by 1 ", - "Display the triggers operating on a table", - "", - "SapDB"); -static toSQL SQLTableTrigger("toBrowser:TableTrigger", - "SELECT Trigger_Name,Triggering_Event,Column_Name,Status,Description \n" - " FROM SYS.ALL_TRIGGERS\n" - " WHERE Table_Owner = :f1<char[101]> AND Table_Name = :f2<char[101]>", - "", - "0801"); -static toSQL SQLTableTrigger8("toBrowser:TableTrigger", - "SELECT Trigger_Name,Triggering_Event,Status,Description \n" - " FROM SYS.ALL_TRIGGERS\n" - " WHERE Table_Owner = :f1<char[101]> AND Table_Name = :f2<char[101]>"); -static toSQL SQLTableTriggerPG("toBrowser:TableTrigger", - " SELECT t.tgname AS \"Trigger Name\",\n" - " pg_catalog.pg_get_triggerdef ( t.OID ) AS \"Condition\"\n" - " FROM pg_catalog.pg_trigger t,\n" - " pg_class c,\n" - " pg_tables tab\n" - " WHERE lower ( tab.schemaname ) = lower ( :f1<char[101]> )\n" - " AND c.relname = tab.tablename\n" - " AND lower ( c.relname ) = lower ( :f2<char[101]> )\n" - " AND c.OID = t.tgrelid\n" - " AND ( NOT tgisconstraint OR NOT EXISTS ( SELECT 1\n" - " FROM pg_catalog.pg_depend d\n" - " JOIN pg_catalog.pg_constraint c\n" - " ON ( d.refclassid = c.tableoid AND d.refobjid = c.OID )\n" - " WHERE d.classid = t.tableoid\n" - " AND d.objid = t.OID\n" - " AND d.deptype = 'i'\n" - " AND c.contype = 'f' ) )\n" - " ORDER BY 1\n", - "", - "", - "PostgreSQL");*/ -/*static toSQL SQLTableInfoMysql("toBrowser:TableInformation", - "show table status from `:own<noquote>` like :tab", - "Display information about a table", - "3.0", - "MySQL"); -static toSQL SQLTableInfo("toBrowser:TableInformation", - "SELECT *\n" - " FROM SYS.ALL_TABLES\n" - " WHERE OWNER = :f1<char[101]> AND Table_Name = :f2<char[101]>", - ""); -static toSQL SQLTableInfoPgSQL("toBrowser:TableInformation", - "SELECT c.*\n" - " FROM pg_class c LEFT OUTER JOIN pg_namespace n ON c.relnamespace=n.oid\n" - " WHERE (n.nspname = :f1 OR n.oid IS NULL)\n" - " AND c.relkind = 'r'\n" - " AND c.relname = :f2", - "", - "7.1", - "PostgreSQL"); -static toSQL SQLTableInfoSapDB("toBrowser:TableInformation", - "SELECT TABLENAME,PRIVILEGES,CREATEDATE,CREATETIME,UPDSTATDATE,UPDSTATTIME,ALTERDATE,ALTERTIME,TABLEID \n" - " FROM tables \n" - " WHERE tabletype = 'TABLE' and owner = upper(:f1<char[101]>) and tablename = :f2<char[101]>", - "", - "", - "SapDB");*/ -/*static toSQL SQLTableStatistic("toBrowser:TableStatstics", - "SELECT description \"Description\", value(char_value,numeric_value) \"Value\" \n" - " FROM tablestatistics \n" - " WHERE owner = upper(:f1<char[101]>) and tablename = :f2<char[101]>", - "Table Statistics", - "", - "SapDB");*/ -/* static toSQL SQLTablePartition("toBrowser:TablePartitions", - "select p.partition_name \"Partition\"\n" - " , p.composite \"Composite\"\n" - " , p.num_rows \"Partition rows\"\n" - " , p.high_value \"High value\"\n" - " , p.subpartition_count \"Subpartitions\"\n" - " , p.partition_position \"Position\"\n" - " , s.subpartition_name \"Subpartition\"\n" - " , s.num_rows \"Subpartition rows\"\n" - " , s.subpartition_position \"Subpartition position\"\n" - " from all_tab_partitions p,\n" - " all_tab_subpartitions s\n" - " where p.table_owner = s.table_owner(+)\n" - " and p.table_name = s.table_name(+)\n" - " and p.partition_name = s.partition_name(+)\n" - " and p.table_owner like upper(:table_owner<char[101]>)\n" - " and p.table_name like upper(:table_name<char[101]>)\n" - " order by p.partition_name\n" - " , s.subpartition_name\n", - "Table partitions", - "0801");*/ - static toSQL SQLListViewPgSQL("toBrowser:ListView", "SELECT c.relname as View_Name\n" " FROM pg_class c LEFT OUTER JOIN pg_namespace n ON c.relnamespace=n.oid\n" @@ -1047,28 +767,6 @@ "", "", "Teradata"); - -/* static toSQL SQLViewSQLPgSQL("toBrowser:ViewSQL", - "SELECT pg_get_viewdef(c.relname)\n" - " FROM pg_class c LEFT OUTER JOIN pg_namespace n ON c.relnamespace=n.oid\n" - " WHERE (n.nspname = :f1 OR n.oid IS NULL)\n" - " AND c.relkind = 'v' AND c.relname = :f2", - "Display SQL of a specified view", - "7.1", - "PostgreSQL");*/ -/* static toSQL SQLViewSQL("toBrowser:ViewSQL", - "SELECT Text SQL\n" - " FROM SYS.ALL_Views\n" - " WHERE Owner = :f1<char[101]> AND View_Name = :f2<char[101]>", - "");*/ -/* static toSQL SQLViewSQLSapDb("toBrowser:ViewSQL", - "SELECT definition \"SQL\"\n" - " FROM viewdefs \n" - " WHERE viewname = :f2<char[101]> and owner = upper(:f1<char[101]>)\n", - "", - "", - "SapDB");*/ - static toSQL SQLListIndexMySQL3("toBrowser:ListIndex", "SHOW INDEX FROM :f1<char[100]>", "List the available indexes in a schema", @@ -1105,76 +803,6 @@ "", "", "SapDB"); - -/* static toSQL SQLIndexColsMySQL("toBrowser:IndexCols", - "SHOW INDEX FROM `:f1<noquote>`.`:f2<noquote>`", - "Display columns on which an index is built", - "3.23", - "MySQL");*/ -/* static toSQL SQLIndexCols("toBrowser:IndexCols", - "SELECT a.Table_Name,a.Column_Name,a.Column_Length,a.Descend,b.Column_Expression \" \"\n" - " FROM sys.All_Ind_Columns a,sys.All_Ind_Expressions b\n" - " WHERE a.Index_Owner = :f1<char[101]> AND a.Index_Name = :f2<char[101]>\n" - " AND a.Index_Owner = b.Index_Owner(+) AND a.Index_Name = b.Index_Name(+)\n" - " AND a.column_Position = b.Column_Position(+)\n" - " ORDER BY a.Column_Position", - "", - "0801");*/ -/* static toSQL SQLIndexCols8("toBrowser:IndexCols", - "SELECT Table_Name,Column_Name,Column_Length,Descend\n" - " FROM SYS.ALL_IND_COLUMNS\n" - " WHERE Index_Owner = :f1<char[101]> AND Index_Name = :f2<char[101]>\n" - " ORDER BY Column_Position", - "", - "0800");*/ -/* static toSQL SQLIndexCols7("toBrowser:IndexCols", - "SELECT Table_Name,Column_Name,Column_Length\n" - " FROM SYS.ALL_IND_COLUMNS\n" - " WHERE Index_Owner = :f1<char[101]> AND Index_Name = :f2<char[101]>\n" - " ORDER BY Column_Position", - "", - "0703");*/ -/* static toSQL SQLIndexColsPgSQL("toBrowser:IndexCols", - "SELECT a.attname,\n" - " format_type(a.atttypid, a.atttypmod) as FORMAT,\n" - " a.attnotnull,\n" - " a.atthasdef\n" - " FROM pg_class c LEFT OUTER JOIN pg_namespace n ON c.relnamespace=n.oid,\n" - " pg_attribute a\n" - " WHERE (n.nspname = :f1 OR n.oid IS NULL)\n" - " AND a.attrelid = c.oid AND c.relname = :f2\n" - " AND a.attnum > 0\n" - " ORDER BY a.attnum\n", - "", - "7.1", - "PostgreSQL");*/ -/* static toSQL SQLIndexColsSapDb("toBrowser:IndexCols", - "SELECT tablename,columnname,len \"Length\",DataType,Sort \n" - " FROM indexcolumns \n" - " WHERE owner = upper(:f1<char[101]>) and indexname = upper(:f2<char[101]>)\n" - " ORDER BY indexname,columnno", - "", - "", - "SapDB");*/ -/* static toSQL SQLIndexInfoSapDb("toBrowser:IndexInformation", - "SELECT INDEXNAME,TABLENAME, TYPE, CREATEDATE,CREATETIME,INDEX_USED, DISABLED \n" - " FROM indexes\n" - " WHERE owner = upper(:f1<char[101]>) and indexname = :f2<char[101]>\n", - "Display information about an index", - "", - "SapDB");*/ -/* static toSQL SQLIndexInfo("toBrowser:IndexInformation", - "SELECT * FROM SYS.ALL_INDEXES\n" - " WHERE Owner = :f1<char[101]> AND Index_Name = :f2<char[101]>", - "");*/ -/* static toSQL SQLIndexStatistic("toBrowser:IndexStatstics", - "SELECT description \"Description\", value(char_value,numeric_value) \"Value\" \n" - " FROM indexstatistics \n" - " WHERE owner = upper(:f1<char[101]>) and indexname = :f2<char[101]>", - "Index Statistics", - "", - "SapDB");*/ - static toSQL SQLListSequencePgSQL("toBrowser:ListSequence", "SELECT c.relname AS \"Sequence Name\"\n" " FROM pg_class c LEFT OUTER JOIN pg_namespace n ON c.relnamespace=n.oid\n" @@ -1190,17 +818,6 @@ " AND UPPER(SEQUENCE_NAME) LIKE :f2<char[101]>\n" " ORDER BY Sequence_Name", ""); -/* static toSQL SQLSequenceInfoPgSQL("toBrowser:SequenceInformation", - "SELECT *, substr(:f1,1) as \"Owner\" FROM :f2<noquote>", - "Display information about a sequence", - "7.1", - "PostgreSQL");*/ -/* static toSQL SQLSequenceInfo("toBrowser:SequenceInformation", - "SELECT * FROM SYS.ALL_SEQUENCES\n" - " WHERE Sequence_Owner = :f1<char[101]>\n" - " AND Sequence_Name = :f2<char[101]>", - "");*/ - static toSQL SQLListSynonym("toBrowser:ListSynonym", "SELECT DECODE(Owner,'PUBLIC','',Owner||'.')||Synonym_Name \"Synonym Name\"\n" " FROM Sys.All_Synonyms\n" @@ -1209,125 +826,12 @@ " AND UPPER(Synonym_Name) LIKE :f2<char[101]>\n" " ORDER BY Synonym_Name", "List the available synonyms in a schema"); -/* static toSQL SQLSynonymInfo("toBrowser:SynonymInformation", - "SELECT * FROM Sys.All_Synonyms a\n" - " WHERE Owner = :f1<char[101]>\n" - " AND Synonym_Name = :f2<char[101]>", - "Display information about a synonym");*/ -/* static toSQL SQLListSQLPgSQL("toBrowser:ListCode", - "SELECT p.proname AS Object_Name,\n" - " CASE WHEN p.prorettype = 0 THEN 'PROCEDURE'\n" - " ELSE 'FUNCTION'\n" - " END AS Object_Type\n" - "FROM pg_proc p LEFT OUTER JOIN pg_namespace n ON p.pronamespace=n.oid\n" - "WHERE (n.nspname = :f1 OR n.oid IS NULL)\n" - "ORDER BY Object_Name", - "List the available Code objects in a schema", - "7.1", - "PostgreSQL");*/ -/* static toSQL SQLListSQL("toBrowser:ListCode", - "SELECT Object_Name,Object_Type,Status Type FROM SYS.ALL_OBJECTS\n" - " WHERE OWNER = :f1<char[101]>\n" - " AND Object_Type IN ('FUNCTION','PACKAGE',\n" - " 'PROCEDURE','TYPE')\n" - " AND UPPER(OBJECT_NAME) LIKE :f2<char[101]>\n" - " ORDER BY Object_Name", - "");*/ -/* static toSQL SQLListSQLShortPgSQL("toBrowser:ListCodeShort", - "SELECT p.proname AS Object_Name\n" - "FROM pg_proc p LEFT OUTER JOIN pg_namespace n ON p.pronamespace=n.oid\n" - "WHERE (n.nspname = :f1 OR n.oid IS NULL)\n" - "ORDER BY Object_Name", - "List the available Code objects in a schema, one column version", - "7.1", - "PostgreSQL");*/ -/* static toSQL SQLListSQLShort("toBrowser:ListCodeShort", - "SELECT Object_Name Type FROM SYS.ALL_OBJECTS\n" - " WHERE OWNER = :f1<char[101]>\n" - " AND Object_Type IN ('FUNCTION','PACKAGE',\n" - " 'PROCEDURE','TYPE')\n" - " AND UPPER(OBJECT_NAME) LIKE :f2<char[101]>\n" - " ORDER BY Object_Name", - "");*/ -/* static toSQL SQLSQLTemplate("toBrowser:CodeTemplate", - "SELECT Text FROM SYS.ALL_SOURCE\n" - " WHERE Owner = :f1<char[101]> AND Name = :f2<char[101]>\n" - " AND Type IN ('PACKAGE','PROCEDURE','FUNCTION','PACKAGE','TYPE')", - "Declaration of object displayed in template window");*/ -// PostgreSQL does not distinguish between Head and Body for Stored SQL -// package code will be returnd for both Head and Body -/* static toSQL SQLSQLHeadPgSQL("toBrowser:CodeHead", - "SELECT p.prosrc\n" - "FROM pg_proc p LEFT OUTER JOIN pg_namespace n ON p.pronamespace=n.oid\n" - "WHERE (n.nspname = :f1 OR n.oid IS NULL)\n" - " AND p.proname = :f2\n", - "Declaration of object", - "7.1", - "PostgreSQL");*/ -/* static toSQL SQLSQLHead("toBrowser:CodeHead", - "SELECT Text FROM SYS.ALL_SOURCE\n" - " WHERE Owner = :f1<char[101]> AND Name = :f2<char[101]>\n" - " AND Type IN ('PACKAGE','TYPE')", - "");*/ -/* static toSQL SQLSQLBodyPgSQL("toBrowser:CodeBody", - "SELECT 'CREATE OR REPLACE FUNCTION ' || p.proname || ' ( ' ||\n" - "( SELECT array_to_string ( ARRAY ( SELECT t.typname\n" - " FROM pg_type t\n" - " WHERE t.OID = ANY ( p.proargtypes ) ),\n" - " ', ' ) ) || ' ) RETURNS ' || ( SELECT t.typname\n" - " from pg_type t\n" - " where p.prorettype = t.oid) ||\n" - " ' AS ' || quote_literal ( p.prosrc ) || ' language plpgsql;'\n" - " FROM pg_proc p\n" - " LEFT OUTER JOIN pg_namespace n\n" - " ON p.pronamespace = n.OID\n" - " WHERE ( n.nspname = :f1 OR n.OID IS NULL )\n" - " AND p.proname = :f2", - "Implementation of object", - "7.1", - "PostgreSQL");*/ -/* static toSQL SQLSQLBody("toBrowser:CodeBody", - "SELECT Text FROM SYS.ALL_SOURCE\n" - " WHERE Owner = :f1<char[101]> AND Name = :f2<char[101]>\n" - " AND Type IN ('PROCEDURE','FUNCTION','PACKAGE BODY','TYPE BODY')", - "");*/ - static toSQL SQLListTrigger("toBrowser:ListTrigger", "SELECT Trigger_Name FROM SYS.ALL_TRIGGERS\n" " WHERE OWNER = :f1<char[101]>\n" " AND UPPER(TRIGGER_NAME) LIKE :f2<char[101]>\n" " ORDER BY Trigger_Name", "List the available triggers in a schema"); -/* static toSQL SQLTriggerInfo("toBrowser:TriggerInfo", - "SELECT Owner,Trigger_Name,\n" - " Trigger_Type,Triggering_Event,\n" - " Table_Owner,Base_Object_Type,Table_Name,Column_Name,\n" - " Referencing_Names,When_Clause,Status,\n" - " Description,Action_Type\n" - " FROM SYS.ALL_TRIGGERS\n" - "WHERE Owner = :f1<char[101]> AND Trigger_Name = :f2<char[101]>", - "Display information about a trigger", - "0801");*/ -/* static toSQL SQLTriggerInfo8("toBrowser:TriggerInfo", - "SELECT Owner,Trigger_Name,\n" - " Trigger_Type,Triggering_Event,\n" - " Table_Owner,Table_Name,\n" - " Referencing_Names,When_Clause,Status,\n" - " Description\n" - " FROM SYS.ALL_TRIGGERS\n" - "WHERE Owner = :f1<char[101]> AND Trigger_Name = :f2<char[101]>", - "", - "0800");*/ -/* static toSQL SQLTriggerBody("toBrowser:TriggerBody", - "SELECT Trigger_Body FROM SYS.ALL_TRIGGERS\n" - " WHERE Owner = :f1<char[101]> AND Trigger_Name = :f2<char[101]>", - "Implementation of trigger");*/ -/* static toSQL SQLTriggerCols("toBrowser:TriggerCols", - "SELECT Column_Name,Column_List \"In Update\",Column_Usage Usage\n" - " FROM SYS.ALL_TRIGGER_COLS\n" - " WHERE Trigger_Owner = :f1<char[101]> AND Trigger_Name = :f2<char[101]>", - "Columns used by trigger");*/ -// #if DBLINK static toSQL SQLListDBLink("toBrowser:ListDBLink", "SELECT Db_Link, Owner FROM SYS.ALL_DB_LINKS\n" " WHERE (Owner = :f1<char[101]> or Owner='PUBLIC') and\n" @@ -1337,51 +841,33 @@ "SELECT Owner, Db_Link, Username, Host, Created\n" " FROM SYS.DBA_DB_LINK\n", "List database links as DBA"); -/* static toSQL SQLDBLinkInfo("toBrowser:DBLinkInformation", - "SELECT * FROM Sys.all_db_links a\n" - " WHERE Owner = :f1<char[101]>\n" - " AND DB_LINK = :f2<char[101]>", - "Display information about database link");*/ -/* static toSQL SQLDBLinkSynonyms("toBrowser:DBLinkSynonyms", - "SELECT * FROM Sys.all_synonyms a\n" - " WHERE Owner = :f1<char[101]>\n" - " AND DB_LINK = :f2<char[101]>", - "Display foreign synonyms");*/ -// #endif - static toSQL SQLListDirectories("toBrowser:ListDirectories", "SELECT DISTINCT directory_name FROM SYS.ALL_DIRECTORIES\n" " WHERE (owner = 'SYS' or owner=:f1<char[101]>) and\n" " UPPER(directory_name) like :f2<char[101]>", " ORDER BY directory_name", "List database external directories"); - static toSQL SQLMySQLAccess("toBrowser:MySQLAcess", "SHOW TABLES FROM mysql", "Show access tables for MySQL databases", "3.23", "MySQL"); - static toSQL SQLMySQLUsers("toBrowser:MySQLUsers", "SELECT concat(user,'@',host) Users FROM mysql.user", "Show users for MySQL databases", "3.23", "MySQL"); - static toSQL SQLTruncateTable("toBrowser:TruncateTable", "TRUNCATE TABLE %1.%2", "Truncate a table", "", "Any"); - static toSQL SQLDropUser("toBrowser:DropUser", "DELETE FROM mysql.user WHERE concat(user,'@',host) = :f1<char[255]>", "Drop MYSQL user", "3.23", "MySQL"); - - toBrowser::toBrowser(QWidget *parent, toConnection &connection) : toToolWidget(BrowserTool, "browser.html", parent, connection, "toBrowser") { @@ -1501,7 +987,7 @@ SLOT(disableConstraints(void))); tableToolbar->addAction(disableConstraintAct); - tableView = new toBrowserSchemaTableView(tableWidget); + tableView = new toBrowserSchemaTableView(tableWidget, "TABLE"); tableLayout->addWidget(tableView); tableView->setReadAll(true); tableView->setSQL(SQLListTables); @@ -1526,7 +1012,7 @@ viewSplitter = new QSplitter(Qt::Horizontal, m_mainTab); viewSplitter->setObjectName(TAB_VIEWS); // m_mainTab->addTab(viewSplitter, tr("&Views")); - viewView = new toBrowserSchemaTableView(viewSplitter); + viewView = new toBrowserSchemaTableView(viewSplitter, "VIEW"); viewView->setReadAll(true); viewView->setSQL(SQLListView); viewView->resize(FIRST_WIDTH, viewView->height()); @@ -1584,7 +1070,7 @@ this, SLOT(dropIndex())); indexToolbar->addAction(dropIndexesAct); - indexView = new toBrowserSchemaTableView(indexWidget); + indexView = new toBrowserSchemaTableView(indexWidget, "INDEX"); indexLayout->addWidget(indexView); indexView->setReadAll(true); indexView->setTabWidget(m_mainTab); @@ -1606,7 +1092,7 @@ sequenceSplitter = new QSplitter(Qt::Horizontal, m_mainTab); sequenceSplitter->setObjectName(TAB_SEQUENCES); // m_mainTab->addTab(sequenceSplitter, tr("Se&quences")); - sequenceView = new toBrowserSchemaTableView(sequenceSplitter); + sequenceView = new toBrowserSchemaTableView(sequenceSplitter, "SEQUENCE"); sequenceView->setReadAll(true); sequenceView->setSQL(SQLListSequence); sequenceView->resize(FIRST_WIDTH, sequenceView->height()); @@ -1625,7 +1111,7 @@ synonymSplitter = new QSplitter(Qt::Horizontal, m_mainTab); synonymSplitter->setObjectName(TAB_SYNONYM); // m_mainTab->addTab(synonymSplitter, tr("S&ynonyms")); - synonymView = new toBrowserSchemaTableView(synonymSplitter); + synonymView = new toBrowserSchemaTableView(synonymSplitter); // Note, object cache does not cache synonyms synonymView->setReadAll(true); synonymView->setSQL(SQLListSynonym); synonymView->resize(FIRST_WIDTH, synonymView->height()); @@ -1662,7 +1148,7 @@ triggerSplitter = new QSplitter(Qt::Horizontal, m_mainTab); triggerSplitter->setObjectName(TAB_TRIGGER); // m_mainTab->addTab(triggerSplitter, tr("Tri&ggers")); - triggerView = new toBrowserSchemaTableView(triggerSplitter); + triggerView = new toBrowserSchemaTableView(triggerSplitter, "TRIGGER"); triggerView->setReadAll(true); triggerView->setSQL(SQLListTrigger); triggerView->resize(FIRST_WIDTH, triggerView->height()); @@ -1721,8 +1207,6 @@ m_browsersMap[dblinkSplitter] = dblinkBrowserWidget; // #endif // dblink - - directoriesSplitter = new QSplitter(Qt::Horizontal, m_mainTab); directoriesSplitter->setObjectName(TAB_DIRECTORIES); @@ -1733,7 +1217,7 @@ directoriesLayout->setContentsMargins(0, 0, 0, 0); directoriesWidget->setLayout(directoriesLayout); - directoriesView = new toBrowserSchemaTableView(directoriesWidget); + directoriesView = new toBrowserSchemaTableView(directoriesWidget, "DIRECTORY"); directoriesBrowserWidget = new toBrowserDirectoriesWidget(directoriesSplitter); directoriesLayout->addWidget(directoriesView); @@ -1822,7 +1306,7 @@ this, SLOT(mainTab_currentChanged(int))); } -void toBrowser::mainTab_currentChanged(int /*ix*/) +void toBrowser::mainTab_currentChanged(int /*ix*/, bool force_requery) { if (Schema->selected().isEmpty()) return; @@ -1838,6 +1322,8 @@ if (m_objectsMap.contains(ix)) { + if (force_requery) + m_objectsMap[ix]->forceRequery(); m_objectsMap[ix]->changeParams(schema(), Filter ? Filter->wildCard() : "%"); changeItem(); } @@ -1942,7 +1428,7 @@ try { Schema->refresh(); - mainTab_currentChanged(m_mainTab->currentIndex()); + mainTab_currentChanged(m_mainTab->currentIndex(), true); } TOCATCH } Modified: branches/tora-trotl/src/tobrowser.h =================================================================== --- branches/tora-trotl/src/tobrowser.h 2011-01-05 14:58:38 UTC (rev 3852) +++ branches/tora-trotl/src/tobrowser.h 2011-01-05 15:00:10 UTC (rev 3853) @@ -260,8 +260,11 @@ void dropUser(void); private slots: - //! \brief Handle main tabwidget and its tabs switch - void mainTab_currentChanged(int); + /** Handle main tabwidget and its tabs switch + * @param int Tab which has been activated + * @param force_requery Do not try using the cache but query the database instead + */ + void mainTab_currentChanged(int, bool force_requery = false); protected: virtual void closeEvent(QCloseEvent *); Modified: branches/tora-trotl/src/tobrowserschemawidget.cpp =================================================================== --- branches/tora-trotl/src/tobrowserschemawidget.cpp 2011-01-05 14:58:38 UTC (rev 3852) +++ branches/tora-trotl/src/tobrowserschemawidget.cpp 2011-01-05 15:00:10 UTC (rev 3853) @@ -44,12 +44,17 @@ #include "tobrowserschemawidget.h" #include "tocodemodel.h" #include "utils.h" +#include "toconfiguration.h" +#include "tocurrent.h" - -toBrowserSchemaTableView::toBrowserSchemaTableView(QWidget * parent) +toBrowserSchemaTableView::toBrowserSchemaTableView(QWidget * parent, const QString &type) : toResultTableView(true, false, parent), toBrowserSchemaBase() { + ObjectType = type; + ForceRequery = false; + if (!type.isEmpty()) + connect(this, SIGNAL(done()), this, SLOT(updateCache())); } QString toBrowserSchemaTableView::objectName() @@ -59,10 +64,48 @@ void toBrowserSchemaTableView::changeParams(const QString & schema, const QString & filter) { + // If all objects of a specific type are to be displayed, try displaying them from the cache + // This cannot work for filtered objects yet as we do not want to re-impelement the "like" operator. + if (filter == "%" && + !ObjectType.isEmpty() && + !ForceRequery + /* && toCurrentConnection(this).cacheAvailable(false)*/) + if (toCurrentConnection(this).Cache->objectExists(schema, "TORA_LIST", ObjectType)) + { + this->queryFromCache(schema, ObjectType); + return; + } + + ForceRequery = false; + Schema = schema; toResultTableView::changeParams(schema, filter); } +void toBrowserSchemaTableView::updateCache(void) +{ + // Update list of objects + QList<toCache::objectName> rows; + toCache::objectName obj; + obj.Owner = Schema; + obj.Type = ObjectType; + // TODO: Check that result model rows are NOT sorted in descending order as that would break updating of cache!!! + toResultModel::RowList modelRows = this->Model->getRawData(); + for (QList<toResultModel::Row>::iterator i = modelRows.begin(); i != modelRows.end(); i++) + { + obj.Name = (*i)[1]; + rows.append(obj); + } + toCurrentConnection(this).Cache->updateObjects(Schema, ObjectType, rows); + // Update information when list of this type of objects in this schema was updated + // NOTE: Type is placed in the name field in order not to + // mix this meta-information with actual list of objects. + obj.Owner = Schema; + obj.Type = "TORA_LIST"; + obj.Name = ObjectType; + toCurrentConnection(this).Cache->addIfNotExists(obj); +} // updateCache + toBrowserSchemaCodeBrowser::toBrowserSchemaCodeBrowser(QWidget * parent) : QTreeView(parent), toBrowserSchemaBase() Modified: branches/tora-trotl/src/tobrowserschemawidget.h =================================================================== --- branches/tora-trotl/src/tobrowserschemawidget.h 2011-01-05 14:58:38 UTC (rev 3852) +++ branches/tora-trotl/src/tobrowserschemawidget.h 2011-01-05 15:00:10 UTC (rev 3853) @@ -59,6 +59,9 @@ */ class toBrowserSchemaBase { + protected: + bool ForceRequery; // Next query MUST be from database rather than from cache + public: toBrowserSchemaBase(){}; virtual ~toBrowserSchemaBase(){}; @@ -66,6 +69,7 @@ virtual QString objectName() = 0; //! \brief Reset widget data depending on new schema and/or filter. virtual void changeParams(const QString & schema, const QString & filter) = 0; + void forceRequery(void) { ForceRequery = true; } }; @@ -78,10 +82,16 @@ { Q_OBJECT + QString ObjectType; // What type of object is displayed (TABLE, VIEW etc.) + QString Schema; + public: - toBrowserSchemaTableView(QWidget * parent = 0); + toBrowserSchemaTableView(QWidget * parent = 0, const QString &type = 0); QString objectName(); void changeParams(const QString & schema, const QString & filter); + + private slots: + void updateCache(void); }; Modified: branches/tora-trotl/src/tocache.cpp =================================================================== --- branches/tora-trotl/src/tocache.cpp 2011-01-05 14:58:38 UTC (rev 3852) +++ branches/tora-trotl/src/tocache.cpp 2011-01-05 15:00:10 UTC (rev 3853) @@ -6,6 +6,7 @@ #include <QDateTime> #include <QTextStream> #include <QProgressDialog> +//#include <boost/preprocessor/iteration/detail/local.hpp> toCache::toCache(QString description) { @@ -42,9 +43,7 @@ QString toCache::cacheFile() { - QString dbname(ConnectionDescription); - - return (cacheDir() + "/" + dbname).trimmed(); + return (cacheDir() + "/" + ConnectionDescription).trimmed(); } // cacheFile bool toCache::loadDiskCache() @@ -103,11 +102,26 @@ (*cur).Synonyms.insert((*cur).Synonyms.end(), (*s)); synCounter++; } + /** TODO: This "if" condition is added here for bakwards compatibility as timestamp + * parameter was not saved to disk before 2010-12-12. Therefore this condition can + * be removed after 2011-12-12 (one year for everybody to update). Another way to + * fix this is to delete the cache. + */ + if (record.count() >= 6) + { + rec++; + (*cur).Timestamp = QDate::fromString((*rec), "yyyy-MM-dd"); + } + else + (*cur).Timestamp = QDate::currentDate(); ObjectNames.insert(ObjectNames.end(), (*cur)); delete cur; cur = 0; } } + + ObjectNames.sort(); + return true; } @@ -120,12 +134,10 @@ if (!toConfigurationSingle::Instance().cacheDisk()) return ; - QString filename(cacheFile()); /** check pathnames and create */ - QString dirname(cacheDir()); QDir dir; dir.setPath(dirname); @@ -133,13 +145,11 @@ if (!dir.exists(dirname)) dir.mkdir(dirname); - /** build record to write out */ - - QStringList record; - QStringList records; - QStringList recordSynonym; + QStringList record; // information about one object + QStringList records; // all objects + QStringList recordSynonym; // all synonyms of one particular object for (std::list<objectName>::iterator i = ObjectNames.begin(); i != ObjectNames.end(); i++) { record.clear(); @@ -153,11 +163,13 @@ synCounter++; } record.append(recordSynonym.join("\x1F")); + record.append((*i).Timestamp.toString("yyyy-MM-dd")); recordSynonym.clear(); objCounter++; records.append(record.join("\x1E")); } - /** open file + + /** Write all records to a file */ QFile file(filename); file.open(QIODevice::ReadWrite | QIODevice::Truncate); @@ -225,19 +237,20 @@ return true; } -void toCache::addIfNotExists(objectName &obj) +bool toCache::addIfNotExists(objectName &obj) { if (!cacheAvailable(true, false)) { toStatusMessage(qApp->translate("toConnection", "Not done caching objects"), false, false); - return ; + return false; } std::list<objectName>::iterator i = ObjectNames.begin(); while (i != ObjectNames.end() && (*i) < obj) i++; if (i != ObjectNames.end() && *i == obj) // Already exists, don't add - return ; + return false; ObjectNames.insert(i, obj); + return true; } void toCache::readObjects(toTask * t) @@ -436,3 +449,117 @@ return Owner == nam.Owner && Name == nam.Name && Type == nam.Type; } +void toCache::setObjectList(std::list<objectName> &list) +{ + ObjectNames = list; + // Set the date when information about this object was red. This will later + // be used to clean up an old information. + for (std::list<objectName>::iterator i = ObjectNames.begin(); i != ObjectNames.end(); i++) + (*i).Timestamp = QDate::currentDate(); + list.sort(); +} // setObjectList + +void toCache::setSynonymList(std::map<QString, objectName> &list) +{ + SynonymMap = list; +} // setSynonymList + +bool toCache::objectExists(const QString &owner, const QString &type, const QString &name) +{ + // TODO: ObjectList is sorted therefore going through all of it is not necessary! + for (std::list<objectName>::iterator i = ObjectNames.begin(); i != ObjectNames.end(); i++) + { + if ((*i).Owner == owner && + (*i).Name == name && + (*i).Type == type) + return true; + } + + return false; +} // objectExists + +toCache::RowList toCache::getObjects(const QString &owner, const QString &type) +{ + Row r; + RowList rl; + for (std::list<objectName>::iterator i = ObjectNames.begin(); i != ObjectNames.end(); i++) + { + if ((*i).Owner == owner && + (*i).Type == type) + { + r.append((*i).Name); + rl.append(r); + r.clear(); + } + } + + return rl; +} // getObjects + +void toCache::updateObjects(const QString &owner, const QString &type, const QList<objectName> rows) +{ + bool OwnerExists = false; + QList<objectName>::const_iterator newObjects = rows.begin(); + std::list<objectName>::iterator currentObjects = ObjectNames.begin(); + + if (ObjectNames.size() > 0) + { + // Find first object belonging to required owner/schema + while (currentObjects != ObjectNames.end() && + (*currentObjects).Owner < owner) + currentObjects++; + if (currentObjects != ObjectNames.end() && + (*currentObjects).Owner == owner) + OwnerExists = true; + } + + while (newObjects != rows.end()) + { + if (OwnerExists) + { + while (currentObjects != ObjectNames.end() && + (*currentObjects).Type != type) + currentObjects++; // skip cached objects of other types + + if (currentObjects != ObjectNames.end() && + (*currentObjects).Name == (*newObjects).Name) + { + //qDebug() << "Object is already in cache" << (*newObjects).Name; + currentObjects++; + newObjects++; + } + else if (currentObjects != ObjectNames.end() && + (*currentObjects).Name < (*newObjects).Name) + { + //qDebug() << "DELETE:" << (*currentObjects).Name; + currentObjects = ObjectNames.erase(currentObjects); + } + else + { + //qDebug() << "NEW:" << (*newObjects).Name; + ObjectNames.insert(currentObjects, (*newObjects)); + newObjects++; + } + } + else + { + //qDebug() << "NEW2:" << (*newObjects).Name; + ObjectNames.insert(currentObjects, (*newObjects)); + newObjects++; + } + } + // Delete any remaining objects + while (OwnerExists && + currentObjects != ObjectNames.end() && + (*currentObjects).Owner == owner) + { + //qDebug() << "iterating2 through" << (*currentObjects).Name; + if ((*currentObjects).Type == type) + { + //qDebug() << "DELETE2:" << (*currentObjects).Name; + currentObjects = ObjectNames.erase(currentObjects); + } + else + currentObjects++; + } +} // updateObjects Modified: branches/tora-trotl/src/tocache.h =================================================================== --- branches/tora-trotl/src/tocache.h 2011-01-05 14:58:38 UTC (rev 3852) +++ branches/tora-trotl/src/tocache.h 2011-01-05 15:00:10 UTC (rev 3853) @@ -4,6 +4,9 @@ #include "tothread.h" #include <QMetaType> +#include <QDate> +#include <QList> +#include <QVariant> #include <map> #include <list> #include <set> @@ -12,10 +15,16 @@ */ class toCache : public QObject { + /** Description of connection for which this instance of cache is used. + * This name is used as a filename to store cache content between TOra runs. + */ QString ConnectionDescription; bool ReadingCache; public: + typedef QList<QVariant> Row; // NOTE: first (0th) value in a row is a row number (see variable currRowKey) + typedef QList<Row> RowList; + toSemaphore ReadingValues; /** Contain information about a tablename. @@ -38,6 +47,10 @@ */ std::list <QString> Synonyms; + /** A date when information about this particular object was last updated + */ + QDate Timestamp; + /** Create an object name with filled in values. */ objectName(const QString &owner, const QString &name, const QString &type = QString("TABLE"), const QString &comment = QString::null) @@ -73,8 +86,12 @@ QString Comment; }; +private: std::list<objectName> ObjectNames; std::map<QString, objectName> SynonymMap; + void ll(void); + +public: typedef queryDescribe toQDescribe; typedef std::list<toQDescribe> toQDescList; std::map<objectName, toQDescList> ColumnCache; @@ -82,7 +99,8 @@ toCache(QString description); ~toCache(); - /** load disk cache + /** Load cache information for current connection from a file on disk + * @return True if cache was loaded */ bool loadDiskCache(void); @@ -92,8 +110,9 @@ /** Add a new object to the objectlist if it doesn't exist already. * @param object The object to add + * @return true if object was not in the cache and was added */ - void addIfNotExists(objectName &object); + bool addIfNotExists(objectName &object); /** Check if cache is available or not. * @param synonyms If synonyms are needed or not. @@ -103,8 +122,14 @@ */ bool cacheAvailable(bool synonyms, bool block = false, bool need = true, toTask * t = NULL); + /** Return the file used to store cache contents for this connection. + * @return A string representing a full path and filename of cache file + */ QString cacheFile(); + /** Return the directory storing files (caches) of all connections. + * @return A string representing a full path to cache store directory + */ static QString cacheDir(); /** @@ -122,6 +147,9 @@ */ std::map<QString, objectName> &synonyms(bool block); + /** + * Starts a new thread which will read all objects and synonyms from the database. + */ void readObjects(toTask * t); /** @@ -147,6 +175,34 @@ * Reread the object and column cache. */ void rereadCache(toTask * t); + + /** Set a list of objects. This is used when list of objects is loaded in bulk + * outside of a cache (for example in connection class). Note that this fucntion + * will remove any existing objects in cache (for this connection). + * @param list list of objects to be set + */ + void setObjectList(std::list<objectName> &list); + + /** Set a list of object synonyms. This is used when list of synonyms is loaded + * in bulk outside of a cache (for example in connection class). Note that this + * fucntion will remove any existing synonyms. + * @param list list of objects to be set + */ + void setSynonymList(std::map<QString, objectName> &list); + + /** Checks if given object is saved in the cache. + */ + bool objectExists(const QString &owner, const QString &type, const QString &name); + + /** Returns a list of objects of particular type and schema/owner + */ + RowList getObjects(const QString &owner, const QString &type); + + /** Update a list of objects of particular type and schema owner in cache. + * This should add any new object to the list as well as remove no longer + * existing ones. + */ + void updateObjects(const QString &owner, const QString &type, const QList<toCache::objectName> rows); }; // toCache /** A short representation of a @ref toCache::queryDescribe Modified: branches/tora-trotl/src/toconnection.cpp =================================================================== --- branches/tora-trotl/src/toconnection.cpp 2011-01-05 14:58:38 UTC (rev 3852) +++ branches/tora-trotl/src/toconnection.cpp 2011-01-05 15:00:10 UTC (rev 3853) @@ -327,6 +327,8 @@ toLocker lock(Lock); } + this->Cache->writeDiskCache(); + delete Connection; } @@ -751,19 +753,18 @@ { std::list<objectName> n = Connection->Connection->objectNames(); if (!Connection->Abort) - Connection->Cache->ObjectNames = n; + Connection->Cache->setObjectList(n); } - Connection->Cache->ObjectNames.sort(); Connection->Cache->ReadingValues.up(); if (!diskloaded && !Connection->Abort) { std::map<QString, objectName> m = - Connection->Connection->synonymMap(Connection->Cache->ObjectNames); + Connection->Connection->synonymMap(Connection->Cache->objects(true)); if (!Connection->Abort) { - Connection->Cache->SynonymMap = m; + Connection->Cache->setSynonymList(m); Connection->Cache->writeDiskCache(); } } @@ -810,7 +811,9 @@ return Connection->analyzer(); } -std::list<toConnection::objectName> toConnection::connectionImpl::objectNames(void) +std::list<toConnection::objectName> toConnection::connectionImpl::objectNames(const QString &owner, + const QString &type, + const QString &name) { std::list<objectName> ret; return ret; @@ -851,6 +854,22 @@ return Cache->objects(block); } +bool toConnection::rereadObjects(const QString &owner, + const QString &type, + const QString &name) +{ + bool added = false; // did we actually add at least one new object? + + std::list<toConnection::objectName> objects = this->Connection->objectNames(owner, type, name); + for (std::list<toConnection::objectName>::iterator i = objects.begin();i != objects.end();i++) + { + added = added || Cache->addIfNotExists(*i); + } + // TODO: If all objects of a particular type/owner are fe... [truncated message content] |
From: <ibr...@us...> - 2011-02-19 15:30:18
|
Revision: 3894 http://tora.svn.sourceforge.net/tora/?rev=3894&view=rev Author: ibre5041 Date: 2011-02-19 15:30:11 +0000 (Sat, 19 Feb 2011) Log Message: ----------- Modified Paths: -------------- branches/tora-trotl/src/tooracleconnection.cpp branches/tora-trotl/src/trotl/src/trotl_lob.cpp Modified: branches/tora-trotl/src/tooracleconnection.cpp =================================================================== --- branches/tora-trotl/src/tooracleconnection.cpp 2011-02-19 15:08:29 UTC (rev 3893) +++ branches/tora-trotl/src/tooracleconnection.cpp 2011-02-19 15:30:11 UTC (rev 3894) @@ -195,15 +195,14 @@ return _displayData; ::trotl::SqlOpenLob clob_open(_data, OCI_LOB_READONLY); char buffer[MAXLOBSHOWN]; + oraub8 chars_read = 0; + unsigned bytes_read = _data.read(&buffer[0], sizeof(buffer), 1, sizeof(buffer), &chars_read); - unsigned bytes_read = _data.read(&buffer[0], sizeof(buffer), 1, sizeof(buffer)); - buffer[bytes_read-1] = '\0'; - TLOG(4,toDecorator,__HERE__) << "Just read CLOB: \"" << buffer << "\"" << std::endl; QString _displayData = QString("{clob}"); - _displayData += QString::fromUtf8(buffer); - if(bytes_read == MAXLOBSHOWN) + _displayData += QString::fromUtf8(buffer, bytes_read); + if(chars_read != _data.length()) _displayData += "...<truncated>"; return _displayData; } @@ -211,7 +210,7 @@ /* virtual */ QString editData() const throw() { ::trotl::SqlOpenLob clob_open(_data, OCI_LOB_READONLY); - QString retval = QString("Datatype: Oracle [N]CLOB\nSize: %1B\n").arg(getLength()); + QString retval = QString("Datatype: Oracle [N]CLOB\nSize: %1 Chars\n").arg(getLength()); char buffer[524288]; unsigned offset = 0; unsigned to_read = 16 * _data.getChunkSize(); Modified: branches/tora-trotl/src/trotl/src/trotl_lob.cpp =================================================================== --- branches/tora-trotl/src/trotl/src/trotl_lob.cpp 2011-02-19 15:08:29 UTC (rev 3893) +++ branches/tora-trotl/src/trotl/src/trotl_lob.cpp 2011-02-19 15:30:11 UTC (rev 3894) @@ -463,7 +463,7 @@ */ oraub8 SqlClob::read(dvoid* bufp, oraub8 buflen, oraub8 offset, oraub8 amount, oraub8 *chars, ub2 csid, ub1 csfrm) { - oraub8 char_amt; + oraub8 char_amt = 0; bool done = false; while(!done) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2011-02-21 14:27:05
|
Revision: 3901 http://tora.svn.sourceforge.net/tora/?rev=3901&view=rev Author: ibre5041 Date: 2011-02-21 14:26:56 +0000 (Mon, 21 Feb 2011) Log Message: ----------- rename Modified Paths: -------------- branches/tora-trotl/src/CMakeLists.txt Added Paths: ----------- branches/tora-trotl/src/tooracleconnection_trotl.cpp Removed Paths: ------------- branches/tora-trotl/src/tooracleconnection.cpp branches/tora-trotl/src/tooracleconnection_trotl.cpp Modified: branches/tora-trotl/src/CMakeLists.txt =================================================================== --- branches/tora-trotl/src/CMakeLists.txt 2011-02-21 14:24:04 UTC (rev 3900) +++ branches/tora-trotl/src/CMakeLists.txt 2011-02-21 14:26:56 UTC (rev 3901) @@ -328,7 +328,7 @@ tomessage.cpp tonewconnection.cpp #win only? toocistub.cpp - tooracleconnection.cpp + tooracleconnection_trotl.cpp tooracleextract.cpp tooraclepreload.cpp tooutput.cpp Deleted: branches/tora-trotl/src/tooracleconnection.cpp =================================================================== --- branches/tora-trotl/src/tooracleconnection.cpp 2011-02-21 14:24:04 UTC (rev 3900) +++ branches/tora-trotl/src/tooracleconnection.cpp 2011-02-21 14:26:56 UTC (rev 3901) @@ -1,2014 +0,0 @@ - -/* BEGIN_COMMON_COPYRIGHT_HEADER - * - * TOra - An Oracle Toolkit for DBA's and developers - * - * Shared/mixed copyright is held throughout files in this product - * - * Portions Copyright (C) 2000-2001 Underscore AB - * Portions Copyright (C) 2003-2005 Quest Software, Inc. - * Portions Copyright (C) 2004-2008 Numerous Other Contributors - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; only version 2 of - * the License is valid for this program. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * As a special exception, you have permission to link this program - * with the Oracle Client libraries and distribute executables, as long - * as you follow the requirements of the GNU GPL in regard to all of the - * software in the executable aside from Oracle client libraries. - * - * Specifically you are not permitted to link this program with the - * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. - * And you are not permitted to distribute binaries compiled against - * these libraries. - * - * You may link this product with any GPL'd Qt library. - * - * All trademarks belong to their respective owners. - * - * END_COMMON_COPYRIGHT_HEADER */ - -#ifndef TO_NO_ORACLE - -#include "utils.h" -#include "tologger.h" -#include <iomanip> - -#ifdef Q_OS_WIN32 -# include "windows/cregistry.h" -#include <Windows.h> -#define MIN min -#else -#define MIN std::min -#endif - -#include <trotl.h> -#include <trotl_convertor.h> -#include <trotl_anydata.h> -#include <trotl_cursor.h> - -#include "utils.h" -#include "toconf.h" -#include "toconfiguration.h" -#include "toconnection.h" -#include "toquery.h" -#include "tomain.h" -#include "tosql.h" -#include "totool.h" -#include "tooraclesetting.h" -#include "todefaultkeywords.h" - -#include <stdio.h> -#include <iostream> - -#include <qcheckbox.h> -#include <qfile.h> -#include <qinputdialog.h> -#include <qlineedit.h> -#include <qpushbutton.h> -#include <qregexp.h> -#include <qspinbox.h> -#include <qvalidator.h> - -#include <QFileInfo> -#include <QString> -#include <QTextStream> -#include <QVector> - -#define MAXTOMAXLONG 30000 -#define MAXLOBSHOWN 64 - -static int toMaxLong = toConfigurationSingle::Instance().maxLong(); - -static toSQL SQLComment("toOracleConnection:Comments", - "SELECT Column_name,Comments FROM sys.All_Col_Comments\n" - " WHERE Owner = :f1<char[100]>\n" - " AND Table_Name = :f2<char[100]>", - "Display column comments"); - -static toSQL SQLMembers("toOracleConnection:Members", - "SELECT object_name,overload,argument_name,data_type\n" - " FROM sys.All_Arguments\n" - " WHERE Owner = :f1<char[100]>\n" - " AND Package_Name = :f2<char[100]>\n" - " ORDER BY object_name,overload,DECODE(argument_name,NULL,9999,sequence)", - "Get list of package members"); - -static toSQL SQLListObjects("toOracleConnection:ListObjects", - "select a.owner,a.object_name,a.object_type,b.comments\n" - " from sys.all_objects a,\n" - " sys.all_tab_comments b\n" - " where a.owner = b.owner(+) and a.object_name = b.table_name(+)\n" - " and a.object_type = b.table_type(+) and a.object_type != 'SYNONYM'\n" - " and a.owner = nvl(:owner<char[101]>, a.owner)" - " and a.object_type = nvl(:type<char[101]>, a.object_type)" - " and a.object_name = nvl(:name<char[101]>, a.object_name)", - "List the objects to cache for a connection, should have same " - "columns and binds"); - -static toSQL SQLListSynonyms("toOracleConnection:ListSynonyms", - "select synonym_name,table_owner,table_name\n" - " from sys.all_synonyms\n" - " where owner = :usr<char[101]> or owner = 'PUBLIC'\n" - " order by table_owner,table_name", - "List the synonyms available to a user, should have same columns and binds"); - -static void ThrowException(const ::trotl::OciException &exc) -{ - TLOG(0,toDecorator,__HERE__) - << "What:" << exc.what() << std::endl - << exc.get_sql() << std::endl - << "--------------------------------------------------------------------------------" - << std::endl; - if (exc.get_code() == 24344) - throw toConnection::exception(QString::fromLatin1("ORA-24344 success with compilation error")); - else - { - toConnection::exception ret(QString::fromUtf8(exc.get_mesg())); - /*** - if (ret.isEmpty()) - { - if (exc.code != 0) - { - ret = QString::fromUtf8("ORA-") + - QString::number(exc.code) + - QString::fromUtf8(" missing error description"); - } - else if (ret.isEmpty()) - { - ret = QString::fromUtf8( - "Missing error description. This may be caused by a library " - "version mismatch. Check that your ORACLE_HOME and library path is correct."); - } - } - */ - /*** - if (exc.stm_text && strlen(exc.stm_text)) - { - ret += QString::fromLatin1("\n"); - QString sql = QString::fromUtf8((const char *)exc.stm_text); - if (exc.code >= 0) - { - QString t = QString::fromUtf8((const char *)exc.stm_text, exc.error_offset); - ret.setOffset(t.length()); - sql.insert(t.length(), QString::fromLatin1("<ERROR>")); - } - ret += sql; - } - */ - throw ret; - } -} - -class toOracleClob: public toQValue::complexType -{ -public: - toOracleClob(trotl::OciConnection &_conn) - : toQValue::complexType() - , _data(_conn) - , _length(0) - , _displayData() - {}; - /* virtual */ bool isBinary() const - { - return false; - } - /* virtual */ bool isLarge() const - { - return true; - } - - /* virtual */ QString displayData() const throw() - { - if(!_displayData.isEmpty()) - return _displayData; - ::trotl::SqlOpenLob clob_open(_data, OCI_LOB_READONLY); - char buffer[MAXLOBSHOWN]; - oraub8 chars_read = 0; - unsigned bytes_read = _data.read(&buffer[0], sizeof(buffer), 1, sizeof(buffer), &chars_read); - - TLOG(4,toDecorator,__HERE__) << "Just read CLOB: \"" << buffer << "\"" << std::endl; - - QString _displayData = QString("{clob}"); - _displayData += QString::fromUtf8(buffer, bytes_read); - if(chars_read != _data.length()) - _displayData += "...<truncated>"; - return _displayData; - } - - /* virtual */ QString editData() const throw() - { - ::trotl::SqlOpenLob clob_open(_data, OCI_LOB_READONLY); - QString retval = QString("Datatype: Oracle [N]CLOB\nSize: %1 Chars\n").arg(getLength()); - char buffer[524288]; - unsigned offset = 0; - unsigned to_read = 16 * _data.getChunkSize(); - oraub8 bytes_read = 0, chars_read = 0; - - while(offset < MAXTOMAXLONG) - { - oraub8 cr = 0, br = 0; - br = _data.read(&buffer[0], sizeof(buffer), offset+1, to_read, &cr); - offset += cr; - chars_read += cr; - bytes_read += br; - if(br == 0) // end of LOB reached - break; - retval += QString::fromUtf8(buffer, br); - } - - if(offset != _data.length()) - retval += "\n...<TRUNCATED>"; - return retval; - } - - /* virtual */ QString userData() const throw() - { - return QString("Datape: Oracle [N]CLOB\nSize: %1B\n") - .arg(getLength()); - } - - /* virtual */ QString tooltipData() const throw() - { - return QString("Datape: Oracle [N]CLOB\n" "Size: %1B\n") - .arg(getLength()); - } - - /* virtual */ QString dataTypeName() const - { - return QString("CLOB"); - } - /* virtual */ QByteArray read(unsigned offset) const - { - unsigned chunksize = _data.getChunkSize(); - char *buffer = (char*)malloc( chunksize ); // TODO use alloc here(or _alloc on MSVC) - unsigned int bytes_read; - { - ::trotl::SqlOpenLob clob_open(_data, OCI_LOB_READONLY); - bytes_read = _data.read(buffer, chunksize, offset+1, chunksize); - buffer[bytes_read] = '\0'; - } - QByteArray retval(buffer, bytes_read); - free(buffer); - return retval; - } - /* virtual */ void write(QByteArray const &data) - { - } - /* virtual */~toOracleClob() - { - TLOG(1,toDecorator,__HERE__) << "toOracleClob DELETED:" << this << std::endl; - } - - mutable trotl::SqlClob _data; -protected: - oraub8 getLength() const - { - if(!_length) - _length = _data.length(); - return _length; - }; - - mutable oraub8 _length; // NOTE: OCILobGetLength makes one roundtrip to the server - mutable QString _displayData; - toOracleClob(toOracleClob const&); - toOracleClob operator=(toOracleClob const&); - //TODO copying prohibited -}; -//Q_DECLARE_METATYPE(toOracleClob*) - -class toOracleBlob: public toQValue::complexType -{ -public: - toOracleBlob(trotl::OciConnection &_conn) - : toQValue::complexType() - , data(_conn) - , _length(0) - , _displayData() - {}; - /* virtual */ bool isBinary() const - { - return true; - } - /* virtual */ bool isLarge() const - { - return true; - } - - /* virtual */ QString displayData() const throw() - { - if(!_displayData.isEmpty()) - return _displayData; - ::trotl::SqlOpenLob blob_open(data, OCI_LOB_READONLY); - unsigned char buffer[MAXLOBSHOWN/2]; - _displayData = QString("{blob}"); - - unsigned bytes_read = data.read(&buffer[0], sizeof(buffer), 1, sizeof(buffer)); - - for(unsigned i=0; i<bytes_read; ++i) - { - char sbuff[4]; - snprintf(sbuff, sizeof(sbuff), " %.2X", buffer[i]); - _displayData += sbuff; - } - - if(bytes_read >= MAXLOBSHOWN/2) - _displayData += "...<truncated>"; - return _displayData; - } - - /* virtual */ QString editData() const throw() - { - ::trotl::SqlOpenLob clob_open(data, OCI_LOB_READONLY); - QString retval = QString("Datatyp pe: Oracle BLOB\nSize: %1B\n").arg(getLength()); - unsigned char buffer[MAXTOMAXLONG]; - ub4 chunk_size = data.getChunkSize(); - unsigned offset = 0; - - while(offset < MAXTOMAXLONG) - { - unsigned to_read = MIN(MAXTOMAXLONG - offset, chunk_size); - unsigned bytes_read = data.read(&buffer[offset], MAXTOMAXLONG - offset, offset+1, to_read); - - if(bytes_read == 0) // end of LOB reached - break; - - for(unsigned i=0; i<bytes_read; ++i) - { - char sbuff[4]; - snprintf(sbuff, sizeof(sbuff), " %.2X", buffer[i]); - retval += sbuff; - if( (offset+i) % 32 == 31) - retval += "\n"; - } - - offset += bytes_read; - } - - if(offset == MAXTOMAXLONG) - retval += "\n...<TRUNCATED>"; - return retval; - } - - /* virtual */ QString userData() const throw() - { - return QString("Datape: Oracle BLOB\nSize: %1B\n") - .arg(data.length()); - } - - /* virtual */ QString tooltipData() const throw() - { - return QString("Datape: Oracle BLOB\nSize: %1B\n") - .arg(data.length()); - } - - /* virtual */ QString dataTypeName() const - { - return QString("blob"); - } - /* virtual */ QByteArray read(unsigned offset) const - { - unsigned chunksize = data.getChunkSize(); - char *buffer = (char*)malloc( chunksize ); // TODO use alloc here(or _alloc on MSVC) - unsigned int bytes_read; - { - ::trotl::SqlOpenLob blob_open(data, OCI_LOB_READONLY); - bytes_read = data.read(buffer, chunksize, offset+1, chunksize); - buffer[bytes_read] = '\0'; - } - QByteArray retval(buffer, bytes_read); - free(buffer); - return retval; - } - /* virtual */ void write(QByteArray const &data) - { - } - /* virtual */~toOracleBlob() - { - TLOG(1,toDecorator,__HERE__) << "toOracleBlob DELETED:" << this << std::endl; - } - - mutable trotl::SqlBlob data; -protected: - oraub8 getLength() const - { - if(!_length) - _length = data.length(); - return _length; - }; - - mutable oraub8 _length; // NOTE: OCILobGetLength makes one roundtrip to the server - mutable QString _displayData; - toOracleBlob(toOracleBlob const&); - toOracleBlob operator=(toOracleBlob const&); - //TODO copying prohibited -}; -//Q_DECLARE_METATYPE(toOracleBlob*) - -class toOracleCollection: public toQValue::complexType -{ -public: - toOracleCollection(trotl::OciConnection &_conn) - : toQValue::complexType() - , data(_conn) - {}; - /* virtual */ bool isBinary() const - { - return false; - } - /* virtual */ bool isLarge() const - { - return false; - } - - - /* virtual */ QString displayData() const throw() - { - return QString("{collection}"); - } - - /* virtual */ QString editData() const throw() - { - return QString::fromUtf8(((::trotl::tstring)data).c_str()); - } - - /* virtual */ QString userData() const throw() - { - return QString("collection"); - } - - /* virtual */ QString tooltipData() const throw() - { - return dataTypeName(); - } - - /* virtual */ QString dataTypeName() const - { - return QString::fromUtf8(data._data_type_name.c_str()); - } - /* virtual */ QByteArray read(unsigned offset) const - { - return QByteArray(); - } - /* virtual */ void write(QByteArray const &data) - { - } - /* virtual */ ~toOracleCollection() - { - TLOG(1,toDecorator,__HERE__) << "toOracleCollection DELETED:" << this << std::endl; - } - - mutable trotl::SqlCollection data; -protected: - toOracleCollection(toOracleCollection const&); - toOracleCollection operator=(toOracleCollection const&); - //TODO copying prohibited -}; -//Q_DECLARE_METATYPE(toOracleCollection*) - -class toOracleCursor: public toQValue::complexType -{ -public: - toOracleCursor() {}; - - /* virtual */ bool isBinary() const - { - return false; - } - /* virtual */ bool isLarge() const - { - return true; - } - - - /* virtual */ QString displayData() const throw() - { - return QString("{cursor}"); - } - - /* virtual */ QString editData() const throw() - { - std::string s; - data >> s; - return QString::fromUtf8(s.c_str()); - } - - /* virtual */ QString userData() const throw() - { - return QString("cursor"); - } - - /* virtual */ QString tooltipData() const throw() - { - return dataTypeName(); - } - - /* virtual */ QString dataTypeName() const - { - return QString("cursor SQLT_RSET"); - } - /* virtual */ QByteArray read(unsigned offset) const - { - return QByteArray(); - } - /* virtual */ void write(QByteArray const &data) - { - } - /* virtual */ ~toOracleCursor() - { - TLOG(1,toDecorator,__HERE__) << "toOracleCursor DELETED:" << this << std::endl; - } - - mutable trotl::SqlCursor data; -protected: - toOracleCursor(toOracleCursor const&); - toOracleCursor operator=(toOracleCursor const&); - //TODO copying prohibited -}; -//Q_DECLARE_METATYPE(toOracleCursor*) - -class toOracleProvider : public toConnectionProvider -{ - ::trotl::OciEnv *_envp; - QByteArray dateFormat; -public: - class oracleSub : public toConnectionSub - { - public: - - ::trotl::OciConnection *_conn; - ::trotl::OciLogin *_login; - - oracleSub(::trotl::OciConnection *conn, ::trotl::OciLogin *login): - _conn(conn), _login(login) - {} - - ~oracleSub() - { - try { - delete _conn; - delete _login; - } - catch(...) - { - TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; - } - _conn = 0; - _login = 0; - } - - virtual void cancel(void) - { - _conn->cancel(); - TLOG(0,toDecorator,__HERE__) << "oracleSub::cancel(this=" << _conn << ")" << std::endl; - } - - virtual void throwExtendedException(toConnection &conn, const ::trotl::OciException &exc) - { - TLOG(0,toDecorator,__HERE__) - << "What:" << exc.what() << std::endl - << exc.get_sql() << std::endl - << "--------------------------------------------------------------------------------" - << std::endl; - if (conn.version() < "0800" && exc.get_code() == 0) - { - // Serious OCI voodoo to get the Parse error location on Oracle7 servers - // TODO - /* - Lda_Def lda; - Cda_Def cda; - if (OCISvcCtxToLda(Connection->connect_struct.svchp, - Connection->connect_struct.errhp, - &lda) == OCI_SUCCESS) - { - if (oopen(&cda, - &lda, - (OraText *)0, -1, - -1, - (OraText *)0, -1) == OCI_SUCCESS) - { - cda.peo = 0; - oparse(&cda, (OraText *)exc.stm_text, -1, FALSE, 1); - ((::trotl::OciException &)exc).code = cda.peo; - oclose(&cda); - } - OCILdaToSvcCtx(&Connection->connect_struct.svchp, - Connection->connect_struct.errhp, - &lda); - } - */ - } - ThrowException(exc); - } - }; - - class oracleQuery : public queryImpl - { - bool Cancel; - bool Running; - bool SaveInPool; - - public: - class trotlQuery : public ::trotl::SqlStatement - { - public: - typedef ::trotl::SqlStatement super; - trotlQuery(::trotl::OciConnection &conn, - const ::trotl::tstring &stmt, // TODO QString here - ub4 lang=OCI_NTV_SYNTAX, - int bulk_rows=::trotl::g_OCIPL_BULK_ROWS) - : ::trotl::SqlStatement(conn, stmt, lang, bulk_rows) - { - // Be compatible with otl, execute some statements immediatelly - if( - get_stmt_type() == STMT_ALTER - || get_stmt_type() == STMT_OTHER // ANALYZE - || _in_cnt == 0 - ) - execute_internal(::trotl::g_OCIPL_BULK_ROWS, OCI_DEFAULT); - }; - void readValue(toQValue &value) - { - super::BindPar const &BP(get_stmt_type() == STMT_SELECT ? - get_next_column() : - get_next_out_bindpar()); - - if((_state & EXECUTED) == 0) - execute_internal(::trotl::g_OCIPL_BULK_ROWS, OCI_DEFAULT); - - if(BP.is_null(_last_buff_row) && BP.dty != SQLT_NTY) { - value = toQValue(); - TLOG(4,toDecorator,__HERE__) << "Just read: NULL" << std::endl; - } else { - switch(BP.dty) { - case SQLT_NUM: - case SQLT_VNU: - { - OCINumber* vnu = (OCINumber*) &((char*)BP.valuep)[_last_buff_row * BP.value_sz ]; - sword res; - boolean isint; - res = OCINumberIsInt(_errh, vnu, &isint); - oci_check_error(__HERE__, _errh, res); - try - { - if(isint) - { - long long i; - res = OCINumberToInt(_errh, - vnu, - sizeof(long long), - OCI_NUMBER_SIGNED, - &i); - oci_check_error(__HERE__, _errh, res); - value = toQValue(i); - TLOG(4,toDecorator,__HERE__) << "Just read: '" << i << '\'' << std::endl; - } else { - double d; - sword res = OCINumberToReal(_errh, - vnu, - sizeof(double), - &d); - oci_check_error(__HERE__, _errh, res); - value = toQValue(d); - TLOG(4,toDecorator,__HERE__) << "Just read: '" << d << '\'' << std::endl; - } - } catch(const ::trotl::OciException &e) { - text str_buf[65]; - ub4 str_len = sizeof(str_buf) / sizeof(*str_buf); - //const char fmt[]="99999999999999999999999999999999999999D00000000000000000000"; - const char fmt[]="TM"; - sword res = OCINumberToText(_errh, - vnu, - (const oratext*)fmt, - sizeof(fmt) -1, - 0, // CONST OraText *nls_params, - 0, // ub4 nls_p_length, - (ub4*)&str_len, - str_buf ); - oci_check_error(__HERE__, _env._errh, res); - str_buf[str_len+1] = '\0'; - value = toQValue(QString::fromUtf8((const char*)str_buf)); - } - } - break; - case SQLT_NTY: - { -#ifdef ORACLE_HAS_XML - if( ::trotl::BindParXML const *bpx = dynamic_cast<const trotl::BindParXML *>(&BP)) - { - if((xmlnode*)bpx->_xmlvaluep[_last_buff_row] == NULL) - { - value = toQValue(); - TLOG(4,toDecorator,__HERE__) << "Just read: NULL XML" << std::endl; - } else { - std::string s(BP.get_string(_last_buff_row)); - value = toQValue(QString::fromUtf8(s.c_str())); - TLOG(4,toDecorator,__HERE__) << "Just read: \"" << s << "\"" << std::endl; - } - } -#endif - if( ::trotl::BindParANYDATA const *bpa = dynamic_cast<const trotl::BindParANYDATA *>(&BP)) - { - if( bpa->_oan_buffer[_last_buff_row] == NULL) - { - value = toQValue(); - } else { - std::string s(BP.get_string(_last_buff_row)); - value = toQValue(QString::fromUtf8(s.c_str())); - } - } else if( ::trotl::BindParCollectionTabNum const *bpc = dynamic_cast<const trotl::BindParCollectionTabNum *>(&BP)) - { - if( *(sb2*)(bpc->_collection_indp[_last_buff_row]) == OCI_IND_NULL) - { - value = toQValue(); - TLOG(4,toDecorator,__HERE__) << "Just read: NULL collection" << std::endl; - } else { - toOracleCollection *i = new toOracleCollection(_conn); - trotl::ConvertorForRead c(_last_buff_row); - trotl::DispatcherForRead::Go(BP, i->data, c); - QVariant v; - v.setValue((toQValue::complexType*)i); - value = toQValue::fromVariant(v); - TLOG(4,toDecorator,__HERE__) << "Just read: collection:" - << (::trotl::tstring)i->data - << std::endl; - } - } else if( ::trotl::BindParCollectionTabVarchar const *bpc = dynamic_cast<const trotl::BindParCollectionTabVarchar *>(&BP)) - { - if( *(sb2*)(bpc->_collection_indp[_last_buff_row]) == OCI_IND_NULL) - { - value = toQValue(); - TLOG(4,toDecorator,__HERE__) << "Just read: NULL collection" << std::endl; - } else { - toOracleCollection *i = new toOracleCollection(_conn); - trotl::ConvertorForRead c(_last_buff_row); - trotl::DispatcherForRead::Go(BP, i->data, c); - QVariant v; - v.setValue((toQValue::complexType*)i); - value = toQValue::fromVariant(v); - TLOG(4,toDecorator,__HERE__) << "Just read: collection:" - << (::trotl::tstring)i->data - << std::endl; - } - } - - } - break; - case SQLT_CLOB: - { - toOracleClob *i = new toOracleClob(_conn); - trotl::ConvertorForRead c(_last_buff_row); - trotl::DispatcherForRead::Go(BP, i->_data, c); - QVariant v; - v.setValue((toQValue::complexType*)i); - value = toQValue::fromVariant(v); - //int id = qMetaTypeId<toQValue::complexType*>(); - TLOG(4,toDecorator,__HERE__) << "Just read: \"CLOB\"" << std::endl; - } - break; - case SQLT_BLOB: - { - toOracleBlob *i = new toOracleBlob(_conn); - trotl::ConvertorForRead c(_last_buff_row); - trotl::DispatcherForRead::Go(BP, i->data, c); - QVariant v; - v.setValue((toQValue::complexType*)i); - value = toQValue::fromVariant(v); - TLOG(4,toDecorator,__HERE__) << "Just read: \"BLOB\"" << std::endl; - } - break; - case SQLT_RSET: - { - toOracleCursor *i = new toOracleCursor(); - trotl::ConvertorForRead c(_last_buff_row); - trotl::DispatcherForRead::Go(BP, i->data, c); - QVariant v; - v.setValue((toQValue::complexType*)i); - value = toQValue::fromVariant(v); - TLOG(4,toDecorator,__HERE__) << "Just read: \"CURSOR\"" << std::endl; - } - default: - std::string s(BP.get_string(_last_buff_row)); - value = toQValue(QString::fromUtf8(s.c_str())); - TLOG(4,toDecorator,__HERE__) << "Just read: \"" << s << "\"" << std::endl; - } - } - - if(_out_pos == _column_count && BP._bind_type == BP.DEFINE_SELECT) - ++_last_buff_row; - - if(_out_pos == _out_cnt && get_stmt_type() != STMT_SELECT ) - _state |= EOF_DATA; - - if(_last_buff_row == fetched_rows() && ((_state & EOF_DATA) == 0) && get_stmt_type() == STMT_SELECT) - fetch(_fetch_rows); - } - }; - trotlQuery * Query; - - oracleQuery(toQuery *query, oracleSub *) - : queryImpl(query) - { - TLOG(0,toDecorator,__HERE__) << std::endl; - Running = Cancel = false; - SaveInPool = false; - Query = NULL; - } - virtual ~oracleQuery() - { - if (!Query) - return; - - Query->close(); - delete Query; - } - - virtual void execute(void); - - virtual toQValue readValue(void) - { - toQValue retval; - Query->readValue(retval); - return retval; - } - - virtual void cancel(void); - - virtual bool eof(void) - { - if (!Query || Cancel) { - TLOG(0,toDecorator,__HERE__) << "eof - on canceled query" << std::endl; - return true; - } - try { - bool e = Query->eof(); - if(e) - { - Running = false; - TLOG(0,toDecorator,__HERE__) << "eof(" << Query->row_count() << ')' << std::endl; - } - return e; //Query->eof(); - } - catch (const ::trotl::OciException &exc) - { - TLOG(0,toDecorator,__HERE__) << "eof(e) - " << exc.what() << std::endl; - if(query()) - { - oracleSub *conn = dynamic_cast<oracleSub *>(query()->connectionSub()); - if(conn) - conn->throwExtendedException(query()->connection(), exc); - } - return true; - } - } - - virtual int rowsProcessed(void) - { - if (!Query) - { - TLOG(0,toDecorator,__HERE__) << "rowsProcessed() - non-query" << std::endl; - return 0; - } - int retval; - - if( Query->get_stmt_type() == ::trotl::SqlStatement::STMT_SELECT ) - { - retval = Query->get_last_row(); - } else { - retval = Query->row_count(); - } - TLOG(0,toDecorator,__HERE__) << "rowsProcessed(" << retval << ")" << std::endl; - return retval; - } - - virtual int columns(void) - { - //int descriptionLen; - //Query->describe_select(descriptionLen); - TLOG(0,toDecorator,__HERE__) << "columns(" << Query->get_column_count() << ")" << std::endl; - return Query->get_column_count(); - } - - virtual std::list<toQDescribe> describe(void) - { - TLOG(0,toDecorator,__HERE__) << std::endl; - std::list<toQDescribe> ret; - - int datatypearg1 = 0; - int datatypearg2 = 0; - TLOG(0,toDecorator,__HERE__) << "TODO describe:" << std::endl; - - // TODO trotl should return const iterator - - const std::vector<trotl::ColumnType> &col = Query->get_columns(); - if(col.empty()) return ret; - std::vector<trotl::ColumnType>::const_iterator it = col.begin(); ++it; // starts with 1st - //TLOG(0,toDecorator,__HERE__) << "Columns: " << q1.get_column_count() << std::endl; - for(; it != col.end(); ++it) - { - TLOG(0,toDecorator,__HERE__) << "Var: " << (*it).get_type_str(true) << std::endl; - toQDescribe desc; - desc.AlignRight = false; - desc.Name = QString::fromUtf8( (*it)._column_name.c_str() ); - desc.Datatype = QString::fromUtf8( (*it).get_type_str(true).c_str() ); - - //datatypearg1 = description[i].char_size; - desc.Datatype.sprintf(desc.Datatype.toUtf8().constData(), datatypearg1, datatypearg2); - //desc.Null = description[i].nullok; - - ret.insert(ret.end(), desc); - } - - return ret; - } - }; // class oracleQuery : public toQuery::queryImpl - - class oracleConnection : public toConnection::connectionImpl - { - ::trotl::OciEnv &_env; - QString connectString(void); - - oracleSub *oracleConv(toConnectionSub *sub) - { - oracleSub *conn = dynamic_cast<oracleSub *>(sub); - if (!conn) - throw QString::fromLatin1("Internal error, not a oracle sub connection"); - return conn; - } - public: - oracleConnection(toConnection *conn, ::trotl::OciEnv &env) : - toConnection::connectionImpl(conn), _env(env) - { } - - /** Return a string representation to address an object. - * Checks if identifier has illegal characters, starts with digit, is a reserved - * word etc. - if so - returns it enclosed with quotes (otherwise returns the same string). - * Note that when identifier name returned from oracle data dictionary is in lowercase - * - it MUST be enclosed with quotes (case insensitive "normal" identifiers are always - * returned in uppercase). - * @param name The name to be quoted. - * @param quoteLowercase Enclose in quotes when identifier has lowercase letters. - * When processing data returned by dada dictionary quoteLowercase should be true - * When processing data entered by user quoteLowercase should be false - * @return String addressing table. - */ - virtual QString quote(const QString &name, const bool quoteLowercase) - { - bool ok = true; - // Identifiers starting with digit should be quoted - if (name.at(0).isDigit()) - ok = false; - else - for (int i = 0; i < name.length(); i++) - { - if ((name.at(i).toUpper() != name.at(i) && quoteLowercase) || !toIsIdent(name.at(i))) - ok = false; - } - - // Check if given identified is a reserved word - int i = 0; - while (ok && (DefaultKeywords[i] != NULL)) - { - if (name.compare(DefaultKeywords[i], Qt::CaseInsensitive) == 0) - ok = false; - i++; - } - if (ok) - { - if (toConfigurationSingle::Instance().objectNamesUpper()) - return name.toUpper(); - else - return name.toLower(); - } - else - return QString::fromLatin1("\"") + name + QString::fromLatin1("\""); - } - - virtual QString unQuote(const QString &str) - { - if (str.at(0).toLatin1() == '\"' && str.at(str.length() - 1).toLatin1() == '\"') - return str.left(str.length() - 1).right(str.length() - 2); - return str.toUpper(); - } - - virtual std::list<toConnection::objectName> objectNames(const QString &owner, - const QString &type, - const QString &name) - { - std::list<toConnection::objectName> ret; - - std::list<toQValue> par; - par.insert(par.end(), owner); - par.insert(par.end(), type); - par.insert(par.end(), name); - toQuery objects(connection(), toQuery::Long, - SQLListObjects, par); - toConnection::objectName cur; - while (!objects.eof()) - { - cur.Owner = objects.readValue(); - cur.Name = objects.readValue(); - cur.Type = objects.readValue(); - cur.Comment = objects.readValue(); - ret.insert(ret.end(), cur); - } - TLOG(0,toDecorator,__HERE__) - << "++++ objectNames +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" - << std::endl; - - return ret; - } - virtual std::map<QString, toConnection::objectName> synonymMap(std::list<toConnection::objectName> &objects) - { - std::map<QString, toConnection::objectName> ret; - - toConnection::objectName cur; - cur.Type = QString::fromLatin1("A"); - std::list<toQValue> par; - par.insert(par.end(), toQValue(connection().user().toUpper())); - toQuery synonyms(connection(), toQuery::Long, - SQLListSynonyms, par); - std::list<toConnection::objectName>::iterator i = objects.begin(); - while (!synonyms.eof()) - { - QString synonym = synonyms.readValue(); - cur.Owner = synonyms.readValue(); - cur.Name = synonyms.readValue(); - while (i != objects.end() && (*i) < cur) - i++; - if (i == objects.end()) - break; - if (cur.Name == (*i).Name && cur.Owner == (*i).Owner) - { - ret[synonym] = (*i); - (*i).Synonyms.insert((*i).Synonyms.end(), synonym); - } - } - TLOG(0,toDecorator,__HERE__) - << "++++ synonymMap ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" - << std::endl; - - return ret; - } - virtual toQDescList columnDesc(const toConnection::objectName &table) - { - toBusy busy; - if (table.Type == QString::fromLatin1("PACKAGE")) - { - toQDescList ret; - try - { - toQDescribe desc; - desc.Datatype = ("MEMBER"); - desc.Null = false; - QString lastName; - QString lastOver; - toQuery member(connection(), SQLMembers, table.Owner, table.Name); - bool hasArgs = false; - while (!member.eof()) - { - QString name = member.readValue(); - QString overld = member.readValue(); - QString arg = member.readValue(); - QString type = member.readValue(); - if (lastName != name || overld != lastOver) - { - if (hasArgs) - desc.Name += ")"; - if (!desc.Name.isEmpty()) - ret.insert(ret.end(), desc); - desc.Name = name; - lastName = name; - lastOver = overld; - hasArgs = false; - } - if (arg.isEmpty()) - { - if (hasArgs) - { - desc.Name += ")"; - hasArgs = false; - } - desc.Name += " RETURNING "; - } - else - { - if (hasArgs) - desc.Name += ", "; - else - { - desc.Name += "("; - hasArgs = true; - } - desc.Name += arg; - desc.Name += " "; - } - desc.Name += type; - } - if (desc.Name.contains("(")) - desc.Name += ")"; - if (!desc.Name.isEmpty()) - ret.insert(ret.end(), desc); - } - catch (...) - { - TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; - } - return ret; - } - - std::map<QString, QString> comments; - try - { - toQuery comment(connection(), SQLComment, table.Owner, table.Name); - while (!comment.eof()) - { - QString col = comment.readValue(); - comments[col] = comment.readValue(); - } - } - catch (...) - { - TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; - } - - try - { - toQuery query(connection()); -#ifdef OTL_STREAM_POOLING_ON - // Need to clear the stream cache first. - oracleSub *sub = dynamic_cast<oracleSub *>(query.connectionSub()); - sub->Lock.down(); - sub->Connection->set_stream_pool_size(std::max(toConfigurationSingle::Instance().openCursors(), 1)); - sub->Lock.up(); -#endif - - QString SQL = QString::fromLatin1("SELECT * FROM \""); - SQL += table.Owner; - SQL += QString::fromLatin1("\".\""); - SQL += table.Name; - SQL += QString::fromLatin1("\" WHERE NULL=NULL"); - toQList par; - query.execute(SQL, par); - toQDescList desc = query.describe(); - for (toQDescList::iterator j = desc.begin();j != desc.end();j++) - (*j).Comment = comments[(*j).Name]; - - return desc; - } - catch ( ... ) - { - throw; - } - - toQDescList ret; - return ret; - } - - virtual void commit(toConnectionSub *sub) - { - oracleSub *conn = oracleConv(sub); - try - { - conn->_conn->commit(); - } - catch (const ::trotl::OciException &exc) - { - ThrowException(exc); - } - } - virtual void rollback(toConnectionSub *sub) - { - oracleSub *conn = oracleConv(sub); - try - { - conn->_conn->rollback(); - } - catch (const ::trotl::OciException &exc) - { - ThrowException(exc); - } - } - - virtual toConnectionSub *createConnection(void); - - void closeConnection(toConnectionSub *conn) - { - delete conn; - } - - virtual QString version(toConnectionSub *sub) - { - oracleSub *connp = oracleConv(sub); - try - { - ::trotl::OciLogin &login( *(connp->_login) ); - ::std::stringstream version; - version << login._server.versionNumber() << "." - << login._server.releaseNumber() << "." - << login._server.updateNumber() << "." - << login._server.portReleaseNumber() << "." - << login._server.portUpdateNumber(); - - return QString::fromLatin1(version.str().c_str()); - } - catch (::trotl::OciException e) { - TLOG(0,toDecorator,__HERE__) << e.what() << std::endl; - } - catch (...) - { - TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; - // Ignore any errors here - } - //return QString::QString(); // TS 2010-12-05 couldn't compile with this... - return QString::null; // ... so changed to this. - } - - virtual queryImpl *createQuery(toQuery *query, toConnectionSub *sub) - { - return new oracleQuery(query, oracleConv(sub)); - } - - - /* TODO I have no idea when this method is used. - instance of toQuery is created and then dropped - why ? - NOTE: there is one more execute method - */ - virtual void execute(toConnectionSub *sub, const QString &sql, toQList ¶ms) - { - oracleSub *conn = oracleConv(sub); - TLOG(0,toDecorator,__HERE__) << std::endl; - if ( params.empty() ) - { - try - { - std::string _sql(sql.toUtf8().constData()); - oracleQuery::trotlQuery query(*conn->_conn, _sql); - query.execute_internal(::trotl::g_OCIPL_BULK_ROWS, OCI_DEFAULT); - //otl_cursor::direct_exec(*(conn->Connection), sql.toUtf8().constData()); - //TODO - TLOG(0,toDecorator,__HERE__) << "TODO: otl_cursor::direct_exec" << std::endl; - } - catch (const ::trotl::OciException &exc) - { - conn->throwExtendedException(connection(), exc); - } - } - else - toQuery query(connection(), sql, params); - } - - virtual void parse(toConnectionSub *sub, const QString &sql) - { - oracleSub *conn = oracleConv(sub); - try - { - //oracleQuery::oracleSqlStatement s1(*conn->_conn, sql.toUtf8().constData()); - oracleQuery::trotlQuery s1(*conn->_conn, ::std::string(sql.toUtf8().constData())); - //conn->Connection->reset_throw_count(); - //conn->Connection->syntax_check(sql.toUtf8().constData()); - - } - catch (const ::trotl::OciException &exc) - { - //conn->Connection->throw_count++; - ThrowException(exc); - } - } - - }; // class oracleConnection : public toConnection::connectionImpl - - toOracleProvider(void) - : toConnectionProvider("Oracle", false) - {} - - virtual void initialize(void) - { - toMaxLong = toConfigurationSingle::Instance().maxLong() == -1 ? 0x80000000 : toConfigurationSingle::Instance().maxLong(); - ::trotl::g_OCIPL_MAX_LONG = toMaxLong; - - dateFormat = toConfigurationSingle::Instance().dateFormat().toAscii(); - ::trotl::g_TROTL_DEFAULT_DATE_FTM = const_cast<char*>(dateFormat.constData()); - ::trotl::OciEnvAlloc *_envallocp = new ::trotl::OciEnvAlloc; - - _envp = new ::trotl::OciEnv(*_envallocp); - - addProvider("Oracle"); - } - - virtual toConnection::connectionImpl *provideConnection(const QString &, toConnection *conn) - { - return new oracleConnection(conn, *_envp); - } - - virtual std::list<QString> providedOptions(const QString &) - { - std::list<QString> ret; - ret.insert(ret.end(), "*SQL*Net"); - ret.insert(ret.end(), "-"); - ret.insert(ret.end(), "SYS_OPER"); - ret.insert(ret.end(), "SYS_DBA"); - return ret; - } - - virtual std::list<QString> providedHosts(const QString &) - { - std::list<QString> ret; - ret.insert(ret.end(), QString::null); - ret.insert(ret.end(), QString::fromLatin1("SQL*Net")); - return ret; - } - - virtual std::list<QString> providedDatabases(const QString &, - const QString &host, - const QString &, - const QString &) - { - QVector<QString> tnsnames; -#ifdef Q_OS_WIN32 - { - QString str; - - CRegistry registry; - DWORD siz = 1024; - char buffer[1024]; - try - { - if (registry.GetStringValue(HKEY_LOCAL_MACHINE, - "SOFTWARE\\ORACLE\\HOME0", - "TNS_ADMIN", - buffer, siz)) - { - if (siz > 0) - str = buffer; - else - throw 0; - } - else - throw 0; - } - catch (...) - { - try - { - if (registry.GetStringValue(HKEY_LOCAL_MACHINE, - "SOFTWARE\\ORACLE\\HOME0", - "ORACLE_HOME", - buffer, siz)) - { - if (siz > 0) - { - str = buffer; - str += "\\network\\admin"; - } - else - throw 0; - } - else - throw 0; - } - catch (...) - { - if (GetEnvironmentVariableA("TNS_ADMIN", buffer, siz) > 0) - str = buffer; - } - } - str.append(QString::fromLatin1("/tnsnames.ora")); - tnsnames.push_back(str); - } -#else - { - QString str; - - str = toExpandFile("$HOME/.tnsnames.ora"); - QFileInfo home(str); - if(home.exists() && home.isFile() && home.isReadable()) - tnsnames.push_back(str); - - - str = "/etc/tnsnames.ora"; - QFileInfo etc(str); - if(etc.exists() && etc.isFile() && etc.isReadable()) - tnsnames.push_back(str); - - if (getenv("TNS_ADMIN")) - { - str = getenv("TNS_ADMIN"); - } - else - { - str = getenv("ORACLE_HOME"); - str.append(QString::fromLatin1("/network/admin")); - } - str.append(QString::fromLatin1("/tnsnames.ora")); - QFileInfo ohome_net_adm(str); - if(ohome_net_adm.exists() && ohome_net_adm.isFile() && ohome_net_adm.isReadable()) - tnsnames.push_back(str); - } -#endif - std::list<QString> ret; - - foreach(QString str, tnsnames) - { - QFile file(str); - int begname = -1; - int parambeg = -1; - int pos = 0; - int param = 0; - QByteArray barray; - const char *buf; - - try { - barray = toReadFileB(str); - buf = barray.constData(); - TLOG(0,toDecorator,__HERE__) - << "--------------------------------------------------------------------------------" << std::endl - << "File read: " << str << std::endl; - } catch( QString const &e ) { - TOMessageBox::warning( - toMainWidget(), - QT_TRANSLATE_NOOP("toReadFileB", "File error"), - QT_TRANSLATE_NOOP("toReadFileB", QString("Couldn't open %1 for readonly") - .arg(str).toAscii().constData())); - goto next; - } - - while (pos < barray.size()) - { - if (buf[pos] == '#') - { - while (pos < barray.size() && buf[pos] != '\n') - pos++; - } - else if (buf[pos] == '=') - { - if (param == 0) - { - if (begname >= 0 && !host.isEmpty()) - ret.insert(ret.end(), QString::fromLatin1(buf + begname, pos - begname)); - } - } - else if (buf[pos] == '(') - { - begname = -1; - parambeg = pos + 1; - param++; - } - else if (buf[pos] == ')') - { - if (parambeg >= 0 && host.isEmpty()) - { - QString tmp = QString::fromLatin1(buf + parambeg, pos - parambeg); - tmp.replace(QRegExp(QString::fromLatin1("\\s+")), QString::null); - if (tmp.toLower().startsWith(QString::fromLatin1("sid="))) - ret.insert(ret.end(), tmp.mid(4)); - } - begname = -1; - parambeg = -1; - param--; - } - else if (!isspace(buf[pos]) && begname < 0) - { - begname = pos; - } - pos++; - } - next: - ;; - } // foreach(QString str, tnsnames) - - ret.sort(); - return ret; - } - - virtual QWidget *providerConfigurationTab(const QString &provider, QWidget *parent); -}; - -static toOracleProvider OracleProvider; - -void toOracleProvider::oracleQuery::execute(void) -{ - oracleSub *conn = dynamic_cast<oracleSub *>(query()->connectionSub()); - if (!conn) - throw QString::fromLatin1("Internal error, not oracle sub connection"); - try - { - if(Query) delete Query; - Query = NULL; - - if (Cancel) - throw QString::fromLatin1("Query aborted before started"); - Running = true; - - QRegExp stripnl("\r"); - QString sql = this->query()->sql(); - sql.replace(stripnl, ""); - - //Query = new oracleQuery::oracleSqlStatement(*conn->_conn, sql.toUtf8().constData()); - Query = new oracleQuery::trotlQuery(*conn->_conn, ::std::string(sql.toUtf8().constData())); - TLOG(0,toDecorator,__HERE__) << "SQL(conn=" << conn->_conn << ", this=" << Query << "): " << ::std::string(sql.toUtf8().constData()) << std::endl; - // TODO autocommit ?? - // Query->set_commit(0); - //if (toQValue::numberFormat() == 0) - // Query->set_all_column_types(otl_all_num2str | otl_all_date2str); - //else - // Query->set_all_column_types(otl_all_date2str); - - //Query->open(1, sql.toUtf8().constData(), *(conn->Connection)); - } - catch (const ::trotl::OciException &exc) - { - delete Query; - Query = NULL; - - Running = false; - conn->throwExtendedException(query()->connection(), exc); - } - try - { - for (toQList::iterator i = query()->params().begin();i != query()->params().end();i++) - { - const trotlQuery::BindPar& bp = (*Query).get_curr_in_bindpar(); - - if( (bp._bind_type & ( trotlQuery::BindPar::BIND_IN | trotlQuery::BindPar::BIND_OUT )) == 0) - throw toConnection::exception(QString::fromLatin1("Fatal pruser error - invalid BindPar")); - - if( bp.bind_typename == "int" /*&& (*i).isInt()*/ ) { - (*Query) << (*i).toInt(); - TLOG(0,toDecorator,__HERE__) - << "<<(conn=" << conn->_conn << ", this=" << Query << ")" - << "::operator<<(" << bp.type_name << " ftype=" << bp.dty - << ", placeholder=" << bp.bind_name - << ", value=" << (*i).toInt() << ");" - << "\t of:" << query()->params().size() << std::endl; - } else if( (bp.bind_typename == "char" || bp.bind_typename == "varchar") - && ((*i).isString() || (*i).isNumber() || (*i).isNull() )) - { - std::string param((const char*)(((QString)*i).toUtf8().constData())); - (*Query) << param; - TLOG(0,toDecorator,__HERE__) - << "<<(conn=" << conn->_conn << ", this=" << Query << ")" - << "::operator<<(" << bp.type_name << " ftype=" << bp.dty - << ", placeholder=" << bp.bind_name - << ", value=" << ::std::string((const char*)(((QString)*i).toUtf8().constData())) << ");" - << "\t of:" << query()->params().size() << std::endl; - } else { - TLOG(0,toDecorator,__HERE__) - << "Fatal pruser error - unsupported BindPar: " << bp.bind_typename << std::endl - << " For SQL: \n" << query()->sql() << std::endl - << "<<(conn=" << conn->_conn << ", this=" << Query << ")" - << "::operator<<(" << bp.type_name << " ftype=" << bp.dty - << ", placeholder=" << bp.bind_name - << ", value=" << ::std::string((const char*)(((QString)*i).toUtf8().constData())) << ");" - << "\t of:" << query()->params().size() << std::endl; - throw toConnection::exception( - QString::fromLatin1("Fatal pruser error - unsupported BindPar:%1\nFor SQL:\n%2\n") - .arg(bp.bind_typename.c_str()) - .arg(query()->sql())); - exit(-1); - } - } - - //Running = false; - } - catch (const ::trotl::OciException &exc) - { - TLOG(0,toDecorator,__HERE__) - << "What:" << exc.what() << std::endl - << exc.get_sql() << std::endl - << "--------------------------------------------------------------------------------" - << std::endl; - try { - conn->_conn->reset(); - } catch(const ::trotl::OciException &e2) { - TLOG(0,toDecorator,__HERE__) - << "Exception in exception What:\n" << e2.what() << std::endl - << e2.get_sql() << std::endl - << "--------------------------------------------------------------------------------" - << std::endl; - } - try { - conn->_conn->reset(); - } catch(const ::trotl::OciException &e2) { - TLOG(0,toDecorator,__HERE__) - << "Exception in exception What:\n" << e2.what() << std::endl - << e2.get_sql() << std::endl - << "--------------------------------------------------------------------------------" - << std::endl; - } - delete Query; - Query = NULL; - - Running = false; - conn->throwExtendedException(query()->connection(), exc); - } -} - -void toOracleProvider::oracleQuery::cancel(void) -{ - oracleSub *conn = dynamic_cast<oracleSub *>(query()->connectionSub()); - if(!Running || Cancel) - { - TLOG(0,toDecorator,__HERE__) << ":oracleQuery::cancel(conn=" << conn->_conn << ", this=" << Query << ") on non-running query" << std::endl; - return; - } - - if (!conn) - throw QString::fromLatin1("Internal error, not oracle sub connection"); - - conn->_conn->cancel(); - conn->_conn->reset(); - Cancel = true; - Running = false; - TLOG(0,toDecorator,__HERE__) << ":oracleQuery::cancel(conn=" << conn->_conn << ", this=" << Query << ")" << std::endl; -} - - -QString toOracleProvider::oracleConnection:: connectString(void) -{ - QString ret; - ret = connection().user().toUtf8(); - ret += QString::fromLatin1("/"); - ret += connection().password().toUtf8(); - if (!connection().host().isEmpty()) - { - ret += QString::fromLatin1("@"); - ret += connection().database().toUtf8(); - } - return ret; -} - -toConnectionSub* toOracleProvider::oracleConnection::createConnection(void) -{ - ::trotl::OciConnection *conn = NULL; - ::trotl::OciLogin *login = NULL; - QString oldSid; - - std::set<QString> options = connection().options(); - - bool sqlNet = (options.find("SQL*Net") != options.end()); - if (!sqlNet) - { - oldSid = getenv("ORACLE_SID"); - toSetEnv("ORACLE_SID", connection().database()); - } - try - { - int session_mode = OCI_DEFAULT; - if (options.find("SYS_OPER") != options.end()) - session_mode = OCI_SYSOPER; - else if (options.find("SYS_DBA") != options.end()) - session_mode = OCI_SYSDBA; - do - { - -#ifdef OTL_STREAM_POOLING_ON - conn->set_stream_pool_size(std::max(toConfigurationSingle::Instance().openCursors(), 1)); -#endif - /* TODO - if (!sqlNet) - conn->server_attach(); - else - */ - QString user = connection().user(); - QString pass = connection().password(); - - try - { - // TODO what does _login destructor? and where is it? - /*::trotl::OciLogin */ login = new ::trotl::OciLogin(_env, - ::trotl::LoginPara( - user.isEmpty() ? "" : user.toUtf8().constData(), - pass.isEmpty() ? "" : pass.toUtf8().constData(), - connection().database().toUtf8().constData() - ), - (ub4) session_mode); - conn = new ::trotl::OciConnection(_env, *login); - - TLOG(0,toDecorator,__HERE__) << "Oracle database version: " - << ::std::hex << ::std::showbase << ::std::setw(10) - << ::std::setfill('0') << ::std::internal - << login->_server._version << ::std::endl - << login->_server._version_string << ::std::endl - << login->_server.versionNumber() << "." - << login->_server.releaseNumber() << "." - << login->_server.updateNumber() << "." - << login->_server.portReleaseNumber() << "." - << login->_server.portUpdateNumber() - << ::std::dec << ::std::endl; - - } - catch (const ::trotl::OciException &exc) - { - TLOG(0,toDecorator,__HERE__) - << "TODO: catch" << std::endl << __HERE__ << std::endl; - if (toThread::mainThread() && exc.get_code() == 28001) - { - bool ok = false; - QString newpass = QInputDialog::getText( - toMainWidget(), - qApp->translate("toOracleConnection", "Password expired"), - qApp->translate("toOracleConnection", "Enter new password"), - QLineEdit::Password, - QString::null, - &ok); - if (!ok) - throw exc; - - QString newpass2 = QInputDialog::getText( - toMainWidget(), - qApp->translate("toOracleConnection", "Password expired"), - qApp->translate("toOracleConnection", "Enter password again for confirmation"), - QLineEdit::Password, - QString::null, - &ok); - - if (!ok) - throw exc; - - if (newpass2 != newpass) - throw qApp->translate("toOracleConnection", "The two passwords doesn't match"); - QString nputf = newpass; - if( login ) delete login; - login = new ::trotl::OciLogin(_env, - ::trotl::LoginAndPChangePara( - user.isEmpty() ? "" : user.toUtf8().constData(), - pass.isEmpty() ? "" : pass.toUtf8().constData(), - newpass.isEmpty() ? "" : newpass.toUtf8().constData(), - connection().database().toUtf8().constData() - ), - (ub4) session_mode); - conn = new ::trotl::OciConnection(_env, *login); - - connection().setPassword(newpass); - } else { - TLOG(0,toDecorator,__HERE__) << std::endl; - throw exc; - } // (toThread::mainThread() && exc.get_code() == 28001) - } // catch (const ::trotl::OciException &exc) - } - while (!conn); - } - catch (const ::trotl::OciException &exc) - { - if (!sqlNet) - { - if (oldSid.isNull()) - toUnSetEnv("ORACLE_SID"); - else - toSetEnv("ORACLE_SID", oldSid.toLatin1()); - } - delete conn; - ThrowException(exc); - } - if (!sqlNet) - { - if (oldSid.isNull()) - toUnSetEnv("ORACLE_SID"); - else - { - toSetEnv("ORACLE_SID", oldSid.toLatin1()); - } - } - - try - { - QString str = QString::fromLatin1("ALTER SESSION SET NLS_DATE_FORMAT = '"); - str += toConfigurationSingle::Instance().dateFormat(); - str += QString::fromLatin1("'"); - oracleQuery::trotlQuery date(*conn, ::std::string(str.toAscii().constData())); - } - catch (...) - { - printf("Failed to set new default date format for session\n"); - toStatusMessage(QObject::tr("Failed to set new default date format for session: %1") - .arg(toConfigurationSingle::Instance().dateFormat())); - } - - try - { - QString str = QString::fromLatin1("ALTER SESSION SET NLS_TIMESTAMP_FORMAT = '"); - str += toConfigurationSingle::Instance().timestampFormat(); - str += QString::fromLatin1("'"); - oracleQuery::trotlQuery timestmp(*conn, ::std::string(str.toAscii().constData())); - } - catch (...) - { - printf("Failed to set new default timestamp format for session\n"); - toStatusMessage(QObject::tr("Failed to set new default timestamp format for session: %1") - .arg(toConfigurationSingle::Instance().timestampFormat())); - } - - try - { - //oracleQuery::oracleSqlStatement info(*conn, - oracleQuery::trotlQuery info(*conn, std::string( - "BEGIN\n" - " SYS.DBMS_APPLICATION_INFO.SET_CLIENT_INFO('" TOAPPNAME - " (http://tora.sf.net)" - "');\n" - " SYS.DBMS_APPLICATION_INFO.SET_MODULE('" TOAPPNAME "','Access Database');\n" - "END;")); - } - catch (::trotl::OciException const&e) - { - TLOG(0,toDecorator,__HERE__) << "Failed to set client info for session:\n" << e.what(); - } - catch (...) - { - TLOG(0,toDecorator,__HERE__) << "Failed to set client info for session\n"; - } - - return new oracleSub(conn, login); -} - -/* -** 11g version, see $ORACLE_HOME/rdbms/admin/utlxplan.sql -*/ -static toSQL SQLCreatePlanTable(toSQL::TOSQL_CREATEPLAN, - "CREATE TABLE %1 (\n" - "STATEMENT_ID VARCHAR2(30),\n" - "PLAN_ID NUMBER,\n" - "TIMESTAMP DATE,\n" - "REMARKS VARCHAR2(4000),\n" - "OPERATION VARCHAR2(30),\n" - "OPTIONS VARCHAR2(255),\n" - "OBJECT_NODE VARCHAR2(128),\n" - "OBJECT_OWNER VARCHAR2(30),\n" - "OBJECT_NAME VARCHAR2(30),\n" - "OBJECT_ALIAS VARCHAR2(65),\n" - "OBJECT_INSTANCE NUMERIC,\n" - "OBJECT_TYPE VARCHAR2(30),\n" - "OPTIMIZER VARCHAR2(255),\n" - "SEARCH_COLUMNS NUMBER,\n" - "ID NUMERIC,\n" - "PARENT_ID NUMERIC,\n" - "DEPTH NUMERIC,\n" - "POSITION NUMERIC,\n" - "COST NUMERIC,\n" - "CARDINALITY NUMERIC,\n" - "BYTES NUMERIC,\n" - "OTHER_TAG VARCHAR2(255),\n" - "PARTITION_START VARCHAR2(255),\n" - "PARTITION_STOP VARCHAR2(255),\n" - "PARTITION_ID NUMERIC,\n" - "OTHER LONG,\n" - "DISTRIBUTION VARCHAR2(30),\n" - "CPU_COST NUMERIC,\n" - "IO_COST NUMERIC,\n" - "TEMP_SPACE NUMERIC,\n" - "ACCESS_PREDICATES VARCHAR2(4000),\n" - "FILTER_PREDICATES VARCHAR2(4000),\n" - "PROJECTION VARCHAR2(4000),\n" - "TIME NUMERIC,\n" - "QBLOCK_NAME VARCHAR2(30),\n" - "OTHER_XML CLOB\n" - ")", - "Create plan table, must have same % signs"); - - -toOracleSetting::toOracleSetting(QWidget *parent) - : QWidget(parent), toSettingTab("database.html#oracle") -{ - - setupUi(this); - DefaultDate->setText(toConfigurationSingle::Instance().dateFormat()); - DefaultTimestamp->setText(toConfigurationSingle::Instance().timestampFormat()); - CheckPoint->setText(toConfigurationSingle::Instance().planCheckpoint()); - ExplainPlan->setText(toConfigurationSingle::Instance().planTable(NULL)); - OpenCursors->setValue(toConfigurationSingle::Instance().openCursors()); - KeepPlans->setChecked(toConfigurationSingle::Instance().keepPlans()); - VsqlPlans->setChecked(toConfigurationSingle::Instance().vsqlPlans()); - SharedPlan->setChecked(toConfigurationSingle::Instance().sharedPlan()); - int len = toConfigurationSingle::Instance().maxLong(); - if (len >= 0) - { - MaxLong->setText(QString::number(len)); - MaxLong->setValidator(new QIntValidator(MaxLong)); - Unlimited->setChecked(false); - } - cbUseDbmsMetadata->setChecked(toConfigurationSingle::Instance().extractorUseDbmsMetadata()); - cbIncludeStorage->setChecked(toConfigurationSingle::Instance().extractorIncludeSotrage()); - cbSkipOrgMon->setChecked(toConfigurationSingle::Instance().extractorSkipOrgMonInformation()); - cbSkiptStorExTablespace->setChecked(toConfigurationSingle::Instance().extractorSkipStorageExceptTablespaces()); - cbIncludeParallel->setChecked(toConfigurationSingle::Instance().extractorIncludeParallel()); - cbIncludePartition->setChecked(toConfigurationSingle::Instance().extractorIncludePartition()); - cbIncludeCode->setChecked(toConfigurationSingle::Instance().extractorIncludeCode()); - cbIncludeHeader->setChecked(toConfigurationSingle::Instance().extractorIncludeHeader()); - cbIncludePrompt->setChecked(toConfigurationSingle::Instance().extractorIncludePrompt()); - try - { - // Check if connection exists - toMainWidget()->currentConnection(); - CreatePlanTable->setEnabled(true); - } - catch (...) - { - TLOG(1,toDecorator,__HERE__) << " Ignored exception." << std::endl; - } -} - - -void toOracleSetting::saveSetting() -{ - toConfigurationSingle::Instance().setKeepPlans(KeepPlans->isChecked()); - toConfigurationSingle::Instance().setVsqlPlans(VsqlPlans->isChecked()); - toConfigurationSingle::Instance().setShar... [truncated message content] |