From: <ibr...@us...> - 2010-11-26 18:08:51
|
Revision: 3825 http://tora.svn.sourceforge.net/tora/?rev=3825&view=rev Author: ibre5041 Date: 2010-11-26 18:08:45 +0000 (Fri, 26 Nov 2010) Log Message: ----------- Sync with trotl trunk Better handling of fixed width CHARs Modified Paths: -------------- trunk/tora/src/trotl/src/trotl_stat.cpp trunk/tora/src/trotl/src/trotl_stat.h trunk/tora/src/trotl/src/trotl_string.h Modified: trunk/tora/src/trotl/src/trotl_stat.cpp =================================================================== --- trunk/tora/src/trotl/src/trotl_stat.cpp 2010-11-26 18:07:38 UTC (rev 3824) +++ trunk/tora/src/trotl/src/trotl_stat.cpp 2010-11-26 18:08:45 UTC (rev 3825) @@ -63,7 +63,7 @@ _state(UNINITIALIZED), _stmt_type(STMT_NONE), _param_count(0), _column_count(0), -_in_cnt(0), _out_cnt(0), +_in_cnt(0), _out_cnt(0), _iters(0), _last_row(-1), _last_fetched_row(-1), _in_pos(0), _out_pos(0), @@ -353,41 +353,40 @@ } } - ub4 iters = 0; switch(STMT_TYPE t = get_stmt_type()) { case STMT_OTHER: - iters = 1; + _iters = 1; _state |= EOF_DATA; break; case STMT_SELECT: - iters = rows; + _iters = rows; break; case STMT_UPDATE: - iters = 1; + _iters = 1; break; case STMT_DELETE: - iters = 1; + _iters = 1; break; case STMT_INSERT: - iters = 1; + _iters = 1; if( _in_cnt == 0 ) break; - iters = _all_binds[_in_binds[1]]->_cnt; + _iters = _all_binds[_in_binds[1]]->_cnt; // Loop over input bind vars - insert can have out binds too(i.e. returning clause) for(unsigned i=1; i<=_in_cnt; ++i) - if(_all_binds[_in_binds[i]]->_cnt != iters) + if(_all_binds[_in_binds[i]]->_cnt != _iters) throw OciException(__TROTL_HERE__, "Wrong count of bindvars: (%d vs. %d)\n") - .arg(iters).arg(_all_binds[_in_binds[i]]->_cnt); + .arg(_iters).arg(_all_binds[_in_binds[i]]->_cnt); break; case STMT_BEGIN: case STMT_DECLARE: - iters = 1; + _iters = 1; break; case STMT_CREATE: case STMT_DROP: case STMT_ALTER: - iters = 1; + _iters = 1; _last_buff_row = 0; _state |= EOF_DATA; break; @@ -411,12 +410,12 @@ _conn._svc_ctx, _handle, // *stmtp _errh, // *errhp - iters, //_stmt_type == STMT_SELECT ? rows : 1, // iters + _iters, //_stmt_type == STMT_SELECT ? rows : 1, // _iters 0, // rowoff (CONST OCISnapshot*)0, (OCISnapshot*)0, mode)); //std::cout << std::endl - // << "iters:" << iters << std::endl; + // << "_iters:" << _iters << std::endl; _state |= EXECUTED; _last_row = _last_buff_row = 0; @@ -961,6 +960,8 @@ //CHAR memset(BP.valuep, ' ', BP.value_sz); memcpy(BP.valuep, val, l); + //strcpy((char*)BP.valuep, val); + BP.value_sz = l; } BP.alenp[0] = (ub2)l; BP._cnt = 1; @@ -1206,7 +1207,9 @@ template<> SqlStatement& SqlStatement::operator>> <int>(std::vector<int> &val) { - if( get_stmt_type() != STMT_DECLARE && get_stmt_type() != STMT_BEGIN) + if( get_stmt_type() != STMT_DECLARE && + get_stmt_type() != STMT_BEGIN && + get_stmt_type() != STMT_INSERT ) throw OciException(__TROTL_HERE__, "Reading vectors from SQL statements is not implemented yet"); BindPar const &BP( (get_stmt_type() == STMT_SELECT ? get_next_column() : get_next_out_bindpar() ) ); @@ -1215,12 +1218,12 @@ if((_state & EXECUTED) == 0) execute_internal(g_OCIPL_BULK_ROWS, OCI_DEFAULT); - val.resize(BP._cnt); - //val = BP.get_int( _last_buff_row); - for(unsigned i=0; i < BP._cnt; ++i) + ub4 iters = get_stmt_type() == STMT_INSERT ? _iters : BP._cnt; + val.resize(iters); + + for(unsigned i=0; i < iters; ++i) { val.at(i) = BP2.get_number<int>(i); -// std::cout << "setting:" << BP2.get_number<int>(i) << std::endl; } // if(_out_pos == _column_count && BP._bind_type == BP.DEFINE_SELECT) @@ -1238,7 +1241,9 @@ template<> SqlStatement& SqlStatement::operator>> <unsigned int>(std::vector<unsigned int> &val) { - if( get_stmt_type() != STMT_DECLARE && get_stmt_type() != STMT_BEGIN) + if( get_stmt_type() != STMT_DECLARE && + get_stmt_type() != STMT_BEGIN && + get_stmt_type() != STMT_INSERT ) throw OciException(__TROTL_HERE__, "Reading vectors from SQL statements is not implemented yet"); BindPar const &BP( (get_stmt_type() == STMT_SELECT ? get_next_column() : get_next_out_bindpar() ) ); @@ -1247,9 +1252,10 @@ if((_state & EXECUTED) == 0) execute_internal(g_OCIPL_BULK_ROWS, OCI_DEFAULT); - val.resize(BP._cnt); + ub4 iters = get_stmt_type() == STMT_INSERT ? _iters : BP._cnt; + val.resize(iters); - for(unsigned i=0; i < BP._cnt; ++i) + for(unsigned i=0; i < iters; ++i) val.at(i) = BP2.get_number<unsigned int>(i); if(_out_pos == _out_cnt && get_stmt_type() != STMT_SELECT ) @@ -1261,7 +1267,9 @@ template<> SqlStatement& SqlStatement::operator>> <long>(std::vector<long> &val) { - if( get_stmt_type() != STMT_DECLARE && get_stmt_type() != STMT_BEGIN) + if( get_stmt_type() != STMT_DECLARE && + get_stmt_type() != STMT_BEGIN && + get_stmt_type() != STMT_INSERT ) throw OciException(__TROTL_HERE__, "Reading vectors from SQL statements is not implemented yet"); BindPar const &BP( (get_stmt_type() == STMT_SELECT ? get_next_column() : get_next_out_bindpar() ) ); @@ -1270,7 +1278,8 @@ if((_state & EXECUTED) == 0) execute_internal(g_OCIPL_BULK_ROWS, OCI_DEFAULT); - val.resize(BP._cnt); + ub4 iters = get_stmt_type() == STMT_INSERT ? _iters : BP._cnt; + val.resize(iters); for(unsigned i=0; i < BP._cnt; ++i) val.at(i) = BP2.get_number<long>(i); @@ -1284,7 +1293,9 @@ template<> SqlStatement& SqlStatement::operator>> <unsigned long>(std::vector<unsigned long> &val) { - if( get_stmt_type() != STMT_DECLARE && get_stmt_type() != STMT_BEGIN) + if( get_stmt_type() != STMT_DECLARE && + get_stmt_type() != STMT_BEGIN && + get_stmt_type() != STMT_INSERT ) throw OciException(__TROTL_HERE__, "Reading vectors from SQL statements is not implemented yet"); BindPar const &BP( (get_stmt_type() == STMT_SELECT ? get_next_column() : get_next_out_bindpar() ) ); @@ -1292,10 +1303,11 @@ if((_state & EXECUTED) == 0) execute_internal(g_OCIPL_BULK_ROWS, OCI_DEFAULT); + + ub4 iters = get_stmt_type() == STMT_INSERT ? _iters : BP._cnt; + val.resize(iters); - val.resize(BP._cnt); - - for(unsigned i=0; i < BP._cnt; ++i) + for(unsigned i=0; i < iters; ++i) val.at(i) = BP2.get_number<unsigned long>(i); if(_out_pos == _out_cnt && get_stmt_type() != STMT_SELECT ) @@ -1307,7 +1319,9 @@ template<> SqlStatement& SqlStatement::operator>> <float>(std::vector<float> &val) { - if( get_stmt_type() != STMT_DECLARE && get_stmt_type() != STMT_BEGIN) + if( get_stmt_type() != STMT_DECLARE && + get_stmt_type() != STMT_BEGIN && + get_stmt_type() != STMT_INSERT ) throw OciException(__TROTL_HERE__, "Reading vectors from SQL statements is not implemented yet"); BindPar const &BP( (get_stmt_type() == STMT_SELECT ? get_next_column() : get_next_out_bindpar() ) ); @@ -1316,9 +1330,10 @@ if((_state & EXECUTED) == 0) execute_internal(g_OCIPL_BULK_ROWS, OCI_DEFAULT); - val.resize(BP._cnt); - - for(unsigned i=0; i < BP._cnt; ++i) + ub4 iters = get_stmt_type() == STMT_INSERT ? _iters : BP._cnt; + val.resize(iters); + + for(unsigned i=0; i < iters; ++i) val.at(i) = BP2.get_number<float>(i); if(_out_pos == _out_cnt && get_stmt_type() != STMT_SELECT ) @@ -1330,7 +1345,9 @@ template<> SqlStatement& SqlStatement::operator>> <double>(std::vector<double> &val) { - if( get_stmt_type() != STMT_DECLARE && get_stmt_type() != STMT_BEGIN) + if( get_stmt_type() != STMT_DECLARE && + get_stmt_type() != STMT_BEGIN && + get_stmt_type() != STMT_INSERT ) throw OciException(__TROTL_HERE__, "Reading vectors from SQL statements is not implemented yet"); BindPar const &BP( (get_stmt_type() == STMT_SELECT ? get_next_column() : get_next_out_bindpar() ) ); @@ -1339,21 +1356,24 @@ if((_state & EXECUTED) == 0) execute_internal(g_OCIPL_BULK_ROWS, OCI_DEFAULT); - val.resize(BP._cnt); + ub4 iters = get_stmt_type() == STMT_INSERT ? _iters : BP._cnt; + val.resize(iters); - for(unsigned i=0; i < BP._cnt; ++i) + for(unsigned i=0; i < _iters; ++i) val.at(i) = BP2.get_number<double>(i); if(_out_pos == _out_cnt && get_stmt_type() != STMT_SELECT ) _state |= EOF_DATA; - + return *this; } template<> SqlStatement& SqlStatement::operator>> <tstring>(std::vector<tstring> &val) { - if( get_stmt_type() != STMT_DECLARE && get_stmt_type() != STMT_BEGIN) + if( get_stmt_type() != STMT_DECLARE && + get_stmt_type() != STMT_BEGIN && + get_stmt_type() != STMT_INSERT ) throw OciException(__TROTL_HERE__, "Reading vectors from SQL statements is not implemented yet"); BindPar const &BP( (get_stmt_type() == STMT_SELECT ? get_next_column() : get_next_out_bindpar() ) ); @@ -1361,9 +1381,10 @@ if((_state & EXECUTED) == 0) execute_internal(g_OCIPL_BULK_ROWS, OCI_DEFAULT); - val.resize(BP._cnt); + ub4 iters = get_stmt_type() == STMT_INSERT ? _iters : BP._cnt; + val.resize(iters); - for(unsigned i=0; i < BP._cnt; ++i) + for(unsigned i=0; i < iters; ++i) val.at(i) = BP.get_string(i); if(_out_pos == _out_cnt && get_stmt_type() != STMT_SELECT ) Modified: trunk/tora/src/trotl/src/trotl_stat.h =================================================================== --- trunk/tora/src/trotl/src/trotl_stat.h 2010-11-26 18:07:38 UTC (rev 3824) +++ trunk/tora/src/trotl/src/trotl_stat.h 2010-11-26 18:08:45 UTC (rev 3825) @@ -401,7 +401,7 @@ int _state; STMT_TYPE _stmt_type; mutable ub4 _param_count, _column_count, _in_cnt, _out_cnt; - ub4 _last_row, _last_fetched_row, _in_pos, _out_pos; + ub4 _last_row, _last_fetched_row, _in_pos, _out_pos, _iters; ub4 _last_buff_row, _buff_size; // used in select statements mutable ub4 _fetched_row; Modified: trunk/tora/src/trotl/src/trotl_string.h =================================================================== --- trunk/tora/src/trotl/src/trotl_string.h 2010-11-26 18:07:38 UTC (rev 3824) +++ trunk/tora/src/trotl/src/trotl_string.h 2010-11-26 18:08:45 UTC (rev 3825) @@ -85,28 +85,11 @@ ~BindParVarchar() {} -// template<class return_type> -// return_type get_number(unsigned int row) const -// { -// throw_ocipl_exception( -// OciException( -// __TROTL_HERE__, -// "Invalid datatype in conversion(BindParVarchar to %d%s)\n" -// ).arg(sizeof(return_type)).arg(typeid(return_type).name()) -// ); -// } - virtual tstring get_string(unsigned int row) const { return is_null(row) ? "NULL" : tstring(((char*)valuep)+(row * value_sz)); } -// virtual int get_int(unsigned int row) const { return get_number<int>(row); }; -// virtual unsigned int get_uint(unsigned int row) const { return get_number<unsigned int>(row); }; -// virtual long get_long(unsigned int row) const { return get_number<long>(row); }; -// virtual unsigned long get_ulong(unsigned int row) const { return get_number<unsigned long>(row); }; -// virtual float get_float(unsigned int row) const { return get_number<float>(row); }; -// virtual double get_double(unsigned int row) const { return get_number<double>(row); }; protected: BindParVarchar(const BindParVarchar &other); }; @@ -130,7 +113,7 @@ valuep = (void**) calloc(decl.bracket[1], decl.bracket[0]); alenp = (ub2*) calloc(_cnt, sizeof(ub2)); - dty = SQLT_CHR; + dty = SQLT_STR; /* use STR_CHR even if placeholder defined as "char" */ value_sz = decl.bracket[0]; type_name = typeid(tstring).name(); } @@ -140,10 +123,8 @@ virtual tstring get_string(unsigned int row) const { -// std::cout << " S:" << value_sz << ":" << dty << " "; - if(!indp[row]) - return tstring(((char*)valuep)+(row * value_sz), value_sz); + return tstring(((char*)valuep)+(row * value_sz), (_bind_type != DEFINE_SELECT ? alenp[row] : value_sz) ); return ""; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |