From: <ibr...@us...> - 2013-12-18 20:38:01
|
Revision: 4993 http://sourceforge.net/p/tora/code/4993 Author: ibre5041 Date: 2013-12-18 20:37:58 +0000 (Wed, 18 Dec 2013) Log Message: ----------- various schema switching fixes III Modified Paths: -------------- trunk/tora/src/core/toconnection.cpp trunk/tora/src/core/toconnection.h trunk/tora/src/core/toconnectionsub.h trunk/tora/src/core/toconnectionsubloan.cpp trunk/tora/src/core/toconnectionsubloan.h trunk/tora/src/tools/toworksheet.cpp trunk/tora/src/tools/toworksheet.h Modified: trunk/tora/src/core/toconnection.cpp =================================================================== --- trunk/tora/src/core/toconnection.cpp 2013-12-18 20:34:38 UTC (rev 4992) +++ trunk/tora/src/core/toconnection.cpp 2013-12-18 20:37:58 UTC (rev 4993) @@ -158,19 +158,6 @@ { Utils::toBusy busy; toConnectionSub *sub = pConnectionImpl->createConnection(); - //QMutexLocker lock(ConnectionLock); already locked by caller - - toQueryParams params; - foreach (QString const & sql, InitStrings) - { - try - { - //toQuery q(sub, sql, toQueryParams()); - //q.eof(); - } - TOCATCH - } - return sub; } @@ -372,7 +359,7 @@ } else if ( Connections.contains(conn)) { } else { - Q_ASSERT_X(false, qPrintable(__QHERE__), "Unvalid QAction poiting onto unknown toConnectionSub"); + Q_ASSERT_X(false, qPrintable(__QHERE__), "Invalid QAction pointing onto unknown toConnectionSub"); } } @@ -407,33 +394,7 @@ /** Set connection's current schema. */ void toConnection::setDefaultSchema(QString const & schema) { - if(this->Schema == schema) - return; - -#define CHANGE_CURRENT_SCHEMA QString("ALTER SESSION SET CURRENT_SCHEMA = \"%1\"") -#define CHANGE_CURRENT_SCHEMA_PG QString("SET search_path TO %1,\"$user\",public") -#define CHANGE_CURRENT_SCHEMA_TD QString("DATABASE \"%1\"") -#define CHANGE_CURRENT_SCHEMA_MY QString("USE `%1`") - Schema = schema; - - if(Schema.isEmpty()) - { - delInit("SCHEMA"); - return; - } - - if (providerIs("Oracle")) - setInit("SCHEMA", CHANGE_CURRENT_SCHEMA.arg(schema)); - else if (providerIs("QMYSQL")) - setInit("SCHEMA", CHANGE_CURRENT_SCHEMA_MY.arg(schema)); - else if (providerIs("QPSQL")) - setInit("SCHEMA", CHANGE_CURRENT_SCHEMA_PG.arg(schema)); - else if (providerIs("Teradata")) - setInit("SCHEMA", CHANGE_CURRENT_SCHEMA_TD.arg(schema)); - else - throw QString("No support for changing schema for this database"); - - allExecute(InitStrings.value("SCHEMA")); + Schema = schema; } void toConnection::setInit(const QString &key, const QString &sql) @@ -511,11 +472,6 @@ Q_ASSERT_X((int)LoanCnt == LentConnections.size(), qPrintable(__QHERE__), "Invalid number of lent toConnectionSub(s)"); } -void toConnection::allExecute(toSQL const& sql) -{ - throw exception("Not implemented yet: void toConnection::allExecute(QString const& sql)"); -} - void toConnection::allExecute(QString const& sql) { try Modified: trunk/tora/src/core/toconnection.h =================================================================== --- trunk/tora/src/core/toconnection.h 2013-12-18 20:34:38 UTC (rev 4992) +++ trunk/tora/src/core/toconnection.h 2013-12-18 20:37:58 UTC (rev 4993) @@ -228,7 +228,6 @@ * @param params Parameters to pass to query. */ void allExecute(QString const& sql); - void allExecute(toSQL const& sql); /** Commit connection implementation */ void commit(toConnectionSub *sub); Modified: trunk/tora/src/core/toconnectionsub.h =================================================================== --- trunk/tora/src/core/toconnectionsub.h 2013-12-18 20:34:38 UTC (rev 4992) +++ trunk/tora/src/core/toconnectionsub.h 2013-12-18 20:37:58 UTC (rev 4993) @@ -20,7 +20,7 @@ public: /** Create connection to database. */ - toConnectionSub() : Query(NULL), Broken(false) {} + toConnectionSub() : Query(NULL), Broken(false), Initialized(false) {} /** Close connection. */ virtual ~toConnectionSub() {} @@ -81,13 +81,28 @@ return Broken; } + inline bool isInitialized() + { + return Initialized; + } + + inline void setInitialized(bool initialized) + { + Initialized = initialized; + } + inline QString const& schema() const { return Schema; } + inline void setSchema(QString const& schema) + { + Schema = schema; + } + protected: - bool Broken; + bool Broken, Initialized; toQuery *Query; QString Schema; QDateTime LastUsed; // last time this db connection was actually used Modified: trunk/tora/src/core/toconnectionsubloan.cpp =================================================================== --- trunk/tora/src/core/toconnectionsubloan.cpp 2013-12-18 20:34:38 UTC (rev 4992) +++ trunk/tora/src/core/toconnectionsubloan.cpp 2013-12-18 20:37:58 UTC (rev 4993) @@ -36,28 +36,27 @@ #include "core/toconnectionsub.h" #include "core/toconnection.h" -toConnectionSubLoan::toConnectionSubLoan(toConnection &con, InitModeEnum i) +toConnectionSubLoan::toConnectionSubLoan(toConnection &con) : ParentConnection(con) , ConnectionSub(con.borrowSub()) - , InitMode(i) - , Initialized(false) + , SchemaInitialized(false) {} toConnectionSubLoan::toConnectionSubLoan(toConnection &con, QString const & schema) : ParentConnection(con) , ConnectionSub(con.borrowSub()) - , InitMode(INIT_SESSION) - , Initialized(false) + , SchemaInitialized(false) + , Schema(schema) { - Initialized = ConnectionSub->schema() == schema && !ConnectionSub->schema().isEmpty(); + Q_ASSERT_X(!schema.isEmpty(), qPrintable(__QHERE__), "schema is empty"); + SchemaInitialized = ConnectionSub->schema() == schema; } /** This special kind of constructor is used by @ref toQuery while testing the connections*/ toConnectionSubLoan::toConnectionSubLoan(toConnection &con, int*) : ParentConnection(con) , ConnectionSub(NULL) - , InitMode(NO_INIT_SESSION) - , Initialized(false) + , SchemaInitialized(false) {} toConnectionSubLoan::~toConnectionSubLoan() Modified: trunk/tora/src/core/toconnectionsubloan.h =================================================================== --- trunk/tora/src/core/toconnectionsubloan.h 2013-12-18 20:34:38 UTC (rev 4992) +++ trunk/tora/src/core/toconnectionsubloan.h 2013-12-18 20:37:58 UTC (rev 4993) @@ -13,17 +13,8 @@ friend class toQuery; public: - /* If set to INIT_SESSION - * - */ - enum InitModeEnum - { - NO_INIT_SESSION = 0, - INIT_SESSION = 1 - }; + toConnectionSubLoan(toConnection &con); - toConnectionSubLoan(toConnection &con, InitModeEnum = NO_INIT_SESSION); - toConnectionSubLoan(toConnection &con, QString const& schema); /** This special kind of constructor is used by @ref toQuery while testing the connections*/ @@ -56,8 +47,9 @@ } toConnection const& ParentConnection; - InitModeEnum InitMode; - bool Initialized; + //InitModeEnum InitMode; + bool SchemaInitialized; + QString Schema; private: inline void check() const { Modified: trunk/tora/src/tools/toworksheet.cpp =================================================================== --- trunk/tora/src/tools/toworksheet.cpp 2013-12-18 20:34:38 UTC (rev 4992) +++ trunk/tora/src/tools/toworksheet.cpp 2013-12-18 20:37:58 UTC (rev 4993) @@ -392,6 +392,9 @@ Schema = new toResultSchema(workToolbar); workToolbar->addWidget(Schema); + connect(Schema, SIGNAL(currentIndexChanged(const QString &)), + this, SLOT(slotSchemaChanged(const QString &))); + Schema->refresh(); new toChangeConnection(workToolbar); @@ -795,6 +798,15 @@ return false; } +void toWorksheet::slotSchemaChanged(const QString &) +{ + if (LockedConnection) + { + (*LockedConnection).SchemaInitialized = false; + (*LockedConnection).Schema = currentSchema(); + } +} + void toWorksheet::closeEvent(QCloseEvent *event) { QSettings s; @@ -940,6 +952,11 @@ return false; } +QString toWorksheet::currentSchema() const +{ + return Schema->currentText(); +} + static toSQL SQLCheckMySQLRoutine("toWorksheet:CheckRoutine", "select count(1)\n" "from information_schema.routines\n" @@ -1121,7 +1138,7 @@ QString buffer; if (!toConfigurationSingle::Instance().wsHistory()) { - toConnectionSubLoan conn(connection()); + toConnectionSubLoan conn(connection(), currentSchema()); toQuery query(conn, statement.sql, toQueryParams()); if (query.rowsProcessed() > 0) buffer = tr("%1 rows processed").arg((int)query.rowsProcessed()); @@ -1498,6 +1515,17 @@ timer()->stop(); stopAct->setDisabled(true); + // Possibly the toConnectionSub.Schema got changed after ~toQuery + // could be possible if something like: + // BEGIN + // EXECUTE IMMEDIATE 'ALTER SESSION SET CURRENT_SCHEMA=ABC'; + // END; + // was executed + if (LockedConnection && !(*LockedConnection)->schema().isEmpty() && (*LockedConnection)->schema() != currentSchema()) + { + Schema->setSelected((*LockedConnection)->schema()); + Schema->refresh(); + } // TODO: LockedConnection.isNull is mandatory here. For some unknown reason slotQueryDone can be called twice for the same query if (!lockConnectionActClicked && LockedConnection) { @@ -2099,15 +2127,15 @@ try { - QSharedPointer<toConnectionSubLoan> conn(new toConnectionSubLoan(connection(), toConnectionSubLoan::INIT_SESSION)); + QSharedPointer<toConnectionSubLoan> conn(new toConnectionSubLoan(connection(), currentSchema())); this->LockedConnection = conn; - Utils::toBusy busy; - toQuery schema(*LockedConnection, toSQL::string("Global:CurrentSchema", connection()), toQueryParams()); - QString value = schema.readValue(); - Schema->setSelected(value); + //Utils::toBusy busy; + //toQuery schema(*LockedConnection, toSQL::string("Global:CurrentSchema", connection()), toQueryParams()); + //QString value = schema.readValue(); + //Schema->setSelected(value); //Schema->refresh(); - connection().setDefaultSchema(value); + //connection().setDefaultSchema(value); bool oldVal = lockConnectionAct->blockSignals(true); lockConnectionAct->setChecked(true); Modified: trunk/tora/src/tools/toworksheet.h =================================================================== --- trunk/tora/src/tools/toworksheet.h 2013-12-18 20:34:38 UTC (rev 4992) +++ trunk/tora/src/tools/toworksheet.h 2013-12-18 20:37:58 UTC (rev 4993) @@ -121,6 +121,7 @@ public slots: bool slotClose(); + void slotSchemaChanged(const QString &); void slotConnectionChanged(void); void slotRefresh(); void slotExecute(); @@ -177,6 +178,8 @@ bool describe(toSyntaxAnalyzer::statement const&); + QString currentSchema() const; + toSyntaxAnalyzer::statement currentStatement() const; QString duration(int, bool hundreds = true); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |