From: <ibr...@us...> - 2010-08-12 09:44:59
|
Revision: 3655 http://tora.svn.sourceforge.net/tora/?rev=3655&view=rev Author: ibre5041 Date: 2010-08-12 09:44:52 +0000 (Thu, 12 Aug 2010) Log Message: ----------- Syc with trotl trunk. Use OCILobAssign, fix for analyze table statement Modified Paths: -------------- trunk/tora/src/trotl/src/trotl_base.h trunk/tora/src/trotl/src/trotl_conn.h trunk/tora/src/trotl/src/trotl_convertor.cpp trunk/tora/src/trotl/src/trotl_lob.cpp trunk/tora/src/trotl/src/trotl_stat.cpp Modified: trunk/tora/src/trotl/src/trotl_base.h =================================================================== --- trunk/tora/src/trotl/src/trotl_base.h 2010-08-12 09:43:15 UTC (rev 3654) +++ trunk/tora/src/trotl/src/trotl_base.h 2010-08-12 09:44:52 UTC (rev 3655) @@ -341,6 +341,12 @@ //std::cerr << "OCIEnvCreate:" << res << std::endl; oci_check_error(__TROTL_HERE__, _handle, res); } + + ~OciEnvAlloc() + { +// sword res = OCITerminate (OCI_DEFAULT); +// oci_check_error(__TROTL_HERE__, _handle, res); + } }; /* This set of specialized templates represent translation table Modified: trunk/tora/src/trotl/src/trotl_conn.h =================================================================== --- trunk/tora/src/trotl/src/trotl_conn.h 2010-08-12 09:43:15 UTC (rev 3654) +++ trunk/tora/src/trotl/src/trotl_conn.h 2010-08-12 09:44:52 UTC (rev 3655) @@ -250,10 +250,16 @@ /// wrap OCIEnv and OCISvcCtx together struct TROTL_EXPORT OciConnection { - OciConnection(OCIEnv* envh, OCISvcCtx* svc_ctx) : - _env(envh), _svc_ctx(svc_ctx) - {} + OciEnv _env; +#ifdef WIN32 + template struct TROTL_EXPORT OciHandleWrapper<OCISvcCtx>; +#endif + OciContext _svc_ctx; + OciConnection(OCIEnv* envh, OCISvcCtx* svc_ctx) + : _env(envh), _svc_ctx(svc_ctx) + {} + //OciConnection(OCIEnv* envh) : // _env(envh), _svc_ctx(0) //{} @@ -274,12 +280,6 @@ tstring getNLS_LANG(); void changePassword (tstring userid, tstring password, tstring new_password); - OciEnv _env; -#ifdef WIN32 - template struct TROTL_EXPORT OciHandleWrapper<OCISvcCtx>; -#endif - OciContext _svc_ctx; - void commit(ub4 flags=OCI_DEFAULT) { sword res = OCICALL(OCITransCommit(_svc_ctx, _env._errh, flags)); @@ -297,6 +297,30 @@ oci_check_error(__TROTL_HERE__, _env._errh, res); } + bool is_noblocking() + { + /* Some OCI statements silently enter blocking mode without any warning + * we call OCIAttrGet everytime + */ + ub1 nonblocking; + //_svc_ctx.get_attribute(&nonblocking, NULL, OCI_ATTR_NONBLOCKING_MODE); + return nonblocking; + } + + void set_noblocking() + { + //_svc_ctx.set_attribute_handle(OCI_ATTR_NONBLOCKING_MODE, NULL); + } + + // TODO check server's version too + void ping() + { +#if (OCI_MAJOR_VERSION == 10 && OCI_MINOR_VERSION >=2) || (OCI_MAJOR_VERSION > 10) + sword res = OCICALL(OCIPing(_svc_ctx, _env._errh, OCI_DEFAULT)); + oci_check_error(__TROTL_HERE__, _env._errh, res); +#endif + } + //StatementCache _stmt_cache; TODO private: Modified: trunk/tora/src/trotl/src/trotl_convertor.cpp =================================================================== --- trunk/tora/src/trotl/src/trotl_convertor.cpp 2010-08-12 09:43:15 UTC (rev 3654) +++ trunk/tora/src/trotl/src/trotl_convertor.cpp 2010-08-12 09:44:52 UTC (rev 3655) @@ -61,29 +61,33 @@ */ void ConvertorForRead::Fire(const BindParClob &BP, SqlClob &CL) { - //std::cout << "Convert: void Fire(BindParClob, SqlClob)\n"; CL._ind = BP.indp[_row]; if(CL.is_not_null()) - { - //sword res = OCICALL(OCILobAssign(BP._env, BP._env._errh, ((OCILobLocator**)BP.valuep)[_row], &CL._loc)); - //_conn._env, _conn._env._errh, other._loc, &_loc)); // no support for temporary LOBs - //oci_check_error(__TROTL_HERE__, BP._env._errh, res); - CL._loc = ((OCILobLocator**)BP.valuep)[_row]; ((OCILobLocator**)BP.valuep)[_row] = NULL; - CL._ind = BP.indp[_row]; + { + /* TODO: + * - whose errh should I use? BP's or SqlValue's (race) + * - no support for temporary lobs here + */ + sword res = OCICALL(OCILobAssign(BP._env, BP._env._errh, ((OCILobLocator**)BP.valuep)[_row], &CL._loc)); + oci_check_error(__TROTL_HERE__, BP._env._errh, res); + + //CL._loc = ((OCILobLocator**)BP.valuep)[_row]; + //((OCILobLocator**)BP.valuep)[_row] = NULL; + //CL._ind = BP.indp[_row]; } }; void ConvertorForRead::Fire(const BindParBlob &BP, SqlBlob &BL) { - //std::cout << "Convert: void Fire(BindParBlob, SqlBlob)\n"; BL._ind = BP.indp[_row]; if(BL.is_not_null()) { - //sword res = OCICALL(OCILobAssign(BP._env, BP._env._errh, ((OCILobLocator**)BP.valuep)[_row], &BL._loc)); - //_conn._env, _conn._env._errh, other._loc, &_loc)); // no support for temporary LOBs - //oci_check_error(__TROTL_HERE__, BP._env._errh, res); - BL._loc = ((OCILobLocator**)BP.valuep)[_row]; ((OCILobLocator**)BP.valuep)[_row] = NULL; - BL._ind = BP.indp[_row]; + sword res = OCICALL(OCILobAssign(BP._env, BP._env._errh, ((OCILobLocator**)BP.valuep)[_row], &BL._loc)); + oci_check_error(__TROTL_HERE__, BP._env._errh, res); + + //BL._loc = ((OCILobLocator**)BP.valuep)[_row]; + //((OCILobLocator**)BP.valuep)[_row] = NULL; + //BL._ind = BP.indp[_row]; } }; @@ -160,11 +164,16 @@ void ConvertorForWrite::Fire(const SqlClob &CL, BindParClob &BP) { - //TODO sword res = OCICALL(OCILobAssign(BP._env, BP._env._errh, ((OCILobLocator**)BP.valuep)[_row], &CL._loc)); - //_conn._env, _conn._env._errh, other._loc, &_loc)); // no support for temporary LOBs - //oci_check_error(__TROTL_HERE__, BP._env._errh, res); + std::cerr << "void ConvertorForWrite::Fire(const SqlClob &CL, BindParClob &BP), row: " << _row << std::endl; + /* TODO: + * - whose errh should I use? BP's or SqlValue's (race) + * - no support for temporary lobs here + * - should I call OCILobLocatorIsInit here ?? + */ + sword res = OCICALL(OCILobAssign(BP._env, BP._env._errh, CL._loc, &((OCILobLocator**)BP.valuep)[_row])); + oci_check_error(__TROTL_HERE__, BP._env._errh, res); - ((OCILobLocator**)BP.valuep)[_row] = CL._loc; +// ((OCILobLocator**)BP.valuep)[_row] = CL._loc; // CL._loc = NULL; BP.indp[_row] = CL._ind; }; Modified: trunk/tora/src/trotl/src/trotl_lob.cpp =================================================================== --- trunk/tora/src/trotl/src/trotl_lob.cpp 2010-08-12 09:43:15 UTC (rev 3654) +++ trunk/tora/src/trotl/src/trotl_lob.cpp 2010-08-12 09:44:52 UTC (rev 3655) @@ -108,9 +108,9 @@ { for(unsigned i=0; i<_cnt; ++i) { - if(((void**)valuep)[i]) + if(((OCILobLocator**)valuep)[i]) { - //std::cerr << "void descFree(void)" << std::endl; + std::cerr << "void descFree(void): " << i << std::endl; sword res = OCICALL(OCIDescriptorFree( ((void**)valuep)[i], OCI_DTYPE_LOB)); oci_check_error(__TROTL_HERE__, _env, res); } @@ -181,7 +181,7 @@ SqlLob::SqlLob(OciConnection &conn) : _conn(conn), _loc(NULL) { - sword res = OCICALL(OCIDescriptorAlloc(_conn._env, (dvoid**)&_loc, OCI_DTYPE_LOB, 0, NULL)); + sword res = OCICALL(OCIDescriptorAlloc(_conn._env, (void**)&_loc, OCI_DTYPE_LOB, 0, NULL)); oci_check_error(__TROTL_HERE__, _conn._env, res); }; Modified: trunk/tora/src/trotl/src/trotl_stat.cpp =================================================================== --- trunk/tora/src/trotl/src/trotl_stat.cpp 2010-08-12 09:43:15 UTC (rev 3654) +++ trunk/tora/src/trotl/src/trotl_stat.cpp 2010-08-12 09:44:52 UTC (rev 3655) @@ -189,10 +189,35 @@ res = OCICALL(OCIStmtPrepare(_handle/*stmtp*/, _errh, (text*)sql.c_str(), (ub4)sql.length(), lang, OCI_DEFAULT)); oci_check_error(__TROTL_HERE__, _errh, res); + /* NOTE this call alse returns other values than mentioned in OCI docs. + * for example "EXPLAIN PLAN FOR ..." returns value 15 + */ res = OCICALL(OCIAttrGet(_handle/*stmtp*/, get_type_id(), &stmt_type, &size, OCI_ATTR_STMT_TYPE, _errh)); oci_check_error(__TROTL_HERE__, _errh, res); - _stmt_type = (STMT_TYPE)stmt_type; + switch(stmt_type) + { + case OCI_STMT_SELECT: + case OCI_STMT_UPDATE: + case OCI_STMT_DELETE: + case OCI_STMT_INSERT: + case OCI_STMT_CREATE: + case OCI_STMT_DROP: + case OCI_STMT_ALTER: + case OCI_STMT_BEGIN: + case OCI_STMT_DECLARE: + _stmt_type = (STMT_TYPE)stmt_type; + break; + case 0: // ANALYZE TABLE + case 15: // EXPLAIN PLAN FOR + _stmt_type = STMT_OTHER; + break; + default: + _stmt_type = STMT_OTHER; + std::cerr << "Unknown statement type: " << stmt_type << std::endl << _parsed_stmt << std::endl; + //exit(-1); + }; + _state |= PREPARED; } @@ -343,15 +368,12 @@ // 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) - throw OciException(__TROTL_HERE__, "Wrong count of bindvars: (%d vs. %d)\n" - ).arg(iters).arg(_all_binds[_in_binds[i]]->_cnt); + throw OciException(__TROTL_HERE__, "Wrong count of bindvars: (%d vs. %d)\n") + .arg(iters).arg(_all_binds[_in_binds[i]]->_cnt); break; case STMT_BEGIN: case STMT_DECLARE: iters = 1; - _last_buff_row = 0; - if( _out_cnt == 0 && _in_cnt == 0) - _state |= EOF_DATA; break; case STMT_CREATE: case STMT_DROP: @@ -360,10 +382,6 @@ _last_buff_row = 0; _state |= EOF_DATA; break; - default: - std::cerr << "Unknown statement type: " << t - << std::endl << _parsed_stmt << std::endl; - exit(-1); }; if(!_bound && _out_cnt) @@ -384,7 +402,7 @@ iters,//_stmt_type == STMT_SELECT ? rows : 1, // iters 0, // rowoff (CONST OCISnapshot*)0, (OCISnapshot*)0, mode)); - + //std::cout << std::endl // << "iters:" << iters << std::endl; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2010-09-24 12:23:34
|
Revision: 3693 http://tora.svn.sourceforge.net/tora/?rev=3693&view=rev Author: ibre5041 Date: 2010-09-24 12:23:27 +0000 (Fri, 24 Sep 2010) Log Message: ----------- - code cleanups - better memory allocations - stability fixes(Oracle environment is iitialized in threaded mode now) - initiall support for named collections - ANADATA supports datatime Modified Paths: -------------- trunk/tora/src/trotl/src/trotl_anydata.cpp trunk/tora/src/trotl/src/trotl_anydata.h trunk/tora/src/trotl/src/trotl_base.h trunk/tora/src/trotl/src/trotl_common.h trunk/tora/src/trotl/src/trotl_date.h trunk/tora/src/trotl/src/trotl_int.h trunk/tora/src/trotl/src/trotl_lob.cpp trunk/tora/src/trotl/src/trotl_misc.h trunk/tora/src/trotl/src/trotl_rid.cpp trunk/tora/src/trotl/src/trotl_stat.cpp trunk/tora/src/trotl/src/trotl_stat.h trunk/tora/src/trotl/src/trotl_string.h trunk/tora/src/trotl/src/trotl_var.cpp trunk/tora/src/trotl/src/trotl_var.h Modified: trunk/tora/src/trotl/src/trotl_anydata.cpp =================================================================== --- trunk/tora/src/trotl/src/trotl_anydata.cpp 2010-09-24 12:20:23 UTC (rev 3692) +++ trunk/tora/src/trotl/src/trotl_anydata.cpp 2010-09-24 12:23:27 UTC (rev 3693) @@ -41,6 +41,49 @@ Util::RegisterInFactory<BindParANYDATA, CustDefineParFactTwoParmSing> regCustDefineNTY_ANYDATA("SYS.ANYDATA"); +void BindParANYDATA::init(SqlStatement &stmt) +{ + sword res; + _anydatatdo = 0; + + + _oan_buffer = new OCIAnyData* [ _cnt ]; + + res = OCICALL(OCITypeByName(_stmt._env, _stmt._errh, _stmt._conn._svc_ctx, + (const oratext*)"SYS", strlen("SYS"), + (const oratext*)"ANYDATA", strlen("ANYDATA"), + 0, 0, + OCI_DURATION_SESSION, OCI_TYPEGET_ALL, + (OCIType**) &_anydatatdo)); + oci_check_error(__TROTL_HERE__, _stmt._errh, res); + + if(_anydatatdo == NULL) + throw OciException(__TROTL_HERE__, "Unknown datatype in the database: SYS.ANYDATA"); + + for(int i=0; i<g_OCIPL_BULK_ROWS; i++) + { + _oan_buffer[i] = NULL; + } +} + +void BindParANYDATA::define_hook(SqlStatement &stmt) +{ + sword res = OCICALL(OCIDefineObject(defnpp, stmt._errh, + _anydatatdo, + (dvoid **) &(_oan_buffer[0]), //(dvoid **) &_oan_buffer, + (ub4 *) 0, + 0, //(dvoid **) &_any_indp, + (ub4 *) 0)); + oci_check_error(__TROTL_HERE__, stmt._errh, res); +// // TODO OCIDefineArrayOfStruct here ?? +} + +void BindParANYDATA::bind_hook(SqlStatement &stmt) +{ + //TODO + throw OciException(__TROTL_HERE__, "Not implemented yet"); +} + // TODO tstring BindParANYDATA::get_string(unsigned int row) const { @@ -65,7 +108,6 @@ OCINumber num; OCINumber *num_ptr = # ub4 len; - OCIInd indp; // TODO check indp here text str_buf[61]; ub4 str_len = sizeof(str_buf) / sizeof(*str_buf); @@ -93,35 +135,56 @@ } case OCI_TYPECODE_VARCHAR2: { - OCIInd indp; // TODO check indp here + OCIInd _indp; // TODO check indp here OCIString *str = (OCIString *) 0; ub4 len, len2; sword res1 = OCICALL(OCIAnyDataAccess(_stmt._conn._svc_ctx, _stmt._errh, - _oan_buffer[row], (OCITypeCode)OCI_TYPECODE_VARCHAR2, - (OCIType *)0, (dvoid *)&indp, (dvoid *)&str, &len)); - oci_check_error(__TROTL_HERE__, _env._errh, res1); + _oan_buffer[row], (OCITypeCode)OCI_TYPECODE_VARCHAR2, + (OCIType *)0, (dvoid *)&_indp, (dvoid *)&str, &len)); + oci_check_error(__TROTL_HERE__, _stmt._errh, res1); return tstring( (const char *)OCIStringPtr(_stmt._env, str), OCIStringSize(_stmt._env, str)); } -// case OCI_TYPECODE_DATE: + case OCI_TYPECODE_DATE: + { // /*checkerr(ctxptr->errhp, OCIAnyDataAccess(ctxptr->svchp, // ctxptr->errhp, oan_buffer, // (OCITypeCode)OCI_TYPECODE_DATE, // (OCIType *)0, (dvoid *)&indp, (dvoid *)&date, &len)); // OCIDateGetDate( (CONST OCIDate *) &date, &year1, &month1, &day1 ); */ - -// checkerr(ctxptr->errhp, OCIAnyDataAccess(ctxptr->svchp, -// ctxptr->errhp, oan_buffer, -// (OCITypeCode)OCI_TYPECODE_DATE, -// (OCIType *)0, (dvoid *)&indp, -// (dvoid **)&date_ptr, &len)); + OCIInd _indp; // TODO check indp here + OCIDate *date_ptr = 0; + text str_buf[200]; + ub4 str_len = sizeof(str_buf) / sizeof( *str_buf); + ub4 len; + + sword res1= OCICALL(OCIAnyDataAccess(_stmt._conn._svc_ctx, _stmt._errh, + _oan_buffer[row], (OCITypeCode)OCI_TYPECODE_DATE, + (OCIType *)0, (dvoid *)&_indp, + (dvoid **)&date_ptr, &len)); + oci_check_error(__TROTL_HERE__, _stmt._errh, res1); // OCIDateGetDate( (CONST OCIDate *) date_ptr, &year1, &month1, &day1 ); - + + + const char fmt[] = "YYYY:MM:DD HH24:MI:SS"; + const char lang_fmt[] = "American"; + + res1 = OCICALL(OCIDateToText(_stmt._errh, + date_ptr, + (CONST text*) fmt, + (ub4) sizeof(fmt)-1, + (CONST text*) lang_fmt, + (ub4) sizeof(lang_fmt)-1, + (ub4 *)&str_len, + str_buf + )); + oci_check_error(__TROTL_HERE__, _stmt._errh, res1); + str_buf[ min( (str_len+1) , (unsigned)sizeof(str_buf) ) ] = '\0'; + + return (const char*)str_buf; // printf("c2 is %d/%d/%d\n", day1, month1, year1); - -// break; - + } // case OCI_TYPECODE_OBJECT: // checkerr(ctxptr->errhp, OCIAnyDataAccess(ctxptr->svchp, ctxptr->errhp, // oan_buffer, (OCITypeCode) OCI_TYPECODE_OBJECT, @@ -211,52 +274,7 @@ return _stringrepres.str(); }; - -void BindParANYDATA::init(SqlStatement &stmt) -{ - sword res; - _anydatatdo = 0; - - - _oan_buffer = new OCIAnyData* [ _cnt ]; - - res = OCICALL(OCITypeByName(_stmt._env, _stmt._errh, _stmt._conn._svc_ctx, - (const oratext*)"SYS", strlen("SYS"), - (const oratext*)"ANYDATA", strlen("ANYDATA"), - 0, 0, - OCI_DURATION_SESSION, OCI_TYPEGET_ALL, - (OCIType**) &_anydatatdo - )); - oci_check_error(__TROTL_HERE__, _stmt._errh, res); - - if(_anydatatdo == NULL) - throw OciException(__TROTL_HERE__, "Unknown datatype in the database: SYS.ANYDATA"); - - for(int i=0; i<g_OCIPL_BULK_ROWS; i++) - { - _oan_buffer[i] = NULL; - } -} - -void BindParANYDATA::define_hook(SqlStatement &stmt) -{ - sword res = OCICALL(OCIDefineObject(defnpp, stmt._errh, - _anydatatdo, - (dvoid **) &(_oan_buffer[0]), //(dvoid **) &_oan_buffer, - (ub4 *) 0, - 0, //(dvoid **) &_any_indp, - (ub4 *) 0)); - oci_check_error(__TROTL_HERE__, stmt._errh, res); -// // TODO OCIDefineArrayOfStruct here ?? -} - -void BindParANYDATA::bind_hook(SqlStatement &stmt) -{ - //TODO - throw OciException(__TROTL_HERE__, "Not implemented yet"); -} - tstring SqlANYDATA::str() const { return _stringrepres.str(); Modified: trunk/tora/src/trotl/src/trotl_anydata.h =================================================================== --- trunk/tora/src/trotl/src/trotl_anydata.h 2010-09-24 12:20:23 UTC (rev 3692) +++ trunk/tora/src/trotl/src/trotl_anydata.h 2010-09-24 12:23:27 UTC (rev 3693) @@ -54,40 +54,41 @@ friend struct ConvertorForWrite; // TODO remember OCIConn or at least svcctx in this class - BindParANYDATA(unsigned int pos, SqlStatement &stmt, ColumnType &ct) : SqlStatement::BindPar(pos, stmt, ct) - , _oan_buffer(NULL), _any_indp(NULL) + BindParANYDATA(unsigned int pos, SqlStatement &stmt, ColumnType &ct) + : SqlStatement::BindPar(pos, stmt, ct) + , _oan_buffer(NULL) + , _any_indp(NULL) { - valuep = NULL; value_sz = 0; delete[] indp; indp = NULL; delete[] rcodep; rcodep = NULL; dty = SQLT_NTY; - value_sz = 0; type_name = ct.get_type_str(); + value_sz = sizeof(OCIAnyData*); + for(unsigned i = 0; i < _cnt; ++i) + { + ((ub2*)rlenp)[i] = (ub2) value_sz; + } + init(stmt); } - BindParANYDATA(unsigned int pos, SqlStatement &stmt, BindVarDecl &decl): SqlStatement::BindPar(pos, stmt, decl) - , _oan_buffer(NULL), _any_indp(NULL) + BindParANYDATA(unsigned int pos, SqlStatement &stmt, BindVarDecl &decl) + : SqlStatement::BindPar(pos, stmt, decl) + , _oan_buffer(NULL) + , _any_indp(NULL) { - valuep = NULL; dty = SQLT_NTY; - value_sz = 0; type_name = "SYS.ANYDATA"; + value_sz = sizeof(OCIAnyData*); + for(unsigned i = 0; i < _cnt; ++i) + { + ((ub4*)rlenp)[i] = (ub4) value_sz; + } + init(stmt); - }; - + } + ~BindParANYDATA() { - if(valuep) - { - delete[] (unsigned char*) valuep; - valuep = NULL; - } - /* - if(_xmlvaluep) - { - delete[] _xmlvaluep; - _xmlvaluep = NULL; - } - */ + // TODO free _any_indp, _oan_buffer } virtual tstring get_string(unsigned int row) const; Modified: trunk/tora/src/trotl/src/trotl_base.h =================================================================== --- trunk/tora/src/trotl/src/trotl_base.h 2010-09-24 12:20:23 UTC (rev 3692) +++ trunk/tora/src/trotl/src/trotl_base.h 2010-09-24 12:23:27 UTC (rev 3693) @@ -335,7 +335,7 @@ { typedef OciSimpleHandle<OCIEnv> super; - OciEnvAlloc(ub4 oci_mode=OCI_OBJECT) // OCI_OBJECT for OCINumber... functions + OciEnvAlloc(ub4 oci_mode=OCI_OBJECT|OCI_THREADED) // OCI_OBJECT for OCINumber... functions { sword res = OCICALL(OCIEnvCreate(&_handle, oci_mode, 0/*ctxp*/, 0, 0, 0, 0/*xtramem_sz*/, 0/*usrmempp*/)); //std::cerr << "OCIEnvCreate:" << res << std::endl; @@ -422,14 +422,40 @@ inline void oci_check_error(tstring where, OCIError* errh, sword res) { - if (res != OCI_SUCCESS) + switch(res) + { + case OCI_SUCCESS: + case OCI_SUCCESS_WITH_INFO: + break; + case OCI_ERROR: throw OciException(where, errh); + break; + case OCI_INVALID_HANDLE: + throw OciException(where, "Invalid handle"); + break; + default: + throw OciException(where, "Unsupported result code"); + break; + } } inline void oci_check_error(tstring where, OCIEnv* envh, sword res) { - if (res != OCI_SUCCESS) + switch(res) + { + case OCI_SUCCESS: + case OCI_SUCCESS_WITH_INFO: + break; + case OCI_ERROR: throw OciException(where, envh); + break; + case OCI_INVALID_HANDLE: + throw OciException(where, "Invalid handle"); + break; + default: + throw OciException(where, "Unsupported result code"); + break; + } } /* Modified: trunk/tora/src/trotl/src/trotl_common.h =================================================================== --- trunk/tora/src/trotl/src/trotl_common.h 2010-09-24 12:20:23 UTC (rev 3692) +++ trunk/tora/src/trotl/src/trotl_common.h 2010-09-24 12:23:27 UTC (rev 3693) @@ -136,7 +136,6 @@ #define __TROTL_HERE1__(x) STR(x)"\t" + __PRETTY_FUNCTION__ // #define __HERE2__(x,y) ::trotl::tstring("("y":" STR(x)"(") + __PRETTY_FUNCTION__ +")" // #define __HERE3__(x,y) ::trotl::tstring("\n(") + __PRETTY_FUNCTION__ + ") " y ":" STR(x) + "\n" - #define STR(a) #a #else // #define __TROTL_HERE__ __HERE3__(__LINE__, __FILE__) // #define __HERE_SHORT__ __HERE3__(__LINE__, __FILE__) @@ -145,10 +144,11 @@ // #define __HERE3__(x,y) std::string("\n(") + __FUNCTION__ + ") " y ":" STR(x) + "\n" #define __TROTL_HERE__ std::string(__FILE__) + ":"__TROTL_HERE1__(__LINE__) #define __TROTL_HERE1__(x) STR(x)"\t" + __FUNCSIG__ - #define STR(a) #a #endif //__GNUC__ #else //DEBUG #define __TROTL_HERE__ "" #endif +#define STR(a) #a + #endif Modified: trunk/tora/src/trotl/src/trotl_date.h =================================================================== --- trunk/tora/src/trotl/src/trotl_date.h 2010-09-24 12:20:23 UTC (rev 3692) +++ trunk/tora/src/trotl/src/trotl_date.h 2010-09-24 12:23:27 UTC (rev 3693) @@ -52,28 +52,32 @@ */ struct TROTL_EXPORT BindParDate: public SqlStatement::BindPar { - BindParDate(unsigned int pos, SqlStatement &stmt, BindVarDecl &decl): SqlStatement::BindPar(pos, stmt, decl) + BindParDate(unsigned int pos, SqlStatement &stmt, ColumnType &ct) : SqlStatement::BindPar(pos, stmt, ct) { - valuep = new unsigned char [ _cnt * sizeof(OCIDate) ]; -// memset(valuep, 0x00, _cnt * sizeof(OCIDate) ); + valuep = (void**) new unsigned char [ _cnt * sizeof(OCIDate) ]; + memset(valuep, 0x00, _cnt * sizeof(OCIDate) ); dty = SQLT_ODT; value_sz = sizeof(OCIDate); - type_name = "DATE"; - - memset(valuep, 0x00, _cnt * sizeof(OCIDate) ); + for(unsigned i = 0; i < _cnt; ++i) + { + ((ub2*)rlenp)[i] = (ub2) value_sz; + } + type_name = ct.get_type_str(); } - BindParDate(unsigned int pos, SqlStatement &stmt, ColumnType &ct) : SqlStatement::BindPar(pos, stmt, ct) + BindParDate(unsigned int pos, SqlStatement &stmt, BindVarDecl &decl): SqlStatement::BindPar(pos, stmt, decl) { - valuep = new unsigned char [ _cnt * sizeof(OCIDate) ]; -// memset(valuep, 0x00, _cnt * sizeof(OCIDate) ); + valuep = (void**) new unsigned char [ _cnt * sizeof(OCIDate) ]; + memset(valuep, 0x00, _cnt * sizeof(OCIDate) ); dty = SQLT_ODT; value_sz = sizeof(OCIDate); - type_name = ct.get_type_str(); - - memset(valuep, 0x00, _cnt * sizeof(OCIDate) ); + for(unsigned i = 0; i < _cnt; ++i) + { + ((ub4*)rlenp)[i] = (ub4) value_sz; + } + type_name = "DATE"; } ~BindParDate() @@ -85,25 +89,8 @@ } } -// template<class return_type> -// return_type get_number(unsigned int row) const -// { -// throw_ocipl_exception( -// OciException( -// __TROTL_HERE__, -// "Invalid datatype in conversion(BindParDate to %d%s)\n" -// ).arg(sizeof(return_type)).arg(typeid(return_type).name()) -// ); -// } - virtual tstring get_string(unsigned int row) const; -// 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: BindParDate(const BindParDate &other); }; Modified: trunk/tora/src/trotl/src/trotl_int.h =================================================================== --- trunk/tora/src/trotl/src/trotl_int.h 2010-09-24 12:20:23 UTC (rev 3692) +++ trunk/tora/src/trotl/src/trotl_int.h 2010-09-24 12:23:27 UTC (rev 3693) @@ -192,31 +192,30 @@ { BindParNumber(unsigned int pos, SqlStatement &stmt, ColumnType &ct) : SqlStatement::BindPar(pos, stmt, ct) { - // SQLT_NUM - unsigned char[22] - // I am not sure here, SQLT_VNU can one byte longer than SQLT_NUM - probably - valuep = new unsigned char [ _cnt * ( OCI_NUMBER_SIZE + 1) ]; + valuep = (void**) new unsigned char [ _cnt * (OCI_NUMBER_SIZE) ]; + memset(valuep, 0x00, _cnt * (OCI_NUMBER_SIZE) ); - // memset(valuep, 0x5a, cnt * OCI_NUMBER_SIZE ); - // ((unsigned char*)valuep)[0] = pos; - memset(valuep, 0x00, _cnt * (OCI_NUMBER_SIZE+1) ); - dty = SQLT_VNU; //dty = SQLT_NUM; - value_sz = OCI_NUMBER_SIZE + 1; + value_sz = OCI_NUMBER_SIZE; + for(unsigned i = 0; i < _cnt; ++i) + { + ((ub2*)rlenp)[i] = (ub2) value_sz; + } type_name = ct.get_type_str(); } BindParNumber(unsigned int pos, SqlStatement &stmt, BindVarDecl &decl): SqlStatement::BindPar(pos, stmt, decl) { - // SQLT_NUM - unsigned char[22] - // I am not sure here, SQLT_VNU can one byte longer than SQLT_NUM - probably - valuep = new unsigned char [ decl.bracket[1] * ( OCI_NUMBER_SIZE + 1) ]; + valuep = (void**) new unsigned char [ decl.bracket[1] * (OCI_NUMBER_SIZE) ]; + memset(valuep, 0x00, decl.bracket[1] * (OCI_NUMBER_SIZE) ); - // memset(valuep, 0x5a, cnt * OCI_NUMBER_SIZE ); - // ((unsigned char*)valuep)[0] = pos; - memset(valuep, 0x00, decl.bracket[1] * (OCI_NUMBER_SIZE+1) ); - dty = SQLT_VNU; //dty = SQLT_NUM; - value_sz = OCI_NUMBER_SIZE + 1; + value_sz = OCI_NUMBER_SIZE; + for(unsigned i = 0; i < _cnt; ++i) + { + ((ub4*)rlenp)[i] = (ub4) value_sz; + } + type_name = "NUMBER"; }; Modified: trunk/tora/src/trotl/src/trotl_lob.cpp =================================================================== --- trunk/tora/src/trotl/src/trotl_lob.cpp 2010-09-24 12:20:23 UTC (rev 3692) +++ trunk/tora/src/trotl/src/trotl_lob.cpp 2010-09-24 12:23:27 UTC (rev 3693) @@ -58,22 +58,30 @@ BindParLob::BindParLob(unsigned int pos, SqlStatement &stmt, ColumnType &ct) : BindPar(pos, stmt, ct) { //valuep = new unsigned char [ _cnt * ( sizeof(OCILobLocator*) ) ]; - valuep = malloc( _cnt * sizeof(OCILobLocator*) ); + valuep = (void**) malloc( _cnt * sizeof(OCILobLocator*) ); + memset(valuep, 0, _cnt * sizeof(OCILobLocator*) ); - ////memset(valuep, 0x5a, _cnt * sizeof(OCILobLocator*) ); + value_sz = sizeof(OCILobLocator*); + for(unsigned i = 0; i < _cnt; ++i) + { + ((ub2*)rlenp)[i] = (ub2) value_sz; + } - value_sz = sizeof(OCILobLocator*); descAlloc(); } BindParLob::BindParLob(unsigned int pos, SqlStatement &stmt, BindVarDecl &decl): BindPar(pos, stmt, decl) { //valuep = new unsigned char [ decl.bracket[1] * ( OCI_NUMBER_SIZE + 1) ]; - valuep = malloc( _cnt * sizeof(OCILobLocator*) ); + valuep = (void**) malloc( _cnt * sizeof(OCILobLocator*) ); + memset(valuep, 0, _cnt * sizeof(OCILobLocator*) ); - ////memset(valuep, 0x5a, _cnt * sizeof(OCILobLocator*) ); + value_sz = sizeof(OCILobLocator*); + for(unsigned i = 0; i < _cnt; ++i) + { + ((ub4*)rlenp)[i] = (ub4) value_sz; + } - value_sz = sizeof(OCILobLocator*); descAlloc(); }; Modified: trunk/tora/src/trotl/src/trotl_misc.h =================================================================== --- trunk/tora/src/trotl/src/trotl_misc.h 2010-09-24 12:20:23 UTC (rev 3692) +++ trunk/tora/src/trotl/src/trotl_misc.h 2010-09-24 12:23:27 UTC (rev 3693) @@ -54,29 +54,26 @@ */ struct TROTL_EXPORT BindParMisc: public SqlStatement::BindPar { -public: BindParMisc(unsigned int pos, SqlStatement &stmt, BindVarDecl &decl) : SqlStatement::BindPar(pos, stmt, decl) { // amount of bytes = (string length +1 ) * (array length) - valuep = new char [ (128) * (decl.bracket[1]) ]; + valuep = (void**) new char [ (128) * (decl.bracket[1]) ]; + memset(valuep, 0x00, 128 * (decl.bracket[1])); + dty = SQLT_STR; value_sz = 128; - alenp = new ub2 [decl.bracket[1]]; type_name = typeid(tstring).name(); - - memset(valuep, 0x00, 128 * (decl.bracket[1])); } BindParMisc(unsigned int pos, SqlStatement &stmt, ColumnType &ct) : SqlStatement::BindPar(pos, stmt, ct) { // amount of bytes = (string length +1 ) * (array length) - valuep = new char [ ( 128 ) * (_cnt) ]; // +1 for ending zero + valuep = (void**) new char [ ( 128 ) * (_cnt) ]; // +1 for ending zero + memset(valuep, 0x00, (128) * _cnt); + dty = SQLT_STR; value_sz = 128; - alenp = new ub2 [_cnt]; type_name = typeid(tstring).name(); - - memset(valuep, 0x00, (128) * _cnt); } @@ -87,16 +84,11 @@ delete[] (char*)valuep; valuep = NULL; } - if(alenp) - { - delete[] (ub2*)alenp; - alenp = NULL; - } } virtual tstring get_string(unsigned int row) const { - return is_null(row) ? "NULL" : tstring(((char*)valuep)+(row * value_sz)); + return is_null(row) ? "NULL" : tstring(((char*)valuep)+(row * value_sz)); } protected: Modified: trunk/tora/src/trotl/src/trotl_rid.cpp =================================================================== --- trunk/tora/src/trotl/src/trotl_rid.cpp 2010-09-24 12:20:23 UTC (rev 3692) +++ trunk/tora/src/trotl/src/trotl_rid.cpp 2010-09-24 12:23:27 UTC (rev 3693) @@ -47,13 +47,12 @@ // // Register Bind datatypes in factory(Define - SELECT) -Util::RegisterInFactory<BindParRid, DefineParFactTwoParmSing, int> regDefineNumberRid(SQLT_RDD); +Util::RegisterInFactory<BindParRid, DefineParFactTwoParmSing, int> regDefineRid(SQLT_RDD); BindParRid::BindParRid(unsigned int pos, SqlStatement &stmt, BindVarDecl &decl): BindPar(pos, stmt, decl) { - //valuep = new unsigned char [ decl.bracket[1] * ( OCI_NUMBER_SIZE + 1) ]; - valuep = malloc( _cnt * sizeof(OCIRowid*) ); - ////memset(valuep, 0x5a, _cnt * sizeof(OCIRowid*) ); + valuep = (void**) malloc( _cnt * sizeof(OCIRowid*) ); + memset(valuep, 0, _cnt * sizeof(OCIRowid*) ); dty = SQLT_RDD; value_sz = sizeof(OCIRowid*); @@ -64,9 +63,8 @@ BindParRid::BindParRid(unsigned int pos, SqlStatement &stmt, ColumnType &ct) : BindPar(pos, stmt, ct) { - //valuep = new unsigned char [ _cnt * ( sizeof(OCIRowid*) ) ]; - valuep = malloc( _cnt * sizeof(OCIRowid*) ); - ////memset(valuep, 0x5a, _cnt * sizeof(OCIRowid*) ); + valuep = (void**) malloc( _cnt * sizeof(OCIRowid*) ); + memset(valuep, 0, _cnt * sizeof(OCIRowid*) ); dty = SQLT_RDD; value_sz = sizeof(OCIRowid*); Modified: trunk/tora/src/trotl/src/trotl_stat.cpp =================================================================== --- trunk/tora/src/trotl/src/trotl_stat.cpp 2010-09-24 12:20:23 UTC (rev 3692) +++ trunk/tora/src/trotl/src/trotl_stat.cpp 2010-09-24 12:23:27 UTC (rev 3693) @@ -48,7 +48,7 @@ namespace trotl { -int TROTL_EXPORT g_OCIPL_BULK_ROWS = 3; +int TROTL_EXPORT g_OCIPL_BULK_ROWS = 1; int TROTL_EXPORT g_OCIPL_MAX_LONG = 30000; @@ -98,11 +98,11 @@ for(unsigned dpos = 1; dpos <= get_column_count(); ++dpos) { std::auto_ptr<BindPar> bp; - dvoid* parmdp; - sword res = OCICALL(OCIParamGet(_handle, get_type_id(), _errh, &parmdp, dpos)); + OCIParam* parmdp; + sword res = OCICALL(OCIParamGet(_handle, get_type_id(), _errh, (void**)&parmdp, dpos)); oci_check_error(__TROTL_HERE__, _errh, res); - _columns[dpos].describe(_errh, parmdp); + _columns[dpos].describe(*this, parmdp); res = OCICALL(OCIDescriptorFree(parmdp, OCI_DTYPE_PARAM)); oci_check_error(__TROTL_HERE__, _env, res); @@ -112,7 +112,7 @@ // << "This: " << this << std::endl // << "Columns:" << _columns[dpos].get_type_str(true) << std::endl; - // Use column datatype for lookup in hash table + // Use column datatype for lookup in a hash table // and call appropriate create function from the factory if( _columns[dpos]._data_type != SQLT_NTY) _all_defines[dpos] = DefineParFactTwoParmSing::Instance().create( @@ -128,8 +128,12 @@ _columns[dpos] ); if(_all_defines[dpos].get() == NULL) - throw OciException(__TROTL_HERE__, "DefinePar: Data type not registered: %s(%d)\n" - ).arg(_columns[dpos]._data_type_name).arg(_columns[dpos]._data_type); + throw OciException(__TROTL_HERE__, "DefinePar: Data type not registered: %s(%d:%d:%d:%s)\n") + .arg(_columns[dpos]._data_type_name) + .arg(_columns[dpos]._data_type) + .arg(_columns[dpos]._typecode) + .arg(_columns[dpos]._collection_typecode) + .arg(_columns[dpos]._data_type_name); define(*_all_defines[dpos]); } _state |= DEFINED; @@ -399,9 +403,10 @@ _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 << "OCIStmtExecute" << std::endl; //std::cout << std::endl // << "iters:" << iters << std::endl; @@ -507,6 +512,7 @@ // << "This: " << this << std::endl // << "Bind:'"<< bp.bind_name << "' " << bp.bind_name.length() << std::endl; + sword res = OCICALL(OCIBindByName (_handle, &bp.bindp, _errh, @@ -523,7 +529,6 @@ //NULL for non-PL/SQL statements (ub4*)(((_stmt_type == STMT_DECLARE ||_stmt_type == STMT_BEGIN ) && bp._max_cnt > 1) ? &bp._cnt : NULL), OCI_DEFAULT)); - oci_check_error(__TROTL_HERE__, _errh, res); // std::cout << std::endl @@ -538,25 +543,25 @@ bp._bound = true; } -void SqlStatement::define(BindPar &dp) -{ - sword res = OCICALL(OCIDefineByPos(_handle/*stmtp*/, - &dp.defnpp, - _errh, - dp._pos, - dp.valuep, - dp.value_sz, - dp.dty, - dp.indp, - dp.rlenp, - dp.rcodep, -// (ub2*)0, (ub2*)0, - OCI_DEFAULT)); - oci_check_error(__TROTL_HERE__, _errh, res); + void SqlStatement::define(BindPar &dp) + { + sword res = OCICALL(OCIDefineByPos(_handle/*stmtp*/, + &dp.defnpp, // (OCIDefine **) + _errh, // (OCIError*) + dp._pos, // ub4 position + dp.valuep, // dvoid *valuep + dp.value_sz, // sb4 value_sz + dp.dty, // ub2 dty + dp.indp, // dvoid *indp + (ub2*) dp.rlenp, // ub2 *rlenp + NULL, // ub2 *rcodep + dp.mode)); + oci_check_error(__TROTL_HERE__, _errh, res); + std::cout << "OCIDefineByPos" << std::endl; + + dp.define_hook(*this); + } - dp.define_hook(*this); -} - SqlStatement::~SqlStatement() { if( get_stmt_type() == STMT_SELECT ) @@ -568,7 +573,7 @@ delete [] _in_binds; delete [] _out_binds; } - _state |= 255; + _state |= 0xff; }; template<> Modified: trunk/tora/src/trotl/src/trotl_stat.h =================================================================== --- trunk/tora/src/trotl/src/trotl_stat.h 2010-09-24 12:20:23 UTC (rev 3692) +++ trunk/tora/src/trotl/src/trotl_stat.h 2010-09-24 12:23:27 UTC (rev 3693) @@ -87,93 +87,120 @@ **/ struct TROTL_EXPORT BindPar { - enum { - BIND_IN=1, BIND_INOUT=2, BIND_OUT=4, DEFINE_SELECT=8 - }; + enum { + BIND_IN=1, + BIND_INOUT=2, + BIND_OUT=4, + DEFINE_SELECT=8 + }; + + /* Placeholder for Bind operations */ + BindPar(unsigned int pos, SqlStatement &stmt, BindVarDecl &decl) + : valuep(NULL) + , indp(NULL) + , rlenp(NULL) + // , rcodep(NULL) + , alenp(NULL) + , mode(OCI_DEFAULT) + , bindp(NULL) + , defnpp(NULL) + , _env(stmt._env) + , _stmt(stmt) + , _pos(pos) + , _max_cnt(decl.bracket[1]) + , _cnt(decl.bracket[1]) + , _bound(false) + , type_name("") + , bind_name(decl.bindname) + , bind_typename(decl.bindtype) + { + indp = new OCIInd [_cnt]; + memset(indp, 0, sizeof(OCIInd)*_cnt); + + rlenp = malloc( sizeof(ub4) * _cnt); // OCIBindByPos uses ub4* for lenp + alenp = new ub2 [_cnt]; + + if(decl.inout == "in") + _bind_type = BIND_IN; + else if(decl.inout == "inout") + _bind_type = BIND_INOUT; + else if(decl.inout == "out") + _bind_type = BIND_OUT; + }; - BindPar(unsigned int pos, SqlStatement &stmt, BindVarDecl &decl): - valuep(NULL), indp(NULL), rlenp(NULL), rcodep(NULL), alenp(NULL), - bindp(NULL), defnpp(NULL), _env(stmt._env), _stmt(stmt),//_conn(conn), - _pos(pos), _max_cnt(decl.bracket[1]), _cnt(decl.bracket[1]), - _bound(false), type_name(""), bind_name(decl.bindname), bind_typename(decl.bindtype) - { - indp = new OCIInd [_cnt]; - memset(indp, 0, sizeof(OCIInd)*_cnt); -//// memset(indp, 0x5a, sizeof(OCIInd)*_cnt); + /* Placeholder for Define operations */ + BindPar(unsigned int pos, SqlStatement &stmt, ColumnType &ct) + : valuep(NULL) + , indp(NULL) + , rlenp(NULL) + // , rcodep(NULL) + , alenp(NULL) + , mode(OCI_DEFAULT) + , bindp(NULL) + , defnpp(NULL) + , _env(stmt._env) + , _stmt(stmt) + , _pos(pos) + , _max_cnt(g_OCIPL_BULK_ROWS) + , _cnt(g_OCIPL_BULK_ROWS) + , _bound(false) + , type_name("") + , bind_name("") + , bind_typename("") + { + indp = new OCIInd [_cnt]; + memset(indp, 0, sizeof(OCIInd)*_cnt); + + rlenp = malloc( sizeof(ub2) * _cnt); // OciDefineByPos uses ub2* for lenp + + _bind_type = DEFINE_SELECT; + }; - rlenp = new ub2 [_cnt]; - rcodep= new ub2 [_cnt]; - - if(decl.inout == "in") - _bind_type = BIND_IN; - else if(decl.inout == "inout") - _bind_type = BIND_INOUT; - else if(decl.inout == "out") - _bind_type = BIND_OUT; - - //std::cerr << "BindPar::BindPar" << std::endl; - }; + virtual ~BindPar() + { + if(indp) { delete[] indp; indp = NULL; } + if(rlenp) { free(rlenp); rlenp = NULL; } + // if(rcodep) { delete[] rcodep; rcodep = NULL; } + if(alenp) {delete[] alenp; alenp = NULL; } + }; - BindPar(unsigned int pos, SqlStatement &stmt, ColumnType &ct): - valuep(NULL), indp(NULL), rlenp(NULL), rcodep(NULL), alenp(NULL), - bindp(NULL), defnpp(NULL), _env(stmt._env), _stmt(stmt),//_conn(conn), - _pos(pos), _max_cnt(g_OCIPL_BULK_ROWS), _cnt(g_OCIPL_BULK_ROWS), - _bound(false), type_name(""), bind_name(""), bind_typename("") - { - indp = new OCIInd [_cnt]; - memset(indp, 0, sizeof(OCIInd)*_cnt); - //// memset(indp, 0x5a, sizeof(OCIInd)*_cnt); - - //alenp = new ub2 [_cnt]; - rcodep= new ub2 [_cnt]; - - _bind_type = DEFINE_SELECT; - - //std::cerr<< "BindPar::BindPar" << std::endl; - }; - - virtual ~BindPar() - { - if(indp) delete[] indp; - if(rlenp) delete[] rlenp; - if(rcodep) delete[] rcodep; - if(alenp) delete[] alenp; - indp = NULL; - rlenp = rcodep = alenp = NULL; - } - - // every datatype can be converted to a string - virtual tstring get_string(unsigned int row) const = 0; + // every datatype can be converted to a string + virtual tstring get_string(unsigned int row) const = 0; - // This callback is used by descendents to call - // OCIBindArrayOfStructures, OCIBindObject etc, ... - virtual void bind_hook(SqlStatement&) {}; - virtual void define_hook(SqlStatement&) {}; + /* These two callbacks are used by descendents to call + * OCIBindArrayOfStructures, OCIBindObject etc, ... + * is called *after* OCIDefineByPos + */ + virtual void bind_hook(SqlStatement&) {}; + virtual void define_hook(SqlStatement&) {}; - dvoid *valuep; - sb4 value_sz; - ub2 dty; - OCIInd *indp; - ub2 *rlenp, *rcodep; - ub2 *alenp; - OCIBind *bindp; - OCIDefine *defnpp; //TODO union with OCIBind *bindpp - OciEnv &_env; -// OciConnection &_conn; - SqlStatement &_stmt; - unsigned int _pos, /*_cnt,*/ _max_cnt, _bind_type; - size_t _cnt; - bool _bound; - tstring type_name, bind_name, bind_typename; + /* members used for OCI calls */ + dvoid **valuep; + sb4 value_sz; + ub2 dty; + OCIInd *indp; // OCIInd aka sb2 ignored for SQL_NTY and SQL_REF + void *rlenp; + //ub2 *rcodep; + ub2 *alenp; + ub4 mode; // define mode = OCI_DEFAULT, except for SQLT_LONG = OCI_DYNAMIC_FETCH TODO fix long + OCIBind *bindp; + OCIDefine *defnpp; //TODO union with OCIBind *bindpp + + OciEnv &_env; + SqlStatement &_stmt; + unsigned int _pos, /*_cnt,*/ _max_cnt, _bind_type; + size_t _cnt; + bool _bound; + tstring type_name, bind_name, bind_typename; - bool is_null(unsigned row) const {return indp[row]==OCI_IND_NULL;}; - bool is_not_null(unsigned row) const {return indp[row]!=OCI_IND_NULL;}; - + /* NOTE these two function do not work with complex types SQLT_NTY */ + bool is_null(unsigned row) const {return indp[row]==OCI_IND_NULL;}; + bool is_not_null(unsigned row) const {return indp[row]!=OCI_IND_NULL;}; protected: - BindPar(const BindPar &other); - friend class SqlStatement; + BindPar(const BindPar &other); + friend class SqlStatement; }; // class BindPar - + SqlStatement(OciConnection& conn, const tstring& stmt, ub4 lang=OCI_NTV_SYNTAX, int bulk_rows=g_OCIPL_BULK_ROWS); bool execute_internal(ub4 rows, ub4 mode); Modified: trunk/tora/src/trotl/src/trotl_string.h =================================================================== --- trunk/tora/src/trotl/src/trotl_string.h 2010-09-24 12:20:23 UTC (rev 3692) +++ trunk/tora/src/trotl/src/trotl_string.h 2010-09-24 12:23:27 UTC (rev 3693) @@ -60,34 +60,28 @@ // returned. struct TROTL_EXPORT BindParVarchar: public SqlStatement::BindPar { -public: - BindParVarchar(unsigned int pos, SqlStatement &stmt, BindVarDecl &decl) : SqlStatement::BindPar(pos, stmt, decl) + BindParVarchar(unsigned int pos, SqlStatement &stmt, ColumnType &ct) : SqlStatement::BindPar(pos, stmt, ct) { - // amount of bytes = (string length +1 ) * (array length) - valuep = new char [ (decl.bracket[0]+1) * (decl.bracket[1]) ]; + /* amount of bytes = (string length +1 ) * (array length) */ + valuep = (void**) new char [ ( ct._width + 1 ) * (_cnt) ]; // +1 for ending zero + memset(valuep, 0x00, (ct._width + 1) * _cnt); + dty = SQLT_STR; - value_sz = decl.bracket[0]+1; - alenp = new ub2 [decl.bracket[1]]; + value_sz = ct._width + 1; type_name = typeid(tstring).name(); - - memset(valuep, 0x00, (decl.bracket[0]+1) * (decl.bracket[1])); - //memset(alenp, 0x00, (decl.bracket[0]+1) * decl.bracket[1]); } - BindParVarchar(unsigned int pos, SqlStatement &stmt, ColumnType &ct) : SqlStatement::BindPar(pos, stmt, ct) + BindParVarchar(unsigned int pos, SqlStatement &stmt, BindVarDecl &decl) : SqlStatement::BindPar(pos, stmt, decl) { // amount of bytes = (string length +1 ) * (array length) - valuep = new char [ ( ct._width + 1 ) * (_cnt) ]; // +1 for ending zero + valuep = (void**) new char [ (decl.bracket[0]+1) * (decl.bracket[1]) ]; + memset(valuep, 0x00, (decl.bracket[0]+1) * (decl.bracket[1])); + dty = SQLT_STR; - value_sz = ct._width + 1; - alenp = new ub2 [_cnt]; + value_sz = decl.bracket[0]+1; type_name = typeid(tstring).name(); - - memset(valuep, 0x00, (ct._width + 1) * _cnt); - //memset(alenp, 0x00, sizeof(ub2) * _cnt); } - ~BindParVarchar() { if(valuep) @@ -95,11 +89,6 @@ delete[] (char*)valuep; valuep = NULL; } - if(alenp) - { - delete[] (ub2*)alenp; - alenp = NULL; - } } // template<class return_type> @@ -132,31 +121,24 @@ **/ struct TROTL_EXPORT BindParChar: public SqlStatement::BindPar { -public: - BindParChar(unsigned int pos, SqlStatement &stmt, BindVarDecl &decl): SqlStatement::BindPar(pos, stmt, decl) + BindParChar(unsigned int pos, SqlStatement &stmt, ColumnType &ct) : SqlStatement::BindPar(pos, stmt, ct) { - valuep = new char [ (decl.bracket[0]) * (decl.bracket[1]) ]; + valuep = (void**) new char [ ( ct._width + 1 ) * _cnt ]; + memset(valuep, 0x00, ( ct._width + 1 ) * _cnt); + dty = SQLT_CHR; - value_sz = decl.bracket[0]; - alenp = new ub2 [decl.bracket[1]]; + value_sz = ct._width; type_name = typeid(tstring).name(); - - memset(valuep, 0x00, (decl.bracket[0]) * (decl.bracket[1])); - memset(alenp, 0x00, sizeof(ub2) * decl.bracket[1]); - //memset(valuep, 0x5a, (decl.bracket[0]) * (decl.bracket[1])); } - BindParChar(unsigned int pos, SqlStatement &stmt, ColumnType &ct) : SqlStatement::BindPar(pos, stmt, ct) + BindParChar(unsigned int pos, SqlStatement &stmt, BindVarDecl &decl): SqlStatement::BindPar(pos, stmt, decl) { - // amount of bytes = (string length +1 ) * (array length) - valuep = new char [ ( ct._width + 1 ) * _cnt ]; + valuep = (void**) new char [ (decl.bracket[0]) * (decl.bracket[1]) ]; + memset(valuep, 0x00, (decl.bracket[0]) * (decl.bracket[1])); + dty = SQLT_CHR; - value_sz = ct._width; - alenp = new ub2 [_cnt]; + value_sz = decl.bracket[0]; type_name = typeid(tstring).name(); - - memset(valuep, 0x00, ( ct._width + 1 ) * _cnt); - memset(alenp, 0x00, sizeof(ub2) * _cnt); } ~BindParChar() @@ -166,21 +148,8 @@ delete[] (char*)valuep; valuep = NULL; } - if(alenp) - { - delete[] (ub2*)alenp; - alenp = NULL; - } } - template<class return_type> - return_type get_number(unsigned int row) const - { - throw OciException(__TROTL_HERE__, "Invalid datatype in conversion(BindParChar to %d%s)\n" - ).arg(sizeof(return_type)).arg(typeid(return_type).name()); -// return (return_type)0; - } - virtual tstring get_string(unsigned int row) const { // std::cout << " S:" << value_sz << ":" << dty << " "; @@ -190,12 +159,6 @@ return ""; } -// 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: BindParChar(const BindParChar &other); }; @@ -204,26 +167,25 @@ **/ struct TROTL_EXPORT BindParRaw: public SqlStatement::BindPar { -public: - BindParRaw(unsigned int pos, SqlStatement &stmt, BindVarDecl &decl): SqlStatement::BindPar(pos, stmt, decl) - { - valuep = new char [ (decl.bracket[0]) * (decl.bracket[1]) ]; - dty = SQLT_BIN; - value_sz = decl.bracket[0]; - alenp = new ub2 [decl.bracket[1]]; - type_name = "RAW"; - } - BindParRaw(unsigned int pos, SqlStatement &stmt, ColumnType &ct) : SqlStatement::BindPar(pos, stmt, ct) { // amount of bytes = (string length +1 ) * (array length) - valuep = new char [ ( ct._width + 1 ) * _cnt ]; + valuep = (void**) new char [ ( ct._width + 1 ) * _cnt ]; + memset(valuep, 0x00, (ct._width + 1) * _cnt); + dty = SQLT_BIN; value_sz = ct._width; - alenp = new ub2 [_cnt]; type_name = ct.get_type_str(); + } - //// memset(valuep, 0x5a, value_sz * _cnt); + BindParRaw(unsigned int pos, SqlStatement &stmt, BindVarDecl &decl): SqlStatement::BindPar(pos, stmt, decl) + { + valuep = (void**) new char [ (decl.bracket[0]) * (decl.bracket[1]) ]; + memset(valuep, 0x00, (decl.bracket[0]) * (decl.bracket[1])); + + dty = SQLT_BIN; + value_sz = decl.bracket[0]; + type_name = "RAW"; } ~BindParRaw() @@ -233,21 +195,8 @@ delete[] (char*)valuep; valuep = NULL; } - if(alenp) - { - delete[] (ub2*)alenp; - alenp = NULL; - } } - - template<class return_type> - return_type get_number(unsigned int row) const - { - throw OciException(__TROTL_HERE__, "Invalid datatype in conversion(BindParRaw to %d%s)\n" - ).arg(sizeof(return_type)).arg(typeid(return_type).name()); - return (return_type)0; - } - + virtual tstring get_string(unsigned int row) const { if(!indp[row]) Modified: trunk/tora/src/trotl/src/trotl_var.cpp =================================================================== --- trunk/tora/src/trotl/src/trotl_var.cpp 2010-09-24 12:20:23 UTC (rev 3692) +++ trunk/tora/src/trotl/src/trotl_var.cpp 2010-09-24 12:23:27 UTC (rev 3693) @@ -40,15 +40,25 @@ #endif #include "trotl_var.h" +#include "trotl_stat.h" namespace trotl { -ColumnType::ColumnType(OCIError* errh, dvoid* handle) +ColumnType::ColumnType(SqlStatement &stat, dvoid* handle): _data_type(0) + , _width(0) + , _char_semantics(0) + , _scale(-127) + , _precision(0) + , _nullable(false) + , _utf16(false) + , _collection_dschp(NULL) + , _tdo(NULL) + , _oref(NULL) { - describe(errh, handle); + describe(stat, handle); } -void ColumnType::describe(OCIError* errh, dvoid* handle) +void ColumnType::describe(SqlStatement &stat, dvoid* handle) { // get column name text* pcol_name = NULL; @@ -58,26 +68,40 @@ ub1 cform; sword res; + OCIDescribe *dschp = (OCIDescribe *) 0; + OCIParam *parmp; + ub1 fsprecision, lfprecision; + size = sizeof(pcol_name); - res = OCICALL(OCIAttrGet(handle, OCI_DTYPE_PARAM, &pcol_name, &size, OCI_ATTR_NAME, errh)); - oci_check_error(__TROTL_HERE__, errh, res); + res = OCICALL(OCIAttrGet(handle, OCI_DTYPE_PARAM, &pcol_name, &size, OCI_ATTR_NAME, stat._errh)); + oci_check_error(__TROTL_HERE__, stat._errh, res); _column_name.assign((const char*)pcol_name, size); + // TODO use this attribute + size = sizeof(fsprecision); + res = OCICALL(OCIAttrGet(handle, OCI_DTYPE_PARAM, (dvoid*)&fsprecision, &size, OCI_ATTR_FSPRECISION, stat._errh)); + oci_check_error(__TROTL_HERE__, stat._errh, res); + + // TODO use this attribute + size = sizeof(lfprecision); + res = OCICALL(OCIAttrGet(handle, OCI_DTYPE_PARAM, (dvoid*)&lfprecision, &size, OCI_ATTR_LFPRECISION, stat._errh)); + oci_check_error(__TROTL_HERE__, stat._errh, res); + // get column data type size = sizeof(_data_type); - res = OCICALL(OCIAttrGet(handle, OCI_DTYPE_PARAM, &_data_type, &size, OCI_ATTR_DATA_TYPE, errh)); - oci_check_error(__TROTL_HERE__, errh, res); + res = OCICALL(OCIAttrGet(handle, OCI_DTYPE_PARAM, &_data_type, &size, OCI_ATTR_DATA_TYPE, stat._errh)); + oci_check_error(__TROTL_HERE__, stat._errh, res); // get NULL-ability flag size = sizeof(_nullable); - res = OCICALL(OCIAttrGet(handle, OCI_DTYPE_PARAM, &_nullable, &size, OCI_ATTR_IS_NULL, errh)); - oci_check_error(__TROTL_HERE__, errh, res); + res = OCICALL(OCIAttrGet(handle, OCI_DTYPE_PARAM, &_nullable, &size, OCI_ATTR_IS_NULL, stat._errh)); + oci_check_error(__TROTL_HERE__, stat._errh, res); #if ORACLE_MAJOR_VERSION>=9 // Oracle 9 -> // retrieve the length semantics for the column size = sizeof(_char_semantics); - res = OCICALL(OCIAttrGet(handle, OCI_DTYPE_PARAM, &_char_semantics, &size, OCI_ATTR_CHAR_USED, errh)); + res = OCICALL(OCIAttrGet(handle, OCI_DTYPE_PARAM, &_char_semantics, &size, OCI_ATTR_CHAR_USED, stat._errh)); if (res != OCI_SUCCESS) _char_semantics = 0; // <- Oracle 9 @@ -86,32 +110,33 @@ if (_char_semantics) { // get the column width in characters - res = OCICALL(OCIAttrGet(handle, OCI_DTYPE_PARAM, &_width, &size, OCI_ATTR_CHAR_SIZE, errh)); - oci_check_error(__TROTL_HERE__, errh, res); + res = OCICALL(OCIAttrGet(handle, OCI_DTYPE_PARAM, &_width, &size, OCI_ATTR_CHAR_SIZE, stat._errh)); + oci_check_error(__TROTL_HERE__, stat._errh, res); } else #endif { // get the column width in bytes - res = OCICALL(OCIAttrGet(handle, OCI_DTYPE_PARAM, &_width, &size, OCI_ATTR_DATA_SIZE, errh)); - oci_check_error(__TROTL_HERE__, errh, res); + res = OCICALL(OCIAttrGet(handle, OCI_DTYPE_PARAM, &_width, &size, OCI_ATTR_DATA_SIZE, stat._errh)); + oci_check_error(__TROTL_HERE__, stat._errh, res); } - switch(_data_type) { + switch(_data_type) + { default: //case OCI_TYPECODE_VARCHAR: _precision = 0; _scale = -127; break; - case SQLT_NUM: { + case SQLT_NUM: size = sizeof(_precision); - res = OCICALL(OCIAttrGet(handle, OCI_DTYPE_PARAM, &_precision, &size, OCI_ATTR_PRECISION, errh)); - oci_check_error(__TROTL_HERE__, errh, res); + res = OCICALL(OCIAttrGet(handle, OCI_DTYPE_PARAM, &_precision, &size, OCI_ATTR_PRECISION, stat._errh)); + oci_check_error(__TROTL_HERE__, stat._errh, res); size = sizeof(_scale); - res = OCICALL(OCIAttrGet(handle, OCI_DTYPE_PARAM, &_scale, &size, OCI_ATTR_SCALE, errh)); - oci_check_error(__TROTL_HERE__, errh, res); - break;} + res = OCICALL(OCIAttrGet(handle, OCI_DTYPE_PARAM, &_scale, &size, OCI_ATTR_SCALE, stat._errh)); + oci_check_error(__TROTL_HERE__, stat._errh, res); + break; case SQLT_DAT: #if ORACLE_MAJOR_VERSION>=8 && ORACLE_MINOR_VERSION>=1 case SQLT_TIME: @@ -122,22 +147,139 @@ #endif _precision = 0; _scale = -127; + break; case SQLT_NTY: + { + OCIType *tdo = 0; + OCIRef *oref = 0; ub4 ssize, nsize; + size = sizeof(oref); + res = OCICALL(OCIAttrGet(handle, OCI_DTYPE_PARAM, (dvoid*)&oref, &size, OCI_ATTR_REF_TDO, stat._errh)); + oci_check_error(__TROTL_HERE__, stat._errh, res); + _oref = oref; + + res = OCICALL(OCITypeByRef(stat._env, stat._errh, oref, OCI_DURATION_SESSION, OCI_TYPEGET_HEADER, &tdo)); + oci_check_error(__TROTL_HERE__, stat._errh, res); + _tdo = tdo; + + // size = sizeof(tdo2); + // res = OCICALL(OCIAttrGet(handle, OCI_DTYPE_PARAM, (dvoid*)&tdo2, &size, OCI_ATTR_TDO, stat._errh)); + // oci_check_error(__TROTL_HERE__, stat._errh, res); + + // size = sizeof(_typecode); + // res = OCICALL(OCIAttrGet(parmp, OCI_DTYPE_PARAM, (dvoid*)&_typecode, &size, OCI_ATTR_TYPECODE, stat._errh)); + // //oci_check_error(__TROTL_HERE__, stat._errh, res); + // checkerr(stat._errh, res); + + // size = sizeof(boolean); + // res = OCICALL(OCIAttrGet(handle, OCI_DTYPE_PARAM, &boolean, &size, OCI_ATTR_IS_INCOMPLETE_TYPE, stat._errh)); + // oci_check_error(__TROTL_HERE__, stat._errh, res); + + // size = sizeof(boolean); + // res = OCICALL(OCIAttrGet(handle, OCI_DTYPE_PARAM, &boolean, &size, OCI_ATTR_IS_SYSTEM_TYPE, stat._errh)); + // oci_check_error(__TROTL_HERE__, stat._errh, res); + + // size = sizeof(boolean); + // res = OCICALL(OCIAttrGet(handle, OCI_DTYPE_PARAM, &boolean, &size, OCI_ATTR_IS_PREDEFINED_TYPE, stat._errh)); + // oci_check_error(__TROTL_HERE__, stat._errh, res); + + // size = sizeof(boolean); + // res = OCICALL(OCIAttrGet(handle, OCI_DTYPE_PARAM, &boolean, &size, OCI_ATTR_IS_TRANSIENT_TYPE, stat._errh)); + // oci_check_error(__TROTL_HERE__, stat._errh, res); + + // size = sizeof(boolean); + // res = OCICALL(OCIAttrGet(handle, OCI_DTYPE_PARAM, &boolean, &size, OCI_ATTR_IS_SYSTEM_GENERATED_TYPE, stat._errh)); + // oci_check_error(__TROTL_HERE__, stat._errh, res); + + // size = sizeof(boolean); + // res = OCICALL(OCIAttrGet(handle, OCI_DTYPE_PARAM, &boolean, &size, OCI_ATTR_HAS_NESTED_TABLE, stat._errh)); + //oci_check_error(__TROTL_HERE__, stat._errh, res); + + // size = sizeof(obj_id); + // res = OCICALL(OCIAttrGet(handle, OCI_DTYPE_PARAM, (dvoid*)&obj_name, &size, OCI_ATTR_OBJ_ID, stat._errh)); + // oci_check_error(__TROTL_HERE__, stat._errh, res); + + // size = sizeof(obj_name); + // res = OCICALL(OCIAttrGet(handle, OCI_DTYPE_PARAM, (dvoid*)&obj_name, &size, OCI_ATTR_OBJ_NAME, stat._errh)); + // oci_check_error(__TROTL_HERE__, stat._errh, res); + + // size = sizeof(obj_schema); + // res = OCICALL(OCIAttrGet(handle, OCI_DTYPE_PARAM, (dvoid*)&obj_name, &size, OCI_ATTR_OBJ_SCHEMA, stat._errh)); + // oci_check_error(__TROTL_HERE__, stat._errh, res); + ssize = sizeof(pschema_name); - res = OCICALL(OCIAttrGet(handle, OCI_DTYPE_PARAM, &pschema_name, &ssize, OCI_ATTR_SCHEMA_NAME, errh)); - oci_check_error(__TROTL_HERE__, errh, res); - + res = OCICALL(OCIAttrGet(handle, OCI_DTYPE_PARAM, &pschema_name, &ssize, OCI_ATTR_SCHEMA_NAME, stat._errh)); + oci_check_error(__TROTL_HERE__, stat._errh, res); nsize = sizeof(ptype_name); - res = OCICALL(OCIAttrGet(handle, OCI_DTYPE_PARAM, &ptype_name, &nsize, OCI_ATTR_TYPE_NAME, errh)); - oci_check_error(__TROTL_HERE__, errh, res); + res = OCICALL(OCIAttrGet(handle, OCI_DTYPE_PARAM, &ptype_name, &nsize, OCI_ATTR_TYPE_NAME, stat._errh)); + oci_check_error(__TROTL_HERE__, stat._errh, res); + _data_type_name = tstring((char*)pschema_name, ssize) + "." + tstring((char*)ptype_name,nsize); + + res = OCICALL(OCIHandleAlloc((dvoid *) stat._env, (dvoid **) &dschp, (ub4) OCI_HTYPE_DESCRIBE, (size_t) 0, (dvoid **) 0)); + oci_check_error(__TROTL_HERE__, stat._errh, res); + + res = OCICALL(OCIDescribeAny(stat._conn._svc_ctx, stat._errh, + (dvoid *) oref, 0, OCI_OTYPE_REF, (ub1)OCI_DEFAULT, (ub1) OCI_PTYPE_TYPE, dschp)); + oci_check_error(__TROTL_HERE__, stat._errh, res); + + res = OCICALL(OCIAttrGet((dvoid *) dschp, (ub4) OCI_HTYPE_DESCRIBE, (dvoid *)&parmp, (ub4 *)0, (ub4)OCI_ATTR_PARAM, stat._errh)); + oci_check_error(__TROTL_HERE__, stat._errh, res); + + size = sizeof(_typecode); + res = OCICALL(OCIAttrGet(parmp, OCI_DTYPE_PARAM, (dvoid*)&_typecode, &size, OCI_ATTR_TYPECODE, stat._errh)); + oci_check_error(__TROTL_HERE__, stat._errh, res); - _data_type_name = tstring((char*)pschema_name, ssize) + "." + tstring((char*)ptype_name); -// _data_type_name.assign((const char*)ptype_name, size); -// _data_type_schema.assign((const char*)pschema_name, size); + if (_typecode == OCI_TYPECODE_NAMEDCOLLECTION) + { + ub4 ssize; + ub2 len; + text* col_type_name = NULL; + text* col_schema_name = NULL; + res = OCICALL(OCIAttrGet((dvoid *) parmp, (ub4) OCI_DTYPE_PARAM, + (dvoid *)&_collection_typecode, (ub4 *)0, (ub4)OCI_ATTR_COLLECTION_TYPECODE, stat._errh)); + oci_check_error(__TROTL_HERE__, stat._errh, res); + + res = OCICALL(OCIAttrGet((dvoid *) parmp, (ub4) OCI_DTYPE_PARAM, + (dvoid *)&_collection_dschp, (ub4 *)0, (ub4)OCI_ATTR_COLLECTION_ELEMENT, stat._errh)); + oci_check_error(__TROTL_HERE__, stat._errh, res); + + /* get the data size */ + res = OCICALL(OCIAttrGet((dvoid*) _collection_dschp, (ub4) OCI_DTYPE_PARAM, (dvoid*) &len, (ub4 *) 0, (ub4) OCI_ATTR_DATA_SIZE, stat._errh)); + oci_check_error(__TROTL_HERE__, stat._errh, res); + + /* get the name of the collection */ + res = OCICALL(OCIAttrGet((dvoid*) _collection_dschp, (ub4) OCI_DTYPE_PARAM, (dvoid*) &col_type_name, (ub4 *) &ssize, (ub4) OCI_ATTR_TYPE_NAME, stat._errh)); + oci_check_error(__TROTL_HERE__, stat._errh, res); + + /* get the name of the schema */ + res = OCICALL(OCIAttrGet((dvoid*) _collection_dschp, (ub4) OCI_DTYPE_PARAM, (dvoid*) &col_schema_name, (ub4 *) &ssize, (ub4) OCI_ATTR_SCHEMA_NAME, stat._errh)); + oci_check_error(__TROTL_HERE__, stat._errh, res); + + /* get the data type */ + res = OCICALL(OCIAttrGet((dvoid*) _collection_dschp, (ub4) OCI_DTYPE_PARAM, (dvoid*) &_collection_typecode, (ub4 *) 0, (ub4) OCI_ATTR_DATA_TYPE, stat._errh)); + oci_check_error(__TROTL_HERE__, stat._errh, res); + + ub4 num_elems = 0; + if (_collection_typecode == OCI_TYPECODE_VARRAY) + { + /* get the number of elements */ + res = OCICALL(OCIAttrGet((dvoid*) _collection_dschp, (ub4) OCI_DTYPE_PARAM, (dvoid*) &num_elems, (ub4 *) 0, (ub4) OCI_ATTR_NUM_ELEMS, stat._errh)); + oci_check_error(__TROTL_HERE__, stat._errh, res); + } + std::cout << "OCI_ATTR_COLLECTION_TYPECODE: " << _collection_typecode << std::endl + << "OCI_ATTR_COLLECTION_ELEMENT: " << _collection_dschp << std::endl + << "OCI_ATTR_DATA_SIZE: " << len << std::endl + << "OCI_ATTR_TYPE_NAME: " << col_type_name << std::endl + << "OCI_ATTR_SCHEMA_NAME: " << col_schema_name << std::endl + << "OCI_ATTR_DATA_TYPE: " << _collection_typecode << std::endl + << "OCI_ATTR_NUM_ELEMS: " << num_elems << std::endl + << "========================================" << std::endl; + _data_type = (OCI_TYPECODE_VARRAY << 8) + _collection_typecode; + } break; + } case SQLT_LNG: _width = g_OCIPL_MAX_LONG; //TODO long can have up to 2GB break; @@ -145,8 +287,8 @@ case SQLT_STR: case SQLT_VCS: case SQLT_CLOB: - res = OCICALL(OCIAttrGet(handle, OCI_DTYPE_PARAM, &cform, 0, OCI_ATTR_CHARSET_FORM, errh)); - oci_check_error(__TROTL_HERE__, errh, res); + res = OCICALL(OCIAttrGet(handle, OCI_DTYPE_PARAM, &cform, 0, OCI_ATTR_CHARSET_FORM, stat._errh)); + oci_check_error(__TROTL_HERE__, stat._errh, res); _utf16 = (cform == SQLCS_NCHAR); break; } @@ -181,6 +323,7 @@ str << "NUMBER(" << (int)_precision << "," << (int)_scale << ")"; else str << "NUMBER(" << (int)_precision << ")"; + break; case SQLT_DAT: // OCI_TYPECODE_DATE: str << "DATE"; @@ -397,3 +540,5 @@ // ret.insert(ret.end(), desc); // } + + Modified: trunk/tora/src/trotl/src/trotl_var.h =================================================================== --- trunk/tora/src/trotl/src/trotl_var.h 2010-09-24 12:20:23 UTC (rev 3692) +++ trunk/tora/src/trotl/src/trotl_var.h 2010-09-24 12:23:27 UTC (rev 3693) @@ -61,6 +61,8 @@ { tstring _column_name; tstring _data_type_name; + tstring _data_type_dblink; // ?? TODO + ub2 _data_type; ub2 _width; ub1 _char_semantics; // for Oracle 9 @@ -69,21 +71,28 @@ ub1 _nullable; bool _utf16; - ColumnType(): - _data_type(0), - _width(0), - _char_semantics(0), - _scale(-127), - _precision(0), - _nullable(false), - _utf16(false) - {}; + // for complex types + OCITypeCode _typecode, _collection_typecode; + dvoid *_collection_dschp; + OCIType *_tdo; + OCIRef *_oref; + + ColumnType(): _data_type(0) + , _width(0) + , _char_semantics(0) + , _scale(-127) + , _precision(0) + , _nullable(false) + , _utf16(false) + , _collection_dschp(NULL) + , _tdo(NULL) + , _oref(NULL) + {}; - ColumnType(OCIError* errh, dvoid* handle); - - tstring get_type_str(bool show_null=false) const; - - void describe(OCIError* errh, dvoid* handle); + ColumnType(SqlStatement &stat, dvoid* handle); + void describe(SqlStatement &stat, dvoid* handle); + + tstring get_type_str(bool show_null=false) const; }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2010-09-29 14:01:04
|
Revision: 3701 http://tora.svn.sourceforge.net/tora/?rev=3701&view=rev Author: ibre5041 Date: 2010-09-29 14:00:56 +0000 (Wed, 29 Sep 2010) Log Message: ----------- sync with trotl release 0.3 Modified Paths: -------------- trunk/tora/src/trotl/src/CMakeLists.txt trunk/tora/src/trotl/src/trotl_anydata.cpp trunk/tora/src/trotl/src/trotl_anydata.h trunk/tora/src/trotl/src/trotl_base.h trunk/tora/src/trotl/src/trotl_common.h trunk/tora/src/trotl/src/trotl_exc.cpp trunk/tora/src/trotl/src/trotl_int.cpp trunk/tora/src/trotl/src/trotl_int.h trunk/tora/src/trotl/src/trotl_lob.cpp trunk/tora/src/trotl/src/trotl_misc.h trunk/tora/src/trotl/src/trotl_rid.cpp trunk/tora/src/trotl/src/trotl_rid.h trunk/tora/src/trotl/src/trotl_stat.cpp trunk/tora/src/trotl/src/trotl_stat.h trunk/tora/src/trotl/src/trotl_string.h trunk/tora/src/trotl/src/trotl_var.cpp trunk/tora/src/trotl/src/trotl_var.h trunk/tora/src/trotl/src/trotl_xml.cpp trunk/tora/src/trotl/src/trotl_xml.h Added Paths: ----------- trunk/tora/src/trotl/src/trotl_collection.cpp trunk/tora/src/trotl/src/trotl_collection.h Removed Paths: ------------- trunk/tora/src/trotl/src/trotl_extended_parser.cpp trunk/tora/src/trotl/src/trotl_extended_parser.h Modified: trunk/tora/src/trotl/src/CMakeLists.txt =================================================================== --- trunk/tora/src/trotl/src/CMakeLists.txt 2010-09-29 13:52:19 UTC (rev 3700) +++ trunk/tora/src/trotl/src/CMakeLists.txt 2010-09-29 14:00:56 UTC (rev 3701) @@ -18,9 +18,9 @@ trotl_anydata.cpp trotl_conn.cpp trotl_convertor.cpp + trotl_collection.cpp trotl_date.cpp trotl_exc.cpp - trotl_extended_parser.cpp trotl_int.cpp trotl_misc.cpp trotl_string.cpp Modified: trunk/tora/src/trotl/src/trotl_anydata.cpp =================================================================== --- trunk/tora/src/trotl/src/trotl_anydata.cpp 2010-09-29 13:52:19 UTC (rev 3700) +++ trunk/tora/src/trotl/src/trotl_anydata.cpp 2010-09-29 14:00:56 UTC (rev 3701) @@ -45,10 +45,8 @@ { sword res; _anydatatdo = 0; + _oan_buffer = (OCIAnyData**) calloc(_cnt, sizeof(OCIAnyData*)); - - _oan_buffer = new OCIAnyData* [ _cnt ]; - res = OCICALL(OCITypeByName(_stmt._env, _stmt._errh, _stmt._conn._svc_ctx, (const oratext*)"SYS", strlen("SYS"), (const oratext*)"ANYDATA", strlen("ANYDATA"), @@ -137,7 +135,7 @@ { OCIInd _indp; // TODO check indp here OCIString *str = (OCIString *) 0; - ub4 len, len2; + ub4 len; sword res1 = OCICALL(OCIAnyDataAccess(_stmt._conn._svc_ctx, _stmt._errh, _oan_buffer[row], (OCITypeCode)OCI_TYPECODE_VARCHAR2, Modified: trunk/tora/src/trotl/src/trotl_anydata.h =================================================================== --- trunk/tora/src/trotl/src/trotl_anydata.h 2010-09-29 13:52:19 UTC (rev 3700) +++ trunk/tora/src/trotl/src/trotl_anydata.h 2010-09-29 14:00:56 UTC (rev 3701) @@ -54,8 +54,7 @@ friend struct ConvertorForWrite; // TODO remember OCIConn or at least svcctx in this class - BindParANYDATA(unsigned int pos, SqlStatement &stmt, ColumnType &ct) - : SqlStatement::BindPar(pos, stmt, ct) + BindParANYDATA(unsigned int pos, SqlStatement &stmt, ColumnType &ct) : SqlStatement::BindPar(pos, stmt, ct) , _oan_buffer(NULL) , _any_indp(NULL) { @@ -70,13 +69,12 @@ init(stmt); } - BindParANYDATA(unsigned int pos, SqlStatement &stmt, BindVarDecl &decl) - : SqlStatement::BindPar(pos, stmt, decl) + BindParANYDATA(unsigned int pos, SqlStatement &stmt, BindVarDecl &decl) : SqlStatement::BindPar(pos, stmt, decl) , _oan_buffer(NULL) , _any_indp(NULL) { dty = SQLT_NTY; - type_name = "SYS.ANYDATA"; + type_name = "SYS.ANYDATA"; value_sz = sizeof(OCIAnyData*); for(unsigned i = 0; i < _cnt; ++i) { Modified: trunk/tora/src/trotl/src/trotl_base.h =================================================================== --- trunk/tora/src/trotl/src/trotl_base.h 2010-09-29 13:52:19 UTC (rev 3700) +++ trunk/tora/src/trotl/src/trotl_base.h 2010-09-29 14:00:56 UTC (rev 3701) @@ -415,11 +415,12 @@ }; /// error handling functions - // extern void TROTL_EXPORT throw_oci_exception(tstring where, OCIError* errh, sword res); - // extern void TROTL_EXPORT throw_oci_exception(tstring where, OCIEnv* envh, sword res); - // __declspec(noreturn) void throw_ocipl_exception(OciException& e); - // extern void TROTL_EXPORT throw_ocipl_exception(OciException const & e); + extern void TROTL_EXPORT throw_oci_exception(tstring where, OCIError* errh, sword res); + extern void TROTL_EXPORT throw_oci_exception(tstring where, OCIEnv* envh, sword res); + extern void TROTL_EXPORT throw_ocipl_exception(OciException const & e); + // __declspec(noreturn) void throw_ocipl_exception(OciException& e); + inline void oci_check_error(tstring where, OCIError* errh, sword res) { switch(res) Added: trunk/tora/src/trotl/src/trotl_collection.cpp =================================================================== --- trunk/tora/src/trotl/src/trotl_collection.cpp (rev 0) +++ trunk/tora/src/trotl/src/trotl_collection.cpp 2010-09-29 14:00:56 UTC (rev 3701) @@ -0,0 +1,205 @@ +// Copyright (c) 2003, 2004, 2005, 2006, 2007, 2008 Martin Fuchs <mar...@gm...> +// +// forked from OCIPL Version 1.3 +// by Ivan Brezina <iv...@cv...> + +/* + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + +*/ + + +#include "trotl_collection.h" +#include <string.h> +namespace trotl { + +//Util::RegisterInFactory<BindParCollectionTabNum, BindParFactTwoParmSing> regBindCollection("???Collection???"); TODO +//Util::RegisterInFactory<BindParCollectionTabNum, DefineParFactTwoParmSing, int> regDefineCollection((OCI_TYPECODE_VARRAY << 8) + 2); +Util::RegisterInFactory<BindParCollectionTabNum, CustDefineParFactTwoParmSing> regCustDefineNTY_NUM_TAB("TABLE OF NUMBER"); +Util::RegisterInFactory<BindParCollectionTabVarchar, CustDefineParFactTwoParmSing> regCustDefineNTY_VARCHAR_TAB("TABLE OF VARCHAR2"); + +void BindParCollectionTabNum::define_hook(SqlStatement &stmt) +{ + //ub4 *size = 0; + sword res; + res = OCICALL(OCIDefineObject(defnpp, stmt._errh, _collection_tdo, + valuep, + (ub4 *) NULL, + (void**) _collection_indp, //(dvoid **) NULL + (ub4 *) 0)); + oci_check_error(__TROTL_HERE__, stmt._errh, res); +} + +void BindParCollectionTabNum::bind_hook(SqlStatement &stmt) +{ + //TODO + throw OciException(__TROTL_HERE__, "Not implemented yet"); +} + +// TODO +tstring BindParCollectionTabNum::get_string(unsigned int row) const +{ + OCITypeCode tc; + OCIType *type = (OCIType *)NULL; + boolean isNull, eoc = false; + OCIInd ind; + sword res; + OCIIter *itr; + + if( *(sb2*)(_collection_indp[row]) == OCI_IND_NULL) + { + _stringrepres << "<NULL>"; + return _stringrepres.str(); + } + + res = OCICALL(OCIIterCreate (_env, _stmt._errh, (OCIColl*)valuep[row], &itr)); + oci_check_error(__TROTL_HERE__, _stmt._errh, res); + + _stringrepres.str(""); + _stringrepres << type_name << "("; + + bool comma=false; + while(!eoc) + { + OCINumber *ocinum = NULL; + void *elemind = NULL; + int i; + res = OCICALL(OCIIterNext (_env, _stmt._errh, + itr, + (void**) &ocinum, + (void**) &elemind, //NULL, //void **elemind, + &eoc)); + oci_check_error(__TROTL_HERE__, _stmt._errh, res); + + if(eoc) + break; + + if(comma) + _stringrepres << ", "; + + if(*(sb2*)(elemind) == OCI_IND_NULL) + { + _stringrepres << "NULL"; + } else { + res = OCICALL(OCINumberToInt(_stmt._errh, ocinum, sizeof(i), 0, &i)); + oci_check_error(__TROTL_HERE__, _stmt._errh, res); + _stringrepres << i; + } + + comma = true; + } + _stringrepres << ")"; + + res = sword(OCIIterDelete (_env, _stmt._errh, &itr)); + oci_check_error(__TROTL_HERE__, _stmt._errh, res); + + return _stringrepres.str(); +}; + +void BindParCollectionTabVarchar::define_hook(SqlStatement &stmt) +{ + sword res; + res = OCICALL(OCIDefineObject(defnpp, stmt._errh, _collection_tdo, + valuep, + (ub4 *) NULL, + (void**) _collection_indp, //(dvoid **) NULL + (ub4 *) 0)); + oci_check_error(__TROTL_HERE__, stmt._errh, res); +} + +void BindParCollectionTabVarchar::bind_hook(SqlStatement &stmt) +{ + //TODO + throw OciException(__TROTL_HERE__, "Not implemented yet"); +} + +tstring BindParCollectionTabVarchar::get_string(unsigned int row) const +{ + OCITypeCode tc; + OCIType *type = (OCIType *)NULL; + boolean isNull, eoc = false; + OCIInd ind; + sword res; + OCIIter *itr; + + if( *(sb2*)(_collection_indp[row]) == OCI_IND_NULL) + { + _stringrepres << "<NULL>"; + return _stringrepres.str(); + } + + res = OCICALL(OCIIterCreate (_env, _stmt._errh, (OCIColl*)valuep[row], &itr)); + oci_check_error(__TROTL_HERE__, _stmt._errh, res); + + _stringrepres.str(""); + _stringrepres << type_name << "("; + + bool comma=false; + while(!eoc) + { + void *ocistring = NULL; + void *elemind = NULL; + int i; + res = OCICALL(OCIIterNext (_env, _stmt._errh, + itr, + (void**) &ocistring, + (void**) &elemind, //NULL, //void **elemind, + &eoc)); + oci_check_error(__TROTL_HERE__, _stmt._errh, res); + + if(eoc) + break; + + if(comma) + _stringrepres << ", "; + + if(*(sb2*)(elemind) == OCI_IND_NULL) + { + _stringrepres << "NULL"; + } else { + _stringrepres << '\'' << OCIStringPtr(_env, *(OCIString **)ocistring) << '\''; + // res = OCICALL(OCINumberToInt(_stmt._errh, ocinum, sizeof(i), 0, &i)); + // oci_check_error(__TROTL_HERE__, _stmt._errh, res); + // _stringrepres << i; + } + + comma = true; + } + _stringrepres << ")"; + + res = sword(OCIIterDelete (_env, _stmt._errh, &itr)); + oci_check_error(__TROTL_HERE__, _stmt._errh, res); + + return _stringrepres.str(); +}; + +// tstring SqlCollection::str() const +// { +// return _stringrepres.str(); +// }; + + +}; Added: trunk/tora/src/trotl/src/trotl_collection.h =================================================================== --- trunk/tora/src/trotl/src/trotl_collection.h (rev 0) +++ trunk/tora/src/trotl/src/trotl_collection.h 2010-09-29 14:00:56 UTC (rev 3701) @@ -0,0 +1,171 @@ +// Copyright (c) 2003, 2004, 2005, 2006, 2007, 2008 Martin Fuchs <mar...@gm...> +// +// forked from OCIPL Version 1.3 +// by Ivan Brezina <iv...@cv...> + +/* + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + +*/ + +#ifndef TROTL_COLLECTION_H_ +#define TROTL_COLLECTION_H_ + +#ifdef WIN32 +#include <stdio.h> +#include <wtypes.h> +#define snprintf _snprintf +//#define gmtime gmtime_s +//#define localtime localtime_s +#endif + +#include "trotl_export.h" +#include "trotl_base.h" +#include "trotl_stat.h" + +namespace trotl { + +struct TROTL_EXPORT BindParCollectionTabNum: public SqlStatement::BindPar +{ + friend struct ConvertorForRead; + friend struct ConvertorForWrite; + + BindParCollectionTabNum(unsigned int pos, SqlStatement &stmt, ColumnType &ct) + : SqlStatement::BindPar(pos, stmt, ct) + , _collection_indp(NULL) + { + valuep = (void**) calloc(_cnt, sizeof(void*)); + value_sz = sizeof(OCIColl*); + _collection_indp = (void**)calloc(_cnt, sizeof(void*)); + + dty = SQLT_NTY; // named collection type (varray or nested table) + type_name = ct.get_type_str(); + + _collection_tdo = ct._tdo; + } + + BindParCollectionTabNum(unsigned int pos, SqlStatement &stmt, BindVarDecl &decl) + : SqlStatement::BindPar(pos, stmt, decl) + , _collection_indp(NULL) + { + valuep = (void**) calloc(_cnt, sizeof(void*)); + value_sz = sizeof(OCIColl*); + _collection_indp = (void**)calloc(_cnt, sizeof(void*)); + + dty = SQLT_NTY; + type_name = "???"; // TODO + + // _collection_tdo = ct._tdo; TODO + }; + + ~BindParCollectionTabNum() {}; + + virtual tstring get_string(unsigned int row) const; + + virtual void define_hook(SqlStatement &stmt); + virtual void bind_hook(SqlStatement &stmt); + + +private: + mutable std::stringstream _stringrepres; + void **_collection_indp; + OCIType *_collection_tdo; +}; + +struct TROTL_EXPORT BindParCollectionTabVarchar: public SqlStatement::BindPar +{ + friend struct ConvertorForRead; + friend struct ConvertorForWrite; + + BindParCollectionTabVarchar(unsigned int pos, SqlStatement &stmt, ColumnType &ct) + : SqlStatement::BindPar(pos, stmt, ct) + , _collection_indp(NULL) + { + valuep = (void**) calloc(_cnt, sizeof(void*)); + value_sz = sizeof(OCIColl*); + _collection_indp = (void**)calloc(_cnt, sizeof(void*)); + + dty = SQLT_NTY; // named collection type (varray or nested table) + type_name = ct.get_type_str(); + + _collection_tdo = ct._tdo; + } + + BindParCollectionTabVarchar(unsigned int pos, SqlStatement &stmt, BindVarDecl &decl) + : SqlStatement::BindPar(pos, stmt, decl) + , _collection_indp(NULL) + { + valuep = (void**) calloc(_cnt, sizeof(void*)); + value_sz = sizeof(OCIColl*); + indp = (OCIInd*) calloc(_cnt, sizeof(void*)); + _collection_indp = (void**)calloc(_cnt, sizeof(void*)); + + dty = SQLT_NTY; + type_name = "???"; // TODO + // _collection_tdo = ct._tdo; TODO + }; + + ~BindParCollectionTabVarchar() {}; + + virtual tstring get_string(unsigned int row) const; + + virtual void define_hook(SqlStatement &stmt); + virtual void bind_hook(SqlStatement &stmt); + + +private: + mutable std::stringstream _stringrepres; + void **_collection_indp; + OCIType *_collection_tdo; +}; + +struct TROTL_EXPORT SqlCollection : public SqlValue +{ + friend struct ConvertorForRead; + friend struct ConvertorForWrite; + + SqlCollection(OciConnection &conn): _conn(conn) // NULL constructor + {} + + + SqlCollection(const SqlValue &value, OciConnection &conn): _conn(conn) + { + //_ind.set(); + throw OciException(__TROTL_HERE__, "Not implemented yet"); + } + + tstring str() const; + + operator tstring() const { return str(); }; + +protected: + std::stringstream _stringrepres; + OciConnection& _conn; +}; + + +}; +#endif /*TROTL_COLLECTION_H_*/ Modified: trunk/tora/src/trotl/src/trotl_common.h =================================================================== --- trunk/tora/src/trotl/src/trotl_common.h 2010-09-29 13:52:19 UTC (rev 3700) +++ trunk/tora/src/trotl/src/trotl_common.h 2010-09-29 14:00:56 UTC (rev 3701) @@ -83,6 +83,7 @@ //} //#define OCICALL(x) x; do { std::cerr << __TROTL_HERE__ << #x << std::endl; } while(0) +//#define OCICALL(x) x; do { std::cerr << #x << std::endl; } while(0) #define OCICALL(x) x #ifdef __GNUC__ Modified: trunk/tora/src/trotl/src/trotl_exc.cpp =================================================================== --- trunk/tora/src/trotl/src/trotl_exc.cpp 2010-09-29 13:52:19 UTC (rev 3700) +++ trunk/tora/src/trotl/src/trotl_exc.cpp 2010-09-29 14:00:56 UTC (rev 3701) @@ -296,31 +296,31 @@ return *this; } -// void TROTL_EXPORT throw_ocipl_exception(OciException const & e) -// { -// throw(e); -// } +void TROTL_EXPORT throw_ocipl_exception(OciException const & e) +{ + throw(e); +} -// void TROTL_EXPORT throw_oci_exception(tstring where, OCIError* errh, sword res) -// { -// switch(res) { -// case OCI_ERROR: -// throw_ocipl_exception(OciException(where, errh)); -// case OCI_INVALID_HANDLE: -// throw_ocipl_exception(OciException(where, "invalid handle")); -// //@todo handle other error states -// } -// } +void TROTL_EXPORT throw_oci_exception(tstring where, OCIError* errh, sword res) +{ + switch(res) { + case OCI_ERROR: + throw_ocipl_exception(OciException(where, errh)); + case OCI_INVALID_HANDLE: + throw_ocipl_exception(OciException(where, "invalid handle")); + //@todo handle other error states + } +} -// void TROTL_EXPORT throw_oci_exception(tstring where, OCIEnv* envh, sword res) -// { -// switch(res) { -// case OCI_ERROR: -// throw_ocipl_exception(OciException(where, envh)); -// case OCI_INVALID_HANDLE: -// throw_ocipl_exception(OciException(where, envh)); -// //@todo handle other error states -// } -// } +void TROTL_EXPORT throw_oci_exception(tstring where, OCIEnv* envh, sword res) +{ + switch(res) { + case OCI_ERROR: + throw_ocipl_exception(OciException(where, envh)); + case OCI_INVALID_HANDLE: + throw_ocipl_exception(OciException(where, envh)); + //@todo handle other error states + } +} }; Deleted: trunk/tora/src/trotl/src/trotl_extended_parser.cpp =================================================================== --- trunk/tora/src/trotl/src/trotl_extended_parser.cpp 2010-09-29 13:52:19 UTC (rev 3700) +++ trunk/tora/src/trotl/src/trotl_extended_parser.cpp 2010-09-29 14:00:56 UTC (rev 3701) @@ -1,231 +0,0 @@ -/* - - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - -*/ - -#include "trotl_extended_parser.h" - -namespace trotl { - - using namespace boost::spirit; - - bool ExtendedPlsqlParser::parse (const tstring &statement) - { - //static rule<phrase_scanner_t> C_WHITE = *(blank_p | eol_p); - static rule<phrase_scanner_t> M_WHITE = +(blank_p | eol_p) - [boost::bind(&ExtendedPlsqlParser::token_callback, boost::ref(*this), "space", _1, _2)]; - - static rule<phrase_scanner_t> K_SELECT = as_lower_d["select"] - [boost::bind(&ExtendedPlsqlParser::token_callback, boost::ref(*this), "keyword", _1, _2)]; - static rule<phrase_scanner_t> K_FROM = as_lower_d["from"]; - static rule<phrase_scanner_t> K_WHERE = as_lower_d["where"]; - static rule<phrase_scanner_t> K_INSERT = as_lower_d["insert"]; - static rule<phrase_scanner_t> K_INTO = as_lower_d["into"]; - static rule<phrase_scanner_t> K_VALUES = as_lower_d["values"]; - static rule<phrase_scanner_t> K_MERGE = as_lower_d["merge"]; - static rule<phrase_scanner_t> K_DELETE = as_lower_d["delete"]; - static rule<phrase_scanner_t> K_DECLARE = as_lower_d["declare"]; - static rule<phrase_scanner_t> K_BEGIN = as_lower_d["begin"]; - static rule<phrase_scanner_t> K_END = as_lower_d["end"]; - static rule<phrase_scanner_t> K_CASE = as_lower_d["case"]; - static rule<phrase_scanner_t> K_WHEN = as_lower_d["when"]; - static rule<phrase_scanner_t> K_THEN = as_lower_d["then"]; - static rule<phrase_scanner_t> K_ELSE = as_lower_d["else"]; - static rule<phrase_scanner_t> K_ROWID = as_lower_d["rowid"]; - static rule<phrase_scanner_t> K_ORDER_BY= as_lower_d["order"] >> as_lower_d["by"]; - - static rule<phrase_scanner_t> K_DISTINCT= as_lower_d["distinct"]; - static rule<phrase_scanner_t> K_UNIQUE = as_lower_d["unique"] - [boost::bind(&ExtendedPlsqlParser::token_callback, boost::ref(*this), "keyword", _1, _2)]; - static rule<phrase_scanner_t> K_ALL = as_lower_d["all"] - [boost::bind(&ExtendedPlsqlParser::token_callback, boost::ref(*this), "keyword", _1, _2)]; - static rule<phrase_scanner_t> K_AS = as_lower_d["as"] - [boost::bind(&ExtendedPlsqlParser::token_callback, boost::ref(*this), "keyword", _1, _2)]; - static rule<phrase_scanner_t> K_BULK_COLLECT = as_lower_d["bulk"] >> as_lower_d["collect"] - [boost::bind(&ExtendedPlsqlParser::token_callback, boost::ref(*this), "keyword", _1, _2)]; - - static rule<phrase_scanner_t> keyword_tm = - K_SELECT | K_FROM | K_WHERE | - K_INSERT | K_INTO | K_VALUES | - K_MERGE | K_DELETE | K_DECLARE | - K_BEGIN | K_END | - K_CASE | K_WHEN | K_THEN | K_ELSE | - K_ROWID | - K_ORDER_BY; - - - - static rule<phrase_scanner_t> word_tm = lexeme_d[(alpha_p >> *(alnum_p | ch_p('_') | ch_p('#') | ch_p('$') ))]; - static rule<phrase_scanner_t> dqstring_tm = lexeme_d[ch_p('"') >> (alnum_p|ch_p(' ')) >> *(~ch_p('"')) >> ch_p('"')]; - static rule<phrase_scanner_t> bind_tm = lexeme_d[(alpha_p >> *(alnum_p | ch_p('_') | ch_p('.')))]; - static rule<phrase_scanner_t> unumber_tm = lexeme_d[(+digit_p)]; - static rule<phrase_scanner_t> number_tm = (!ch_p('-')) >> unumber_tm; - static rule<phrase_scanner_t> float_tm = lexeme_d[(number_tm >> !(ch_p('.') >> unumber_tm ))]; - - static rule<phrase_scanner_t> operator_tm = ( str_p("**") | - as_lower_d["not"] | as_lower_d["in"] | as_lower_d["and"] | as_lower_d["or"] | - ( as_lower_d["is"] >> as_lower_d["null"] ) | - ( as_lower_d["is"] >> as_lower_d["not"] >> as_lower_d["null"] ) | - ch_p('+') | ch_p('-') | - ch_p('*') | ch_p('/') | - str_p("||") | - ch_p('=') | ch_p('<') | - ch_p('>') | str_p("<=") | - str_p(">=") | str_p("<>") | - str_p("!=") | str_p("~=") | - str_p("^=") | str_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('\''); - static rule<phrase_scanner_t> inout_tm = str_p("inout") | str_p("out") | str_p("in"); - static rule<phrase_scanner_t> label_tm = str_p("<<") >> word_tm >> str_p(">>"); - -// static rule<phrase_scanner_t> end_tm = - - rule<phrase_scanner_t> keyword_cl = keyword_tm - [boost::bind(&ExtendedPlsqlParser::token_callback, boost::ref(*this), "keyword", _1, _2)]; - - rule<phrase_scanner_t> operator_cl = operator_tm - [boost::bind(&ExtendedPlsqlParser::token_callback, boost::ref(*this), "character", _1, _2)]; - - rule<phrase_scanner_t> delim_cl= delim_tm - [boost::bind(&ExtendedPlsqlParser::token_callback, boost::ref(*this), "character", _1, _2)]; - - rule<phrase_scanner_t> number_cl = (float_tm|unumber_tm|number_tm) - [boost::bind(&ExtendedPlsqlParser::token_callback, boost::ref(*this), "number", _1, _2)]; - - rule<phrase_scanner_t> word_cl = ((label_tm | ((word_tm|dqstring_tm) >> - !( ch_p('.') >> (word_tm|dqstring_tm)) >> - !( ch_p('.') >> (word_tm|dqstring_tm)) >> - !( ch_p('%') >> (word_tm|dqstring_tm)) - )) - keyword_tm - operator_tm) - [boost::bind(&ExtendedPlsqlParser::token_callback, boost::ref(*this), "word", _1, _2)]; - - rule<phrase_scanner_t> dqstring_cl = dqstring_tm - [boost::bind(&ExtendedPlsqlParser::token_callback, boost::ref(*this), "qword", _1, _2)]; - - rule<phrase_scanner_t> qstring_cl = qstring_tm - [boost::bind(&ExtendedPlsqlParser::token_callback, boost::ref(*this), "qstring", _1, _2)]; - - rule<phrase_scanner_t> bracket_cl = ( ch_p('[') >> unumber_tm[boost::bind(&BindVarDecl::setname, boost::ref(_bindvar), "bracket", _1, _2)] >> ch_p(']') ); - - rule<phrase_scanner_t> bindvar = (ch_p(':') >> - (+alnum_p)[boost::bind(&BindVarDecl::setname, boost::ref(_bindvar), "bindname", _1, _2)] >> - ch_p('<') >> - (bind_tm)[boost::bind(&BindVarDecl::setname, boost::ref(_bindvar), "bindtype", _1, _2)] >> - (!bracket_cl) >> - !(ch_p(',') >> - inout_tm[boost::bind(&BindVarDecl::setname, boost::ref(_bindvar), "inout", _1, _2)] >> - (!bracket_cl) - )>> - ch_p('>')) - [boost::bind(&ExtendedPlsqlParser::bindvar_callback, boost::ref(*this), "bindvar", _1, _2)]; - - rule<phrase_scanner_t> comment_cl = (confix_p("/*", *(anychar_p | ch_p(':') ) , "*/") | confix_p("--", *anychar_p, eol_p) | confix_p("PROMPT", *anychar_p, eol_p)) - [boost::bind(&ExtendedPlsqlParser::token_callback, boost::ref(*this), "comment", _1, _2)]; - - static rule<phrase_scanner_t> coma = str_p(",") - [boost::bind(&ExtendedPlsqlParser::token_callback, boost::ref(*this), "character", _1, _2)]; - static rule<phrase_scanner_t> dot = str_p(".") - [boost::bind(&ExtendedPlsqlParser::token_callback, boost::ref(*this), "character", _1, _2)]; - static rule<phrase_scanner_t> asterisk = ch_p('*'); - - static rule<phrase_scanner_t> function; - static rule<phrase_scanner_t> expression; - - static rule<phrase_scanner_t> identifier = ( dqstring_cl | word_cl ); - static rule<phrase_scanner_t> sql_expression; - static rule<phrase_scanner_t> sql_identifier = ( K_ROWID | identifier ); - - expression = (sql_expression | function) >> *(operator_cl >> ( sql_expression | function)); - function = word_cl >> - str_p("(")[boost::bind(&ExtendedPlsqlParser::token_callback, boost::ref(*this), "character", _1, _2)] >> - expression >> str_p(")") [boost::bind(&ExtendedPlsqlParser::token_callback, boost::ref(*this), "character", _1, _2)]; - - static rule<phrase_scanner_t> column_spec = ( (sql_identifier | number_cl | qstring_cl | function) >> !( dot >> asterisk | dot >> sql_identifier )); - static rule<phrase_scanner_t> alias = (!K_AS) >> (!sql_identifier); - static rule<phrase_scanner_t> displayed_column = ( column_spec /* | sql_expression */ ) >> !alias ; - static rule<phrase_scanner_t> select_list = asterisk | displayed_column >> *(coma >> displayed_column); - - static rule<phrase_scanner_t> select_expression = K_SELECT >> !( K_DISTINCT | K_UNIQUE | K_ALL ) >> select_list >> !( K_BULK_COLLECT ); - - rule<> plsql = *(keyword_cl | comment_cl | word_cl | dqstring_cl | - bindvar | operator_cl | qstring_cl| - number_cl | delim_cl ); - - parse_info<> res = boost::spirit::parse(statement.c_str(), - // Begin grammar - /*as_lower_d[(*/ select_expression>> end_p /*)]*/ - //, - // End grammar - //M_WHITE - //(space_p | blank_p | eol_p) - ); - bool p = res.full; - - BOOST_SPIRIT_DEBUG_RULE(K_SELECT); - BOOST_SPIRIT_DEBUG_RULE(M_WHITE); -// BOOST_SPIRIT_DEBUG_RULE(keyword_tm); -// BOOST_SPIRIT_DEBUG_RULE(comment_cl); - BOOST_SPIRIT_DEBUG_RULE(word_cl); - BOOST_SPIRIT_DEBUG_RULE(expression); - BOOST_SPIRIT_DEBUG_RULE(column_spec); - BOOST_SPIRIT_DEBUG_RULE(displayed_column); - BOOST_SPIRIT_DEBUG_RULE(function); - - for(unsigned itr2=0; itr2 < _bindvars.size(); ++itr2) - _bindvars.at(itr2).print(); -// std::cout << "Bindvar count: " << _bindvars.size() << std::endl; - - return p; - }; - - - tstring ExtendedPlsqlParser::colorword(const tstring &i, int color) - { - char command[256], normal[256]; - int attr = BRIGHT; - int bg = BLACK; - tostream retval; - // see: http://www.vias.org/linux-knowhow/lnag_05_05_04.html - // sprintf(command, "%c[%d;%d;%dm", 0x1B, attr, color + 30, bg + 40); - if( color == ExtendedPlsqlParser::RED) - sprintf(command, "%c[%d;%dm", 0x1B, color + 30, 1); - else - sprintf(command, "%c[%d;%dm", 0x1B, color + 30, 22); - // sprintf(normal, "%c[%d;%d;%dm", 0x1B, RESET, WHITE+30, BLACK+40); - sprintf(normal, "%c[0m", 0x1B); - - retval << command << i << normal; - - return retval.str(); - }; - -}; - Deleted: trunk/tora/src/trotl/src/trotl_extended_parser.h =================================================================== --- trunk/tora/src/trotl/src/trotl_extended_parser.h 2010-09-29 13:52:19 UTC (rev 3700) +++ trunk/tora/src/trotl/src/trotl_extended_parser.h 2010-09-29 14:00:56 UTC (rev 3701) @@ -1,155 +0,0 @@ -// Copyright (c) 2003, 2004, 2005, 2006, 2007, 2008 Martin Fuchs <mar...@gm...> -// -// forked from OCIPL Version 1.3 -// by Ivan Brezina <iv...@cv...> - -/* - - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - -*/ - -#ifndef TROTL_EXTENDED_PARSER_H_ -#define TROTL_EXTENDED_PARSER_H_ - -#include <string> -#include <sstream> -#include <algorithm> - -#define BOOST_SPIRIT_USE_OLD_NAMESPACE -#define BOOST_SPIRIT_DEBUG -#include <boost/bind.hpp> -//#include <boost/spirit.hpp> -#include <boost/spirit/include/classic.hpp> -//#include <boost/spirit/actor/clear_actor.hpp> -#include <boost/spirit/include/classic_clear_actor.hpp> -#include <boost/function.hpp> - -#include "trotl_export.h" -#include "trotl_common.h" -#include "trotl_parser.h" - -namespace trotl { - -//using namespace std; -//using namespace boost::spirit; - -class TROTL_EXPORT ExtendedPlsqlParser -{ -public: - bool parse(const tstring &sql); - ExtendedPlsqlParser() : _lastlen(0) { }; - - static tstring colorword(const tstring &i, int color); - - //Colors - as difined in linux console - enum linux_console_attrs { - RESET = 0, - BRIGHT = 1, - DIM = 2, - UNDERLINE = 3, - BLINK = 4, - REVERSE = 7, - HIDDEN = 8 - }; - - enum linux_console_colors { - BLACK = 0, - RED = 1, - GREEN = 2, - YELLOW = 3, - BLUE = 4, - MAGENTA = 5, - CYAN = 6, - WHITE = 7 - }; - - void token_callback(const tstring name, const char *begin, const char *end) - { - const tstring str(begin,end); - if(_bindvar._inside_bindvar || str.empty()) - return; - - if(name == "character") - _colored << colorword(str, ExtendedPlsqlParser::WHITE); - else if(name == "word") - _colored << colorword(str, ExtendedPlsqlParser::GREEN); - else if(name == "keyword") - _colored << colorword(str, ExtendedPlsqlParser::BLUE); - else if(name == "number") - _colored << colorword(str, ExtendedPlsqlParser::BLUE); - else if(name == "eq") - _colored << colorword(str, ExtendedPlsqlParser::WHITE); - else if(name == "qstring") - _colored << colorword(str, ExtendedPlsqlParser::YELLOW); - else if(name == "comment") - _colored << str; - else if(name == "space") - _colored << '@' << str << '@'; - else - _colored << str; - _non_colored << str; - } - - void bindvar_callback(const tstring name, const char *begin, const char * end) - { - const tstring str(begin, end); - tstring bindname(begin, end); - - if(str.empty()) - return; - - /* replace OTL specific extension with spaces */ - tstring::iterator l = find(bindname.begin(), bindname.end(), '<'); - tstring::iterator r = find(bindname.begin(), bindname.end(), '>'); - std::fill(l, ++r, ' '); - - _colored << colorword(str, ExtendedPlsqlParser::RED); - - // Do not try to find duplicate bindvar names - we use OciBindbyPos - //if( find(_bindvars.begin(), _bindvars.end(), _bindvar.bindname) == _bindvars.end()) - _bindvars.push_back(_bindvar); - - _bindvar.reset(); - _non_colored << bindname; - } - - tstring getColored() const { return _colored.str(); }; - tstring getNonColored() const { return _non_colored.str(); }; - -#ifdef WIN32 -// typedef TROTL_EXPORT std::vector<BindVarDecl>; -#endif - - std::vector<BindVarDecl> _bindvars; -private: - tostream _non_colored, _colored; - int _lastlen; - BindVarDecl _bindvar; -}; - -}; - -#endif Modified: trunk/tora/src/trotl/src/trotl_int.cpp =================================================================== --- trunk/tora/src/trotl/src/trotl_int.cpp 2010-09-29 13:52:19 UTC (rev 3700) +++ trunk/tora/src/trotl/src/trotl_int.cpp 2010-09-29 14:00:56 UTC (rev 3701) @@ -95,6 +95,22 @@ } } +SqlNumber::SqlNumber(OciEnv &env, const char* str, const char* fmt, const char* nls_fmt) : _env(env) +{ + //while(str && istspace(*str)) ++str; + + if (str && *str) { + sword res = OCICALL(OCINumberFromText(_env._errh, + (const text*)str, (ub4)strlen(str), + (const text*)fmt, (ub4)strlen(fmt), + (const text*)nls_fmt, (ub4)strlen(nls_fmt), + (OCINumber*)&_val)); + oci_check_error(__TROTL_HERE__, _env._errh, res); + _ind.set(); + } else + _ind.clear(); +} + //SqlNumber::SqlNumber(const oraclenumber* pnum) //{ // memcpy(&_val.exp, &pnum->exp, pnum->len); @@ -102,23 +118,6 @@ // _ind.set(); //} -//SqlNumber::SqlNumber(OCIError* errh, const char* str, const char* fmt, const char* nls_fmt) -//{ -// //while(str && istspace(*str)) ++str; -// -// if (str && *str) { -// sword res = OCICALL(OCINumberFromText(errh, -// (const text*)str, (ub4)strlen(str), -// (const text*)fmt, (ub4)strlen(fmt), -// (const text*)nls_fmt, (ub4)strlen(nls_fmt), -// (OCINumber*)&_val)); -// -// oci_check_error(__TROTL_HERE__, errh, res); -// _ind.set(); -// } else -// _ind.clear(); -//} - //tstring number_to_str(const oraclenumber& val, OCIError* errh, const char* fmt, const char* nls_fmt) //{ // text buffer[128]; Modified: trunk/tora/src/trotl/src/trotl_int.h =================================================================== --- trunk/tora/src/trotl/src/trotl_int.h 2010-09-29 13:52:19 UTC (rev 3700) +++ trunk/tora/src/trotl/src/trotl_int.h 2010-09-29 14:00:56 UTC (rev 3701) @@ -192,8 +192,7 @@ { BindParNumber(unsigned int pos, SqlStatement &stmt, ColumnType &ct) : SqlStatement::BindPar(pos, stmt, ct) { - valuep = (void**) new unsigned char [ _cnt * (OCI_NUMBER_SIZE) ]; - memset(valuep, 0x00, _cnt * (OCI_NUMBER_SIZE) ); + valuep = (void**) calloc(_cnt, (size_t)OCI_NUMBER_SIZE ); dty = SQLT_VNU; //dty = SQLT_NUM; value_sz = OCI_NUMBER_SIZE; @@ -206,8 +205,7 @@ BindParNumber(unsigned int pos, SqlStatement &stmt, BindVarDecl &decl): SqlStatement::BindPar(pos, stmt, decl) { - valuep = (void**) new unsigned char [ decl.bracket[1] * (OCI_NUMBER_SIZE) ]; - memset(valuep, 0x00, decl.bracket[1] * (OCI_NUMBER_SIZE) ); + valuep = (void**) calloc(_cnt, (size_t)OCI_NUMBER_SIZE ); dty = SQLT_VNU; //dty = SQLT_NUM; value_sz = OCI_NUMBER_SIZE; @@ -219,14 +217,7 @@ type_name = "NUMBER"; }; - ~BindParNumber() - { - if(valuep) - { - delete[] (unsigned char*) valuep; - valuep = NULL; - } - } + ~BindParNumber() {}; template<class wrapped_int> wrapped_int get_number(unsigned row) const @@ -324,17 +315,10 @@ // wrapper for internal Oracle NUMBER type [length][1-20digits][mantisa] struct SqlNumber : public SqlValue { - //SqlNumber() {}; - //SqlNumber(const oraclenumber* pnum); - -/* SqlNumber(OCIError* errh, const char* s, */ + /* SqlNumber(OCIError* errh, const std::string, */ /* const char* fmt="99999999999999999999999999999999999999D99999999999999999999", */ /* const char* nls_fmt="NLS_NUMERIC_CHARACTERS='.,'"); */ - -/* SqlNumber(OCIError* errh, const std::string, */ -/* const char* fmt="99999999999999999999999999999999999999D99999999999999999999", */ -/* const char* nls_fmt="NLS_NUMERIC_CHARACTERS='.,'"); */ /* SqlNumber(OCIError* errh, double d) */ /* { */ @@ -343,10 +327,14 @@ /* _ind.set(); */ /* }; */ - SqlNumber(SqlNumber const &other) : _env(other._env) + SqlNumber(SqlNumber const &other) : _env(other._env) { *this = other; }; + + SqlNumber(OciEnv &env, const char* s, + const char* fmt="99999999999999999999999999999999999999D99999999999999999999", + const char* nls_fmt="NLS_NUMERIC_CHARACTERS='.,'"); SqlNumber(OciEnv &env) : _env(env) { Modified: trunk/tora/src/trotl/src/trotl_lob.cpp =================================================================== --- trunk/tora/src/trotl/src/trotl_lob.cpp 2010-09-29 13:52:19 UTC (rev 3700) +++ trunk/tora/src/trotl/src/trotl_lob.cpp 2010-09-29 14:00:56 UTC (rev 3701) @@ -18,7 +18,7 @@ distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRES7S OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR @@ -58,10 +58,9 @@ BindParLob::BindParLob(unsigned int pos, SqlStatement &stmt, ColumnType &ct) : BindPar(pos, stmt, ct) { //valuep = new unsigned char [ _cnt * ( sizeof(OCILobLocator*) ) ]; - valuep = (void**) malloc( _cnt * sizeof(OCILobLocator*) ); - memset(valuep, 0, _cnt * sizeof(OCILobLocator*) ); - + valuep = (void**) calloc(_cnt, sizeof(OCILobLocator*)); value_sz = sizeof(OCILobLocator*); + for(unsigned i = 0; i < _cnt; ++i) { ((ub2*)rlenp)[i] = (ub2) value_sz; @@ -73,10 +72,9 @@ BindParLob::BindParLob(unsigned int pos, SqlStatement &stmt, BindVarDecl &decl): BindPar(pos, stmt, decl) { //valuep = new unsigned char [ decl.bracket[1] * ( OCI_NUMBER_SIZE + 1) ]; - valuep = (void**) malloc( _cnt * sizeof(OCILobLocator*) ); - memset(valuep, 0, _cnt * sizeof(OCILobLocator*) ); - + valuep = (void**) calloc(_cnt, sizeof(OCILobLocator*)); value_sz = sizeof(OCILobLocator*); + for(unsigned i = 0; i < _cnt; ++i) { ((ub4*)rlenp)[i] = (ub4) value_sz; Modified: trunk/tora/src/trotl/src/trotl_misc.h =================================================================== --- trunk/tora/src/trotl/src/trotl_misc.h 2010-09-29 13:52:19 UTC (rev 3700) +++ trunk/tora/src/trotl/src/trotl_misc.h 2010-09-29 14:00:56 UTC (rev 3701) @@ -54,29 +54,27 @@ */ struct TROTL_EXPORT BindParMisc: public SqlStatement::BindPar { - BindParMisc(unsigned int pos, SqlStatement &stmt, BindVarDecl &decl) : SqlStatement::BindPar(pos, stmt, decl) + BindParMisc(unsigned int pos, SqlStatement &stmt, ColumnType &ct) : SqlStatement::BindPar(pos, stmt, ct) { - // amount of bytes = (string length +1 ) * (array length) - valuep = (void**) new char [ (128) * (decl.bracket[1]) ]; - memset(valuep, 0x00, 128 * (decl.bracket[1])); + valuep = (void**) calloc(_cnt, 128); + alenp = (ub2*) calloc(_cnt, sizeof(ub2)); dty = SQLT_STR; value_sz = 128; type_name = typeid(tstring).name(); } - BindParMisc(unsigned int pos, SqlStatement &stmt, ColumnType &ct) : SqlStatement::BindPar(pos, stmt, ct) + BindParMisc(unsigned int pos, SqlStatement &stmt, BindVarDecl &decl) : SqlStatement::BindPar(pos, stmt, decl) { - // amount of bytes = (string length +1 ) * (array length) - valuep = (void**) new char [ ( 128 ) * (_cnt) ]; // +1 for ending zero - memset(valuep, 0x00, (128) * _cnt); + // an assumtion is that remaining datatypes can hit into 128 chars + valuep = (void**) calloc(decl.bracket[1], 128); + alenp = (ub2*) calloc(_cnt, sizeof(ub2)); dty = SQLT_STR; value_sz = 128; type_name = typeid(tstring).name(); } - ~BindParMisc() { if(valuep) Modified: trunk/tora/src/trotl/src/trotl_rid.cpp =================================================================== --- trunk/tora/src/trotl/src/trotl_rid.cpp 2010-09-29 13:52:19 UTC (rev 3700) +++ trunk/tora/src/trotl/src/trotl_rid.cpp 2010-09-29 14:00:56 UTC (rev 3701) @@ -51,38 +51,22 @@ BindParRid::BindParRid(unsigned int pos, SqlStatement &stmt, BindVarDecl &decl): BindPar(pos, stmt, decl) { - valuep = (void**) malloc( _cnt * sizeof(OCIRowid*) ); - memset(valuep, 0, _cnt * sizeof(OCIRowid*) ); - + valuep = (void**) calloc(_cnt, sizeof(OCIRowid*)); + value_sz = sizeof(OCIRowid*); dty = SQLT_RDD; - value_sz = sizeof(OCIRowid*); type_name = "ROWID"; - descAlloc(); }; BindParRid::BindParRid(unsigned int pos, SqlStatement &stmt, ColumnType &ct) : BindPar(pos, stmt, ct) { - valuep = (void**) malloc( _cnt * sizeof(OCIRowid*) ); - memset(valuep, 0, _cnt * sizeof(OCIRowid*) ); - + valuep = (void**) calloc(_cnt, sizeof(OCIRowid*)); + value_sz = sizeof(OCIRowid*); dty = SQLT_RDD; - value_sz = sizeof(OCIRowid*); - type_name = ct.get_type_str(); - + type_name = ct.get_type_str(); descAlloc(); } -BindParRid::~BindParRid() -{ - descFree(); - if(valuep) - { - free(valuep); - valuep = NULL; - } -} - void BindParRid::descAlloc(void) { for(unsigned i=0; i<_cnt; ++i) Modified: trunk/tora/src/trotl/src/trotl_rid.h =================================================================== --- trunk/tora/src/trotl/src/trotl_rid.h 2010-09-29 13:52:19 UTC (rev 3700) +++ trunk/tora/src/trotl/src/trotl_rid.h 2010-09-29 14:00:56 UTC (rev 3701) @@ -44,7 +44,7 @@ { BindParRid(unsigned int pos, SqlStatement &stmt, ColumnType &ct); BindParRid(unsigned int pos, SqlStatement &stmt, BindVarDecl &decl); - ~BindParRid(); + ~BindParRid() {}; virtual tstring get_string(unsigned int) const; Modified: trunk/tora/src/trotl/src/trotl_stat.cpp =================================================================== --- trunk/tora/src/trotl/src/trotl_stat.cpp 2010-09-29 13:52:19 UTC (rev 3700) +++ trunk/tora/src/trotl/src/trotl_stat.cpp 2010-09-29 14:00:56 UTC (rev 3701) @@ -48,7 +48,7 @@ namespace trotl { -int TROTL_EXPORT g_OCIPL_BULK_ROWS = 1; +int TROTL_EXPORT g_OCIPL_BULK_ROWS = 3; int TROTL_EXPORT g_OCIPL_MAX_LONG = 30000; @@ -122,18 +122,19 @@ _columns[dpos] ); else _all_defines[dpos] = CustDefineParFactTwoParmSing::Instance().create( - _columns[dpos]._data_type_name.c_str(), + _columns[dpos]._reg_name.c_str(), dpos, *this, _columns[dpos] ); if(_all_defines[dpos].get() == NULL) - throw OciException(__TROTL_HERE__, "DefinePar: Data type not registered: %s(%d:%d:%d:%s)\n") - .arg(_columns[dpos]._data_type_name) - .arg(_columns[dpos]._data_type) - .arg(_columns[dpos]._typecode) - .arg(_columns[dpos]._collection_typecode) - .arg(_columns[dpos]._data_type_name); + throw OciException(__TROTL_HERE__, "DefinePar: Data type not registered: %s(%d:%d:%d:%s:%s)\n") + .arg(_columns[dpos]._data_type_name) + .arg(_columns[dpos]._data_type) + .arg(_columns[dpos]._typecode) + .arg(_columns[dpos]._collection_typecode) + .arg(_columns[dpos]._data_type_name) + .arg(_columns[dpos]._reg_name); define(*_all_defines[dpos]); } _state |= DEFINED; @@ -334,7 +335,8 @@ bool SqlStatement::execute_internal(ub4 rows, ub4 mode) { - ub4 iters; + if( _state & EXECUTED) + return true; // TODO replace rows by something else - &FETCHED if (rows==0 && get_stmt_type() == STMT_SELECT) @@ -350,6 +352,7 @@ } } + ub4 iters; switch(STMT_TYPE t = get_stmt_type()) { case STMT_OTHER: @@ -366,6 +369,7 @@ iters = 1; break; case STMT_INSERT: + iters = 1; if( _in_cnt == 0 ) break; iters = _all_binds[_in_binds[1]]->_cnt; @@ -406,7 +410,6 @@ iters, //_stmt_type == STMT_SELECT ? rows : 1, // iters 0, // rowoff (CONST OCISnapshot*)0, (OCISnapshot*)0, mode)); - std::cout << "OCIStmtExecute" << std::endl; //std::cout << std::endl // << "iters:" << iters << std::endl; @@ -437,8 +440,8 @@ bool SqlStatement::fetch(ub4 rows/*=-1*/) { - sword res = OCICALL(OCIStmtFetch2(_handle, _errh, rows, OCI_FETCH_NEXT, 0, OCI_DEFAULT)); - + sword res = OCICALL(OCIStmtFetch(_handle, _errh, rows, OCI_FETCH_NEXT, OCI_DEFAULT)); + _last_row += _last_buff_row; _last_fetched_row = row_count(); _last_buff_row = 0; @@ -557,7 +560,6 @@ NULL, // ub2 *rcodep dp.mode)); oci_check_error(__TROTL_HERE__, _errh, res); - std::cout << "OCIDefineByPos" << std::endl; dp.define_hook(*this); } Modified: trunk/tora/src/trotl/src/trotl_stat.h =================================================================== --- trunk/tora/src/trotl/src/trotl_stat.h 2010-09-29 13:52:19 UTC (rev 3700) +++ trunk/tora/src/trotl/src/trotl_stat.h 2010-09-29 14:00:56 UTC (rev 3701) @@ -93,9 +93,9 @@ BIND_OUT=4, DEFINE_SELECT=8 }; - - /* Placeholder for Bind operations */ - BindPar(unsigned int pos, SqlStatement &stmt, BindVarDecl &decl) + + /* Placeholder for Define operations */ + BindPar(unsigned int pos, SqlStatement &stmt, ColumnType &ct) : valuep(NULL) , indp(NULL) , rlenp(NULL) @@ -107,29 +107,22 @@ , _env(stmt._env) , _stmt(stmt) , _pos(pos) - , _max_cnt(decl.bracket[1]) - , _cnt(decl.bracket[1]) + , _max_cnt(g_OCIPL_BULK_ROWS) + , _cnt(g_OCIPL_BULK_ROWS) , _bound(false) , type_name("") - , bind_name(decl.bindname) - , bind_typename(decl.bindtype) + , reg_name("") + , bind_name("") + , bind_typename("") { - indp = new OCIInd [_cnt]; - memset(indp, 0, sizeof(OCIInd)*_cnt); - - rlenp = malloc( sizeof(ub4) * _cnt); // OCIBindByPos uses ub4* for lenp - alenp = new ub2 [_cnt]; - - if(decl.inout == "in") - _bind_type = BIND_IN; - else if(decl.inout == "inout") - _bind_type = BIND_INOUT; - else if(decl.inout == "out") - _bind_type = BIND_OUT; + indp = (OCIInd*) calloc(_cnt, sizeof(OCIInd)); + rlenp = calloc(_cnt, sizeof(ub2)); // OciDefineByPos uses ub2* for lenp + + _bind_type = DEFINE_SELECT; }; - - /* Placeholder for Define operations */ - BindPar(unsigned int pos, SqlStatement &stmt, ColumnType &ct) + + /* Placeholder for Bind operations */ + BindPar(unsigned int pos, SqlStatement &stmt, BindVarDecl &decl) : valuep(NULL) , indp(NULL) , rlenp(NULL) @@ -141,27 +134,32 @@ , _env(stmt._env) , _stmt(stmt) , _pos(pos) - , _max_cnt(g_OCIPL_BULK_ROWS) - , _cnt(g_OCIPL_BULK_ROWS) + , _max_cnt(decl.bracket[1]) + , _cnt(decl.bracket[1]) , _bound(false) , type_name("") - , bind_name("") - , bind_typename("") + , reg_name("") + , bind_name(decl.bindname) + , bind_typename(decl.bindtype) { - indp = new OCIInd [_cnt]; - memset(indp, 0, sizeof(OCIInd)*_cnt); - - rlenp = malloc( sizeof(ub2) * _cnt); // OciDefineByPos uses ub2* for lenp + indp = (OCIInd*) calloc(_cnt, sizeof(OCIInd)); + rlenp = calloc(_cnt, sizeof(ub4)); // OCIBindByPos uses ub4* for lenp - _bind_type = DEFINE_SELECT; + if(decl.inout == "in") + _bind_type = BIND_IN; + else if(decl.inout == "inout") + _bind_type = BIND_INOUT; + else if(decl.inout == "out") + _bind_type = BIND_OUT; }; + virtual ~BindPar() { - if(indp) { delete[] indp; indp = NULL; } + if(indp) { free(indp); indp = NULL; } if(rlenp) { free(rlenp); rlenp = NULL; } // if(rcodep) { delete[] rcodep; rcodep = NULL; } - if(alenp) {delete[] alenp; alenp = NULL; } + if(alenp) { free(alenp); alenp = NULL; } }; // every datatype can be converted to a string @@ -182,7 +180,7 @@ void *rlenp; //ub2 *rcodep; ub2 *alenp; - ub4 mode; // define mode = OCI_DEFAULT, except for SQLT_LONG = OCI_DYNAMIC_FETCH TODO fix long + ub4 mode; // define mode = OCI_DEFAULT, except for SQLT_LONG => OCI_DYNAMIC_FETCH TODO fix long OCIBind *bindp; OCIDefine *defnpp; //TODO union with OCIBind *bindpp @@ -191,12 +189,13 @@ unsigned int _pos, /*_cnt,*/ _max_cnt, _bind_type; size_t _cnt; bool _bound; - tstring type_name, bind_name, bind_typename; + tstring type_name, reg_name, bind_name, bind_typename; - /* NOTE these two function do not work with complex types SQLT_NTY */ + /* NOTE these two functions do not work with complex types SQLT_NTY */ bool is_null(unsigned row) const {return indp[row]==OCI_IND_NULL;}; bool is_not_null(unsigned row) const {return indp[row]!=OCI_IND_NULL;}; protected: + BindPar(const BindPar &other); friend class SqlStatement; }; // class BindPar @@ -386,14 +385,14 @@ void execute_describe(); bool fetch(ub4 rows=-1); - + /* OCIBindByPos - for PL/SQL statements */ void bind(BindPar &bp); /* OCIDefineByPos - for SELECT statements */ void define(BindPar &dp); //OCISvcCtx* _svchp; -public: //todo delete me - these fields should not be public +public: //todo delete me - these fields should not be public const ub4 _lang; const tstring _orig_stmt; mutable tstring _parsed_stmt; Modified: trunk/tora/src/trotl/src/trotl_string.h =================================================================== --- trunk/tora/src/trotl/src/trotl_string.h 2010-09-29 13:52:19 UTC (rev 3700) +++ trunk/tora/src/trotl/src/trotl_string.h 2010-09-29 14:00:56 UTC (rev 3701) @@ -63,8 +63,8 @@ BindParVarchar(unsigned int pos, SqlStatement &stmt, ColumnType &ct) : SqlStatement::BindPar(pos, stmt, ct) { /* amount of bytes = (string length +1 ) * (array length) */ - valuep = (void**) new char [ ( ct._width + 1 ) * (_cnt) ]; // +1 for ending zero - memset(valuep, 0x00, (ct._width + 1) * _cnt); + valuep = (void**) calloc(_cnt, ct._width + 1); + alenp = (ub2*) calloc(_cnt, sizeof(ub2)); dty = SQLT_STR; value_sz = ct._width + 1; @@ -74,8 +74,8 @@ BindParVarchar(unsigned int pos, SqlStatement &stmt, BindVarDecl &decl) : SqlStatement::BindPar(pos, stmt, decl) { // amount of bytes = (string length +1 ) * (array length) - valuep = (void**) new char [ (decl.bracket[0]+1) * (decl.bracket[1]) ]; - memset(valuep, 0x00, (decl.bracket[0]+1) * (decl.bracket[1])); + valuep = (void**) calloc(decl.bracket[0]+1, decl.bracket[1]); + alenp = (ub2*) calloc(_cnt, sizeof(ub2)); dty = SQLT_STR; value_sz = decl.bracket[0]+1; @@ -123,8 +123,8 @@ { BindParChar(unsigned int pos, SqlStatement &stmt, ColumnType &ct) : SqlStatement::BindPar(pos, stmt, ct) { - valuep = (void**) new char [ ( ct._width + 1 ) * _cnt ]; - memset(valuep, 0x00, ( ct._width + 1 ) * _cnt); + valuep = (void**) calloc(_cnt, ct._width + 1); // TODO +1 ?? why? + alenp = (ub2*) calloc(_cnt, sizeof(ub2)); dty = SQLT_CHR; value_sz = ct._width; @@ -133,9 +133,9 @@ BindParChar(unsigned int pos, SqlStatement &stmt, BindVarDecl &decl): SqlStatement::BindPar(pos, stmt, decl) { - valuep = (void**) new char [ (decl.bracket[0]) * (decl.bracket[1]) ]; - memset(valuep, 0x00, (decl.bracket[0]) * (decl.bracket[1])); - + valuep = (void**) calloc(decl.bracket[1], decl.bracket[0]); + alenp = (ub2*) calloc(_cnt, sizeof(ub2)); + dty = SQLT_CHR; value_sz = decl.bracket[0]; type_name = typeid(tstring).name(); @@ -170,8 +170,8 @@ BindParRaw(unsigned int pos, SqlStatement &stmt, ColumnType &ct) : SqlStatement::BindPar(pos, stmt, ct) { // amount of bytes = (string length +1 ) * (array length) - valuep = (void**) new char [ ( ct._width + 1 ) * _cnt ]; - memset(valuep, 0x00, (ct._width + 1) * _cnt); + valuep = (void**) calloc(_cnt, ct._width + 1); + alenp = (ub2*) calloc(_cnt, sizeof(ub2)); dty = SQLT_BIN; value_sz = ct._width; @@ -180,8 +180,8 @@ BindParRaw(unsigned int pos, SqlStatement &stmt, BindVarDecl &decl): SqlStatement::BindPar(pos, stmt, decl) { - valuep = (void**) new char [ (decl.bracket[0]) * (decl.bracket[1]) ]; - memset(valuep, 0x00, (decl.bracket[0]) * (decl.bracket[1])); + valuep = (void**) calloc (decl.bracket[1], decl.bracket[0]); + alenp = (ub2*) calloc(_cnt, sizeof(ub2)); dty = SQLT_BIN; value_sz = decl.bracket[0]; Modified: trunk/tora/src/trotl/src/trotl_var.cpp =================================================================== --- trunk/tora/src/trotl/src/trotl_var.cpp 2010-09-29 13:52:19 UTC (rev 3700) +++ trunk/tora/src/trotl/src/trotl_var.cpp 2010-09-29 14:00:56 UTC (rev 3701) @@ -215,7 +215,7 @@ nsize = sizeof(ptype_name); res = OCICALL(OCIAttrGet(handle, OCI_DTYPE_PARAM, &ptype_name, &nsize, OCI_ATTR_TYPE_NAME, stat._errh)); oci_check_error(__TROTL_HERE__, stat._errh, res); - _data_type_name = tstring((char*)pschema_name, ssize) + "." + tstring((char*)ptype_name,nsize); + _reg_name = _data_type_name = tstring((char*)pschema_name, ssize) + "." + tstring((char*)ptype_name,nsize); res = OCICALL(OCIHandleAlloc((dvoid *) stat._env, (dvoid **) &dschp, (ub4) OCI_HTYPE_DESCRIBE, (size_t) 0, (dvoid **) 0)); oci_check_error(__TROTL_HERE__, stat._errh, res); @@ -233,10 +233,10 @@ if (_typecode == OCI_TYPECODE_NAMEDCOLLECTION) { - ub4 ssize; + ub4 ssize, tsize; ub2 len; - text* col_type_name = NULL; - text* col_schema_name = NULL; + text* coll_type_name = NULL; + text* coll_schema_name = NULL; res = OCICALL(OCIAttrGet((dvoid *) parmp, (ub4) OCI_DTYPE_PARAM, (dvoid *)&_collection_typecode, (ub4 *)0, (ub4)OCI_ATTR_COLLECTION_TYPECODE, stat._errh)); oci_check_error(__TROTL_HERE__, stat._errh, res); @@ -250,11 +250,11 @@ oci_check_error(__TROTL_HERE__, stat._errh, res); /* get the name of the collection */ - res = OCICALL(OCIAttrGet((dvoid*) _collection_dschp, (ub4) OCI_DTYPE_PARAM, (dvoid*) &col_type_name, (ub4 *) &ssize, (ub4) OCI_ATTR_TYPE_NAME, stat._errh)); + res = OCICALL(OCIAttrGet((dvoid*) _collection_dschp, (ub4) OCI_DTYPE_PARAM, (dvoid*) &coll_type_name, (ub4 *) &tsize, (ub4) OCI_ATTR_TYPE_NAME, stat._errh)); oci_check_error(__TROTL_HERE__, stat._errh, res); /* get the name of the schema */ - res = OCICALL(OCIAttrGet((dvoid*) _collection_dschp, (ub4) OCI_DTYPE_PARAM, (dvoid*) &col_schema_name, (ub4 *) &ssize, (ub4) OCI_ATTR_SCHEMA_NAME, stat._errh)); + res = OCICALL(OCIAttrGet((dvoid*) _collection_dschp, (ub4) OCI_DTYPE_PARAM, (dvoid*) &coll_schema_name, (ub4 *) &ssize, (ub4) OCI_ATTR_SCHEMA_NAME, stat._errh)); oci_check_error(__TROTL_HERE__, stat._errh, res); /* get the data type */ @@ -265,18 +265,22 @@ if (_collection_typecode == OCI_TYPECODE_VARRAY) { /* get the number of elements */ - res = OCICALL(OCIAttrGet((dvoid*) _collection_dschp, (ub4) OCI_DTYPE_PARAM, (dvoid*) &num_elems, (ub4 *) 0, (ub4) OCI_ATTR_NUM_ELEMS, stat._errh)); + res = OCICALL(OCIAttrGet((dvoid*) _collection_dschp, (ub4) OCI_DTYPE_PARAM, (dvoid*) &num_elems, (ub4 *) 0, + (ub4) OCI_ATTR_NUM_ELEMS, stat._errh)); oci_check_error(__TROTL_HERE__, stat._errh, res); + _reg_name = tstring("VARARRAY OF ") + tstring((char*)coll_type_name ,tsize); + } else { + _reg_name = tstring("TABLE OF ") + tstring((char*)coll_type_name ,tsize); } - std::cout << "OCI_ATTR_COLLECTION_TYPECODE: " << _collection_typecode << std::endl - << "OCI_ATTR_COLLECTION_ELEMENT: " << _collection_dschp << std::endl - << "OCI_ATTR_DATA_SIZE: " << len << std::endl - << "OCI_ATTR_TYPE_NAME: " << col_type_name << std::endl - << "OCI_ATTR_SCHEMA_NAME: " << col_schema_name << std::endl - << "OCI_ATTR_DATA_TYPE: " << _collection_typecode << std::endl - << "OCI_ATTR_NUM_ELEMS: " << num_elems << std::endl - << "========================================" << std::endl; - _data_type = (OCI_TYPECODE_VARRAY << 8) + _collection_typecode; + // std::cout << "OCI_ATTR_COLLECTION_TYPECODE: " << _collection_typecode << std::endl + // << "OCI_ATTR_COLLECTION_ELEMENT: " << _collection_dschp << std::endl + // << "OCI_ATTR_DATA_SIZE: " << len << std::endl + // << "OCI_ATTR_TYPE_NAME: " << coll_type_name << std::endl + // << "OCI_ATTR_SCHEMA_NAME: " << coll_schema_name << std::endl + // << "OCI_ATTR_DATA_TYPE: " << _collection_typecode << std::endl + // << "OCI_ATTR_NUM_ELEMS: " << num_elems << std::endl + // << "========================================" << std::endl; + //_data_type = (OCI_TYPECODE_VARRAY << 8) + _collection_typecode; } break; } Modified: trunk/tora/src/trotl/src/trotl_var.h =================================================================== --- trunk/tora/src/trotl/src/trotl_var.h 2010-09-29 13:52:19 UTC (rev 3700) +++ trunk/tora/src/trotl/src/trotl_var.h 2010-09-29 14:00:56 UTC (rev 3701) @@ -62,6 +62,7 @@ tstring _column_name; tstring _data_type_name; tstring _data_type_dblink; // ?? TODO + tstring _reg_name; ub2 _data_type; ub2 _width; Modified: trunk/tora/src/trotl/src/trotl_xml.cpp =================================================================== --- trunk/tora/src/trotl/src/trotl_xml.cpp 2010-09-29 13:52:19 UTC (rev 3700) +++ trunk/tora/src/trotl/src/trotl_xml.cpp 2010-09-29 14:00:56 UTC (rev 3701) @@ -40,50 +40,13 @@ Util::RegisterInFactory<BindParXML, CustDefineParFactTwoParmSing> regCustDefineNTY_XML("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; - struct xmlctx *xctx = (xmlctx*) 0; -// xmldocnode *doc = (xmldocnode*) 0; - ocixmldbparam params[1]; - - /* Get an XML context */ - params[0].name_ocixmldbparam = XCTXINIT_OCIDUR; - params[0].value_ocixmldbparam = &dur; - - // TODO add some error checking here - // TODO this xml context should be "more global" - xctx = OCIXmlDbInitXmlCtx(_env, _stmt._conn._svc_ctx, _env._errh, params, 1); - - orastream *os = OraStreamInit((void*)0xDEAD, (void*)this, &oerr, "write", stream_write_callback, "... [truncated message content] |
From: <ibr...@us...> - 2010-10-04 21:52:48
|
Revision: 3723 http://tora.svn.sourceforge.net/tora/?rev=3723&view=rev Author: ibre5041 Date: 2010-10-04 21:52:41 +0000 (Mon, 04 Oct 2010) Log Message: ----------- sync with trotl trunk Modified Paths: -------------- trunk/tora/src/trotl/src/trotl_anydata.cpp trunk/tora/src/trotl/src/trotl_anydata.h trunk/tora/src/trotl/src/trotl_collection.cpp trunk/tora/src/trotl/src/trotl_collection.h trunk/tora/src/trotl/src/trotl_convertor.cpp trunk/tora/src/trotl/src/trotl_convertor.h trunk/tora/src/trotl/src/trotl_exc.cpp trunk/tora/src/trotl/src/trotl_int.cpp trunk/tora/src/trotl/src/trotl_int.h trunk/tora/src/trotl/src/trotl_lob.cpp trunk/tora/src/trotl/src/trotl_lob.h trunk/tora/src/trotl/src/trotl_stat.cpp trunk/tora/src/trotl/src/trotl_stat.h trunk/tora/src/trotl/src/trotl_var.h Modified: trunk/tora/src/trotl/src/trotl_anydata.cpp =================================================================== --- trunk/tora/src/trotl/src/trotl_anydata.cpp 2010-10-04 21:51:39 UTC (rev 3722) +++ trunk/tora/src/trotl/src/trotl_anydata.cpp 2010-10-04 21:52:41 UTC (rev 3723) @@ -106,7 +106,7 @@ OCINumber num; OCINumber *num_ptr = # ub4 len; - text str_buf[61]; + text str_buf[64]; ub4 str_len = sizeof(str_buf) / sizeof(*str_buf); sword res1 = OCICALL(OCIAnyDataAccess(_stmt._conn._svc_ctx, _stmt._errh, @@ -117,11 +117,10 @@ (dvoid **)&num_ptr, &len)); oci_check_error(__TROTL_HERE__, _stmt._errh, res1); - const char fmt[]="99999999999999999999999999999999999999D90"; sword res2 = OCICALL(OCINumberToText(_stmt._errh, (OCINumber*) &num, - (const oratext*)fmt, - sizeof(fmt) -1, + (const oratext*) g_TROTL_DEFAULT_NUM_FTM, + strlen(g_TROTL_DEFAULT_NUM_FTM), 0, // CONST OraText *nls_params, 0, // ub4 nls_p_length, (ub4*)&str_len, @@ -129,7 +128,7 @@ )); oci_check_error(__TROTL_HERE__, _env._errh, res2); - return tstring( (const char *)&str_buf[0], str_len); + return tstring((const char*)str_buf, str_len); } case OCI_TYPECODE_VARCHAR2: { Modified: trunk/tora/src/trotl/src/trotl_anydata.h =================================================================== --- trunk/tora/src/trotl/src/trotl_anydata.h 2010-10-04 21:51:39 UTC (rev 3722) +++ trunk/tora/src/trotl/src/trotl_anydata.h 2010-10-04 21:52:41 UTC (rev 3723) @@ -128,7 +128,7 @@ // int* get_ref() {return &_value;} -protected: +//protected: std::stringstream _stringrepres; Modified: trunk/tora/src/trotl/src/trotl_collection.cpp =================================================================== --- trunk/tora/src/trotl/src/trotl_collection.cpp 2010-10-04 21:51:39 UTC (rev 3722) +++ trunk/tora/src/trotl/src/trotl_collection.cpp 2010-10-04 21:52:41 UTC (rev 3723) @@ -62,13 +62,12 @@ // TODO tstring BindParCollectionTabNum::get_string(unsigned int row) const { - OCITypeCode tc; - OCIType *type = (OCIType *)NULL; - boolean isNull, eoc = false; - OCIInd ind; + boolean eoc = false; sword res; OCIIter *itr; + _stringrepres.str(""); + if( *(sb2*)(_collection_indp[row]) == OCI_IND_NULL) { _stringrepres << "<NULL>"; @@ -77,8 +76,7 @@ res = OCICALL(OCIIterCreate (_env, _stmt._errh, (OCIColl*)valuep[row], &itr)); oci_check_error(__TROTL_HERE__, _stmt._errh, res); - - _stringrepres.str(""); + _stringrepres << type_name << "("; bool comma=false; @@ -86,7 +84,6 @@ { OCINumber *ocinum = NULL; void *elemind = NULL; - int i; res = OCICALL(OCIIterNext (_env, _stmt._errh, itr, (void**) &ocinum, @@ -99,17 +96,25 @@ if(comma) _stringrepres << ", "; - + comma = true; if(*(sb2*)(elemind) == OCI_IND_NULL) { _stringrepres << "NULL"; } else { - res = OCICALL(OCINumberToInt(_stmt._errh, ocinum, sizeof(i), 0, &i)); - oci_check_error(__TROTL_HERE__, _stmt._errh, res); - _stringrepres << i; - } - - comma = true; + text str_buf[64]; + ub4 str_len = sizeof(str_buf) / sizeof(*str_buf); + sword res = OCICALL(OCINumberToText(_stmt._errh, + (OCINumber*) ocinum, + (const oratext*) g_TROTL_DEFAULT_NUM_FTM, + strlen(g_TROTL_DEFAULT_NUM_FTM), + 0, // CONST OraText *nls_params, + 0, // ub4 nls_p_length, + (ub4*)&str_len, + str_buf + )); + oci_check_error(__TROTL_HERE__, _env._errh, res); + _stringrepres << tstring((const char*)str_buf, str_len); + } } _stringrepres << ")"; @@ -138,10 +143,7 @@ tstring BindParCollectionTabVarchar::get_string(unsigned int row) const { - OCITypeCode tc; - OCIType *type = (OCIType *)NULL; - boolean isNull, eoc = false; - OCIInd ind; + boolean eoc = false; sword res; OCIIter *itr; @@ -162,7 +164,6 @@ { void *ocistring = NULL; void *elemind = NULL; - int i; res = OCICALL(OCIIterNext (_env, _stmt._errh, itr, (void**) &ocistring, @@ -181,9 +182,6 @@ _stringrepres << "NULL"; } else { _stringrepres << '\'' << OCIStringPtr(_env, *(OCIString **)ocistring) << '\''; - // res = OCICALL(OCINumberToInt(_stmt._errh, ocinum, sizeof(i), 0, &i)); - // oci_check_error(__TROTL_HERE__, _stmt._errh, res); - // _stringrepres << i; } comma = true; @@ -195,7 +193,81 @@ return _stringrepres.str(); }; + +tstring SqlCollection::str() const +{ + boolean eoc = false; + sword res; + OCIIter *itr; + + _stringrepres.str(""); + if( _ind == OCI_IND_NULL) + { + _stringrepres << "<NULL>"; + return _stringrepres.str(); + } + + res = OCICALL(OCIIterCreate (_conn._env, _conn._env._errh, _valuep, &itr)); + oci_check_error(__TROTL_HERE__, _conn._env._errh, res); + + _stringrepres << _data_type_name << "("; + + bool comma=false; + while(!eoc) + { + OCINumber *ocinum = NULL; + void *elemind = NULL; + res = OCICALL(OCIIterNext (_conn._env, _conn._env._errh, + itr, + (void**) &ocinum, + (void**) &elemind, //NULL, //void **elemind, + &eoc)); + oci_check_error(__TROTL_HERE__, _conn._env._errh, res); + + if(eoc) + break; + + if(comma) + _stringrepres << ", "; + comma = true; + if(*(sb2*)(elemind) == OCI_IND_NULL) + { + _stringrepres << "NULL"; + } else { + switch(_data_type) + { + case SQLT_NUM: + { + text str_buf[64]; + ub4 str_len = sizeof(str_buf) / sizeof(*str_buf); + sword res = OCICALL(OCINumberToText(_conn._env._errh, + (OCINumber*) ocinum, + (const oratext*) g_TROTL_DEFAULT_NUM_FTM, + strlen(g_TROTL_DEFAULT_NUM_FTM), + 0, // CONST OraText *nls_params, + 0, // ub4 nls_p_length, + (ub4*)&str_len, + str_buf + )); + oci_check_error(__TROTL_HERE__, _conn._env._errh, res); + _stringrepres << tstring((const char*)str_buf, str_len); + } + break; + default: + throw OciException(__TROTL_HERE__, "Not implemented yet"); + } + } + } + _stringrepres << ")"; + + res = sword(OCIIterDelete (_conn._env, _conn._env._errh, &itr)); + oci_check_error(__TROTL_HERE__, _conn._env._errh, res); + + return _stringrepres.str(); +}; + + // tstring SqlCollection::str() const // { // return _stringrepres.str(); Modified: trunk/tora/src/trotl/src/trotl_collection.h =================================================================== --- trunk/tora/src/trotl/src/trotl_collection.h 2010-10-04 21:51:39 UTC (rev 3722) +++ trunk/tora/src/trotl/src/trotl_collection.h 2010-10-04 21:52:41 UTC (rev 3723) @@ -89,7 +89,7 @@ virtual void bind_hook(SqlStatement &stmt); -private: +//private: mutable std::stringstream _stringrepres; void **_collection_indp; OCIType *_collection_tdo; @@ -147,26 +147,35 @@ friend struct ConvertorForRead; friend struct ConvertorForWrite; - SqlCollection(OciConnection &conn): _conn(conn) // NULL constructor + SqlCollection(OciConnection &conn) + : _conn(conn) + , _collection_tdo(NULL) {} - SqlCollection(const SqlValue &value, OciConnection &conn): _conn(conn) - { - //_ind.set(); + SqlCollection(const SqlValue &value, OciConnection &conn) + : _conn(conn) + , _collection_tdo(NULL) + { throw OciException(__TROTL_HERE__, "Not implemented yet"); } - tstring str() const - { - throw OciException(__TROTL_HERE__, "Not implemented yet"); - } + ~SqlCollection() {}; + + tstring str() const; operator tstring() const { return str(); }; -protected: - std::stringstream _stringrepres; +//protected: OciConnection& _conn; + mutable std::stringstream _stringrepres; + tstring _data_type_name; + + OCIColl *_valuep; + OCIType *_collection_tdo; + OCIInd _ind; + ub2 _data_type; + }; Modified: trunk/tora/src/trotl/src/trotl_convertor.cpp =================================================================== --- trunk/tora/src/trotl/src/trotl_convertor.cpp 2010-10-04 21:51:39 UTC (rev 3722) +++ trunk/tora/src/trotl/src/trotl_convertor.cpp 2010-10-04 21:52:41 UTC (rev 3723) @@ -64,13 +64,14 @@ CL._ind = BP.indp[_row]; if(CL.is_not_null()) { - /* TODO: - * - whose errh should I use? BP's or SqlValue's (race) - * - no support for temporary lobs here - */ - sword res = OCICALL(OCILobAssign(BP._env, BP._env._errh, ((OCILobLocator**)BP.valuep)[_row], &CL._loc)); - oci_check_error(__TROTL_HERE__, BP._env._errh, res); - + if(BP.is_temporary(_row)) + { + sword res = OCICALL(OCILobLocatorAssign(BP._stmt._conn._svc_ctx, BP._env._errh, ((OCILobLocator**)BP.valuep)[_row], &CL._loc)); + oci_check_error(__TROTL_HERE__, BP._env._errh, res); + } else { + sword res = OCICALL(OCILobAssign(BP._env, BP._env._errh, ((OCILobLocator**)BP.valuep)[_row], &CL._loc)); + oci_check_error(__TROTL_HERE__, BP._env._errh, res); + } //CL._loc = ((OCILobLocator**)BP.valuep)[_row]; //((OCILobLocator**)BP.valuep)[_row] = NULL; //CL._ind = BP.indp[_row]; @@ -81,10 +82,16 @@ { BL._ind = BP.indp[_row]; if(BL.is_not_null()) - { - sword res = OCICALL(OCILobAssign(BP._env, BP._env._errh, ((OCILobLocator**)BP.valuep)[_row], &BL._loc)); - oci_check_error(__TROTL_HERE__, BP._env._errh, res); - + { + if(BP.is_temporary(_row)) + { + sword res = OCICALL(OCILobLocatorAssign(BP._stmt._conn._svc_ctx, BP._env._errh, ((OCILobLocator**)BP.valuep)[_row], &BL._loc)); + oci_check_error(__TROTL_HERE__, BP._env._errh, res); + } else { + sword res = OCICALL(OCILobAssign(BP._env, BP._env._errh, ((OCILobLocator**)BP.valuep)[_row], &BL._loc)); + oci_check_error(__TROTL_HERE__, BP._env._errh, res); + } + //BL._loc = ((OCILobLocator**)BP.valuep)[_row]; //((OCILobLocator**)BP.valuep)[_row] = NULL; //BL._ind = BP.indp[_row]; @@ -146,6 +153,27 @@ } #endif +void ConvertorForRead::Fire(const BindParCollectionTabNum &BP, SqlCollection &SV) +{ + sword res; + SV._collection_tdo = BP._collection_tdo; + SV._data_type = SQLT_NUM; + SV._ind = *(sb2*)(BP._collection_indp[_row]); + SV._data_type_name = BP.type_name; + + res = OCICALL(OCIObjectNew(BP._stmt._env, BP._stmt._errh, BP._stmt._conn._svc_ctx, + OCI_TYPECODE_TABLE, // TabNum => Table + BP._collection_tdo, + NULL, // dvoid *table + OCI_DURATION_SESSION, + TRUE, // boolean value + (dvoid**) &SV._valuep)); + oci_check_error(__TROTL_HERE__, BP._stmt._errh, res); + + res = OCICALL(OCICollAssign(BP._stmt._env, BP._stmt._errh, (OCIColl*)BP.valuep[_row], SV._valuep)); + oci_check_error(__TROTL_HERE__, BP._stmt._errh, res); +} + // TODO this needs to be tested void ConvertorForWrite::Fire(const SqlDateTime &DT, BindParDate &BP) { Modified: trunk/tora/src/trotl/src/trotl_convertor.h =================================================================== --- trunk/tora/src/trotl/src/trotl_convertor.h 2010-10-04 21:51:39 UTC (rev 3722) +++ trunk/tora/src/trotl/src/trotl_convertor.h 2010-10-04 21:52:41 UTC (rev 3723) @@ -41,6 +41,7 @@ #include "trotl_int.h" #include "trotl_lob.h" #include "trotl_date.h" +#include "trotl_collection.h" #ifdef ORACLE_HAS_XML #include "trotl_xml.h" @@ -63,10 +64,6 @@ * This the only way, how can I pass row argument */ ConvertorForRead(unsigned int row) : _row(row) {}; - - void Fire(const BindParDate &BP, SqlDateTime &SV); - void Fire(const BindParBlob &BP, SqlBlob &SV); - void Fire(const BindParClob &BP, SqlClob &SV); void Fire(const prefferedNumericType &BP, SqlInt<int> &SV); void Fire(const prefferedNumericType &BP, SqlInt<unsigned int> &SV); @@ -75,11 +72,15 @@ void Fire(const prefferedNumericType &BP, SqlInt<double> &SV); void Fire(const prefferedNumericType &BP, SqlInt<float> &SV); void Fire(const prefferedNumericType &BP, SqlNumber &SV); - + void Fire(const prefferedNumericType &BP, SqlCollection &SV) { OnError(BP, SV); }; + void Fire(const prefferedNumericType &BP, SqlDateTime &SV) { OnError(BP, SV); }; + void Fire(const prefferedNumericType &BP, SqlBlob &SV) { OnError(BP, SV); }; + void Fire(const prefferedNumericType &BP, SqlClob &SV) { OnError(BP, SV); }; #ifdef ORACLE_HAS_XML - void Fire(const BindParXML &BP, SqlXML &SV); + void Fire(const prefferedNumericType &BP, SqlXML &SV) { OnError(BP, SV); }; #endif + void Fire(const BindParDate &BP, SqlDateTime &SV); void Fire(const BindParDate &BP, SqlClob &SV) { OnError(BP, SV); }; void Fire(const BindParDate &BP, SqlBlob &SV) { OnError(BP, SV); }; void Fire(const BindParDate &BP, SqlInt<int> &SV) { OnError(BP, SV); }; @@ -89,10 +90,12 @@ void Fire(const BindParDate &BP, SqlInt<double> &SV) { OnError(BP, SV); }; void Fire(const BindParDate &BP, SqlInt<float> &SV) { OnError(BP, SV); }; void Fire(const BindParDate &BP, SqlNumber &SV) { OnError(BP, SV); }; + void Fire(const BindParDate &BP, SqlCollection &SV) { OnError(BP, SV); }; #ifdef ORACLE_HAS_XML void Fire(const BindParDate &BP, SqlXML &SV) { OnError(BP, SV); }; #endif + void Fire(const BindParClob &BP, SqlClob &SV); void Fire(const BindParClob &BP, SqlDateTime &SV) { OnError(BP, SV); }; void Fire(const BindParClob &BP, SqlBlob &SV) { OnError(BP, SV); }; void Fire(const BindParClob &BP, SqlInt<int> &SV) { OnError(BP, SV); }; @@ -102,10 +105,12 @@ void Fire(const BindParClob &BP, SqlInt<double> &SV) { OnError(BP, SV); }; void Fire(const BindParClob &BP, SqlInt<float> &SV) { OnError(BP, SV); }; void Fire(const BindParClob &BP, SqlNumber &SV) { OnError(BP, SV); }; + void Fire(const BindParClob &BP, SqlCollection &SV) { OnError(BP, SV); }; #ifdef ORACLE_HAS_XML void Fire(const BindParClob &BP, SqlXML &SV) { OnError(BP, SV); }; // TODO is any convesion possible here? #endif - + + void Fire(const BindParBlob &BP, SqlBlob &SV); void Fire(const BindParBlob &BP, SqlDateTime &SV) { OnError(BP, SV); }; void Fire(const BindParBlob &BP, SqlClob &SV) { OnError(BP, SV); }; void Fire(const BindParBlob &BP, SqlInt<int> &SV) { OnError(BP, SV); }; @@ -115,17 +120,29 @@ void Fire(const BindParBlob &BP, SqlInt<double> &SV) { OnError(BP, SV); }; void Fire(const BindParBlob &BP, SqlInt<float> &SV) { OnError(BP, SV); }; void Fire(const BindParBlob &BP, SqlNumber &SV) { OnError(BP, SV); }; + void Fire(const BindParBlob &BP, SqlCollection &SV) { OnError(BP, SV); }; #ifdef ORACLE_HAS_XML void Fire(const BindParBlob &BP, SqlXML &SV) { OnError(BP, SV); }; #endif - void Fire(const prefferedNumericType &BP, SqlDateTime &SV) { OnError(BP, SV); }; - void Fire(const prefferedNumericType &BP, SqlBlob &SV) { OnError(BP, SV); }; - void Fire(const prefferedNumericType &BP, SqlClob &SV) { OnError(BP, SV); }; -#ifdef ORACLE_HAS_XML - void Fire(const prefferedNumericType &BP, SqlXML &SV) { OnError(BP, SV); }; + void Fire(const BindParCollectionTabNum &BP, SqlDateTime &SV) { OnError(BP, SV); }; + void Fire(const BindParCollectionTabNum &BP, SqlClob &SV) { OnError(BP, SV); }; + void Fire(const BindParCollectionTabNum &BP, SqlBlob &SV) { OnError(BP, SV); }; + void Fire(const BindParCollectionTabNum &BP, SqlNumber &SV) { OnError(BP, SV); }; + void Fire(const BindParCollectionTabNum &BP, SqlCollection &SV); +#ifdef ORACLE_HAS_XML + void Fire(const BindParCollectionTabNum &BP, SqlXML &SV) { OnError(BP, SV); }; #endif - + + void Fire(const BindParCollectionTabVarchar &BP, SqlClob &SV) { OnError(BP, SV); }; + void Fire(const BindParCollectionTabVarchar &BP, SqlBlob &SV) { OnError(BP, SV); }; + void Fire(const BindParCollectionTabVarchar &BP, SqlDateTime &SV) { OnError(BP, SV); }; + void Fire(const BindParCollectionTabVarchar &BP, SqlNumber &SV) { OnError(BP, SV); }; + void Fire(const BindParCollectionTabVarchar &BP, SqlCollection &SV) { OnError(BP, SV); }; +#ifdef ORACLE_HAS_XML + void Fire(const BindParCollectionTabVarchar &BP, SqlXML &SV) { OnError(BP, SV); }; +#endif + #ifdef ORACLE_HAS_XML void Fire(const BindParXML &BP, SqlDateTime &SV) { OnError(BP, SV); }; void Fire(const BindParXML &BP, SqlBlob &SV) { OnError(BP, SV); }; @@ -137,36 +154,48 @@ void Fire(const BindParXML &BP, SqlInt<double> &SV) { OnError(BP, SV); }; void Fire(const BindParXML &BP, SqlInt<float> &SV) { OnError(BP, SV); }; void Fire(const BindParXML &BP, SqlNumber &SV) { OnError(BP, SV); }; + void Fire(const BindParXML &BP, SqlXML &SV); + void Fire(const BindParXML &BP, SqlCollection &SV) { OnError(BP, SV); }; #endif + private: ConvertorForRead(); unsigned int _row; }; -typedef ::Loki::StaticDispatcher -< -ConvertorForRead, -const SqlStatement::BindPar, - + typedef LOKI_TYPELIST_6(const prefferedNumericType, + const BindParClob, + const BindParBlob, + const BindParDate, + const BindParCollectionTabNum, + const BindParCollectionTabVarchar) + TL_DispatcherForReadInput; + + typedef LOKI_TYPELIST_5(SqlClob, + SqlBlob, + SqlDateTime, + SqlNumber, + SqlCollection) + TL_DispatcherForReadOutput; + #ifdef ORACLE_HAS_XML -LOKI_TYPELIST_5(const prefferedNumericType, const BindParClob, const BindParBlob, const BindParDate, const BindParXML), + typedef ::Loki::TL::Append<TL_DispatcherForReadInput, const BindParXML>::Result TL_DispatcherForReadInputX; + typedef ::Loki::TL::Append<TL_DispatcherForReadOutput, SqlXML>::Result TL_DispatcherForReadOutputX; #else -LOKI_TYPELIST_4(const prefferedNumericType, const BindParClob, const BindParBlob, const BindParDate), + typedef TL_DispatcherForReadInput TL_DispatcherForReadInputX; + typedef TL_DispatcherForReadOutput TL_DispatcherForReadOutputX; #endif - -false, -SqlValue, - -#ifdef ORACLE_HAS_XML -LOKI_TYPELIST_5(SqlClob, SqlBlob, SqlDateTime, SqlXML, SqlNumber), - /*SqlInt<int>, SqlInt<unsigned>, SqlInt<long>, SqlInt<unsigned long>, SqlInt<double>, SqlInt<float>,*/ -#else -LOKI_TYPELIST_4(SqlClob, SqlBlob, SqlDateTime, SqlNumber), -#endif - -void -> DispatcherForRead; + +typedef ::Loki::StaticDispatcher < + ConvertorForRead, + const SqlStatement::BindPar, + TL_DispatcherForReadInputX, + false, + SqlValue, + TL_DispatcherForReadOutputX, + void + > DispatcherForRead; struct TROTL_EXPORT ConvertorForWrite: public Convertor { Modified: trunk/tora/src/trotl/src/trotl_exc.cpp =================================================================== --- trunk/tora/src/trotl/src/trotl_exc.cpp 2010-10-04 21:51:39 UTC (rev 3722) +++ trunk/tora/src/trotl/src/trotl_exc.cpp 2010-10-04 21:52:41 UTC (rev 3723) @@ -70,6 +70,9 @@ _sql_error_code.push_back(21001); // my bogus value _mess += "ORACLE_HOME not found\n"; break; + case OCI_NO_DATA: + _sql_error_code.push_back(21002); // my bogus value + _mess += "OCIErrorGet: OCI_NO_DATA\n"; default: _sql_error_code.push_back(0); } @@ -90,30 +93,30 @@ sb4 errorcode; sword res = OCICALL(OCIErrorGet(errh, 1, NULL, &errorcode, (OraText*)buffer, sizeof(buffer), OCI_HTYPE_ERROR)); - if (res == OCI_SUCCESS) { + switch(res) + { + case OCI_SUCCESS: + { _sql_error_code.push_back(errorcode); -//#ifdef _UNICODE -// #if 0 -// char nbuffer[2048]; -// #ifdef _MSC_VER -// std::_USE(std::locale::empty(), std::ctype<wchar_t>) -// #else -// std::use_facet<std::ctype<wchar_t> >(std::locale::empty()) -// #endif -// .narrow((const char*)buffer, (const char*)buffer+_tcslen((const char*)buffer)+1, 0, nbuffer); -// _mess += nbuffer; -// #else _mess += buffer; -//#endif - } else { + break; + } + case OCI_NO_DATA: + { + _sql_error_code.push_back(21002); + _mess += "OCIErrorGet: OCI_NO_DATA\n"; + } + default: + { _sql_error_code.push_back(0); + _mess += "OCIErrorGet: unknown error: \n" + res; } -// std::cerr << "Res:" << res << ":" << _mess << std::endl; + } _parse_offset = 0; } //OciException::OciException(tstring where, OCIError* errh, SqlStatement& stmt) -OciException::OciException(tstring where, SqlStatement& stmt) : + OciException::OciException(tstring where, SqlStatement& stmt) : _where(where), _mess(where) { #ifdef DEBUG Modified: trunk/tora/src/trotl/src/trotl_int.cpp =================================================================== --- trunk/tora/src/trotl/src/trotl_int.cpp 2010-10-04 21:51:39 UTC (rev 3722) +++ trunk/tora/src/trotl/src/trotl_int.cpp 2010-10-04 21:52:41 UTC (rev 3723) @@ -68,28 +68,22 @@ { if(!indp[row]) { - text str_buf[61]; + text str_buf[64]; ub4 str_len = sizeof(str_buf) / sizeof(*str_buf); - // const char fmt[]="99999999999999999999999999999999999999D99999999999999999999"; - const char fmt[]="99999999999999999999999999999999999999D90"; - // const char fmt[]="0009D99"; - sword res = OCICALL(OCINumberToText( _env._errh, - (OCINumber*) &((char*)valuep)[row * value_sz ], //(OCINumber*)valuep, - (const oratext*)fmt, - sizeof(fmt) -1, - 0, // CONST OraText *nls_params, - 0, // ub4 nls_p_length, + (OCINumber*) &((char*)valuep)[row * value_sz ], //(OCINumber*)valuep, + (const oratext*) g_TROTL_DEFAULT_NUM_FTM, + strlen(g_TROTL_DEFAULT_NUM_FTM), + 0, // CONST OraText *nls_params, + 0, // ub4 nls_p_length, (ub4*)&str_len, str_buf )); oci_check_error(__TROTL_HERE__, _env._errh, res); - str_buf[str_len+1] = '\0'; - - return tstring((const char*)str_buf); + return tstring((const char*)str_buf, str_len); } else { return ""; } Modified: trunk/tora/src/trotl/src/trotl_int.h =================================================================== --- trunk/tora/src/trotl/src/trotl_int.h 2010-10-04 21:51:39 UTC (rev 3722) +++ trunk/tora/src/trotl/src/trotl_int.h 2010-10-04 21:52:41 UTC (rev 3723) @@ -555,30 +555,24 @@ tstring str() const { - text str_buf[61]; + text str_buf[64]; ub4 str_len = sizeof(str_buf) / sizeof(*str_buf); - // const char fmt[]="99999999999999999999999999999999999999D99999999999999999999"; - const char fmt[]="99999999999999999999999999999999999999D90"; - // const char fmt[]="0009D99"; - sword res = OCICALL(OCINumberToText( _env._errh, - (OCINumber*) &_val, - (const oratext*)fmt, - sizeof(fmt) -1, - 0, // CONST OraText *nls_params, - 0, // ub4 nls_p_length, + (OCINumber*) &_val, + (const oratext*) g_TROTL_DEFAULT_NUM_FTM, //(const oratext*)fmt, + strlen(g_TROTL_DEFAULT_NUM_FTM), + 0, // CONST OraText *nls_params, + 0, // ub4 nls_p_length, (ub4*)&str_len, str_buf )); oci_check_error(__TROTL_HERE__, _env._errh, res); - //str_buf[str_len+1] = '\0'; - return tstring((const char*)str_buf, str_len); }; - + friend struct ConvertorForRead; friend struct ConvertorForWrite; }; Modified: trunk/tora/src/trotl/src/trotl_lob.cpp =================================================================== --- trunk/tora/src/trotl/src/trotl_lob.cpp 2010-10-04 21:51:39 UTC (rev 3722) +++ trunk/tora/src/trotl/src/trotl_lob.cpp 2010-10-04 21:52:41 UTC (rev 3723) @@ -98,7 +98,7 @@ //std::cerr << "~BindParLob3" << std::endl; valuep = NULL; } - std::cerr << "~BindParLob4" << std::endl; + //std::cerr << "~BindParLob4" << std::endl; } void BindParLob::descAlloc(void) //TODO OCI_DTYPE_FILE for BFILE, CFILE @@ -116,7 +116,7 @@ { if(((OCILobLocator**)valuep)[i]) { - std::cerr << "void descFree(void): " << i << std::endl; + //std::cerr << "void descFree(void): " << i << std::endl; sword res = OCICALL(OCIDescriptorFree( ((void**)valuep)[i], OCI_DTYPE_LOB)); oci_check_error(__TROTL_HERE__, _env, res); } @@ -137,6 +137,14 @@ // oci_check_error(__TROTL_HERE__, _env, res); } +boolean BindParLob::is_temporary(unsigned _row) const +{ + boolean flag; + sword res = OCICALL(OCILobIsTemporary(_env, _env._errh, ((OCILobLocator**)valuep)[_row], &flag)); + oci_check_error(__TROTL_HERE__, _env._errh, res); + return flag; +} + BindParClob::BindParClob(unsigned int pos, SqlStatement &stmt, ColumnType &ct) : BindParLob(pos, stmt, ct) { dty = SQLT_CLOB; Modified: trunk/tora/src/trotl/src/trotl_lob.h =================================================================== --- trunk/tora/src/trotl/src/trotl_lob.h 2010-10-04 21:51:39 UTC (rev 3722) +++ trunk/tora/src/trotl/src/trotl_lob.h 2010-10-04 21:52:41 UTC (rev 3723) @@ -56,6 +56,8 @@ virtual void bind_hook(SqlStatement &stmt); virtual void define_hook(SqlStatement &stmt); + boolean is_temporary(unsigned _row) const; + private: void descAlloc(void); //TODO OCI_DTYPE_FILE for BFILE, CFILE void descFree(void); Modified: trunk/tora/src/trotl/src/trotl_stat.cpp =================================================================== --- trunk/tora/src/trotl/src/trotl_stat.cpp 2010-10-04 21:51:39 UTC (rev 3722) +++ trunk/tora/src/trotl/src/trotl_stat.cpp 2010-10-04 21:52:41 UTC (rev 3723) @@ -50,6 +50,7 @@ int TROTL_EXPORT g_OCIPL_BULK_ROWS = 3; int TROTL_EXPORT g_OCIPL_MAX_LONG = 30000; +char TROTL_EXPORT *g_TROTL_DEFAULT_NUM_FTM = "TM\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; SqlStatement::SqlStatement(OciConnection& conn, const tstring& stmt, ub4 lang, int bulk_rows) Modified: trunk/tora/src/trotl/src/trotl_stat.h =================================================================== --- trunk/tora/src/trotl/src/trotl_stat.h 2010-10-04 21:51:39 UTC (rev 3722) +++ trunk/tora/src/trotl/src/trotl_stat.h 2010-10-04 21:52:41 UTC (rev 3723) @@ -190,11 +190,11 @@ size_t _cnt; bool _bound; tstring type_name, reg_name, bind_name, bind_typename; - + + //protected: /* NOTE these two functions do not work with complex types SQLT_NTY */ bool is_null(unsigned row) const {return indp[row]==OCI_IND_NULL;}; - bool is_not_null(unsigned row) const {return indp[row]!=OCI_IND_NULL;}; - protected: + bool is_not_null(unsigned row) const {return indp[row]!=OCI_IND_NULL;}; BindPar(const BindPar &other); friend class SqlStatement; Modified: trunk/tora/src/trotl/src/trotl_var.h =================================================================== --- trunk/tora/src/trotl/src/trotl_var.h 2010-10-04 21:51:39 UTC (rev 3722) +++ trunk/tora/src/trotl/src/trotl_var.h 2010-10-04 21:52:41 UTC (rev 3723) @@ -48,10 +48,11 @@ #if defined(TROTL_MAKE_DLL) || defined(__GNUC__) extern int TROTL_EXPORT g_OCIPL_BULK_ROWS; extern int TROTL_EXPORT g_OCIPL_MAX_LONG; +extern char TROTL_EXPORT *g_TROTL_DEFAULT_NUM_FTM; #else -// int TROTL_EXPORT g_OCIPL_BULK_ROWS; debug int TROTL_EXPORT g_OCIPL_BULK_ROWS; -int TROTL_EXPORT g_OCIPL_MAX_LONG; +int TROTL_EXPORT g_OCIPL_MAX_LONG; +char TROTL_EXPORT *g_TROTL_DEFAULT_NUM_FTM; #endif struct Convertor; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2010-10-04 22:02:22
|
Revision: 3726 http://tora.svn.sourceforge.net/tora/?rev=3726&view=rev Author: ibre5041 Date: 2010-10-04 22:02:16 +0000 (Mon, 04 Oct 2010) Log Message: ----------- debug prints removed Modified Paths: -------------- trunk/tora/src/trotl/src/trotl_exc.cpp trunk/tora/src/trotl/src/trotl_parser.h Modified: trunk/tora/src/trotl/src/trotl_exc.cpp =================================================================== --- trunk/tora/src/trotl/src/trotl_exc.cpp 2010-10-04 21:57:15 UTC (rev 3725) +++ trunk/tora/src/trotl/src/trotl_exc.cpp 2010-10-04 22:02:16 UTC (rev 3726) @@ -244,7 +244,7 @@ _parse_offset(other._parse_offset) { //throw std::logic_error("OciException should not be copied"); - std::cerr << __TROTL_HERE__ << "OciException should not be copied" << std::endl; + //std::cerr << __TROTL_HERE__ << "OciException should not be copied" << std::endl; } OciException& OciException::arg(int d) Modified: trunk/tora/src/trotl/src/trotl_parser.h =================================================================== --- trunk/tora/src/trotl/src/trotl_parser.h 2010-10-04 21:57:15 UTC (rev 3725) +++ trunk/tora/src/trotl/src/trotl_parser.h 2010-10-04 22:02:16 UTC (rev 3726) @@ -88,8 +88,7 @@ void print() const { // get_log().ts( std::string(__HERE_SHORT__)) - std::cout - << ':' << bindname << '<' << bindtype << bracket[0] << ',' << inout << bracket[1] << '>' << std::endl; + //std::cout << ':' << bindname << '<' << bindtype << bracket[0] << ',' << inout << bracket[1] << '>' << std::endl; } bool operator==(tstring _varname) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2010-10-06 11:19:42
|
Revision: 3733 http://tora.svn.sourceforge.net/tora/?rev=3733&view=rev Author: ibre5041 Date: 2010-10-06 11:19:27 +0000 (Wed, 06 Oct 2010) Log Message: ----------- code cleanup, camelize is_temporary, new method getChunkSize Modified Paths: -------------- trunk/tora/src/trotl/src/trotl_convertor.cpp trunk/tora/src/trotl/src/trotl_exc.cpp trunk/tora/src/trotl/src/trotl_lob.cpp trunk/tora/src/trotl/src/trotl_lob.h trunk/tora/src/trotl/src/trotl_xml.cpp Modified: trunk/tora/src/trotl/src/trotl_convertor.cpp =================================================================== --- trunk/tora/src/trotl/src/trotl_convertor.cpp 2010-10-05 12:15:40 UTC (rev 3732) +++ trunk/tora/src/trotl/src/trotl_convertor.cpp 2010-10-06 11:19:27 UTC (rev 3733) @@ -64,7 +64,7 @@ CL._ind = BP.indp[_row]; if(CL.is_not_null()) { - if(BP.is_temporary(_row)) + if(BP.isTemporary(_row)) { sword res = OCICALL(OCILobLocatorAssign(BP._stmt._conn._svc_ctx, BP._env._errh, ((OCILobLocator**)BP.valuep)[_row], &CL._loc)); oci_check_error(__TROTL_HERE__, BP._env._errh, res); @@ -83,7 +83,7 @@ BL._ind = BP.indp[_row]; if(BL.is_not_null()) { - if(BP.is_temporary(_row)) + if(BP.isTemporary(_row)) { sword res = OCICALL(OCILobLocatorAssign(BP._stmt._conn._svc_ctx, BP._env._errh, ((OCILobLocator**)BP.valuep)[_row], &BL._loc)); oci_check_error(__TROTL_HERE__, BP._env._errh, res); Modified: trunk/tora/src/trotl/src/trotl_exc.cpp =================================================================== --- trunk/tora/src/trotl/src/trotl_exc.cpp 2010-10-05 12:15:40 UTC (rev 3732) +++ trunk/tora/src/trotl/src/trotl_exc.cpp 2010-10-06 11:19:27 UTC (rev 3733) @@ -170,7 +170,7 @@ const char* sql = _last_sql.c_str(); size_t l = strlen(buffer); - int line = 1; + unsigned line = 1; const char* s = sql; const char* e = sql + _parse_offset; const char* lp = sql; @@ -190,7 +190,7 @@ //#ifdef __STDC_WANT_SECURE_LIB__ // char* b = buffer+l + snprintf_s(buffer+l, sizeof(buffer)-l, _TRUNCATE, "\nerror at SQL position %d [%d.%d]:\n", _parse_offset, line, column); //#else - char* b = buffer+l + snprintf(buffer+l, sizeof(buffer)-l-1, "\nerror at SQL position %d [%d.%d]:\n", _parse_offset, line, column); + char* b = buffer+l + snprintf(buffer+l, sizeof(buffer)-l-1, "\nerror at SQL position %u [%u.%zu]:\n", (unsigned)_parse_offset, line, column); //#endif char* p = b; s = lp; @@ -225,7 +225,7 @@ } OciException::OciException(tstring where, const char* msg) : - _where(where), _mess(where), _parse_offset(0), _last_sql("") + _where(where), _mess(where), _last_sql(""), _parse_offset(0) { #ifdef DEBUG dbg::stack s; @@ -235,13 +235,13 @@ _mess += msg; } -OciException::OciException(const OciException& other): - _sql_error_code(other._sql_error_code), - _where(), //_where(other._where), - _mess(other._mess), - _stack(), - _last_sql(other._last_sql), - _parse_offset() // _parse_offset(other._parse_offset) +OciException::OciException(const OciException& other) + : _sql_error_code(other._sql_error_code) + , _where() //_where(other._where) + , _stack() + , _mess(other._mess) + , _last_sql(other._last_sql) + , _parse_offset() // _parse_offset(other._parse_offset) { //throw std::logic_error("OciException should not be copied"); //std::cerr << __TROTL_HERE__ << "OciException should not be copied" << std::endl; Modified: trunk/tora/src/trotl/src/trotl_lob.cpp =================================================================== --- trunk/tora/src/trotl/src/trotl_lob.cpp 2010-10-05 12:15:40 UTC (rev 3732) +++ trunk/tora/src/trotl/src/trotl_lob.cpp 2010-10-06 11:19:27 UTC (rev 3733) @@ -137,13 +137,22 @@ // oci_check_error(__TROTL_HERE__, _env, res); } -boolean BindParLob::is_temporary(unsigned _row) const +boolean BindParLob::isTemporary(unsigned _row) const { boolean flag; sword res = OCICALL(OCILobIsTemporary(_env, _env._errh, ((OCILobLocator**)valuep)[_row], &flag)); oci_check_error(__TROTL_HERE__, _env._errh, res); return flag; } + +ub4 BindParLob::getChunkSize(unsigned _row) const +{ + ub4 retval; + sword res = OCICALL(OCILobGetChunkSize(_stmt._conn._svc_ctx, _env._errh, ((OCILobLocator**)valuep)[_row], &retval)); + oci_check_error(__TROTL_HERE__, _env._errh, res); + return retval; + +} BindParClob::BindParClob(unsigned int pos, SqlStatement &stmt, ColumnType &ct) : BindParLob(pos, stmt, ct) { @@ -203,7 +212,7 @@ { // According to the Oracle 10g documentation we should try to free // implicit created temporary LOBs as soon as possible. - if (is_temporary()) { + if (isTemporary()) { sword res = OCICALL(OCILobFreeTemporary(_conn._svc_ctx, _conn._env._errh, _loc)); oci_check_error(__TROTL_HERE__, _conn._env._errh, res); } @@ -256,7 +265,7 @@ return flag; }; -boolean SqlLob::is_temporary() const +boolean SqlLob::isTemporary() const { boolean flag; sword res = OCICALL(OCILobIsTemporary(_conn._env, _conn._env._errh, _loc, &flag)); @@ -351,9 +360,9 @@ ub4 SqlBlob::read(dvoid* bufp, ub4 buflen, ub4 offset, ub4 amount) { sword res = OCICALL(OCILobRead(_conn._svc_ctx, _conn._env._errh, _loc, - &amount, offset, bufp, buflen, - NULL/*dvoid* ctxp*/, NULL/*sb4 (*cbfp)(dvoid*ctxp,CONST dvoid*bufp,ub4*len,ub1*piece)*/, - 0, 0)); + &amount, offset, bufp, buflen, + NULL/*dvoid* ctxp*/, NULL/*sb4 (*cbfp)(dvoid*ctxp,CONST dvoid*bufp,ub4*len,ub1*piece)*/, + 0, 0)); oci_check_error(__TROTL_HERE__, _conn._env._errh, res); return amount; }; Modified: trunk/tora/src/trotl/src/trotl_lob.h =================================================================== --- trunk/tora/src/trotl/src/trotl_lob.h 2010-10-05 12:15:40 UTC (rev 3732) +++ trunk/tora/src/trotl/src/trotl_lob.h 2010-10-06 11:19:27 UTC (rev 3733) @@ -56,8 +56,9 @@ virtual void bind_hook(SqlStatement &stmt); virtual void define_hook(SqlStatement &stmt); - boolean is_temporary(unsigned _row) const; - + boolean isTemporary(unsigned row) const; + ub4 getChunkSize(unsigned row) const; + private: void descAlloc(void); //TODO OCI_DTYPE_FILE for BFILE, CFILE void descFree(void); @@ -116,7 +117,7 @@ boolean is_open() const; - boolean is_temporary() const; + boolean isTemporary() const; void copy(const SqlLob& src, ub4 amount, ub4 dst_offset, ub4 src_offset); @@ -124,7 +125,7 @@ void trim(ub4 newlen=0); - ub4 erase(ub4 offset, ub4 amount); + ub4 erase(ub4 offset, ub4 amount); void enable_buffering(); Modified: trunk/tora/src/trotl/src/trotl_xml.cpp =================================================================== --- trunk/tora/src/trotl/src/trotl_xml.cpp 2010-10-05 12:15:40 UTC (rev 3732) +++ trunk/tora/src/trotl/src/trotl_xml.cpp 2010-10-06 11:19:27 UTC (rev 3733) @@ -34,12 +34,13 @@ #include "trotl_xml.h" #include <string.h> + namespace trotl { Util::RegisterInFactory<BindParXML, BindParFactTwoParmSing> regBindXML("SYS.XMLTYPE"); Util::RegisterInFactory<BindParXML, CustDefineParFactTwoParmSing> regCustDefineNTY_XML("SYS.XMLTYPE"); - + void BindParXML::init(SqlStatement &stmt) { sword res; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2010-10-06 12:57:07
|
Revision: 3734 http://tora.svn.sourceforge.net/tora/?rev=3734&view=rev Author: ibre5041 Date: 2010-10-06 12:56:59 +0000 (Wed, 06 Oct 2010) Log Message: ----------- cast "table of VARCHAR2" to string Modified Paths: -------------- trunk/tora/src/trotl/src/CMakeLists.txt trunk/tora/src/trotl/src/trotl_collection.cpp trunk/tora/src/trotl/src/trotl_collection.h trunk/tora/src/trotl/src/trotl_convertor.cpp trunk/tora/src/trotl/src/trotl_convertor.h trunk/tora/src/trotl/src/trotl_var.cpp Modified: trunk/tora/src/trotl/src/CMakeLists.txt =================================================================== --- trunk/tora/src/trotl/src/CMakeLists.txt 2010-10-06 11:19:27 UTC (rev 3733) +++ trunk/tora/src/trotl/src/CMakeLists.txt 2010-10-06 12:56:59 UTC (rev 3734) @@ -14,7 +14,6 @@ ENDIF(CMAKE_BUILD_TYPE STREQUAL "Debug") SET(TROTL_SOURCES - trotl_aq.cpp trotl_anydata.cpp trotl_conn.cpp trotl_convertor.cpp Modified: trunk/tora/src/trotl/src/trotl_collection.cpp =================================================================== --- trunk/tora/src/trotl/src/trotl_collection.cpp 2010-10-06 11:19:27 UTC (rev 3733) +++ trunk/tora/src/trotl/src/trotl_collection.cpp 2010-10-06 12:56:59 UTC (rev 3734) @@ -216,11 +216,11 @@ bool comma=false; while(!eoc) { - OCINumber *ocinum = NULL; + void *field = NULL; void *elemind = NULL; res = OCICALL(OCIIterNext (_conn._env, _conn._env._errh, itr, - (void**) &ocinum, + (void**) &field, (void**) &elemind, //NULL, //void **elemind, &eoc)); oci_check_error(__TROTL_HERE__, _conn._env._errh, res); @@ -235,14 +235,14 @@ { _stringrepres << "NULL"; } else { - switch(_data_type) + switch(_collection_typecode) { case SQLT_NUM: { text str_buf[64]; ub4 str_len = sizeof(str_buf) / sizeof(*str_buf); sword res = OCICALL(OCINumberToText(_conn._env._errh, - (OCINumber*) ocinum, + (OCINumber*) field, (const oratext*) g_TROTL_DEFAULT_NUM_FTM, strlen(g_TROTL_DEFAULT_NUM_FTM), 0, // CONST OraText *nls_params, @@ -254,8 +254,13 @@ _stringrepres << tstring((const char*)str_buf, str_len); } break; + case SQLT_CHR: // NOTE: this is also valid for array of VARCHAR2 + { + _stringrepres << '\'' << OCIStringPtr(_conn._env, *(OCIString **)field) << '\''; + } + break; default: - throw OciException(__TROTL_HERE__, "Not implemented yet"); + throw OciException(__TROTL_HERE__, "Collection to string convertorsion - Not implemented yet"); } } } Modified: trunk/tora/src/trotl/src/trotl_collection.h =================================================================== --- trunk/tora/src/trotl/src/trotl_collection.h 2010-10-06 11:19:27 UTC (rev 3733) +++ trunk/tora/src/trotl/src/trotl_collection.h 2010-10-06 12:56:59 UTC (rev 3734) @@ -56,6 +56,7 @@ BindParCollectionTabNum(unsigned int pos, SqlStatement &stmt, ColumnType &ct) : SqlStatement::BindPar(pos, stmt, ct) , _collection_indp(NULL) + , _collection_typecode(ct._collection_typecode) { valuep = (void**) calloc(_cnt, sizeof(void*)); value_sz = sizeof(OCIColl*); @@ -70,6 +71,7 @@ BindParCollectionTabNum(unsigned int pos, SqlStatement &stmt, BindVarDecl &decl) : SqlStatement::BindPar(pos, stmt, decl) , _collection_indp(NULL) + // , _collection_typecode(???) TODO { valuep = (void**) calloc(_cnt, sizeof(void*)); value_sz = sizeof(OCIColl*); @@ -92,6 +94,7 @@ //private: mutable std::stringstream _stringrepres; void **_collection_indp; + OCITypeCode _collection_typecode; OCIType *_collection_tdo; }; @@ -103,6 +106,7 @@ BindParCollectionTabVarchar(unsigned int pos, SqlStatement &stmt, ColumnType &ct) : SqlStatement::BindPar(pos, stmt, ct) , _collection_indp(NULL) + , _collection_typecode(ct._collection_typecode) { valuep = (void**) calloc(_cnt, sizeof(void*)); value_sz = sizeof(OCIColl*); @@ -116,7 +120,8 @@ BindParCollectionTabVarchar(unsigned int pos, SqlStatement &stmt, BindVarDecl &decl) : SqlStatement::BindPar(pos, stmt, decl) - , _collection_indp(NULL) + , _collection_indp(NULL) + // , _collection_typecode(???) TODO { valuep = (void**) calloc(_cnt, sizeof(void*)); value_sz = sizeof(OCIColl*); @@ -136,9 +141,10 @@ virtual void bind_hook(SqlStatement &stmt); -private: +//private: mutable std::stringstream _stringrepres; void **_collection_indp; + OCITypeCode _collection_typecode; OCIType *_collection_tdo; }; @@ -149,7 +155,9 @@ SqlCollection(OciConnection &conn) : _conn(conn) + , _collection_typecode(0) , _collection_tdo(NULL) + {} @@ -172,10 +180,9 @@ tstring _data_type_name; OCIColl *_valuep; + OCITypeCode _collection_typecode; OCIType *_collection_tdo; OCIInd _ind; - ub2 _data_type; - }; Modified: trunk/tora/src/trotl/src/trotl_convertor.cpp =================================================================== --- trunk/tora/src/trotl/src/trotl_convertor.cpp 2010-10-06 11:19:27 UTC (rev 3733) +++ trunk/tora/src/trotl/src/trotl_convertor.cpp 2010-10-06 12:56:59 UTC (rev 3734) @@ -157,7 +157,7 @@ { sword res; SV._collection_tdo = BP._collection_tdo; - SV._data_type = SQLT_NUM; + SV._collection_typecode = BP._collection_typecode; SV._ind = *(sb2*)(BP._collection_indp[_row]); SV._data_type_name = BP.type_name; @@ -173,6 +173,27 @@ res = OCICALL(OCICollAssign(BP._stmt._env, BP._stmt._errh, (OCIColl*)BP.valuep[_row], SV._valuep)); oci_check_error(__TROTL_HERE__, BP._stmt._errh, res); } + +void ConvertorForRead::Fire(const BindParCollectionTabVarchar &BP, SqlCollection &SV) +{ + sword res; + SV._collection_tdo = BP._collection_tdo; + SV._collection_typecode = BP._collection_typecode; + SV._ind = *(sb2*)(BP._collection_indp[_row]); + SV._data_type_name = BP.type_name; + + res = OCICALL(OCIObjectNew(BP._stmt._env, BP._stmt._errh, BP._stmt._conn._svc_ctx, + OCI_TYPECODE_TABLE, // TabNum => Table + BP._collection_tdo, + NULL, // dvoid *table + OCI_DURATION_SESSION, + TRUE, // boolean value + (dvoid**) &SV._valuep)); + oci_check_error(__TROTL_HERE__, BP._stmt._errh, res); + + res = OCICALL(OCICollAssign(BP._stmt._env, BP._stmt._errh, (OCIColl*)BP.valuep[_row], SV._valuep)); + oci_check_error(__TROTL_HERE__, BP._stmt._errh, res); +} // TODO this needs to be tested void ConvertorForWrite::Fire(const SqlDateTime &DT, BindParDate &BP) Modified: trunk/tora/src/trotl/src/trotl_convertor.h =================================================================== --- trunk/tora/src/trotl/src/trotl_convertor.h 2010-10-06 11:19:27 UTC (rev 3733) +++ trunk/tora/src/trotl/src/trotl_convertor.h 2010-10-06 12:56:59 UTC (rev 3734) @@ -138,7 +138,7 @@ void Fire(const BindParCollectionTabVarchar &BP, SqlBlob &SV) { OnError(BP, SV); }; void Fire(const BindParCollectionTabVarchar &BP, SqlDateTime &SV) { OnError(BP, SV); }; void Fire(const BindParCollectionTabVarchar &BP, SqlNumber &SV) { OnError(BP, SV); }; - void Fire(const BindParCollectionTabVarchar &BP, SqlCollection &SV) { OnError(BP, SV); }; + void Fire(const BindParCollectionTabVarchar &BP, SqlCollection &SV); #ifdef ORACLE_HAS_XML void Fire(const BindParCollectionTabVarchar &BP, SqlXML &SV) { OnError(BP, SV); }; #endif Modified: trunk/tora/src/trotl/src/trotl_var.cpp =================================================================== --- trunk/tora/src/trotl/src/trotl_var.cpp 2010-10-06 11:19:27 UTC (rev 3733) +++ trunk/tora/src/trotl/src/trotl_var.cpp 2010-10-06 12:56:59 UTC (rev 3734) @@ -285,7 +285,7 @@ break; } case SQLT_LNG: - _width = g_OCIPL_MAX_LONG; //TODO long can have up to 2GB + _width = g_OCIPL_MAX_LONG; //TODO long can have up to 2GB, use callback define break; case SQLT_CHR: case SQLT_STR: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2010-10-08 13:04:33
|
Revision: 3765 http://tora.svn.sourceforge.net/tora/?rev=3765&view=rev Author: ibre5041 Date: 2010-10-08 13:04:27 +0000 (Fri, 08 Oct 2010) Log Message: ----------- fix memory leak, free vs. delete[] inconsistency Modified Paths: -------------- trunk/tora/src/trotl/src/trotl_date.h trunk/tora/src/trotl/src/trotl_misc.h trunk/tora/src/trotl/src/trotl_stat.h trunk/tora/src/trotl/src/trotl_string.h trunk/tora/src/trotl/src/trotl_xml.h Modified: trunk/tora/src/trotl/src/trotl_date.h =================================================================== --- trunk/tora/src/trotl/src/trotl_date.h 2010-10-08 08:41:42 UTC (rev 3764) +++ trunk/tora/src/trotl/src/trotl_date.h 2010-10-08 13:04:27 UTC (rev 3765) @@ -54,8 +54,7 @@ { BindParDate(unsigned int pos, SqlStatement &stmt, ColumnType &ct) : SqlStatement::BindPar(pos, stmt, ct) { - valuep = (void**) new unsigned char [ _cnt * sizeof(OCIDate) ]; - memset(valuep, 0x00, _cnt * sizeof(OCIDate) ); + valuep = (void**) calloc(_cnt, sizeof(OCIDate)); dty = SQLT_ODT; value_sz = sizeof(OCIDate); @@ -68,8 +67,7 @@ BindParDate(unsigned int pos, SqlStatement &stmt, BindVarDecl &decl): SqlStatement::BindPar(pos, stmt, decl) { - valuep = (void**) new unsigned char [ _cnt * sizeof(OCIDate) ]; - memset(valuep, 0x00, _cnt * sizeof(OCIDate) ); + valuep = (void**) calloc(_cnt, sizeof(OCIDate)); dty = SQLT_ODT; value_sz = sizeof(OCIDate); @@ -81,13 +79,7 @@ } ~BindParDate() - { - if(valuep) - { - delete[] (unsigned char*)valuep; - valuep = NULL; - } - } + {} virtual tstring get_string(unsigned int row) const; Modified: trunk/tora/src/trotl/src/trotl_misc.h =================================================================== --- trunk/tora/src/trotl/src/trotl_misc.h 2010-10-08 08:41:42 UTC (rev 3764) +++ trunk/tora/src/trotl/src/trotl_misc.h 2010-10-08 13:04:27 UTC (rev 3765) @@ -76,13 +76,7 @@ } ~BindParMisc() - { - if(valuep) - { - delete[] (char*)valuep; - valuep = NULL; - } - } + {} virtual tstring get_string(unsigned int row) const { Modified: trunk/tora/src/trotl/src/trotl_stat.h =================================================================== --- trunk/tora/src/trotl/src/trotl_stat.h 2010-10-08 08:41:42 UTC (rev 3764) +++ trunk/tora/src/trotl/src/trotl_stat.h 2010-10-08 13:04:27 UTC (rev 3765) @@ -160,6 +160,7 @@ if(rlenp) { free(rlenp); rlenp = NULL; } // if(rcodep) { delete[] rcodep; rcodep = NULL; } if(alenp) { free(alenp); alenp = NULL; } + if(valuep) { free(valuep); valuep = NULL; } }; // every datatype can be converted to a string @@ -544,30 +545,24 @@ class TBindParInt: public SqlStatement::BindPar { public: - TBindParInt(unsigned int pos, SqlStatement &stmt, BindVarDecl &decl) : SqlStatement::BindPar(pos, stmt, decl) + TBindParInt(unsigned int pos, SqlStatement &stmt, ColumnType &ct) : SqlStatement::BindPar(pos, stmt, ct) { - valuep = new wrapped_type [_max_cnt]; + valuep = calloc(_cnt, sizeof(wrapped_type)); dty = SQLT<wrapped_type>::value; value_sz = sizeof(wrapped_type); type_name = typeid(wrapped_type).name(); } - - TBindParInt(unsigned int pos, SqlStatement &stmt, ColumnType &ct) : SqlStatement::BindPar(pos, stmt, ct) + + TBindParInt(unsigned int pos, SqlStatement &stmt, BindVarDecl &decl) : SqlStatement::BindPar(pos, stmt, decl) { - valuep = new wrapped_type [_cnt]; + valuep = calloc(_max_cnt, sizeof(wrapped_type)); dty = SQLT<wrapped_type>::value; value_sz = sizeof(wrapped_type); type_name = typeid(wrapped_type).name(); } ~TBindParInt() - { - if(valuep) - { - delete[] (wrapped_type*)valuep; - valuep = NULL; - } - } + {} virtual tstring get_string(unsigned int row) const { Modified: trunk/tora/src/trotl/src/trotl_string.h =================================================================== --- trunk/tora/src/trotl/src/trotl_string.h 2010-10-08 08:41:42 UTC (rev 3764) +++ trunk/tora/src/trotl/src/trotl_string.h 2010-10-08 13:04:27 UTC (rev 3765) @@ -83,13 +83,7 @@ } ~BindParVarchar() - { - if(valuep) - { - delete[] (char*)valuep; - valuep = NULL; - } - } + {} // template<class return_type> // return_type get_number(unsigned int row) const @@ -142,13 +136,7 @@ } ~BindParChar() - { - if(valuep) - { - delete[] (char*)valuep; - valuep = NULL; - } - } + {} virtual tstring get_string(unsigned int row) const { @@ -189,13 +177,7 @@ } ~BindParRaw() - { - if(valuep) - { - delete[] (char*)valuep; - valuep = NULL; - } - } + {} virtual tstring get_string(unsigned int row) const { Modified: trunk/tora/src/trotl/src/trotl_xml.h =================================================================== --- trunk/tora/src/trotl/src/trotl_xml.h 2010-10-08 08:41:42 UTC (rev 3764) +++ trunk/tora/src/trotl/src/trotl_xml.h 2010-10-08 13:04:27 UTC (rev 3765) @@ -60,7 +60,7 @@ // TODO remember OCIConn or at least svcctx in this class BindParXML(unsigned int pos, SqlStatement &stmt, ColumnType &ct) : SqlStatement::BindPar(pos, stmt, ct) { - valuep = NULL; + free(valuep); valuep = NULL; dty = SQLT_NTY; value_sz = 0; type_name = ct.get_type_str(); @@ -69,7 +69,7 @@ BindParXML(unsigned int pos, SqlStatement &stmt, BindVarDecl &decl): SqlStatement::BindPar(pos, stmt, decl) { - valuep = NULL; + free(valuep); valuep = NULL; dty = SQLT_NTY; value_sz = 0; type_name = "SYS.XMLTYPE"; @@ -78,16 +78,8 @@ ~BindParXML() { - if(_xmlvaluep) - { - delete[] _xmlvaluep; - _xmlvaluep = NULL; - } - if(_xmlindp) - { - delete[] _xmlindp; - _xmlindp = NULL; - } + if(_xmlvaluep) { free(_xmlvaluep); _xmlvaluep = NULL; } + if(_xmlindp) { free(_xmlindp); _xmlindp = NULL; } } virtual tstring get_string(unsigned int row) const; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
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. |
From: <ibr...@us...> - 2010-12-08 15:03:39
|
Revision: 3834 http://tora.svn.sourceforge.net/tora/?rev=3834&view=rev Author: ibre5041 Date: 2010-12-08 15:03:33 +0000 (Wed, 08 Dec 2010) Log Message: ----------- initial support for cursor datatype added, so far this type is not treated as a custom/complex datatype Modified Paths: -------------- trunk/tora/src/trotl/src/CMakeLists.txt trunk/tora/src/trotl/src/trotl_base.h trunk/tora/src/trotl/src/trotl_common.h trunk/tora/src/trotl/src/trotl_stat.cpp trunk/tora/src/trotl/src/trotl_stat.h Added Paths: ----------- trunk/tora/src/trotl/src/trotl_cursor.cpp trunk/tora/src/trotl/src/trotl_cursor.h Modified: trunk/tora/src/trotl/src/CMakeLists.txt =================================================================== --- trunk/tora/src/trotl/src/CMakeLists.txt 2010-12-08 15:02:14 UTC (rev 3833) +++ trunk/tora/src/trotl/src/CMakeLists.txt 2010-12-08 15:03:33 UTC (rev 3834) @@ -18,6 +18,7 @@ trotl_conn.cpp trotl_convertor.cpp trotl_collection.cpp + trotl_cursor.cpp trotl_date.cpp trotl_exc.cpp trotl_int.cpp Modified: trunk/tora/src/trotl/src/trotl_base.h =================================================================== --- trunk/tora/src/trotl/src/trotl_base.h 2010-12-08 15:02:14 UTC (rev 3833) +++ trunk/tora/src/trotl/src/trotl_base.h 2010-12-08 15:03:33 UTC (rev 3834) @@ -174,7 +174,7 @@ // allocate error handle _errh.alloc(_handle); } -#ifdef WIN32 // is ithis really neccessary? +#ifdef WIN32 // is this really neccessary? template struct TROTL_EXPORT OciSimpleHandle<OCIError>; #endif OciError _errh; @@ -198,7 +198,7 @@ OciHandle(const OciHandle& other) : _env(other._env), _handle(other._handle) { - const_cast<HandleType*>(other._handle) = NULL; + const_cast<OciHandle&>(other)._handle = NULL; } ~OciHandle() Modified: trunk/tora/src/trotl/src/trotl_common.h =================================================================== --- trunk/tora/src/trotl/src/trotl_common.h 2010-12-08 15:02:14 UTC (rev 3833) +++ trunk/tora/src/trotl/src/trotl_common.h 2010-12-08 15:03:33 UTC (rev 3834) @@ -67,21 +67,6 @@ //TODO //thread_safe_log get_log(); -//inline tstring str_backtrace() -//{ -// tostream ret; -//#ifdef __GNUC__ -// void *buffer[TROTL_BACKTRACE_DEPTH]; -// -// int bsize = ::backtrace(buffer, TROTL_BACKTRACE_DEPTH); -// char **names = backtrace_symbols (buffer, bsize); -// for(int i=0; i<bsize; i++) -// ret << names[i] << std::endl; -// free(names); -//#endif -// return ret.str(); -//} - //#define OCICALL(x) x; do { std::cerr << __TROTL_HERE__ << #x << std::endl; } while(0) //#define OCICALL(x) x; do { std::cerr << #x << std::endl; } while(0) #define OCICALL(x) x Added: trunk/tora/src/trotl/src/trotl_cursor.cpp =================================================================== --- trunk/tora/src/trotl/src/trotl_cursor.cpp (rev 0) +++ trunk/tora/src/trotl/src/trotl_cursor.cpp 2010-12-08 15:03:33 UTC (rev 3834) @@ -0,0 +1,139 @@ +// Copyright (c) 2003, 2004, 2005, 2006, 2007, 2008 Martin Fuchs <mar...@gm...> +// +// forked from OCIPL Version 1.3 +// by Ivan Brezina <iv...@cv...> + +/* + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRES7S OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + +*/ + +#ifdef WIN32 +#include "trotl_parser.h" +#include <stdio.h> +#define snprintf _snprintf +#endif + +#include "trotl_cursor.h" + +namespace trotl { + +// // Register Bind datatypes in factory(Bind - PL/SQL) + Util::RegisterInFactory<BindParCursor, BindParFactTwoParmSing> regBindCursor("cursor"); + +// // Register Bind datatypes in factory(Define - SELECT) +Util::RegisterInFactory<BindParCursor, DefineParFactTwoParmSing, int> regDefineCursor(SQLT_RSET); + +BindParCursor::BindParCursor(unsigned int pos, SqlStatement &stmt, BindVarDecl &decl): BindPar(pos, stmt, decl) +{ + valuep = (void**) calloc(_cnt, sizeof(OCIStmt*)); + value_sz = sizeof(OCIStmt*); + dty = SQLT_RSET; + type_name = "cursor"; + descAlloc(); +}; + +BindParCursor::BindParCursor(unsigned int pos, SqlStatement &stmt, ColumnType &ct) : BindPar(pos, stmt, ct) +{ + valuep = (void**) calloc(_cnt, sizeof(OCIStmt*)); + value_sz = sizeof(OCIStmt*); + dty = SQLT_RSET; + type_name = ct.get_type_str(); + descAlloc(); +} + +void BindParCursor::descAlloc(void) +{ + // Note: If you have retrieved multiple ref cursors, you must take care when fetching them into stm2p. + // If you fetch the first one, you can then perform fetches on it to retrieve its data. + // However, once you fetch the second ref cursor into stm2p, you no longer have access to the data from the first ref cursor. + for(unsigned i=0; i<_cnt; ++i) + { + OciHandle<OCIStmt> handle(_env); + CursorStatement *s = new CursorStatement(_stmt._conn, handle); + ((OCIStmt**)valuep)[i] = s->operator OCIStmt*(); + _cursors.push_back(s); + } +} + +void BindParCursor::descFree(void) +{ + for(unsigned i=0; i<_cnt; ++i) + { + sword res = OCICALL(OCIHandleFree(((void**)valuep)[i], OCI_HTYPE_STMT)); + oci_check_error(__TROTL_HERE__, _env, res); + } +} + +void BindParCursor::redefine(ub4 i) +{ + OciHandle<OCIStmt> handle(_env); + CursorStatement *s = new CursorStatement(_stmt._conn, handle); + ((OCIStmt**)valuep)[i] = s->operator OCIStmt*(); + _cursors.at(i) = s; +} + +tstring BindParCursor::get_string(unsigned int i) const +{ + std::stringstream retval; + if(indp[i] == OCI_IND_NULL) + return ""; + + CursorStatement *c = _cursors.at(i); + + if( (c->_state & BindParCursor::CursorStatement::DEFINED) == 0 ) + c->define_all(); + if( (c->_state & BindParCursor::CursorStatement::FETCHED) == 0 ) + c->fetch(); + + unsigned column = 0; + while(!c->eof()) + { + std::string s; + *c >> s; + retval << s << '\t'; + column++; + if(column==c->get_column_count()) + { + retval << std::endl; + column=0; + } + } + const_cast<BindParCursor*>(this)->redefine(i); + return retval.str(); +} + + +SqlCursor::SqlCursor() : c(NULL) +{ +} + +SqlCursor::~SqlCursor() +{ + if(c) delete c; +} + +}; Added: trunk/tora/src/trotl/src/trotl_cursor.h =================================================================== --- trunk/tora/src/trotl/src/trotl_cursor.h (rev 0) +++ trunk/tora/src/trotl/src/trotl_cursor.h 2010-12-08 15:03:33 UTC (rev 3834) @@ -0,0 +1,124 @@ +// Copyright (c) 2003, 2004, 2005, 2006, 2007, 2008 Martin Fuchs <mar...@gm...> +// +// forked from OCIPL Version 1.3 +// by Ivan Brezina <iv...@cv...> + +/* + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + +*/ + +#ifndef TROTL_CURSOR_H_ +#define TROTL_CURSOR_H_ + +#include "trotl_export.h" +#include "trotl_base.h" +#include "trotl_stat.h" + +namespace trotl { + +class SqlCursor; + +class TROTL_EXPORT BindParCursor: public SqlStatement::BindPar +{ +public: + BindParCursor(unsigned int pos, SqlStatement &stmt, ColumnType &ct); + BindParCursor(unsigned int pos, SqlStatement &stmt, BindVarDecl &decl); + ~BindParCursor() + { + descFree(); + }; + + virtual tstring get_string(unsigned int) const; + + friend class SqlCursor; + class CursorStatement : public SqlStatement + { + public: + CursorStatement(OciConnection& conn, OciHandle<OCIStmt> handle, ub4 lang=OCI_NTV_SYNTAX, int bulk_rows=g_OCIPL_BULK_ROWS) + : SqlStatement(conn, handle, bulk_rows) + { + _stmt_type = STMT_SELECT; + _state |= PREPARED | DESCRIBED | EXECUTED; + }; + + void define_all() + { + SqlStatement::define_all(); + }; + void fetch() + { + SqlStatement::fetch(_buff_size); + }; + }; + void descAlloc(void); + void descFree(void); + void redefine(ub4); + + std::vector<CursorStatement*> _cursors; +protected: + BindParCursor(const BindParCursor &other); +}; + +class TROTL_EXPORT SqlCursor: public SqlValue +{ +public: + SqlCursor(OciEnv &env); + + template<class wrapped_type> + SqlCursor& operator>>(wrapped_type &val) + { + if( (c->_state & BindParCursor::CursorStatement::DEFINED) == 0 ) + c->define_all(); + if( (c->_state & BindParCursor::CursorStatement::FETCHED) == 0 ) + c->fetch(); + *c >> val; + return *this; + } + + bool eof() + { + return c->eof(); + } + + ub4 get_column_count() + { + return c->get_column_count(); + } +//protected: + OciHandle<OCIStmt> *handle; + + friend struct ConvertorForRead; + friend struct ConvertorForWrite; + + SqlCursor(); + ~SqlCursor(); + BindParCursor::CursorStatement *c; +}; + +}; + +#endif Modified: trunk/tora/src/trotl/src/trotl_stat.cpp =================================================================== --- trunk/tora/src/trotl/src/trotl_stat.cpp 2010-12-08 15:02:14 UTC (rev 3833) +++ trunk/tora/src/trotl/src/trotl_stat.cpp 2010-12-08 15:03:33 UTC (rev 3834) @@ -45,6 +45,7 @@ #include "trotl_stat.h" #include "trotl_convertor.h" +#include "trotl_cursor.h" namespace trotl { @@ -92,53 +93,6 @@ if(get_stmt_type() == STMT_SELECT) { execute_describe(); - _columns.resize(get_column_count()+1); // we do not use zero-th position - - _all_defines= new std::auto_ptr<BindPar> [get_column_count()+1]; - - for(unsigned dpos = 1; dpos <= get_column_count(); ++dpos) - { - std::auto_ptr<BindPar> bp; - OCIParam* parmdp; - sword res = OCICALL(OCIParamGet(_handle, get_type_id(), _errh, (void**)&parmdp, dpos)); - oci_check_error(__TROTL_HERE__, _errh, res); - - _columns[dpos].describe(*this, parmdp); - - res = OCICALL(OCIDescriptorFree(parmdp, OCI_DTYPE_PARAM)); - oci_check_error(__TROTL_HERE__, _env, res); - - //get_log().ts( std::string(__HERE_SHORT__)) - //std::cout - // << "This: " << this << std::endl - // << "Columns:" << _columns[dpos].get_type_str(true) << std::endl; - - // Use column datatype for lookup in a hash table - // and call appropriate create function from the factory - if( _columns[dpos]._data_type != SQLT_NTY) - _all_defines[dpos] = DefineParFactTwoParmSing::Instance().create( - _columns[dpos]._data_type, - dpos, - *this, - _columns[dpos] ); - else - _all_defines[dpos] = CustDefineParFactTwoParmSing::Instance().create( - _columns[dpos]._reg_name.c_str(), - dpos, - *this, - _columns[dpos] ); - - if(_all_defines[dpos].get() == NULL) - throw OciException(__TROTL_HERE__, "DefinePar: Data type not registered: %s(%d:%d:%d:%s:%s)\n") - .arg(_columns[dpos]._data_type_name) - .arg(_columns[dpos]._data_type) - .arg(_columns[dpos]._typecode) - .arg(_columns[dpos]._collection_typecode) - .arg(_columns[dpos]._data_type_name) - .arg(_columns[dpos]._reg_name); - define(*_all_defines[dpos]); - } - _state |= DEFINED; } if(get_bindpar_count()) @@ -177,15 +131,31 @@ if(_out_binds) _out_binds[0]=0; // if(_binds_all) _binds_all[0]=0; -// get_log().ts( std::string(__HERE_SHORT__)) -// std::cout -// << "This: " << this << std::endl -// << "Stat: " << stmt << std::endl -// << "In Binds: " << _in_cnt << std::endl -// << "Out Binds: " << _out_cnt << std::endl -// << "All Binds: " << get_bindpar_count() << std::endl; }; +SqlStatement::SqlStatement(OciConnection& conn, OciHandle<OCIStmt>& handle, ub4 lang, int bulk_rows) +: super(handle), +_conn(conn), +_lang(lang), +_orig_stmt(""), +_parsed_stmt(""), +_state(UNINITIALIZED), +_stmt_type(STMT_NONE), +_param_count(0), _column_count(0), +_in_cnt(0), _out_cnt(0), _iters(0), +_last_row(-1), +_last_fetched_row(-1), +_in_pos(0), _out_pos(0), +_last_buff_row(0), _buff_size(g_OCIPL_BULK_ROWS), +_all_binds(NULL), _in_binds(NULL), _out_binds(NULL), +_bound(false) +// _res(NULL), +// _bulk_rows(bulk_rows), +// _result_buffers(0), +{ + _errh.alloc(_env); +}; + void SqlStatement::prepare(const tstring& sql, ub4 lang) { ub2 stmt_type; // OCI_STMT_SELECT, OCI_STMT_UPDATE, ... @@ -238,6 +208,52 @@ _state |= DESCRIBED; } +void SqlStatement::define_all() +{ + _columns.resize(get_column_count()+1); // we do not use zero-th position + _all_defines= new std::auto_ptr<BindPar> [get_column_count()+1]; + + for(unsigned dpos = 1; dpos <= get_column_count(); ++dpos) + { + std::auto_ptr<BindPar> bp; + OCIParam* parmdp; + sword res = OCICALL(OCIParamGet(_handle, get_type_id(), _errh, (void**)&parmdp, dpos)); + oci_check_error(__TROTL_HERE__, _errh, res); + + _columns[dpos].describe(*this, parmdp); + + res = OCICALL(OCIDescriptorFree(parmdp, OCI_DTYPE_PARAM)); + oci_check_error(__TROTL_HERE__, _env, res); + + // Use column datatype for lookup in a hash table + // and call appropriate create function from the factory + if( _columns[dpos]._data_type != SQLT_NTY) + _all_defines[dpos] = DefineParFactTwoParmSing::Instance().create( + _columns[dpos]._data_type, + dpos, + *this, + _columns[dpos] ); + else + _all_defines[dpos] = CustDefineParFactTwoParmSing::Instance().create( + _columns[dpos]._reg_name.c_str(), + dpos, + *this, + _columns[dpos] ); + + if(_all_defines[dpos].get() == NULL) + throw OciException(__TROTL_HERE__, "DefinePar: Data type not registered: %s(%d:%d:%d:%s:%s)\n") + .arg(_columns[dpos]._data_type_name) + .arg(_columns[dpos]._data_type) + .arg(_columns[dpos]._typecode) + .arg(_columns[dpos]._collection_typecode) + .arg(_columns[dpos]._data_type_name) + .arg(_columns[dpos]._reg_name); + define(*_all_defines[dpos]); + } + _state |= DEFINED; +} + + ub4 SqlStatement::get_column_count() const { if(get_stmt_type() != STMT_SELECT) @@ -251,11 +267,11 @@ res = OCICALL(OCIAttrGet(_handle, get_type_id(), &_column_count, &size, OCI_ATTR_PARAM_COUNT, _errh)); oci_check_error(__TROTL_HERE__, _errh, res); - + //get_log().ts( std::string(__HERE_SHORT__)) -// std::cout -// << "This: " << this << std::endl -// << "Column count:" << _column_count << std::endl; + // std::cout + // << "This: " << this << std::endl + // << "Column count:" << _column_count << std::endl; return _column_count; } @@ -328,8 +344,8 @@ bool SqlStatement::eof() { - if((_state & EXECUTED) == 0) - execute_internal(g_OCIPL_BULK_ROWS, OCI_DEFAULT); + if((_state & EXECUTED) == 0) + execute_internal(g_OCIPL_BULK_ROWS, OCI_DEFAULT); return _state >= EOF_DATA && _last_buff_row >= fetched_rows(); } @@ -360,7 +376,8 @@ _state |= EOF_DATA; break; case STMT_SELECT: - _iters = rows; + //_iters = rows; + _iters = 0; break; case STMT_UPDATE: _iters = 1; @@ -404,14 +421,15 @@ if(!BP._bound) bind(BP); } } - - // execute and fetch + _bound = true; + + // execute and do not fetch sword res = OCICALL(OCIStmtExecute( _conn._svc_ctx, - _handle, // *stmtp - _errh, // *errhp - _iters, //_stmt_type == STMT_SELECT ? rows : 1, // _iters - 0, // rowoff + _handle, // *stmtp + _errh, // *errhp + _iters, + 0, // rowoff (CONST OCISnapshot*)0, (OCISnapshot*)0, mode)); //std::cout << std::endl @@ -420,8 +438,14 @@ _state |= EXECUTED; _last_row = _last_buff_row = 0; if(get_stmt_type() == STMT_SELECT) - _last_fetched_row = row_count(); - _bound = true; + { + if((_state & DEFINED) == 0) + { + define_all(); + } + fetch(_buff_size); + _last_fetched_row = row_count(); + } switch(res) { @@ -455,7 +479,7 @@ _state |= FETCHED; return true; case OCI_NO_DATA: - _state |= EOF_DATA; + _state |= FETCHED | EOF_DATA; return false; default: oci_check_error(__TROTL_HERE__, _errh, res); @@ -1393,4 +1417,26 @@ return *this; } +SqlStatement& SqlStatement::operator>> (SqlCursor &val) +{ + BindPar &BP(get_stmt_type() == STMT_SELECT ? get_next_column() : get_next_out_bindpar()); + BindParCursor &BP2 = dynamic_cast<BindParCursor&>(BP); + + val.c = BP2._cursors.at(_last_buff_row); + BP2.redefine(_last_buff_row); + + 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); + } + + return *this; }; + +}; Modified: trunk/tora/src/trotl/src/trotl_stat.h =================================================================== --- trunk/tora/src/trotl/src/trotl_stat.h 2010-12-08 15:02:14 UTC (rev 3833) +++ trunk/tora/src/trotl/src/trotl_stat.h 2010-12-08 15:03:33 UTC (rev 3834) @@ -52,7 +52,9 @@ namespace trotl { - +class BindParCursor; +class SqlCursor; + inline void oci_check_error(tstring where, SqlStatement &stmt, sword res) { if (res != OCI_SUCCESS) @@ -63,7 +65,7 @@ class TROTL_EXPORT SqlStatement : public OciHandle<OCIStmt> { typedef OciHandle<OCIStmt> super; - + friend class BindParCursor; public: enum STMT_TYPE { STMT_OTHER = 0, // truncate table, ... @@ -202,6 +204,7 @@ }; // class BindPar SqlStatement(OciConnection& conn, const tstring& stmt, ub4 lang=OCI_NTV_SYNTAX, int bulk_rows=g_OCIPL_BULK_ROWS); + SqlStatement(OciConnection& conn, OciHandle<OCIStmt> &handle, ub4 lang=OCI_NTV_SYNTAX, int bulk_rows=g_OCIPL_BULK_ROWS); bool execute_internal(ub4 rows, ub4 mode); ub4 row_count() const; @@ -307,6 +310,7 @@ } SqlStatement& operator>> (SqlValue &val); + SqlStatement& operator>> (SqlCursor &val); template<class wrapped_type> SqlStatement& operator>>(wrapped_type &val) @@ -391,6 +395,7 @@ void bind(BindPar &bp); /* OCIDefineByPos - for SELECT statements */ void define(BindPar &dp); + void define_all(); //OCISvcCtx* _svchp; public: //todo delete me - these fields should not be public This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2011-02-07 16:13:48
|
Revision: 3876 http://tora.svn.sourceforge.net/tora/?rev=3876&view=rev Author: ibre5041 Date: 2011-02-07 16:13:42 +0000 (Mon, 07 Feb 2011) Log Message: ----------- Workaround for ORA 3127. For some unknown reason it is ilegal to work with LONGs and LOBs on one connection in parallel. OCI is re-entrant but sometimes OCI call end up with the error: ORA-3127 no new operations allowed until the active operation ends This is a temporary workaround that wraps two OCI calls(OCILobOpen, OCILobClose) into while loop. Maybe in the future it will be mandatory to wrapp all the OCI calls. NOTE: this patch prevents Tora from beeing compile-able on MSVC, there is no usleep in MSVC. Modified Paths: -------------- trunk/tora/src/trotl/src/trotl_lob.cpp trunk/tora/src/trotl/src/trotl_stat.cpp trunk/tora/src/trotl/src/trotl_string.cpp trunk/tora/src/trotl/src/trotl_string.h Modified: trunk/tora/src/trotl/src/trotl_lob.cpp =================================================================== --- trunk/tora/src/trotl/src/trotl_lob.cpp 2011-02-07 16:06:40 UTC (rev 3875) +++ trunk/tora/src/trotl/src/trotl_lob.cpp 2011-02-07 16:13:42 UTC (rev 3876) @@ -41,6 +41,9 @@ #include "trotl_lob.h" +#include <assert.h> +#include <unistd.h> + namespace trotl { // Register Bind datatypes in factory(Bind - PL/SQL) @@ -318,23 +321,62 @@ SqlOpenLob::SqlOpenLob(SqlLob& lob, ub1 mode) : _lob(lob) { - sword res = OCICALL(OCILobOpen( - lob._conn._svc_ctx, - lob._conn._env._errh, - lob._loc, - mode - )); - oci_check_error(__TROTL_HERE__, lob._conn._env._errh, res); + bool done = false; + while(!done) + { + sword res = OCICALL(OCILobOpen( + lob._conn._svc_ctx, + lob._conn._env._errh, + lob._loc, + mode + )); + if( res != OCI_SUCCESS ) + { + sb4 errorcode; + sword res2 = OCICALL(OCIErrorGet(_lob._conn._env._errh, 1, NULL, &errorcode, NULL, 0, OCI_HTYPE_ERROR)); + assert(res2 == OCI_SUCCESS); + + if(errorcode == 3127) // ORA-03127: no new operations allowed until the active operation ends + { + std::cerr << "ORA-03127: no new operations allowed until the active operation ends" << std::endl; + usleep(100); + } else { + oci_check_error(__TROTL_HERE__, _lob._conn._env._errh, res); + } + } else { + done = true; + } + } }; SqlOpenLob::~SqlOpenLob() { - sword res = OCICALL(OCILobClose( - _lob._conn._svc_ctx, - _lob._conn._env._errh, - _lob._loc - )); - oci_check_error(__TROTL_HERE__, _lob._conn._env._errh, res); + bool done = false; + while(!done) + { + sword res = OCICALL(OCILobClose( + _lob._conn._svc_ctx, + _lob._conn._env._errh, + _lob._loc + )); + + if( res != OCI_SUCCESS ) + { + sb4 errorcode; + sword res2 = OCICALL(OCIErrorGet(_lob._conn._env._errh, 1, NULL, &errorcode, NULL, 0, OCI_HTYPE_ERROR)); + assert(res2 == OCI_SUCCESS); + + if(errorcode == 3127) // ORA-03127: no new operations allowed until the active operation ends + { + std::cerr << "ORA-03127: no new operations allowed until the active operation ends" << std::endl; + usleep(100); + } else { + oci_check_error(__TROTL_HERE__, _lob._conn._env._errh, res); + } + } else { + done = true; + } + } }; ub4 SqlBlob::write(const dvoid* bufp, ub4 buflen, ub4 offset/*=1*/, ub4 amount) Modified: trunk/tora/src/trotl/src/trotl_stat.cpp =================================================================== --- trunk/tora/src/trotl/src/trotl_stat.cpp 2011-02-07 16:06:40 UTC (rev 3875) +++ trunk/tora/src/trotl/src/trotl_stat.cpp 2011-02-07 16:13:42 UTC (rev 3876) @@ -425,7 +425,7 @@ } _bound = true; - define_all(); + //define_all(); // execute and do not fetch sword res = OCICALL(OCIStmtExecute( Modified: trunk/tora/src/trotl/src/trotl_string.cpp =================================================================== --- trunk/tora/src/trotl/src/trotl_string.cpp 2011-02-07 16:06:40 UTC (rev 3875) +++ trunk/tora/src/trotl/src/trotl_string.cpp 2011-02-07 16:13:42 UTC (rev 3876) @@ -135,7 +135,7 @@ // len = PIECE_SIZE; // *alenpp = &len; - + // ind = 0; // if (glGetInd) // *indpp = (dvoid *) &ind; Modified: trunk/tora/src/trotl/src/trotl_string.h =================================================================== --- trunk/tora/src/trotl/src/trotl_string.h 2011-02-07 16:06:40 UTC (rev 3875) +++ trunk/tora/src/trotl/src/trotl_string.h 2011-02-07 16:13:42 UTC (rev 3876) @@ -190,10 +190,10 @@ valuep = (void**) calloc(8192, 1); alenp = (ub2*) calloc(_cnt, sizeof(ub4)); - alenp[0] = 8192; + alenp[0] = 8192; // Fetch buffer size 8KB dty = SQLT_LNG; - value_sz = 0x10000000; //ct._width + 1; + value_sz = 8192; //0x80000000; // 2GB type_name = typeid(tstring).name(); mode = OCI_DYNAMIC_FETCH; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2011-02-12 00:11:25
|
Revision: 3877 http://tora.svn.sourceforge.net/tora/?rev=3877&view=rev Author: ibre5041 Date: 2011-02-12 00:11:18 +0000 (Sat, 12 Feb 2011) Log Message: ----------- When selecting from table having LONG column set buffer fetch size to 1 Modified Paths: -------------- trunk/tora/src/trotl/src/trotl_cursor.h trunk/tora/src/trotl/src/trotl_stat.cpp trunk/tora/src/trotl/src/trotl_stat.h trunk/tora/src/trotl/src/trotl_string.cpp Modified: trunk/tora/src/trotl/src/trotl_cursor.h =================================================================== --- trunk/tora/src/trotl/src/trotl_cursor.h 2011-02-07 16:13:42 UTC (rev 3876) +++ trunk/tora/src/trotl/src/trotl_cursor.h 2011-02-12 00:11:18 UTC (rev 3877) @@ -71,7 +71,7 @@ }; void fetch() { - SqlStatement::fetch(_buff_size); + SqlStatement::fetch(_fetch_rows); }; }; void descAlloc(void); Modified: trunk/tora/src/trotl/src/trotl_stat.cpp =================================================================== --- trunk/tora/src/trotl/src/trotl_stat.cpp 2011-02-07 16:13:42 UTC (rev 3876) +++ trunk/tora/src/trotl/src/trotl_stat.cpp 2011-02-12 00:11:18 UTC (rev 3877) @@ -69,7 +69,7 @@ _last_row(-1), _last_fetched_row(-1), _in_pos(0), _out_pos(0), _iters(0), -_last_buff_row(0), _buff_size(g_OCIPL_BULK_ROWS), +_last_buff_row(0), _buff_size(g_OCIPL_BULK_ROWS), _fetch_rows(g_OCIPL_BULK_ROWS), _all_binds(NULL), _in_binds(NULL), _out_binds(NULL), _bound(false) // _res(NULL), @@ -250,6 +250,9 @@ .arg(_columns[dpos]._data_type_name) .arg(_columns[dpos]._reg_name); define(*_all_defines[dpos]); + + if(_all_defines[dpos]->dty == SQLT_LNG) + _fetch_rows = 1; } _state |= DEFINED; } @@ -447,7 +450,7 @@ { define_all(); } - fetch(_buff_size); + fetch(_fetch_rows); _last_fetched_row = row_count(); } @@ -516,7 +519,7 @@ res2 = OCICALL(OCIStmtSetPieceInfo((dvoid *)hdlptr, (ub4)hdltype, _errh, (dvoid *) BPp->valuep, &alen, piece, (dvoid *)&indptr, &rcode)); oci_check_error(__TROTL_HERE__, _errh, res2); - res = OCICALL(OCIStmtFetch(_handle, _errh, rows, OCI_FETCH_NEXT, OCI_DEFAULT)); + res = OCICALL(OCIStmtFetch(_handle, _errh, 1, OCI_FETCH_NEXT, OCI_DEFAULT)); if(res == OCI_NEED_DATA || res == OCI_NO_DATA || res == OCI_SUCCESS || res == OCI_SUCCESS_WITH_INFO) BPp->fetch_hook(iter, idx, piece, alen, indptr); } @@ -1088,7 +1091,7 @@ _state |= EOF_DATA; if(_last_buff_row == fetched_rows() && ((_state & EOF_DATA) == 0) && get_stmt_type() == STMT_SELECT) - fetch(_buff_size); + fetch(_fetch_rows); return *this; }; @@ -1112,7 +1115,7 @@ _state |= EOF_DATA; if(_last_buff_row == fetched_rows() && ((_state & EOF_DATA) == 0) && get_stmt_type() == STMT_SELECT) - fetch(_buff_size); + fetch(_fetch_rows); return *this; }; @@ -1136,7 +1139,7 @@ _state |= EOF_DATA; if(_last_buff_row == fetched_rows() && ((_state & EOF_DATA) == 0) && get_stmt_type() == STMT_SELECT) - fetch(_buff_size); + fetch(_fetch_rows); return *this; }; @@ -1161,7 +1164,7 @@ _state |= EOF_DATA; if(_last_buff_row == fetched_rows() && ((_state & EOF_DATA) == 0) && get_stmt_type() == STMT_SELECT) - fetch(_buff_size); + fetch(_fetch_rows); return *this; }; @@ -1185,7 +1188,7 @@ _state |= EOF_DATA; if(_last_buff_row == fetched_rows() && ((_state & EOF_DATA) == 0) && get_stmt_type() == STMT_SELECT) - fetch(_buff_size); + fetch(_fetch_rows); return *this; }; @@ -1209,7 +1212,7 @@ _state |= EOF_DATA; if(_last_buff_row == fetched_rows() && ((_state & EOF_DATA) == 0) && get_stmt_type() == STMT_SELECT) - fetch(_buff_size); + fetch(_fetch_rows); return *this; }; @@ -1232,7 +1235,7 @@ _state |= EOF_DATA; if(_last_buff_row == fetched_rows() && ((_state & EOF_DATA) == 0) && get_stmt_type() == STMT_SELECT) - fetch(_buff_size); + fetch(_fetch_rows); return *this; } @@ -1273,7 +1276,7 @@ _state |= EOF_DATA; if(_last_buff_row == fetched_rows() && ((_state & EOF_DATA) == 0) && get_stmt_type() == STMT_SELECT) - fetch(_buff_size); + fetch(_fetch_rows); return *this; } @@ -1307,7 +1310,7 @@ _state |= EOF_DATA; // if(_last_buff_row == fetched_rows() && ((_state & EOF_DATA) == 0) && get_stmt_type() == STMT_SELECT) -// fetch(_buff_size); +// fetch(_fetch_rows); return *this; } @@ -1483,7 +1486,7 @@ if(_last_buff_row == fetched_rows() && ((_state & EOF_DATA) == 0) && get_stmt_type() == STMT_SELECT) { - fetch(_buff_size); + fetch(_fetch_rows); } return *this; Modified: trunk/tora/src/trotl/src/trotl_stat.h =================================================================== --- trunk/tora/src/trotl/src/trotl_stat.h 2011-02-07 16:13:42 UTC (rev 3876) +++ trunk/tora/src/trotl/src/trotl_stat.h 2011-02-12 00:11:18 UTC (rev 3877) @@ -363,7 +363,7 @@ /* _state |= EOF_DATA; */ /* if(_last_buff_row == fetched_rows() && ((_state & EOF_DATA) == 0) && get_stmt_type() == STMT_SELECT) */ -/* fetch(_buff_size); */ +/* fetch(_fetch_rows); */ /* return *this; */ /* } */ @@ -409,7 +409,7 @@ mutable ub4 _param_count, _column_count, _in_cnt, _out_cnt; ub4 _last_row, _last_fetched_row, _in_pos, _out_pos, _iters; - ub4 _last_buff_row, _buff_size; // used in select statements + ub4 _last_buff_row, _buff_size, _fetch_rows; // used in select statements mutable ub4 _fetched_row; std::vector<ColumnType> _columns; // TODO move into some SQL-result class Modified: trunk/tora/src/trotl/src/trotl_string.cpp =================================================================== --- trunk/tora/src/trotl/src/trotl_string.cpp 2011-02-07 16:13:42 UTC (rev 3876) +++ trunk/tora/src/trotl/src/trotl_string.cpp 2011-02-12 00:11:18 UTC (rev 3877) @@ -56,6 +56,12 @@ void BindParLong::fetch_hook(ub4 iter, ub4 idx, ub1 piece, ub4 alen, sb2 ind) { + std::cerr << "\t iter: " << iter + << "\t idx: " << idx + << "\t piece: " << (unsigned short)piece + << "\t alen: " << alen + << "\t ind: " << ind + << std::endl; if(piece == OCI_FIRST_PIECE) { s.at(iter)->clear(); @@ -135,7 +141,7 @@ // len = PIECE_SIZE; // *alenpp = &len; - + // ind = 0; // if (glGetInd) // *indpp = (dvoid *) &ind; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2011-04-15 14:21:48
|
Revision: 3941 http://tora.svn.sourceforge.net/tora/?rev=3941&view=rev Author: ibre5041 Date: 2011-04-15 14:21:41 +0000 (Fri, 15 Apr 2011) Log Message: ----------- Fixes for compilation on MSVC Express 2010 Fix SEGFAULT. Statement of type OTHER "EXPLAIN PLAN FOR SELECT * FROM DUAL WHERE DUMMY = :X" in fact has NO bind variables. Modified Paths: -------------- trunk/tora/src/trotl/src/trotl_base.h trunk/tora/src/trotl/src/trotl_conn.h trunk/tora/src/trotl/src/trotl_lob.cpp trunk/tora/src/trotl/src/trotl_stat.cpp Modified: trunk/tora/src/trotl/src/trotl_base.h =================================================================== --- trunk/tora/src/trotl/src/trotl_base.h 2011-04-15 14:16:13 UTC (rev 3940) +++ trunk/tora/src/trotl/src/trotl_base.h 2011-04-15 14:21:41 UTC (rev 3941) @@ -174,7 +174,9 @@ // allocate error handle _errh.alloc(_handle); } -#ifdef WIN32 // is this really neccessary? + +//Workaround for MSVC2008 +#if _MSC_VER==1400 template struct TROTL_EXPORT OciSimpleHandle<OCIError>; #endif OciError _errh; Modified: trunk/tora/src/trotl/src/trotl_conn.h =================================================================== --- trunk/tora/src/trotl/src/trotl_conn.h 2011-04-15 14:16:13 UTC (rev 3940) +++ trunk/tora/src/trotl/src/trotl_conn.h 2011-04-15 14:21:41 UTC (rev 3941) @@ -249,7 +249,7 @@ tstring _tnsname; protected: -#ifdef WIN32 +#if _MSC_VER==1400 template struct TROTL_EXPORT OciHandle<OCISession>; #endif OciHandle<OCISession> _session; @@ -260,7 +260,7 @@ struct TROTL_EXPORT OciConnection { OciEnv _env; -#ifdef WIN32 +#if _MSC_VER==1400 template struct TROTL_EXPORT OciHandleWrapper<OCISvcCtx>; #endif OciContext _svc_ctx; @@ -311,7 +311,7 @@ /* Some OCI statements silently enter blocking mode without any warning * we call OCIAttrGet everytime */ - ub1 nonblocking; + ub1 nonblocking = 1; //_svc_ctx.get_attribute(&nonblocking, NULL, OCI_ATTR_NONBLOCKING_MODE); return nonblocking; } Modified: trunk/tora/src/trotl/src/trotl_lob.cpp =================================================================== --- trunk/tora/src/trotl/src/trotl_lob.cpp 2011-04-15 14:16:13 UTC (rev 3940) +++ trunk/tora/src/trotl/src/trotl_lob.cpp 2011-04-15 14:21:41 UTC (rev 3941) @@ -34,15 +34,19 @@ #ifdef WIN32 #include "trotl_parser.h" #include <stdio.h> +#include <windows.h> #define snprintf _snprintf +#define MSLEEP(x) Sleep(x) //#define gmtime gmtime_s //#define localtime localtime_s +#else +#include <unistd.h> +#define MSLEEP(x) usleep(1000 * x) #endif #include "trotl_lob.h" #include <assert.h> -#include <unistd.h> namespace trotl { @@ -339,7 +343,7 @@ if(errorcode == 3127) // ORA-03127: no new operations allowed until the active operation ends { std::cerr << "ORA-03127: no new operations allowed until the active operation ends" << std::endl; - usleep(100); + MSLEEP(100); } else { oci_check_error(__TROTL_HERE__, _lob._conn._env._errh, res); } @@ -369,7 +373,7 @@ if(errorcode == 3127) // ORA-03127: no new operations allowed until the active operation ends { std::cerr << "ORA-03127: no new operations allowed until the active operation ends" << std::endl; - usleep(100); + MSLEEP(100); } else { oci_check_error(__TROTL_HERE__, _lob._conn._env._errh, res); } @@ -491,7 +495,7 @@ if(errorcode == 24804) // ORA-24804: Lob read/write functions called while another OCI LOB read/write streaming is in progress { std::cerr << "ORA-24804: Lob read/write functions called while another OCI LOB read/write streaming is in progress" << std::endl; - usleep(100); + MSLEEP(100); } else { oci_check_error(__TROTL_HERE__, _conn._env._errh, res); } Modified: trunk/tora/src/trotl/src/trotl_stat.cpp =================================================================== --- trunk/tora/src/trotl/src/trotl_stat.cpp 2011-04-15 14:16:13 UTC (rev 3940) +++ trunk/tora/src/trotl/src/trotl_stat.cpp 2011-04-15 14:21:41 UTC (rev 3941) @@ -103,27 +103,31 @@ _out_binds = new unsigned [get_bindpar_count()+1]; } - int ipos=1; - for(std::vector<BindVarDecl>::iterator it = parser._bindvars.begin(); it != parser._bindvars.end(); ++it, ++ipos) + if( get_stmt_type() != STMT_OTHER && get_stmt_type() != STMT_DROP && get_stmt_type() != STMT_CREATE && + get_stmt_type() != STMT_ALTER && get_stmt_type() != OCI_STMT_UNKNOWN) { - if(it->inout == "in") + int ipos=1; + for(std::vector<BindVarDecl>::iterator it = parser._bindvars.begin(); it != parser._bindvars.end(); ++it, ++ipos) { - _in_binds[++_in_pos] = ipos; - } else if(it->inout == "inout") { - _in_binds[++_in_pos] = ipos; - _out_binds[++_out_pos] = ipos; - } else if(it->inout == "out") { - _out_binds[++_out_pos] = ipos; - } else { - throw OciException(__TROTL_HERE__, "Unsupported bindpar parameter: %s\n").arg(it->inout); - }; + if(it->inout == "in") + { + _in_binds[++_in_pos] = ipos; + } else if(it->inout == "inout") { + _in_binds[++_in_pos] = ipos; + _out_binds[++_out_pos] = ipos; + } else if(it->inout == "out") { + _out_binds[++_out_pos] = ipos; + } else { + throw OciException(__TROTL_HERE__, "Unsupported bindpar parameter: %s\n").arg(it->inout); + }; - //Create BindPar instance, constructor takes two arguments (position, BindVarDecl&) - _all_binds[ipos] = BindParFactTwoParmSing::Instance().create(it->bindtype, ipos, *this, *it); + //Create BindPar instance, constructor takes two arguments (position, BindVarDecl&) + _all_binds[ipos] = BindParFactTwoParmSing::Instance().create(it->bindtype, ipos, *this, *it); - if ( _all_binds[ipos].get() == NULL ) - throw OciException(__TROTL_HERE__, "BindPar: Data type not registered: %s\n").arg(it->bindtype); + if ( _all_binds[ipos].get() == NULL ) + throw OciException(__TROTL_HERE__, "BindPar: Data type not registered: %s\n").arg(it->bindtype); + } } _in_cnt = _in_pos; _in_pos=0; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ibr...@us...> - 2012-10-10 13:11:05
|
Revision: 4502 http://tora.svn.sourceforge.net/tora/?rev=4502&view=rev Author: ibre5041 Date: 2012-10-10 13:10:59 +0000 (Wed, 10 Oct 2012) Log Message: ----------- One more undocumented OCI constant Modified Paths: -------------- trunk/tora/src/trotl/src/trotl_stat.cpp trunk/tora/src/trotl/src/trotl_stat.h Modified: trunk/tora/src/trotl/src/trotl_stat.cpp =================================================================== --- trunk/tora/src/trotl/src/trotl_stat.cpp 2012-10-09 14:32:55 UTC (rev 4501) +++ trunk/tora/src/trotl/src/trotl_stat.cpp 2012-10-10 13:10:59 UTC (rev 4502) @@ -191,6 +191,7 @@ break; case 0: // ANALYZE TABLE case 15: // EXPLAIN PLAN FOR + case 17: // ROLLBACK case 21: // COMMIT _stmt_type = STMT_OTHER; break; Modified: trunk/tora/src/trotl/src/trotl_stat.h =================================================================== --- trunk/tora/src/trotl/src/trotl_stat.h 2012-10-09 14:32:55 UTC (rev 4501) +++ trunk/tora/src/trotl/src/trotl_stat.h 2012-10-10 13:10:59 UTC (rev 4502) @@ -87,9 +87,9 @@ }; /* This structure represents a pack of all values needed for bind/define operation - * All descendents of this class are created using factory BindParFactTwoParmSing + * All descendants of this class are created using factory BindParFactTwoParmSing * or DefineParFactTwoParm - * All descendents have to be resistered by creating an instance of the template + * All descendants have to be registered by creating an instance of the template * Util::RegisterInFactory - look at trotl_int.cpp **/ struct TROTL_EXPORT BindPar This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |