From: <ibr...@us...> - 2009-05-23 22:07:04
|
Revision: 3199 http://tora.svn.sourceforge.net/tora/?rev=3199&view=rev Author: ibre5041 Date: 2009-05-23 22:06:56 +0000 (Sat, 23 May 2009) Log Message: ----------- some thread debugging added Modified Paths: -------------- branches/tora-trotl/src/CMakeLists.txt branches/tora-trotl/src/toconnection.cpp branches/tora-trotl/src/tooracleconnection.cpp branches/tora-trotl/src/tothread.cpp branches/tora-trotl/src/tothread.h Added Paths: ----------- branches/tora-trotl/src/trotl_test2.cpp Modified: branches/tora-trotl/src/CMakeLists.txt =================================================================== --- branches/tora-trotl/src/CMakeLists.txt 2009-05-22 02:00:15 UTC (rev 3198) +++ branches/tora-trotl/src/CMakeLists.txt 2009-05-23 22:06:56 UTC (rev 3199) @@ -464,7 +464,7 @@ ${CMAKE_CURRENT_SOURCE_DIR}/loki/include ${CMAKE_CURRENT_SOURCE_DIR}/otl "/usr/local/trotl/include" -# "/home/ibrezina/workspace/boost_1_38_0" + "/home/ibrezina/workspace/boost_1_38_0" ) IF (POSTGRESQL_INCLUDE_DIR) @@ -761,10 +761,7 @@ ## END: MESS SECTION ## -ADD_LIBRARY(libtoracheck STATIC ${TORA_CHECK_STATIC_OBJS}) -ADD_EXECUTABLE(trotl_test1 trotl_test1.cpp ${TORA_I18N_QM} ) - -TARGET_LINK_LIBRARIES(trotl_test1 +SET(TEST_LIBRARIES -Wl,--whole-archive libtoracheck -Wl,--no-whole-archive ${QT_LIBRARIES} ${ORACLE_LIBRARIES} @@ -774,5 +771,12 @@ ${TORA_LOKI_LIB} -L/usr/local/trotl/lib -Wl,-rpath,/usr/local/trotl/lib -ltrotl ) - + +ADD_LIBRARY(libtoracheck STATIC ${TORA_CHECK_STATIC_OBJS}) +ADD_EXECUTABLE(trotl_test1 trotl_test1.cpp ${TORA_I18N_QM} ) +ADD_EXECUTABLE(trotl_test2 trotl_test2.cpp ${TORA_I18N_QM} ) +TARGET_LINK_LIBRARIES(trotl_test1 ${TEST_LIBRARIES}) +TARGET_LINK_LIBRARIES(trotl_test2 ${TEST_LIBRARIES}) + + # ADD_TEST(trotl_test1 trotl_test1 Hello) Modified: branches/tora-trotl/src/toconnection.cpp =================================================================== --- branches/tora-trotl/src/toconnection.cpp 2009-05-22 02:00:15 UTC (rev 3198) +++ branches/tora-trotl/src/toconnection.cpp 2009-05-23 22:06:56 UTC (rev 3199) @@ -655,7 +655,7 @@ toQValue toQuery::readValue(void) { - std::cout << "toQValue toQuery::readValue(void)" << this->sql().toUtf8().constData() << "'" << std::endl; + std::cout << "toQValue toQuery::readValue(void)" << this->sql().left(50).toUtf8().constData() << "'" << std::endl; if (!Connection) return toQValue(0); @@ -668,7 +668,8 @@ toQValue toQuery::readValueNull(void) { //TODO - std::cout << "toQuery::readValueNull(void): '" << this->sql().toUtf8().constData() << "'" << std::endl; + std::cout << "toQuery::readValueNull(void): '" << this->sql().left(50).toUtf8().constData() << "'" << std::endl; + if (!Connection) return toQValue(0); Modified: branches/tora-trotl/src/tooracleconnection.cpp =================================================================== --- branches/tora-trotl/src/tooracleconnection.cpp 2009-05-22 02:00:15 UTC (rev 3198) +++ branches/tora-trotl/src/tooracleconnection.cpp 2009-05-23 22:06:56 UTC (rev 3199) @@ -1,43 +1,44 @@ #include <iomanip> #include <iostream> #include <string> +#include <sstream> /* 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. - * + * these libraries. + * * You may link this product with any GPL'd Qt library. - * + * * All trademarks belong to their respective owners. * * END_COMMON_COPYRIGHT_HEADER */ @@ -131,7 +132,7 @@ " 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'", "List the objects to cache for a connection, should have same " "columns and binds"); @@ -195,34 +196,36 @@ class oracleSub : public toConnectionSub { public: - - ::trotl::OciConnection *Connection; - oracleSub(::trotl::OciConnection *conn) - { - Connection = conn; - } - + + ::trotl::OciConnection *_conn; + ::trotl::OciLogin *_login; + + oracleSub(::trotl::OciConnection *conn, ::trotl::OciLogin *login): + _conn(conn), _login(login) + {} + ~oracleSub() { try { - delete Connection; + delete _conn; + delete _login; } catch(...) { } - - Connection = 0; + _conn = 0; + _login = 0; } - + virtual void cancel(void) { - Connection->cancel(); + _conn->cancel(); } - + virtual void throwExtendedException(toConnection &conn, const ::trotl::OciException &exc) { std::cout << "virtual void throwExtendedException(toConnection &conn, const ::trotl::OciException &exc)" << std::endl; std::cout << "What:" << exc.what() << std::endl - << exc.get_sql() << std::endl + << exc.get_sql() << std::endl << "--------------------------------------------------------------------------------" << std::endl; if (conn.version() < "0800" && exc.get_code() == 0) { @@ -255,7 +258,7 @@ ThrowException(exc); } }; - + class oracleQuery : public toQuery::queryImpl { bool Cancel; @@ -275,27 +278,27 @@ { if (!Query) return; - + Query->close(); delete Query; } - + virtual void execute(void); virtual toQValue readValue(void) - { + { std::string val; (*Query) >> val; //std::cout << "TODO: readValue:" << val << std::endl << __HERE_SHORT__ << std::endl; - std::cout << '\'' << val << '\''; + std::cout << '\'' << val << '\''; return toQValue(val.c_str()); - + /* char *buffer = NULL; otl_var_desc *dsc = Query->describe_next_out_var(); if (!dsc) throw QString::fromLatin1("Couldn't get description of next column to read"); - + oracleSub *conn = dynamic_cast<oracleSub *>(query()->connectionSub()); if (!conn) throw QString::fromLatin1("Internal error, not oracle sub connection"); @@ -344,12 +347,12 @@ otl_long_string str(buffer, len); (*Query) >> str; Running = false; - + if (!str.len()) { free(buffer); return null; } - + QString buf; if (dsc->ftype == otl_var_varchar_long) { @@ -450,9 +453,9 @@ // Never get here return QString(); //qt4 ::null; } - + virtual void cancel(void); - + virtual bool eof(void) { if (!Query || Cancel) { @@ -460,12 +463,12 @@ return true; } try { - std::cout << "eof - yes/no" << __HERE_SHORT__ << std::endl; + std::cout << "eof - yes/no" << __HERE_SHORT__ << std::endl; return Query->eof(); } catch (const ::trotl::OciException &exc) { - std::cout << "eof - exception" << __HERE_SHORT__ << std::endl; + std::cout << "eof - exception" << __HERE_SHORT__ << std::endl; if(query()) { oracleSub *conn = dynamic_cast<oracleSub *>(query()->connectionSub()); @@ -475,7 +478,7 @@ return true; } } - + virtual int rowsProcessed(void) { std::cout << "TODO: rowsProcessed:" << std::endl @@ -487,7 +490,7 @@ std::cout << "TODO: rowsProcessed: " << i << std::endl << __HERE_SHORT__ << std::endl; return i; } - + virtual int columns(void) { //int descriptionLen; @@ -496,16 +499,15 @@ << __HERE_SHORT__ << std::endl; return Query->get_column_count(); } - + virtual std::list<toQuery::queryDescribe> describe(void) { std::cout << "virtual std::list<toQuery::queryDescribe> describe(void)" << std::endl; std::list<toQuery::queryDescribe> ret; - int descriptionLen; + //TODO int descriptionLen; int datatypearg1 = 0; int datatypearg2 = 0; - std::cout << "TODO describe:" << std::cout - << __HERE_SHORT__ << std::endl; + std::cout << "TODO describe:" << __HERE_SHORT__ << std::endl; //otl_column_desc *description = Query->describe_select(descriptionLen); // TODO trotl should return const iterator @@ -513,7 +515,7 @@ const std::vector<trotl::ColumnType> &col = Query->get_columns(); std::vector<trotl::ColumnType>::const_iterator it = col.begin(); ++it; // start with 1st //std::cout << "Columns: " << q1.get_column_count() << std::endl; - for(it; it != col.end(); ++it) + for(; it != col.end(); ++it) { std::cout << "Var: " << (*it).get_type_str(true) << std::endl; toQuery::queryDescribe desc; @@ -521,7 +523,7 @@ desc.Name = QString::fromUtf8( (*it)._column_name.c_str() ); desc.Datatype = QString::fromLatin1( (*it).get_type_str(true).c_str() ); - //datatypearg1 = description[i].char_size; + //datatypearg1 = description[i].char_size; desc.Datatype.sprintf(desc.Datatype.toUtf8().constData(), datatypearg1, datatypearg2); //desc.Null = description[i].nullok; @@ -729,6 +731,9 @@ cur.Comment = objects.readValueNull(); ret.insert(ret.end(), cur); } + std::cout + << "++++ objectNames +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" + << std::endl; return ret; } @@ -758,6 +763,9 @@ (*i).Synonyms.insert((*i).Synonyms.end(), synonym); } } + std::cout + << "++++ synonymMap ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" + << std::endl; return ret; } @@ -877,7 +885,7 @@ oracleSub *conn = oracleConv(sub); try { - conn->Connection->commit(); + conn->_conn->commit(); } catch (const ::trotl::OciException &exc) { @@ -889,7 +897,7 @@ oracleSub *conn = oracleConv(sub); try { - conn->Connection->rollback(); + conn->_conn->rollback(); } catch (const ::trotl::OciException &exc) { @@ -898,7 +906,7 @@ } virtual toConnectionSub *createConnection(void); - + void closeConnection(toConnectionSub *conn) { delete conn; @@ -906,36 +914,23 @@ virtual QString version(toConnectionSub *sub) { - std::cout << __HERE_SHORT__ << std::endl; oracleSub *connp = oracleConv(sub); try { - // Todo - there better ways to do this - ::trotl::OciConnection &conn( *(connp->Connection) ); - ::trotl::SqlStatement version( conn, - "SELECT version FROM product_component_version " - " where product like 'Oracle%'" - ); - if (!version.eof()) - { - std::string s; - //char buffer[1024]; - version >> s; - QStringList vl = QString(s.c_str()).split('.'); - QString ve; - QString verrj; - for ( QStringList::iterator vi = vl.begin(); vi != vl.end(); ++vi ) - { - ve = *vi; - verrj += ve.rightJustified(2, '0'); - } - return verrj; - } + ::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(version.str().c_str()); } catch (::trotl::OciException e) { std::cerr << __HERE_SHORT__ << std::endl << e.what(); exit(0); - } + } catch (...) { // Ignore any errors here @@ -974,7 +969,7 @@ oracleSub *conn = oracleConv(sub); try { - ::trotl::SqlStatement s1(*conn->Connection, sql.toUtf8().constData()); + ::trotl::SqlStatement s1(*conn->_conn, sql.toUtf8().constData()); //conn->Connection->reset_throw_count(); //conn->Connection->syntax_check(sql.toUtf8().constData()); @@ -1008,7 +1003,7 @@ { return new oracleConnection(conn, *_envp); } - + virtual std::list<QString> providedOptions(const QString &) { std::list<QString> ret; @@ -1018,7 +1013,7 @@ ret.insert(ret.end(), "SYS_DBA"); return ret; } - + virtual std::list<QString> providedHosts(const QString &) { std::list<QString> ret; @@ -1026,7 +1021,7 @@ ret.insert(ret.end(), QString::fromLatin1("SQL*Net")); return ret; } - + virtual std::list<QString> providedDatabases(const QString &, const QString &host, const QString &, @@ -1034,7 +1029,7 @@ { QString str; #ifdef Q_OS_WIN32 - + CRegistry registry; DWORD siz = 1024; char buffer[1024]; @@ -1089,17 +1084,17 @@ str = getenv("ORACLE_HOME"); str.append(QString::fromLatin1("/network/admin")); } - + str.append(QString::fromLatin1("/tnsnames.ora")); - + std::list<QString> ret; - + str = QString("/home/ibrezina/.tnsnames.ora"); -#endif +#endif QFile file(str); if (!file.open(QIODevice::ReadOnly)) return ret; - + QTextStream in(&file); QByteArray barray = in.readAll().toUtf8(); const char *buf = barray.constData(); @@ -1150,7 +1145,7 @@ } return ret; } - + virtual QWidget *providerConfigurationTab(const QString &provider, QWidget *parent); }; @@ -1172,13 +1167,13 @@ throw QString::fromLatin1("Query aborted before started"); Running = true; - QRegExp stripnl("\r"); + QRegExp stripnl("\r"); QString sql = query()->sql(); sql.replace(stripnl, ""); std::cout << "SQL:" << sql.toUtf8().constData() << std::endl; - - Query = new ::trotl::SqlStatement(*conn->Connection, sql.toUtf8().constData()); + + Query = new ::trotl::SqlStatement(*conn->_conn, sql.toUtf8().constData()); // TODO autocommit ?? // Query->set_commit(0); //if (toQValue::numberFormat() == 0) @@ -1252,14 +1247,14 @@ } */ } - + Running = false; } catch (const ::trotl::OciException &exc) { delete Query; Query = NULL; - + Running = false; conn->throwExtendedException(query()->connection(), exc); } @@ -1274,7 +1269,7 @@ if (!conn) throw QString::fromLatin1("Internal error, not oracle sub connection"); - conn->Connection->cancel(); + conn->_conn->cancel(); Cancel = true; } @@ -1295,6 +1290,8 @@ toConnectionSub* toOracleProvider::oracleConnection::createConnection(void) { + ::trotl::OciConnection *conn = NULL; + ::trotl::OciLogin *login = NULL; QString oldSid; std::set<QString> options = connection().options(); @@ -1305,7 +1302,6 @@ oldSid = getenv("ORACLE_SID"); toSetEnv("ORACLE_SID", connection().database()); } - ::trotl::OciConnection *conn = NULL; try { int session_mode = OCI_DEFAULT; @@ -1332,28 +1328,27 @@ { //std::cout << "TODO: _login destructor??" << std::endl << __HERE_SHORT__ << std::endl; // TODO what does _login destructor? - - ::trotl::OciLogin *_login - = new ::trotl::OciLogin(_env, + + /*::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); + conn = new ::trotl::OciConnection(_env, *login); ::std::cout << "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::endl; - + << 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::endl; + //::trotl::SqlStatement q(*conn, "select sysdate from dual" ); //::std::cout << q.get_last_sql() << ::std::endl; //::std::string d; @@ -1436,7 +1431,7 @@ toSetEnv("ORACLE_SID", oldSid.toLatin1()); } } - + try { QString str = QString::fromLatin1("ALTER SESSION SET NLS_DATE_FORMAT = '"); @@ -1450,7 +1445,7 @@ toStatusMessage(QObject::tr("Failed to set new default date format for session: %1") .arg(toConfigurationSingle::Instance().dateFormat())); } - + try { ::trotl::SqlStatement info(*conn, @@ -1465,8 +1460,8 @@ { printf("Failed to set client info for session\n"); } - - return new oracleSub(conn); + + return new oracleSub(conn, login); } /* @@ -1524,7 +1519,7 @@ ExplainPlan->setText(toConfigurationSingle::Instance().planTable()); OpenCursors->setValue(toConfigurationSingle::Instance().openCursors()); KeepPlans->setChecked(toConfigurationSingle::Instance().keepPlans()); - VsqlPlans->setChecked(toConfigurationSingle::Instance().vsqlPlans()); + VsqlPlans->setChecked(toConfigurationSingle::Instance().vsqlPlans()); int len = toConfigurationSingle::Instance().maxLong(); if (len >= 0) { @@ -1546,7 +1541,7 @@ void toOracleSetting::saveSetting() { toConfigurationSingle::Instance().setKeepPlans(KeepPlans->isChecked()); - toConfigurationSingle::Instance().setVsqlPlans(VsqlPlans->isChecked()); + toConfigurationSingle::Instance().setVsqlPlans(VsqlPlans->isChecked()); toConfigurationSingle::Instance().setDateFormat(DefaultDate->text()); // try to change NLS for already running sessions Modified: branches/tora-trotl/src/tothread.cpp =================================================================== --- branches/tora-trotl/src/tothread.cpp 2009-05-22 02:00:15 UTC (rev 3198) +++ branches/tora-trotl/src/tothread.cpp 2009-05-23 22:06:56 UTC (rev 3199) @@ -1,3 +1,7 @@ +#include <iomanip> +#include <iostream> +#include <string> +#include <sstream> /* BEGIN_COMMON_COPYRIGHT_HEADER * @@ -79,6 +83,8 @@ return val; } +QThreadStorage<toThreadInfo*> toThread::toThreadInfoStorage; +volatile unsigned toThread::lastThreadNumber = 0; std::list<toThread *> *toThread::Threads; toLock *toThread::Lock; QThread *toThread::MainThread = NULL; @@ -141,6 +147,7 @@ { toThread::Lock->lock () ; + toThread::toThreadInfoStorage.setLocalData(new toThreadInfo(++toThread::lastThreadNumber)); StartSemaphore.up(); toThread::mainThread(); toThread::Lock->unlock(); @@ -179,3 +186,8 @@ } toThread::Lock->unlock(); } + +toThreadInfo::~toThreadInfo() +{ + std::cout << "Thread no: " << threadNumber << " exited." << std::endl; +} Modified: branches/tora-trotl/src/tothread.h =================================================================== --- branches/tora-trotl/src/tothread.h 2009-05-22 02:00:15 UTC (rev 3198) +++ branches/tora-trotl/src/tothread.h 2009-05-23 22:06:56 UTC (rev 3199) @@ -47,6 +47,7 @@ #include <QMutex> #include <QWaitCondition> #include <QThread> +#include <QThreadStorage> /** This is an abstract class that defines something that is to be performed by a * thread. @@ -129,13 +130,16 @@ void *toThreadStartWrapper(void*); class taskRunner; +class toThreadInfo; class toThread { private: /** Not part of the API. */ - + static QThreadStorage<toThreadInfo*> toThreadInfoStorage; + volatile static unsigned lastThreadNumber; + taskRunner *Thread; static std::list<toThread *> *Threads; static toLock *Lock; @@ -159,8 +163,31 @@ static void setMainThread(QThread *main); friend class taskRunner; + friend class toThreadInfo; }; +/** This class is used for debugging purposes only + * Holds thread specific data + */ +class toThreadInfo +{ + public: + unsigned threadNumber; + QString threadTask; + toThreadInfo(unsigned number) :threadNumber(number), threadTask("") {}; + static unsigned getThreadNumber() + { + if(toThread::toThreadInfoStorage.hasLocalData()) + { + toThreadInfo *i = toThread::toThreadInfoStorage.localData(); + return i->threadNumber; + } else { + throw QString("This thread has no in information associated"); + } + } + virtual ~toThreadInfo(); +}; + /** This is a convenience class that holds a lock for the duration of the scope * of the object. It is very convenient to use if exceptions can be thrown, simply * declare an auto @ref toLocker to hold the lock. If any exception is thrown the Added: branches/tora-trotl/src/trotl_test2.cpp =================================================================== --- branches/tora-trotl/src/trotl_test2.cpp (rev 0) +++ branches/tora-trotl/src/trotl_test2.cpp 2009-05-23 22:06:56 UTC (rev 3199) @@ -0,0 +1,44 @@ +#include <unistd.h> +#include <qapplication.h> +#include <iostream> +#include "toconnectionpool.h" + +bool toMonolithic(void) +{ +#ifdef TOMONOLITHIC + return true; +#else + + return false; +#endif +} + +int main(int argc, char **argv) +{ + QString provider("Oracle"), + username("ivan"), + password("acror"), + host("localhost"), + database("DEVEL"), + schema(""); + std::set<QString> options; + + QApplication app(argc, argv); + toConnectionProvider::initializeAll(); +// toConnectionProvider &oracleProvider(toConnectionProvider::fetchProvider(QString("Oracle"))); + + toConnection *oraCon = new toConnection( + provider, + username, + password, + host, + database, + schema, + options); + std::cout << "Version: " << oraCon->version().toUtf8().constData() << std::endl; + sleep(600); + std::cout << ".." << std::endl; + sleep(5); +} + + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |