From: <ibr...@us...> - 2009-09-28 20:53:24
|
Revision: 3320 http://tora.svn.sourceforge.net/tora/?rev=3320&view=rev Author: ibre5041 Date: 2009-09-28 20:52:29 +0000 (Mon, 28 Sep 2009) Log Message: ----------- sync with trotl trunc Modified Paths: -------------- branches/tora-trotl/src/trotl/src/CMakeLists.txt branches/tora-trotl/src/trotl/src/trotl.h branches/tora-trotl/src/trotl/src/trotl_base.h branches/tora-trotl/src/trotl/src/trotl_exc.cpp branches/tora-trotl/src/trotl/src/trotl_extended_parser.cpp branches/tora-trotl/src/trotl/src/trotl_parser.cpp branches/tora-trotl/src/trotl/src/trotl_stat.cpp branches/tora-trotl/src/trotl/src/trotl_stat.h branches/tora-trotl/src/trotl/src/trotl_var.cpp branches/tora-trotl/src/trotl/src/trotl_xml.cpp Modified: branches/tora-trotl/src/trotl/src/CMakeLists.txt =================================================================== --- branches/tora-trotl/src/trotl/src/CMakeLists.txt 2009-09-28 18:58:08 UTC (rev 3319) +++ branches/tora-trotl/src/trotl/src/CMakeLists.txt 2009-09-28 20:52:29 UTC (rev 3320) @@ -32,6 +32,7 @@ trotl_string.cpp trotl_lob.cpp trotl_parser.cpp + trotl_rid.cpp trotl_stat.cpp trotl_var.cpp # trotl_xml.cpp Modified: branches/tora-trotl/src/trotl/src/trotl.h =================================================================== --- branches/tora-trotl/src/trotl/src/trotl.h 2009-09-28 18:58:08 UTC (rev 3319) +++ branches/tora-trotl/src/trotl/src/trotl.h 2009-09-28 20:52:29 UTC (rev 3320) @@ -44,6 +44,7 @@ #include "trotl_lob.h" #include "trotl_date.h" #include "trotl_string.h" +#include "trotl_rid.h" #ifdef ORACLE_HAS_XML #include "trotl_xml.h" Modified: branches/tora-trotl/src/trotl/src/trotl_base.h =================================================================== --- branches/tora-trotl/src/trotl/src/trotl_base.h 2009-09-28 18:58:08 UTC (rev 3319) +++ branches/tora-trotl/src/trotl/src/trotl_base.h 2009-09-28 20:52:29 UTC (rev 3320) @@ -35,7 +35,8 @@ #define TROTL_BASE_H_ #include <exception> -//#include <string> +#include <vector> +#include <string> #include <oci.h> #include "trotl_export.h" @@ -395,11 +396,11 @@ virtual const char* what() const throw() {return _mess.c_str();} - int get_code() const { return _sql_error_code; }; + int get_code(int pos = 0) const { return _sql_error_code.at(pos); }; const char* get_mesg() const { return _mess.c_str(); }; const char* get_sql() const { return _last_sql.c_str(); }; private: - int _sql_error_code; + ::std::vector<int> _sql_error_code; tstring _where; ::std::stringstream _stack; tstring _mess; Modified: branches/tora-trotl/src/trotl/src/trotl_exc.cpp =================================================================== --- branches/tora-trotl/src/trotl/src/trotl_exc.cpp 2009-09-28 18:58:08 UTC (rev 3319) +++ branches/tora-trotl/src/trotl/src/trotl_exc.cpp 2009-09-28 20:52:29 UTC (rev 3320) @@ -56,18 +56,19 @@ sb4 errorcode; sword res = OCICALL(OCIErrorGet(envh, 1, NULL, &errorcode, buffer, sizeof(buffer), OCI_HTYPE_ENV)); + //TODO loop over OCIErrorGet. switch(res) { case OCI_SUCCESS: - _sql_error_code = errorcode; + _sql_error_code.push_back(errorcode); _mess += (const char *)buffer; break; case OCI_INVALID_HANDLE: - _sql_error_code = 21001; // my bogus value + _sql_error_code.push_back(21001); // my bogus value _mess += "ORACLE_HOME not found\n"; break; default: - _sql_error_code = 0; + _sql_error_code.push_back(0); } _parse_offset = 0; @@ -86,7 +87,7 @@ sword res = OCICALL(OCIErrorGet(errh, 1, NULL, &errorcode, (OraText*)buffer, sizeof(buffer), OCI_HTYPE_ERROR)); if (res == OCI_SUCCESS) { - _sql_error_code = errorcode; + _sql_error_code.push_back(errorcode); //#ifdef _UNICODE // #if 0 // char nbuffer[2048]; @@ -101,7 +102,7 @@ _mess += buffer; //#endif } else { - _sql_error_code = 0; + _sql_error_code.push_back(0); } // std::cerr << "Res:" << res << ":" << _mess << std::endl; _parse_offset = 0; @@ -115,9 +116,11 @@ std::copy(s.begin(), s.end(), std::ostream_iterator<dbg::stack_frame>(_stack, "\n")); _mess += "\n" + _stack.str(); - char buffer[4096]; + ub4 size = sizeof(_parse_offset); + sword res2 = OCICALL(OCIAttrGet(stmt, OCI_HTYPE_STMT, &_parse_offset, &size, OCI_ATTR_PARSE_ERROR_OFFSET, stmt._errh)); + if (res2 != OCI_SUCCESS) + _parse_offset = 0; - sb4 errorcode; //#ifdef _UNICODE //#if 0 // char wbuffer[4096]; @@ -132,19 +135,25 @@ // .narrow((const char*)wbuffer, (const char*)wbuffer+_tcslen((const char*)wbuffer)+1, 0, buffer); //#else //TODO - in multithreaded environment SqlStatement should have its own error handle - sword res = OCICALL(OCIErrorGet(stmt._env._errh, 1, NULL, &errorcode, (OraText*)buffer, sizeof(buffer), OCI_HTYPE_ERROR)); + char buffer[4096]; + sb4 errorcode; + ub4 recordno = 1; + size_t last_length = 0; + sword res; + do { + res = OCICALL(OCIErrorGet(stmt._errh, recordno, NULL, &errorcode, (OraText*)buffer+last_length, sizeof(buffer)-last_length, OCI_HTYPE_ERROR)); + if(res == OCI_SUCCESS) + _sql_error_code.push_back(errorcode); + else + break; + ++recordno; + last_length = strlen(buffer); + } while(res == OCI_SUCCESS); //#endif - ub4 size = sizeof(_parse_offset); - sword res2 = OCICALL(OCIAttrGet(stmt, OCI_HTYPE_STMT, &_parse_offset, &size, OCI_ATTR_PARSE_ERROR_OFFSET, stmt._env._errh)); - if (res2 != OCI_SUCCESS) - _parse_offset = 0; - - if (res == OCI_SUCCESS) - _sql_error_code = errorcode; - else { + if ( _sql_error_code.empty()) { // No error was detecter, but the exception was thrown *buffer = '\0'; - _sql_error_code = 0; + _sql_error_code.push_back(0); } _last_sql = stmt.get_sql(); Modified: branches/tora-trotl/src/trotl/src/trotl_extended_parser.cpp =================================================================== --- branches/tora-trotl/src/trotl/src/trotl_extended_parser.cpp 2009-09-28 18:58:08 UTC (rev 3319) +++ branches/tora-trotl/src/trotl/src/trotl_extended_parser.cpp 2009-09-28 20:52:29 UTC (rev 3320) @@ -104,7 +104,7 @@ str_p("^=") | str_p(":=") ); - static rule<phrase_scanner_t> delim_tm = ( str_p("..") | ch_p(';') /*| ','*/ | '(' | ')' /*| '.' /*| blank_p | eol_p*/ ); + static rule<phrase_scanner_t> delim_tm = ( str_p("..") | ch_p(';') /*| ','*/ | '(' | ')' /*| '.' | blank_p | eol_p*/ ); static rule<phrase_scanner_t> appos_tm = (ch_p('\'') >> ch_p('\'')); static rule<phrase_scanner_t> qstring_tm = ch_p('\'') >> *(~ch_p('\'')|appos_tm) >> ch_p('\''); Modified: branches/tora-trotl/src/trotl/src/trotl_parser.cpp =================================================================== --- branches/tora-trotl/src/trotl/src/trotl_parser.cpp 2009-09-28 18:58:08 UTC (rev 3319) +++ branches/tora-trotl/src/trotl/src/trotl_parser.cpp 2009-09-28 20:52:29 UTC (rev 3320) @@ -144,12 +144,17 @@ [boost::bind(&SimplePlsqlParser::token_callback, boost::ref(*this), "eq", _1, _2)]; bool p = boost::spirit::parse(statement.c_str(), - // Begin grammar +// Note: as_lower_d wont compile on 64bit linux if BOOST_VERSION < 1.37.0 +#if (BOOST_VERSION >= 103700) as_lower_d[( +#endif + // Begin grammar *(comment_cl | word_cl | quoted_word_cl | bindvar |operator_cl |string_cl| /*eq_cl |*/ number_cl | delim_cl) +#if (BOOST_VERSION >= 103700) )] +#endif //, // End grammar //space_p Modified: branches/tora-trotl/src/trotl/src/trotl_stat.cpp =================================================================== --- branches/tora-trotl/src/trotl/src/trotl_stat.cpp 2009-09-28 18:58:08 UTC (rev 3319) +++ branches/tora-trotl/src/trotl/src/trotl_stat.cpp 2009-09-28 20:52:29 UTC (rev 3320) @@ -266,7 +266,7 @@ { if( _all_binds == 0 || _out_binds == 0 ) throw OciException(__HERE__, "No out Bindpars specified"); - + ub4 pos = _out_pos < _out_cnt ? ++_out_pos : _out_pos=1; //Round robin hack return *_all_binds[_out_binds[ pos ]]; } @@ -310,7 +310,8 @@ // Optimizing of TCP packets by transfering multiple datasets in one packet try { set_attribute(OCI_ATTR_PREFETCH_MEMORY, 1500); - set_attribute(OCI_ATTR_PREFETCH_ROWS, 10); + //set_attribute(OCI_ATTR_PREFETCH_ROWS, 10); + set_attribute(OCI_ATTR_PREFETCH_ROWS, 3); } catch(std::exception&) { // ignore exception of this optional performance tuning //TODO add some debug output here @@ -419,8 +420,8 @@ _state |= EOF_DATA; return false; default: - //oci_check_error(__HERE__, _errh, res); - oci_check_error(__HERE__, *this, res); + oci_check_error(__HERE__, _errh, res); + //oci_check_error(__HERE__, *this, res); return true; } @@ -970,6 +971,9 @@ if(_out_pos == _column_count && BP._bind_type == BP.DEFINE_SELECT) ++_last_buff_row; + if(_out_pos == _out_cnt && get_stmt_type() != STMT_SELECT ) + _state |= EOF_DATA; + if(_last_buff_row == fetched_rows() && ((_state & EOF_DATA) == 0) && get_stmt_type() == STMT_SELECT) fetch(_buff_size); @@ -991,6 +995,9 @@ if(_out_pos == _column_count && BP._bind_type == BP.DEFINE_SELECT) ++_last_buff_row; + if(_out_pos == _out_cnt && get_stmt_type() != STMT_SELECT ) + _state |= EOF_DATA; + if(_last_buff_row == fetched_rows() && ((_state & EOF_DATA) == 0) && get_stmt_type() == STMT_SELECT) fetch(_buff_size); @@ -1012,6 +1019,9 @@ if(_out_pos == _column_count && BP._bind_type == BP.DEFINE_SELECT) ++_last_buff_row; + if(_out_pos == _out_cnt && get_stmt_type() != STMT_SELECT ) + _state |= EOF_DATA; + if(_last_buff_row == fetched_rows() && ((_state & EOF_DATA) == 0) && get_stmt_type() == STMT_SELECT) fetch(_buff_size); @@ -1034,6 +1044,9 @@ if(_out_pos == _column_count && BP._bind_type == BP.DEFINE_SELECT) ++_last_buff_row; + if(_out_pos == _out_cnt && get_stmt_type() != STMT_SELECT ) + _state |= EOF_DATA; + if(_last_buff_row == fetched_rows() && ((_state & EOF_DATA) == 0) && get_stmt_type() == STMT_SELECT) fetch(_buff_size); @@ -1055,6 +1068,9 @@ if(_out_pos == _column_count && BP._bind_type == BP.DEFINE_SELECT) ++_last_buff_row; + if(_out_pos == _out_cnt && get_stmt_type() != STMT_SELECT ) + _state |= EOF_DATA; + if(_last_buff_row == fetched_rows() && ((_state & EOF_DATA) == 0) && get_stmt_type() == STMT_SELECT) fetch(_buff_size); @@ -1076,6 +1092,9 @@ if(_out_pos == _column_count && BP._bind_type == BP.DEFINE_SELECT) ++_last_buff_row; + if(_out_pos == _out_cnt && get_stmt_type() != STMT_SELECT ) + _state |= EOF_DATA; + if(_last_buff_row == fetched_rows() && ((_state & EOF_DATA) == 0) && get_stmt_type() == STMT_SELECT) fetch(_buff_size); @@ -1096,6 +1115,9 @@ if(_out_pos == _column_count && BP._bind_type == BP.DEFINE_SELECT) ++_last_buff_row; + if(_out_pos == _out_cnt && get_stmt_type() != STMT_SELECT ) + _state |= EOF_DATA; + if(_last_buff_row == fetched_rows() && ((_state & EOF_DATA) == 0) && get_stmt_type() == STMT_SELECT) fetch(_buff_size); @@ -1134,6 +1156,9 @@ if(_out_pos == _column_count && BP._bind_type == BP.DEFINE_SELECT) ++_last_buff_row; + if(_out_pos == _out_cnt && get_stmt_type() != STMT_SELECT ) + _state |= EOF_DATA; + if(_last_buff_row == fetched_rows() && ((_state & EOF_DATA) == 0) && get_stmt_type() == STMT_SELECT) fetch(_buff_size); @@ -1163,6 +1188,9 @@ // if(_out_pos == _column_count && BP._bind_type == BP.DEFINE_SELECT) // ++_last_buff_row; + if(_out_pos == _out_cnt && get_stmt_type() != STMT_SELECT ) + _state |= EOF_DATA; + // if(_last_buff_row == fetched_rows() && ((_state & EOF_DATA) == 0) && get_stmt_type() == STMT_SELECT) // fetch(_buff_size); @@ -1186,6 +1214,9 @@ for(unsigned i=0; i < BP._cnt; ++i) val.at(i) = BP2.get_number<unsigned int>(i); + if(_out_pos == _out_cnt && get_stmt_type() != STMT_SELECT ) + _state |= EOF_DATA; + return *this; } @@ -1206,6 +1237,9 @@ for(unsigned i=0; i < BP._cnt; ++i) val.at(i) = BP2.get_number<long>(i); + if(_out_pos == _out_cnt && get_stmt_type() != STMT_SELECT ) + _state |= EOF_DATA; + return *this; } @@ -1226,6 +1260,9 @@ for(unsigned i=0; i < BP._cnt; ++i) val.at(i) = BP2.get_number<unsigned long>(i); + if(_out_pos == _out_cnt && get_stmt_type() != STMT_SELECT ) + _state |= EOF_DATA; + return *this; } @@ -1246,6 +1283,9 @@ for(unsigned i=0; i < BP._cnt; ++i) val.at(i) = BP2.get_number<float>(i); + if(_out_pos == _out_cnt && get_stmt_type() != STMT_SELECT ) + _state |= EOF_DATA; + return *this; } @@ -1266,6 +1306,9 @@ for(unsigned i=0; i < BP._cnt; ++i) val.at(i) = BP2.get_number<double>(i); + if(_out_pos == _out_cnt && get_stmt_type() != STMT_SELECT ) + _state |= EOF_DATA; + return *this; } @@ -1285,6 +1328,9 @@ for(unsigned i=0; i < BP._cnt; ++i) val.at(i) = BP.get_string(i); + if(_out_pos == _out_cnt && get_stmt_type() != STMT_SELECT ) + _state |= EOF_DATA; + return *this; } Modified: branches/tora-trotl/src/trotl/src/trotl_stat.h =================================================================== --- branches/tora-trotl/src/trotl/src/trotl_stat.h 2009-09-28 18:58:08 UTC (rev 3319) +++ branches/tora-trotl/src/trotl/src/trotl_stat.h 2009-09-28 20:52:29 UTC (rev 3320) @@ -278,7 +278,7 @@ return *this; } - + SqlStatement& operator>> (SqlValue &val); template<class wrapped_type> @@ -327,6 +327,9 @@ /* if(_out_pos == _column_count && BP._bind_type == BP.DEFINE_SELECT) //TODO */ /* ++_last_buff_row; */ +/* if(_out_pos == _out_cnt && get_stmt_type() != STMT_SELECT ) */ +/* _state |= EOF_DATA; */ + /* if(_last_buff_row == fetched_rows() && ((_state & EOF_DATA) == 0) && get_stmt_type() == STMT_SELECT) */ /* fetch(_buff_size); */ Modified: branches/tora-trotl/src/trotl/src/trotl_var.cpp =================================================================== --- branches/tora-trotl/src/trotl/src/trotl_var.cpp 2009-09-28 18:58:08 UTC (rev 3319) +++ branches/tora-trotl/src/trotl/src/trotl_var.cpp 2009-09-28 20:52:29 UTC (rev 3320) @@ -207,8 +207,13 @@ str << "LONG RAW"; /* !! TODO unsupported yet */ break; case SQLT_RDD: - case 208: // 208 = 2 * SQLT_RDD (mentioned only in catalog.sql) - str << "ROWID"; + case 208: // 208 = 2 * SQLT_RDD (mentioned only in catalog.sql) + // _width == 4 for ROWID datatype + // _width == 4000 for UROWID datatype + if(_width == sizeof(OCIRowid*)) + str << "ROWID"; + else + str << "UROWID"; break; case SQLT_IBFLOAT: str << "BINARY_FLOAT"; Modified: branches/tora-trotl/src/trotl/src/trotl_xml.cpp =================================================================== --- branches/tora-trotl/src/trotl/src/trotl_xml.cpp 2009-09-28 18:58:08 UTC (rev 3319) +++ branches/tora-trotl/src/trotl/src/trotl_xml.cpp 2009-09-28 20:52:29 UTC (rev 3320) @@ -40,8 +40,12 @@ Util::RegisterInFactory<BindParXML, CustDefineParFactTwoParmSing> regCustDefineNTY("SYS.XMLTYPE"); +// TODO - use NULL indicator for SYS.XMLTYPE tstring BindParXML::get_string(unsigned int row) const { + if((xmlnode*)_xmlvaluep[row] == NULL) + return ""; + OCIDuration dur; xmlerr xerr = (xmlerr)0; oraerr oerr = (oraerr)0; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |