toConnectionSub *toQSqlConnectionImpl::createConnection(void) { static QAtomicInt ID_COUNTER(0); int ID = ID_COUNTER.fetchAndAddAcquire(1); QString dbName = QString::number(ID); QSqlDatabase db = QSqlDatabase::addDatabase("QODBC", dbName); db.setDatabaseName(parentConnection().database()); db.open(parentConnection().user(), parentConnection().password()); if (!db.isOpen()) { QString t = toQSqlConnectionSub::ErrorString(db.lastError()); QSqlDatabase::removeDatabase(dbName); throw t; } toQSqlConnectionSub *ret = new toQSqlConnectionSub(parentConnection(), db, dbName); return ret; }
toToolWidget::toToolWidget(toTool &tool, const QString &ctx, QWidget *parent, toConnection &conn, const char *name) : QWidget(parent), toHelpContext(ctx), toConnectionWidget(conn, this), Tool(tool), Action(NULL) { if (name) { setObjectName(name); setCaption(name); } // make sure widget gets deleted setAttribute(Qt::WA_DeleteOnClose); // have to set the basic layout for widgets. It's requested later QVBoxLayout *vbox = new QVBoxLayout(this); vbox->setSpacing(0); vbox->setContentsMargins(0, 0, 0, 0); setLayout(vbox); Timer = NULL; connect(&toWorkSpaceSingle::Instance(), SIGNAL(activeToolChaged(toToolWidget*)), this, SLOT(slotWindowActivated(toToolWidget*))); connect(&toWorkSpaceSingle::Instance(), SIGNAL(activeToolChaged(toToolWidget*)), this, SLOT(toolActivated(toToolWidget*))); if (parent) { // Voodoo for making connection changing cascade to sub tools. try { toToolWidget *tool = toToolWidget::currentTool(parent); 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; } } }
toConnectionSub *toQPSqlConnectionImpl::createConnection(void) { // TODO shouldn't be this method reenteant? static QAtomicInt ID_COUNTER(0); int ID = ID_COUNTER.fetchAndAddAcquire(1); QString dbName = QString::number(ID); QSqlDatabase db = QSqlDatabase::addDatabase(parentConnection().provider(), dbName); db.setDatabaseName(parentConnection().database()); QString host = parentConnection().host(); int pos = host.indexOf(QString(":")); if (pos < 0) db.setHostName(host); else { db.setHostName(host.mid(0, pos)); db.setPort(host.mid(pos + 1).toInt()); } QString opt; QSet<QString> options = parentConnection().options(); if (options.find("Compress") != options.end()) opt += ";CLIENT_COMPRESS"; if (options.find("Ignore Space") != options.end()) opt += ";CLIENT_IGNORE_SPACE"; if (options.find("No Schema") != options.end()) opt += ";CLIENT_NO_SCHEMA"; if (options.find("SSL") != options.end()) opt += ";CLIENT_SSL"; if (!opt.isEmpty()) db.setConnectOptions(opt.mid(1)); // Strip first ; character db.open(parentConnection().user(), parentConnection().password()); if (!db.isOpen()) { QString t = toQPSqlConnectionSub::ErrorString(db.lastError()); QSqlDatabase::removeDatabase(dbName); throw t; } toQPSqlConnectionSub *ret = new toQPSqlConnectionSub(parentConnection(), db, dbName); return ret; }
toConnectionSub* toOracleConnectionImpl::createConnection(void) { ::trotl::OciConnection *conn = NULL; ::trotl::OciLogin *login = NULL; QString oldSid; QSet<QString> options = parentConnection().options(); bool sqlNet = (options.find("SQL*Net") != options.end()); if (!sqlNet) { oldSid = qgetenv("ORACLE_SID"); qputenv("ORACLE_SID", parentConnection().database().toLatin1()); } 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; #ifdef OCI_SYSASM else if (options.find("SYS_ASM") != options.end()) session_mode = OCI_SYSASM; #endif do { /* TODO if (!sqlNet) conn->server_attach(); else */ QString user = parentConnection().user(); QString pass = parentConnection().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(), parentConnection().database().toUtf8().constData() ), (ub4) session_mode); conn = new ::trotl::OciConnection(_env, *login); TLOG(5, toDecorator, __HERE__) << "Oracle database version: " << ::std::hex << ::std::showbase << ::std::setw(10) << ::std::setfill('0') << ::std::internal << login->_server._version << ::std::endl << login->_server._version_string << ::std::endl << login->_server.versionNumber() << "." << login->_server.releaseNumber() << "." << login->_server.updateNumber() << "." << login->_server.portReleaseNumber() << "." << login->_server.portUpdateNumber() << ::std::dec << ::std::endl; } catch (const ::trotl::OciException &exc) { TLOG(5, toDecorator, __HERE__) << "TODO: catch" << std::endl << __HERE__ << std::endl; if (/*toThread::mainThread() &&*/ exc.get_code() == 28001) { bool ok = false; QString newpass = QInputDialog::getText( Utils::toQMainWindow(), qApp->translate("toOracleConnection", "Password expired"), qApp->translate("toOracleConnection", "Enter new password"), QLineEdit::Password, QString::null, &ok); if (!ok) throw exc; QString newpass2 = QInputDialog::getText( Utils::toQMainWindow(), 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(), parentConnection().database().toUtf8().constData() ), (ub4) session_mode); conn = new ::trotl::OciConnection(_env, *login); parentConnection().setPassword(newpass); } else { throw exc; } // (toThread::mainThread() && exc.get_code() == 28001) } // catch (const ::trotl::OciException &exc) } while (!conn); } catch (const ::trotl::OciException &exc) { if (!sqlNet) { if (oldSid.isNull()) qputenv("ORACLE_SID", ""); else qputenv("ORACLE_SID", oldSid.toLatin1()); } delete conn; ReThrowException(exc); } if (!sqlNet) { if (oldSid.isNull()) qputenv("ORACLE_SID", ""); else { qputenv("ORACLE_SID", oldSid.toLatin1()); } } try { QString alterSessionSQL = QString::fromLatin1("ALTER SESSION SET NLS_DATE_FORMAT = '"); alterSessionSQL += toConfigurationNewSingle::Instance().option(ToConfiguration::Oracle::ConfDateFormat).toString(); alterSessionSQL += QString::fromLatin1("'"); oracleQuery::trotlQuery date(*conn, qPrintable(alterSessionSQL)); } catch (...) { TLOG(5, toDecorator, __HERE__) << "Failed to set new default date format for session: " << toConfigurationNewSingle::Instance().option(ToConfiguration::Oracle::ConfDateFormat).toString() << std::endl; Utils::toStatusMessage(QObject::tr("Failed to set new default date format for session: %1") .arg(toConfigurationNewSingle::Instance().option(ToConfiguration::Oracle::ConfDateFormat).toString())); } try { QString alterSessionSQL = QString::fromLatin1("ALTER SESSION SET NLS_TIMESTAMP_FORMAT = '"); alterSessionSQL += toConfigurationNewSingle::Instance().option(ToConfiguration::Oracle::ConfTimestampFormat).toString(); alterSessionSQL += QString::fromLatin1("'"); oracleQuery::trotlQuery timestmp(*conn, qPrintable(alterSessionSQL)); } catch (::trotl::OciException const& e) { TLOG(5, toDecorator, __HERE__) << "Failed to set new default timestmp format for session: " << toConfigurationNewSingle::Instance().option(ToConfiguration::Oracle::ConfTimestampFormat).toString() << std::endl << e.what(); Utils::toStatusMessage(QObject::tr("Failed to set new default timestamp format for session: %1") .arg(toConfigurationNewSingle::Instance().option(ToConfiguration::Oracle::ConfTimestampFormat).toString())); } catch (...) { TLOG(5, toDecorator, __HERE__) << "Failed to set new default timestmp format for session: " << toConfigurationNewSingle::Instance().option(ToConfiguration::Oracle::ConfTimestampFormat).toString() << std::endl; Utils::toStatusMessage(QObject::tr("Failed to set new default timestamp format for session: %1") .arg(toConfigurationNewSingle::Instance().option(ToConfiguration::Oracle::ConfTimestampFormat).toString())); } try { oracleQuery::trotlQuery info(*conn, "BEGIN\n" " SYS.DBMS_APPLICATION_INFO.SET_CLIENT_INFO('" TOAPPNAME " " TORAVERSION " (http://tora.sf.net)" "');\n" " SYS.DBMS_APPLICATION_INFO.SET_MODULE('" TOAPPNAME "','Access Database');\n" "END;"); } catch (::trotl::OciException const& e) { TLOG(5, toDecorator, __HERE__) << "Failed to set client info for session:\n" << e.what(); } catch (...) { TLOG(5, toDecorator, __HERE__) << "Failed to set client info for session\n"; } return new toOracleConnectionSub(conn, login); }