From: <mrj...@us...> - 2008-07-21 16:40:34
|
Revision: 2903 http://tora.svn.sourceforge.net/tora/?rev=2903&view=rev Author: mrjohnson0 Date: 2008-07-21 16:40:42 +0000 (Mon, 21 Jul 2008) Log Message: ----------- since this is no longer protected by a lock, cannot share QRegExp instance. If you're as unlucky as I frequently am, it'll corrupt the sql string and crash. Modified Paths: -------------- trunk/tora/src/tooracleconnection.cpp Modified: trunk/tora/src/tooracleconnection.cpp =================================================================== --- trunk/tora/src/tooracleconnection.cpp 2008-07-21 13:04:08 UTC (rev 2902) +++ trunk/tora/src/tooracleconnection.cpp 2008-07-21 16:40:42 UTC (rev 2903) @@ -1073,7 +1073,7 @@ throw QString::fromLatin1("Query aborted before started"); Running = true; - static QRegExp stripnl("\r"); + QRegExp stripnl("\r"); Query = new otl_stream; Query->set_commit(0); if (toQValue::numberFormat() == 0) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mrj...@us...> - 2008-08-03 23:34:35
|
Revision: 2927 http://tora.svn.sourceforge.net/tora/?rev=2927&view=rev Author: mrjohnson0 Date: 2008-08-03 23:34:45 +0000 (Sun, 03 Aug 2008) Log Message: ----------- make sure malloc calls are followed by free Modified Paths: -------------- trunk/tora/src/tooracleconnection.cpp Modified: trunk/tora/src/tooracleconnection.cpp =================================================================== --- trunk/tora/src/tooracleconnection.cpp 2008-08-03 21:08:20 UTC (rev 2926) +++ trunk/tora/src/tooracleconnection.cpp 2008-08-03 23:34:45 UTC (rev 2927) @@ -310,8 +310,12 @@ otl_long_string str(buffer, len); (*Query) >> str; Running = false; - if (!str.len()) + + if (!str.len()) { + free(buffer); return null; + } + QString buf; if (dsc->ftype == otl_var_varchar_long) { @@ -322,7 +326,7 @@ else { QByteArray ret(buffer, str.len()); -// Qt4 does not contain assign ret.assign(buffer, str.len()); + free(buffer); return toQValue::createBinary(ret); } } @@ -355,10 +359,8 @@ lob >> sink; } while (!lob.eof() && sink.len() > 0); - if (toThread::mainThread()) - toStatusMessage(QString::fromLatin1("Data exists past length of LOB")); - else - printf("Data exists past length of LOB in thread\n"); + + toStatusMessage(QString::fromLatin1("Data exists past length of LOB")); } buffer[data.len()] = 0; Running = false; @@ -372,7 +374,7 @@ else { QByteArray ret(buffer, data.len()); -// qt4 does not contain assing ret.assign(buffer, data.len()); + free(buffer); return toQValue::createBinary(ret); } } @@ -385,14 +387,13 @@ buffer = new char[std::max(dsc->elem_size * 5 + 1, 100)]; buffer[0] = 0; (*Query) >> buffer; + QString buf = QString::fromUtf8(buffer); + delete[] buffer; + Running = false; + if (Query->is_null()) - { - delete[] buffer; return null; - } - QString buf(QString::fromUtf8(buffer)); - delete[] buffer; return buf; } break; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <su...@us...> - 2008-09-18 09:27:52
|
Revision: 3022 http://tora.svn.sourceforge.net/tora/?rev=3022&view=rev Author: subik Date: 2008-09-18 09:28:02 +0000 (Thu, 18 Sep 2008) Log Message: ----------- improved NLS_DATE_FORMAT settings in prefs - it doesn't require restart now (hopefully bugfree, Mike?) Modified Paths: -------------- trunk/tora/src/tooracleconnection.cpp Modified: trunk/tora/src/tooracleconnection.cpp =================================================================== --- trunk/tora/src/tooracleconnection.cpp 2008-09-17 15:59:14 UTC (rev 3021) +++ trunk/tora/src/tooracleconnection.cpp 2008-09-18 09:28:02 UTC (rev 3022) @@ -1298,6 +1298,8 @@ 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 @@ -1396,6 +1398,15 @@ { toConfigurationSingle::Instance().setKeepPlans(KeepPlans->isChecked()); toConfigurationSingle::Instance().setDateFormat(DefaultDate->text()); + + // try to change NLS for already running sessions + QString str("ALTER SESSION SET NLS_DATE_FORMAT = '%1'"); + foreach (QString c, toMainWidget()->connections()) + { + toQuery synonyms(toMainWidget()->connection(c), + str.arg(toConfigurationSingle::Instance().dateFormat())); + } + toConfigurationSingle::Instance().setPlanCheckpoint(CheckPoint->text()); toConfigurationSingle::Instance().setPlanTable(ExplainPlan->text()); toConfigurationSingle::Instance().setOpenCursors(OpenCursors->value()); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mrj...@us...> - 2008-09-18 14:23:14
|
Revision: 3023 http://tora.svn.sourceforge.net/tora/?rev=3023&view=rev Author: mrjohnson0 Date: 2008-09-18 14:23:25 +0000 (Thu, 18 Sep 2008) Log Message: ----------- here's how to run a sql statement for all connections. since there's a connection pool, it's best to use the allExecute() method. that'll pass it off to the connection pool which'll run it in it's own thread. Modified Paths: -------------- trunk/tora/src/tooracleconnection.cpp Modified: trunk/tora/src/tooracleconnection.cpp =================================================================== --- trunk/tora/src/tooracleconnection.cpp 2008-09-18 09:28:02 UTC (rev 3022) +++ trunk/tora/src/tooracleconnection.cpp 2008-09-18 14:23:25 UTC (rev 3023) @@ -1403,8 +1403,19 @@ QString str("ALTER SESSION SET NLS_DATE_FORMAT = '%1'"); foreach (QString c, toMainWidget()->connections()) { - toQuery synonyms(toMainWidget()->connection(c), - str.arg(toConfigurationSingle::Instance().dateFormat())); + try + { + toConnection &conn = toMainWidget()->connection(c); + + if(toIsOracle(conn)) + { + conn.allExecute( + str.arg(toConfigurationSingle::Instance().dateFormat())); + } + } + catch(...) { + toStatusMessage(tr("Failed to set new default date format for connection: %1").arg(c)); + } } toConfigurationSingle::Instance().setPlanCheckpoint(CheckPoint->text()); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mrj...@us...> - 2008-10-21 15:54:03
|
Revision: 3064 http://tora.svn.sourceforge.net/tora/?rev=3064&view=rev Author: mrjohnson0 Date: 2008-10-21 15:51:50 +0000 (Tue, 21 Oct 2008) Log Message: ----------- fixes crash selecting from clob columns. disables OTL_FUNC_THROW_SPEC_ON because it declares eof() does not throw exceptions fixes the crash at least and handles the otl exception. Now I know this statement (from the OE schema example) will throw a java NullPointerException. Awesome. select c.CUST_GEO_LOCATION.get_wkt() from customers c; Modified Paths: -------------- trunk/tora/src/tooracleconnection.cpp Modified: trunk/tora/src/tooracleconnection.cpp =================================================================== --- trunk/tora/src/tooracleconnection.cpp 2008-10-21 08:14:27 UTC (rev 3063) +++ trunk/tora/src/tooracleconnection.cpp 2008-10-21 15:51:50 UTC (rev 3064) @@ -61,7 +61,9 @@ #define OTL_ORA_UNICODE #define OTL_ORA_TIMESTAMP #define OTL_ANSI_CPP -#define OTL_FUNC_THROW_SPEC_ON +// mrj: disabled, otl_stream::eof sometimes throws an unexpected +// exception which causes a crash +// #define OTL_FUNC_THROW_SPEC_ON #if 1 #if defined(OTL_ORA10G) || defined(OTL_ORA10G_R2) || defined(OTL_ORA11G) @@ -425,7 +427,18 @@ { if (!Query || Cancel) return true; - return Query->eof(); + try { + return Query->eof(); + } + catch (const otl_exception &exc) + { + if(query()) + { + oracleSub *conn = dynamic_cast<oracleSub *>(query()->connectionSub()); + if(conn) + conn->throwExtendedException(query()->connection(), exc); + } + } } virtual int rowsProcessed(void) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mrj...@us...> - 2008-12-25 02:22:09
|
Revision: 3134 http://tora.svn.sourceforge.net/tora/?rev=3134&view=rev Author: mrjohnson0 Date: 2008-12-25 01:30:07 +0000 (Thu, 25 Dec 2008) Log Message: ----------- fixes crash. this belongs in a wtf somewhere... Modified Paths: -------------- trunk/tora/src/tooracleconnection.cpp Modified: trunk/tora/src/tooracleconnection.cpp =================================================================== --- trunk/tora/src/tooracleconnection.cpp 2008-12-19 06:13:37 UTC (rev 3133) +++ trunk/tora/src/tooracleconnection.cpp 2008-12-25 01:30:07 UTC (rev 3134) @@ -177,21 +177,9 @@ class toOracleProvider : public toConnectionProvider { public: -class connectionDeleter : public toTask + class oracleSub : public toConnectionSub { - otl_connect *Connection; public: - connectionDeleter(otl_connect *connect) - : Connection(connect) - { } - virtual void run(void) - { - delete Connection; - } - }; -class oracleSub : public toConnectionSub - { - public: otl_connect *Connection; oracleSub(otl_connect *conn) { @@ -199,8 +187,11 @@ } ~oracleSub() { - toThread *thread = new toThread(new connectionDeleter(Connection)); - thread->start(); + try { + delete Connection; + } + catch(...) { + } } virtual void cancel(void) { @@ -438,6 +429,8 @@ if(conn) conn->throwExtendedException(query()->connection(), exc); } + + return true; } } virtual int rowsProcessed(void) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mrj...@us...> - 2008-12-26 18:06:30
|
Revision: 3135 http://tora.svn.sourceforge.net/tora/?rev=3135&view=rev Author: mrjohnson0 Date: 2008-12-26 18:06:27 +0000 (Fri, 26 Dec 2008) Log Message: ----------- set Connection null Modified Paths: -------------- trunk/tora/src/tooracleconnection.cpp Modified: trunk/tora/src/tooracleconnection.cpp =================================================================== --- trunk/tora/src/tooracleconnection.cpp 2008-12-25 01:30:07 UTC (rev 3134) +++ trunk/tora/src/tooracleconnection.cpp 2008-12-26 18:06:27 UTC (rev 3135) @@ -192,6 +192,8 @@ } catch(...) { } + + Connection = 0; } virtual void cancel(void) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <nn...@us...> - 2009-04-07 00:55:26
|
Revision: 3170 http://tora.svn.sourceforge.net/tora/?rev=3170&view=rev Author: nneul Date: 2009-04-07 00:55:20 +0000 (Tue, 07 Apr 2009) Log Message: ----------- allow this code to actual work when enabled Modified Paths: -------------- trunk/tora/src/tooracleconnection.cpp Modified: trunk/tora/src/tooracleconnection.cpp =================================================================== --- trunk/tora/src/tooracleconnection.cpp 2009-04-02 15:25:26 UTC (rev 3169) +++ trunk/tora/src/tooracleconnection.cpp 2009-04-07 00:55:20 UTC (rev 3170) @@ -75,7 +75,8 @@ #if 0 /* OTL tracing */ #define OTL_TRACE_LEVEL 0xff #define OTL_TRACE_STREAM cerr -#include <iostream.h> +#include <iostream> +using namespace std; #endif #include "otlv4.h" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2009-05-21 19:59:49
|
Revision: 3194 http://tora.svn.sourceforge.net/tora/?rev=3194&view=rev Author: ibre5041 Date: 2009-05-21 19:58:46 +0000 (Thu, 21 May 2009) Log Message: ----------- New oracle swapper library used Modified Paths: -------------- trunk/tora/src/tooracleconnection.cpp Modified: trunk/tora/src/tooracleconnection.cpp =================================================================== --- trunk/tora/src/tooracleconnection.cpp 2009-05-21 19:56:31 UTC (rev 3193) +++ trunk/tora/src/tooracleconnection.cpp 2009-05-21 19:58:46 UTC (rev 3194) @@ -1,3 +1,6 @@ +#include <iomanip> +#include <iostream> +#include <string> /* BEGIN_COMMON_COPYRIGHT_HEADER * @@ -55,6 +58,7 @@ */ //#define OTL_STREAM_POOLING_ON +#if 0 //ivan #define OTL_STL #define OTL_EXCEPTION_ENABLE_ERROR_OFFSET #define OTL_ORA_UTF8 @@ -72,6 +76,8 @@ #endif #endif +#endif + #if 0 /* OTL tracing */ #define OTL_TRACE_LEVEL 0xff #define OTL_TRACE_STREAM cerr @@ -79,7 +85,8 @@ using namespace std; #endif -#include "otlv4.h" +//#include "otlv4.h" +#include <trotl.h> #include "toconf.h" #include "toconnection.h" @@ -135,1199 +142,1331 @@ " order by table_owner,table_name", "List the synonyms available to a user, should have same columns and binds"); -static void ThrowException(const otl_exception &exc) +static void ThrowException(const ::trotl::OciException &exc) { - if (exc.code == 24344) - throw toConnection::exception(QString::fromLatin1("ORA-24344 success with compilation error")); - else - { - toConnection::exception ret(QString::fromUtf8((const char *)exc.msg)); - - if (ret.isEmpty()) - { - if (exc.code != 0) - { - ret = QString::fromLatin1("ORA-") + - QString::number(exc.code) + - QString::fromLatin1(" missing error description"); - } - else if (ret.isEmpty()) - { - ret = QString::fromLatin1( - "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; - } + std::cout << "static void ThrowException(const ::trotl::OciException &exc)" << std::endl; + std::cout << "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::fromLatin1("ORA-") + + QString::number(exc.code) + + QString::fromLatin1(" missing error description"); + } + else if (ret.isEmpty()) + { + ret = QString::fromLatin1( + "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 toOracleProvider : public toConnectionProvider { + ::trotl::OciEnv *_envp; public: - class oracleSub : public toConnectionSub - { - public: - otl_connect *Connection; - oracleSub(otl_connect *conn) - { - Connection = conn; - } - ~oracleSub() - { - try { - delete Connection; - } - catch(...) { - } + class oracleSub : public toConnectionSub + { + public: + + ::trotl::OciConnection *Connection; + oracleSub(::trotl::OciConnection *conn) + { + Connection = conn; + } + + ~oracleSub() + { + try { + delete Connection; + } + catch(...) { + } - Connection = 0; - } - virtual void cancel(void) - { - Connection->cancel(); - } - virtual void throwExtendedException(toConnection &conn, const otl_exception &exc) - { - if (conn.version() < "0800" && exc.code == 0) - { - // Serious OCI voodoo to get the Parse error location on Oracle7 servers + Connection = 0; + } + + virtual void cancel(void) + { + Connection->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 + << "--------------------------------------------------------------------------------" << 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 toQuery::queryImpl + { + bool Cancel; + bool Running; + bool SaveInPool; + ::trotl::SqlStatement *Query; + public: + oracleQuery(toQuery *query, oracleSub *) + : toQuery::queryImpl(query) + { + std::cout << "oracleQuery::oracleQuery(toQuery *query, oracleSub *)" << std::endl; + Running = Cancel = false; + SaveInPool = false; + Query = NULL; + } + virtual ~oracleQuery() + { + if (!Query) + return; + + Query->close(); + delete Query; + } + + virtual void execute(void); - 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); - ((otl_exception &)exc).code = cda.peo; - oclose(&cda); - } - OCILdaToSvcCtx(&Connection->connect_struct.svchp, - Connection->connect_struct.errhp, - &lda); - } - } - ThrowException(exc); - } - }; + virtual toQValue readValue(void) + { + std::string val; + (*Query) >> val; + //std::cout << "TODO: readValue:" << val << std::endl << __HERE_SHORT__ << std::endl; + 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"); + if (Cancel) + throw QString::fromLatin1("Cancelled while waiting to read value"); + Running = true; + SaveInPool = true; + try + { + toQValue null; + switch (dsc->ftype) + { + case otl_var_double: + case otl_var_float: + { + double d = 0; + (*Query) >> d; + Running = false; + if (Query->is_null()) + return null; + return toQValue(d); + } + break; + case otl_var_int: + case otl_var_unsigned_int: + case otl_var_short: + case otl_var_long_int: + { + int i = 0; + (*Query) >> i; + Running = false; + if (Query->is_null()) + return null; + return toQValue(i); + } + break; + case otl_var_varchar_long: + case otl_var_raw: + case otl_var_raw_long: + { + int len = toMaxLong; + if (toMaxLong < 0) + len = DEFAULT_MAX_LONG; + buffer = (char *)malloc(len + 1); + buffer[len] = 0; + 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) + { + buf = (QString::fromUtf8(buffer)); + free(buffer); + return buf; + } + else + { + QByteArray ret(buffer, str.len()); + free(buffer); + return toQValue::createBinary(ret); + } + } + case otl_var_clob: + case otl_var_blob: + { + otl_lob_stream lob; + (*Query) >> lob; + if (lob.len() == 0) + { + Running = false; + return null; + } + int len = lob.len(); + if (toMaxLong >= 0 && len > toMaxLong) + len = toMaxLong; + if (dsc->ftype == otl_var_clob) + len *= 5; + else + len *= 2; + buffer = (char *)malloc(len + 1); + buffer[0] = 0; + otl_long_string data(buffer, len); + lob >> data; + if (!lob.eof()) + { + otl_long_string sink(10000); + do + { + lob >> sink; + } + while (!lob.eof() && sink.len() > 0); -class oracleQuery : public toQuery::queryImpl - { - bool Cancel; - bool Running; - bool SaveInPool; - otl_stream *Query; - public: - oracleQuery(toQuery *query, oracleSub *) - : toQuery::queryImpl(query) - { - Running = Cancel = false; - SaveInPool = false; - Query = NULL; - } - virtual ~oracleQuery() - { - if (!Query) - return; + toStatusMessage(QString::fromLatin1("Data exists past length of LOB")); + } + buffer[data.len()] = 0; + Running = false; - Query->close(); - delete Query; - } - virtual void execute(void); + if (dsc->ftype == otl_var_clob) + { + QString buf = QString::fromUtf8(buffer); + free(buffer); + return buf; + } + else + { + QByteArray ret(buffer, data.len()); + free(buffer); + return toQValue::createBinary(ret); + } + } + break; + default: // Try using char if all else fails + { + // The *5 is for raw columns or UTF expanded data, also dates and numbers + // are a bit tricky but if someone specifies a dateformat longer than 100 bytes he + // deserves everything he gets! + buffer = new char[std::max(dsc->elem_size * 5 + 1, 100)]; + buffer[0] = 0; + (*Query) >> buffer; + QString buf = QString::fromUtf8(buffer); + delete[] buffer; - virtual toQValue readValue(void) - { - 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"); + Running = false; - oracleSub *conn = dynamic_cast<oracleSub *>(query()->connectionSub()); - if (!conn) - throw QString::fromLatin1("Internal error, not oracle sub connection"); - if (Cancel) - throw QString::fromLatin1("Cancelled while waiting to read value"); - Running = true; - SaveInPool = true; - try - { - toQValue null; - switch (dsc->ftype) - { - case otl_var_double: - case otl_var_float: - { - double d = 0; - (*Query) >> d; - Running = false; - if (Query->is_null()) - return null; - return toQValue(d); - } - break; - case otl_var_int: - case otl_var_unsigned_int: - case otl_var_short: - case otl_var_long_int: - { - int i = 0; - (*Query) >> i; - Running = false; - if (Query->is_null()) - return null; - return toQValue(i); - } - break; - case otl_var_varchar_long: - case otl_var_raw: - case otl_var_raw_long: - { - int len = toMaxLong; - if (toMaxLong < 0) - len = DEFAULT_MAX_LONG; - buffer = (char *)malloc(len + 1); - buffer[len] = 0; - otl_long_string str(buffer, len); - (*Query) >> str; - Running = false; + if (Query->is_null()) + return null; + return buf; + } + break; + } + } + catch (const ::trotl::OciException &exc) + { + Running = false; + delete[] buffer; + if(conn && query()) + conn->throwExtendedException(query()->connection(), exc); + } + catch (...) + { + Running = false; + delete[] buffer; + throw; + } + */ + // Never get here + return QString(); //qt4 ::null; + } + + virtual void cancel(void); + + virtual bool eof(void) + { + if (!Query || Cancel) { + std::cout << "eof - noquery" << __HERE_SHORT__ << std::endl; + return true; + } + try { + 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; + if(query()) + { + oracleSub *conn = dynamic_cast<oracleSub *>(query()->connectionSub()); + if(conn) + conn->throwExtendedException(query()->connection(), exc); + } + return true; + } + } + + virtual int rowsProcessed(void) + { + std::cout << "TODO: rowsProcessed:" << std::endl + << __HERE_SHORT__ << std::endl; + if (!Query) + return 0; + //return Query->get_last_row(); ???? + unsigned i = Query->get_last_row(); + std::cout << "TODO: rowsProcessed: " << i << std::endl << __HERE_SHORT__ << std::endl; + return i; + } + + virtual int columns(void) + { + //int descriptionLen; + //Query->describe_select(descriptionLen); + std::cout << "TODO: columns:" << std::endl + << __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; + int datatypearg1 = 0; + int datatypearg2 = 0; + std::cout << "TODO describe:" << std::cout + << __HERE_SHORT__ << std::endl; + //otl_column_desc *description = Query->describe_select(descriptionLen); - if (!str.len()) { - free(buffer); - return null; - } + // TODO trotl should return const iterator - QString buf; - if (dsc->ftype == otl_var_varchar_long) - { - buf = (QString::fromUtf8(buffer)); - free(buffer); - return buf; - } - else - { - QByteArray ret(buffer, str.len()); - free(buffer); - return toQValue::createBinary(ret); - } - } - case otl_var_clob: - case otl_var_blob: - { - otl_lob_stream lob; - (*Query) >> lob; - if (lob.len() == 0) - { - Running = false; - return null; - } - int len = lob.len(); - if (toMaxLong >= 0 && len > toMaxLong) - len = toMaxLong; - if (dsc->ftype == otl_var_clob) - len *= 5; - else - len *= 2; - buffer = (char *)malloc(len + 1); - buffer[0] = 0; - otl_long_string data(buffer, len); - lob >> data; - if (!lob.eof()) - { - otl_long_string sink(10000); - do - { - lob >> sink; - } - while (!lob.eof() && sink.len() > 0); + 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) + { + std::cout << "Var: " << (*it).get_type_str(true) << std::endl; + toQuery::queryDescribe desc; + desc.AlignRight = false; + desc.Name = QString::fromUtf8( (*it)._column_name.c_str() ); + desc.Datatype = QString::fromLatin1( (*it).get_type_str(true).c_str() ); - toStatusMessage(QString::fromLatin1("Data exists past length of LOB")); - } - buffer[data.len()] = 0; - Running = false; + //datatypearg1 = description[i].char_size; + desc.Datatype.sprintf(desc.Datatype.toUtf8().constData(), datatypearg1, datatypearg2); + //desc.Null = description[i].nullok; - if (dsc->ftype == otl_var_clob) - { - QString buf = QString::fromUtf8(buffer); - free(buffer); - return buf; - } - else - { - QByteArray ret(buffer, data.len()); - free(buffer); - return toQValue::createBinary(ret); - } - } - break; - default: // Try using char if all else fails - { - // The *5 is for raw columns or UTF expanded data, also dates and numbers - // are a bit tricky but if someone specifies a dateformat longer than 100 bytes he - // deserves everything he gets! - buffer = new char[std::max(dsc->elem_size * 5 + 1, 100)]; - buffer[0] = 0; - (*Query) >> buffer; - QString buf = QString::fromUtf8(buffer); - delete[] buffer; + ret.insert(ret.end(), desc); + } +// for (int i = 0;i < descriptionLen;i++) +// { +// toQuery::queryDescribe desc; +// desc.AlignRight = false; +// desc.Name = QString::fromUtf8(description[i].name); +// /* +// * http://www.stanford.edu/dept/itss/docs/oracle/10g/server.101/b10758/sqlqr06.htm +// * include ocidfn.h +// */ +// switch (description[i].dbtype) +// { +// case 1: /* VARCHAR2, NVARCHAR2 */ +// desc.Datatype = QString::fromLatin1("VARCHAR2(%i)"); +// datatypearg1 = description[i].char_size; +// #ifdef OTL_ORA_UNICODE +// if (description[i].charset_form == 2) +// { +// desc.Datatype = QString::fromLatin1("N") + desc.Datatype; +// } +// #endif +// break; - Running = false; +// case 2: /* NUMBER */ +// desc.Datatype = QString::fromLatin1("NUMBER"); - if (Query->is_null()) - return null; - return buf; - } - break; - } - } - catch (const otl_exception &exc) - { - Running = false; - delete[] buffer; - if(conn && query()) - conn->throwExtendedException(query()->connection(), exc); - } - catch (...) - { - Running = false; - delete[] buffer; - throw; - } - // Never get here - return QString(); //qt4 ::null; - } - virtual void cancel(void); - virtual bool eof(void) - { - if (!Query || Cancel) - return true; - try { - return Query->eof(); - } - catch (const otl_exception &exc) - { - if(query()) - { - oracleSub *conn = dynamic_cast<oracleSub *>(query()->connectionSub()); - if(conn) - conn->throwExtendedException(query()->connection(), exc); - } +// if (description[i].prec) +// { +// desc.Datatype = QString::fromLatin1("NUMBER(%i)"); +// datatypearg1 = description[i].prec; +// if (description[i].scale != 0) +// { +// desc.Datatype = QString::fromLatin1("NUMBER(%i,%i)"); +// datatypearg2 = description[i].scale; +// } +// } +// desc.AlignRight = true; +// break; - return true; - } - } - virtual int rowsProcessed(void) - { - if (!Query) - return 0; - return Query->get_rpc(); - } - virtual int columns(void) - { - int descriptionLen; - Query->describe_select(descriptionLen); - return descriptionLen; - } - virtual std::list<toQuery::queryDescribe> describe(void) - { - std::list<toQuery::queryDescribe> ret; - int descriptionLen; - int datatypearg1 = 0; - int datatypearg2 = 0; - otl_column_desc *description = Query->describe_select(descriptionLen); +// case 8: /* LONG */ +// desc.Datatype = QString::fromLatin1("LONG"); +// break; - for (int i = 0;i < descriptionLen;i++) - { - toQuery::queryDescribe desc; - desc.AlignRight = false; - desc.Name = QString::fromUtf8(description[i].name); - /* - * http://www.stanford.edu/dept/itss/docs/oracle/10g/server.101/b10758/sqlqr06.htm - * include ocidfn.h - */ - switch (description[i].dbtype) - { - case 1: /* VARCHAR2, NVARCHAR2 */ - desc.Datatype = QString::fromLatin1("VARCHAR2(%i)"); - datatypearg1 = description[i].char_size; -#ifdef OTL_ORA_UNICODE - if (description[i].charset_form == 2) - { - desc.Datatype = QString::fromLatin1("N") + desc.Datatype; - } -#endif - break; +// case 12: /* DATE */ +// desc.Datatype = QString::fromLatin1("DATE"); +// desc.AlignRight = true; +// break; - case 2: /* NUMBER */ - desc.Datatype = QString::fromLatin1("NUMBER"); +// case 23: /* RAW */ +// desc.Datatype = QString::fromLatin1("RAW(%i)"); +// datatypearg1 = description[i].dbsize; +// break; - if (description[i].prec) - { - desc.Datatype = QString::fromLatin1("NUMBER(%i)"); - datatypearg1 = description[i].prec; - if (description[i].scale != 0) - { - desc.Datatype = QString::fromLatin1("NUMBER(%i,%i)"); - datatypearg2 = description[i].scale; - } - } - desc.AlignRight = true; - break; +// case 24: /* LONG RAW */ +// desc.Datatype = QString::fromLatin1("LONG RAW"); +// break; - case 8: /* LONG */ - desc.Datatype = QString::fromLatin1("LONG"); - break; +// case 104: /* ROWID, docu: 69, ocidfn.h: 104 */ +// case 208: /* UROWID */ +// desc.Datatype = QString::fromLatin1("ROWID"); +// break; - case 12: /* DATE */ - desc.Datatype = QString::fromLatin1("DATE"); - desc.AlignRight = true; - break; +// case 96: /* CHAR, NCHAR */ +// desc.Datatype = QString::fromLatin1("CHAR(%i)"); +// datatypearg1 = description[i].char_size; +// #ifdef OTL_ORA_UNICODE +// if (description[i].charset_form == 2) +// { +// desc.Datatype = QString::fromLatin1("N") + desc.Datatype; +// } +// #endif +// break; +// #ifdef OTL_ORA_NATIVE_TYPES +// case 100: /* BINARY_FLOAT */ +// desc.Datatype = QString::fromLatin1("BINARY_FLOAT"); +// break; - case 23: /* RAW */ - desc.Datatype = QString::fromLatin1("RAW(%i)"); - datatypearg1 = description[i].dbsize; - break; +// case 101: /* BINARY_DOUBLE */ +// desc.Datatype = QString::fromLatin1("BINARY_DOUBLE"); +// break; +// #endif +// case 112: /* CLOB, NCLOB */ +// desc.Datatype = QString::fromLatin1("CLOB"); +// #ifdef OTL_ORA_UNICODE +// if (description[i].charset_form == 2) +// { +// desc.Datatype = QString::fromLatin1("N") + desc.Datatype; +// } +// #endif +// break; - case 24: /* LONG RAW */ - desc.Datatype = QString::fromLatin1("LONG RAW"); - break; +// case 113: /* BLOB */ +// desc.Datatype = QString::fromLatin1("BLOB"); +// break; +// #ifdef OTL_ORA_TIMESTAMP +// case 187: /* TIMESTAMP, docu: 180, ocidfn.h: 187 */ +// desc.Datatype = QString::fromLatin1("TIMESTAMP(%i)"); +// datatypearg1 = description[i].scale; +// break; - case 104: /* ROWID, docu: 69, ocidfn.h: 104 */ - case 208: /* UROWID */ - desc.Datatype = QString::fromLatin1("ROWID"); - break; +// case 188: /* TIMESTAMP WITH TIME ZONE, docu: 181, ocidfn.h: 188 */ +// desc.Datatype = QString::fromLatin1("TIMESTAMP(%i) WITH TIME ZONE"); +// datatypearg1 = description[i].scale; +// break; - case 96: /* CHAR, NCHAR */ - desc.Datatype = QString::fromLatin1("CHAR(%i)"); - datatypearg1 = description[i].char_size; -#ifdef OTL_ORA_UNICODE - if (description[i].charset_form == 2) - { - desc.Datatype = QString::fromLatin1("N") + desc.Datatype; - } -#endif - break; -#ifdef OTL_ORA_NATIVE_TYPES - case 100: /* BINARY_FLOAT */ - desc.Datatype = QString::fromLatin1("BINARY_FLOAT"); - break; +// case 189: /* INTERVAL YEAR TO MONTH, docu: 182, ocidfn.h: 189 */ +// desc.Datatype = QString::fromLatin1("INTERVAL YEAR(%i) TO MONTH"); +// datatypearg1 = description[i].prec; +// break; - case 101: /* BINARY_DOUBLE */ - desc.Datatype = QString::fromLatin1("BINARY_DOUBLE"); - break; -#endif - case 112: /* CLOB, NCLOB */ - desc.Datatype = QString::fromLatin1("CLOB"); -#ifdef OTL_ORA_UNICODE - if (description[i].charset_form == 2) - { - desc.Datatype = QString::fromLatin1("N") + desc.Datatype; - } -#endif - break; +// case 190: /* INTERVAL DAY TO SECOND, docu: 183, ocidfn.h: 190 */ +// desc.Datatype = QString::fromLatin1("INTERVAL DAY(%i) TO SECOND(%i)"); +// datatypearg1 = description[i].prec; +// datatypearg2 = description[i].scale; +// break; - case 113: /* BLOB */ - desc.Datatype = QString::fromLatin1("BLOB"); - break; -#ifdef OTL_ORA_TIMESTAMP - case 187: /* TIMESTAMP, docu: 180, ocidfn.h: 187 */ - desc.Datatype = QString::fromLatin1("TIMESTAMP(%i)"); - datatypearg1 = description[i].scale; - break; +// case 232: /* TIMESTAMP WITH LOCAL TIME ZONE docu: 231, ocidfn.h: 232 */ +// desc.Datatype = QString::fromLatin1("TIMESTAMP(%i) WITH LOCAL TIME ZONE"); +// datatypearg1 = description[i].scale; +// break; +// #endif +// default: +// desc.Datatype = QString::fromLatin1("UNKNOWN"); - case 188: /* TIMESTAMP WITH TIME ZONE, docu: 181, ocidfn.h: 188 */ - desc.Datatype = QString::fromLatin1("TIMESTAMP(%i) WITH TIME ZONE"); - datatypearg1 = description[i].scale; - break; +// /* report unmatched datatypes for adding later */ +// printf("File a bug report and include the table layout and the following data:\n"); +// printf(" type=%i, otl_type=%i, size=%i, nullok=%i, charset_form=%i, charset_size=%i, prec=%i, scale=%i\n", +// description[i].dbtype, +// description[i].otl_var_dbtype, +// description[i].dbsize, +// description[i].nullok, +// description[i].charset_form, +// description[i].char_size, +// description[i].prec, +// description[i].scale); +// } +// desc.Datatype.sprintf(desc.Datatype.toUtf8().constData(), datatypearg1, datatypearg2); - case 189: /* INTERVAL YEAR TO MONTH, docu: 182, ocidfn.h: 189 */ - desc.Datatype = QString::fromLatin1("INTERVAL YEAR(%i) TO MONTH"); - datatypearg1 = description[i].prec; - break; +// desc.Null = description[i].nullok; - case 190: /* INTERVAL DAY TO SECOND, docu: 183, ocidfn.h: 190 */ - desc.Datatype = QString::fromLatin1("INTERVAL DAY(%i) TO SECOND(%i)"); - datatypearg1 = description[i].prec; - datatypearg2 = description[i].scale; - break; +// ret.insert(ret.end(), desc); +// } - case 232: /* TIMESTAMP WITH LOCAL TIME ZONE docu: 231, ocidfn.h: 232 */ - desc.Datatype = QString::fromLatin1("TIMESTAMP(%i) WITH LOCAL TIME ZONE"); - datatypearg1 = description[i].scale; - break; -#endif - default: - desc.Datatype = QString::fromLatin1("UNKNOWN"); + return ret; + } + }; - /* report unmatched datatypes for adding later */ - printf("File a bug report and include the table layout and the following data:\n"); - printf(" type=%i, otl_type=%i, size=%i, nullok=%i, charset_form=%i, charset_size=%i, prec=%i, scale=%i\n", - description[i].dbtype, - description[i].otl_var_dbtype, - description[i].dbsize, - description[i].nullok, - description[i].charset_form, - description[i].char_size, - description[i].prec, - description[i].scale); - } - desc.Datatype.sprintf(desc.Datatype.toUtf8().constData(), datatypearg1, datatypearg2); + class oracleConnection : public toConnection::connectionImpl + { + QString connectString(void); - desc.Null = description[i].nullok; + oracleSub *oracleConv(toConnectionSub *sub) + { + oracleSub *conn = dynamic_cast<oracleSub *>(sub); + if (!conn) + throw QString::fromLatin1("Internal error, not oracle sub connection"); + return conn; + } + public: + oracleConnection(toConnection *conn, ::trotl::OciEnv &env) : + _env(env), toConnection::connectionImpl(conn) + { } - ret.insert(ret.end(), desc); - } - return ret; - } - }; + /** Return a string representation to address an object. + * @param name The name to be quoted. + * @return String addressing table. + */ + virtual QString quote(const QString &name) + { + bool ok = true; + for (int i = 0;i < name.length();i++) + { + if (name.at(i).toUpper() != name.at(i) || !toIsIdent(name.at(i))) + ok = false; + } + if (ok) + 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(); + } -class oracleConnection : public toConnection::connectionImpl - { - QString 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; - } - oracleSub *oracleConv(toConnectionSub *sub) - { - oracleSub *conn = dynamic_cast<oracleSub *>(sub); - if (!conn) - throw QString::fromLatin1("Internal error, not oracle sub connection"); - return conn; - } - public: - oracleConnection(toConnection *conn) - : toConnection::connectionImpl(conn) - { } + virtual std::list<toConnection::objectName> objectNames(void) + { + std::list<toConnection::objectName> ret; - /** Return a string representation to address an object. - * @param name The name to be quoted. - * @return String addressing table. - */ - virtual QString quote(const QString &name) - { - bool ok = true; - for (int i = 0;i < name.length();i++) - { - if (name.at(i).toUpper() != name.at(i) || !toIsIdent(name.at(i))) - ok = false; - } - if (ok) - 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(); - } + std::list<toQValue> par; + toQuery objects(connection(), toQuery::Long, + SQLListObjects, par); + toConnection::objectName cur; + while (!objects.eof()) + { + cur.Owner = objects.readValueNull(); + cur.Name = objects.readValueNull(); + cur.Type = objects.readValueNull(); + cur.Comment = objects.readValueNull(); + ret.insert(ret.end(), cur); + } - virtual std::list<toConnection::objectName> objectNames(void) - { - std::list<toConnection::objectName> ret; + return ret; + } + virtual std::map<QString, toConnection::objectName> synonymMap(std::list<toConnection::objectName> &objects) + { + std::map<QString, toConnection::objectName> ret; - std::list<toQValue> par; - toQuery objects(connection(), toQuery::Long, - SQLListObjects, par); - toConnection::objectName cur; - while (!objects.eof()) - { - cur.Owner = objects.readValueNull(); - cur.Name = objects.readValueNull(); - cur.Type = objects.readValueNull(); - cur.Comment = objects.readValueNull(); - ret.insert(ret.end(), cur); - } + 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.readValueNull(); + cur.Owner = synonyms.readValueNull(); + cur.Name = synonyms.readValueNull(); + 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); + } + } - return ret; - } - virtual std::map<QString, toConnection::objectName> synonymMap(std::list<toConnection::objectName> &objects) - { - std::map<QString, toConnection::objectName> ret; + return ret; + } + virtual toQDescList columnDesc(const toConnection::objectName &table) + { + toBusy busy; + if (table.Type == QString::fromLatin1("PACKAGE")) + { + toQDescList ret; + try + { + toQuery::queryDescribe 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.readValueNull(); + QString type = member.readValueNull(); + 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 (...) + {} + return 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.readValueNull(); - cur.Owner = synonyms.readValueNull(); - cur.Name = synonyms.readValueNull(); - 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); - } - } + std::map<QString, QString> comments; + try + { + toQuery comment(connection(), SQLComment, table.Owner, table.Name); + while (!comment.eof()) + { + QString col = comment.readValue(); + comments[col] = comment.readValueNull(); + } + } + catch (...) + {} - return ret; - } - virtual toQDescList columnDesc(const toConnection::objectName &table) - { - toBusy busy; - if (table.Type == QString::fromLatin1("PACKAGE")) - { - toQDescList ret; - try - { - toQuery::queryDescribe 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.readValueNull(); - QString type = member.readValueNull(); - 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 (...) - {} - 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.readValueNull(); - } - } - catch (...) - {} - - try - { - toQuery query(connection()); + 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(); + // 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]; + 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; - } + return desc; + } + catch ( ... ) + { + throw; + } - toQDescList ret; - return ret; - } + toQDescList ret; + return ret; + } - virtual void commit(toConnectionSub *sub) - { - oracleSub *conn = oracleConv(sub); - try - { - conn->Connection->commit(); - } - catch (const otl_exception &exc) - { - ThrowException(exc); - } - } - virtual void rollback(toConnectionSub *sub) - { - oracleSub *conn = oracleConv(sub); - try - { - conn->Connection->rollback(); - } - catch (const otl_exception &exc) - { - ThrowException(exc); - } - } + virtual void commit(toConnectionSub *sub) + { + oracleSub *conn = oracleConv(sub); + try + { + conn->Connection->commit(); + } + catch (const ::trotl::OciException &exc) + { + ThrowException(exc); + } + } + virtual void rollback(toConnectionSub *sub) + { + oracleSub *conn = oracleConv(sub); + try + { + conn->Connection->rollback(); + } + catch (const ::trotl::OciException &exc) + { + ThrowException(exc); + } + } - virtual toConnectionSub *createConnection(void); + virtual toConnectionSub *createConnection(void); + + void closeConnection(toConnectionSub *conn) + { + delete conn; + } - void closeConnection(toConnectionSub *conn) - { - delete conn; - } + 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; + } + } + catch (::trotl::OciException e) { + std::cerr << __HERE_SHORT__ << std::endl << e.what(); + exit(0); + } + catch (...) + { + // Ignore any errors here + } + return QString::QString(); + } - virtual QString version(toConnectionSub *sub) - { - oracleSub *conn = oracleConv(sub); - try - { - otl_stream version(1, - "SELECT version FROM product_component_version where product like 'Oracle%'", - *(conn->Connection)); - if (!version.eof()) - { - char buffer[1024]; - version >> buffer; - QStringList vl = QString(buffer).split('.'); - QString ve; - QString verrj; - for ( QStringList::iterator vi = vl.begin(); vi != vl.end(); ++vi ) - { - ve = *vi; - verrj += ve.rightJustified(2, '0'); - } - return verrj; - } - } - catch (...) - { - // Ignore any errors here - } - return QString::QString(); - } + virtual toQuery::queryImpl *createQuery(toQuery *query, toConnectionSub *sub) + { + return new oracleQuery(query, oracleConv(sub)); + } - virtual toQuery::queryImpl *createQuery(toQuery *query, toConnectionSub *sub) - { - return new oracleQuery(query, oracleConv(sub)); - } + virtual void execute(toConnectionSub *sub, const QString &sql, toQList ¶ms) + { + oracleSub *conn = oracleConv(sub); - virtual void execute(toConnectionSub *sub, const QString &sql, toQList ¶ms) - { - oracleSub *conn = oracleConv(sub); + if ( params.empty() ) + { + try + { + //otl_cursor::direct_exec(*(conn->Connection), sql.toUtf8().constData()); + //TODO + //std::cout << "TODO: otl_cursor::direct_exec" << __HERE_SHORT__ << std::endl; + } + catch (const ::trotl::OciException &exc) + { + conn->throwExtendedException(connection(), exc); + } + } + else + toQuery query(connection(), sql, params); + } - if ( params.empty() ) - { - try - { - otl_cursor::direct_exec(*(conn->Connection), sql.toUtf8().constData()); - } - catch (const otl_exception &exc) - { - conn->throwExtendedException(connection(), exc); - } - } - else - toQuery query(connection(), sql, params); - } + virtual void parse(toConnectionSub *sub, const QString &sql) + { + oracleSub *conn = oracleConv(sub); + try + { + ::trotl::SqlStatement s1(*conn->Connection, sql.toUtf8().constData()); + //conn->Connection->reset_throw_count(); + //conn->Connection->syntax_check(sql.toUtf8().constData()); - virtual void parse(toConnectionSub *sub, const QString &sql) - { - oracleSub *conn = oracleConv(sub); - try - { - conn->Connection->reset_throw_count(); - conn->Connection->syntax_check(sql.toUtf8().constData()); + } + catch (const ::trotl::OciException &exc) + { + //conn->Connection->throw_count++; + ThrowException(exc); + } + } - } - catch (const otl_exception &exc) - { - conn->Connection->throw_count++; - ThrowException(exc); - } - } - }; + ::trotl::OciEnv &_env; + }; // class oracleConnection : public toConnection::connectionImpl - toOracleProvider(void) - : toConnectionProvider("Oracle", false) - {} + toOracleProvider(void) + : toConnectionProvider("Oracle", false) + {} - virtual void initialize(void) - { - toMaxLong = toConfigurationSingle::Instance().maxLong(); - if (otl_connect::otl_initialize(1)) - addProvider("Oracle"); - else - fprintf(stderr, "otl_initialize failed!\n"); - } + virtual void initialize(void) + { + //toMaxLong = toConfigurationSingle::Instance().maxLong(); + ::trotl::OciEnvAlloc *_envallocp = new ::trotl::OciEnvAlloc; + _envp = new ::trotl::OciEnv(*_envallocp); - virtual toConnection::connectionImpl *provideConnection(const QString &, toConnection *conn) - { - return new oracleConnection(conn); - } - 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 &) - { - QString str; + //std::cout << "TODO: initialize" << std::endl << __HERE_SHORT__ << std::endl; + + 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 &) + { + QString str; #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 (...) - { - 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; - } - } + + 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; + } + } #else - if (getenv("TNS_ADMIN")) - { - str = getenv("TNS_ADMIN"); - } - else - { - str = getenv("ORACLE_HOME"); - str.append(QString::fromLatin1("/network/admin")); - } -#endif - str.append(QString::fromLatin1("/tnsnames.ora")); + 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")); + + std::list<QString> ret; + + str = QString("/home/ibrezina/.tnsnames.ora"); +#endif + QFile file(str); + if (!file.open(QIODevice::ReadOnly)) + return ret; + + QTextStream in(&file); + QByteArray barray = in.readAll().toUtf8(); + const char *buf = barray.constData(); - - 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()) - { - 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++; - } - return ret; - } - virtual QWidget *providerConfigurationTab(const QString &provider, QWidget *parent); + int begname = -1; + int parambeg = -1; + int pos = 0; + int param = 0; + 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... [truncated message content] |
From: <su...@us...> - 2010-08-17 18:04:49
|
Revision: 3662 http://tora.svn.sourceforge.net/tora/?rev=3662&view=rev Author: subik Date: 2010-08-17 18:04:42 +0000 (Tue, 17 Aug 2010) Log Message: ----------- fix #3035832: Data exists past length of LOB Modified Paths: -------------- trunk/tora/src/tooracleconnection.cpp Modified: trunk/tora/src/tooracleconnection.cpp =================================================================== --- trunk/tora/src/tooracleconnection.cpp 2010-08-17 18:01:32 UTC (rev 3661) +++ trunk/tora/src/tooracleconnection.cpp 2010-08-17 18:04:42 UTC (rev 3662) @@ -363,7 +363,8 @@ } while (!lob.eof() && sink.len() > 0); - toStatusMessage(QString::fromLatin1("Data exists past length of LOB")); + toStatusMessage(QObject::tr("Data exists past configured maximum LOB length (Preferences)", + "toOracleConnection")); } buffer[data.len()] = 0; Running = false; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |