From: <ibr...@us...> - 2010-07-28 22:06:16
|
Revision: 3639 http://tora.svn.sourceforge.net/tora/?rev=3639&view=rev Author: ibre5041 Date: 2010-07-28 22:06:10 +0000 (Wed, 28 Jul 2010) Log Message: ----------- - Fix LOB reading/writing - Fix for "EXPLAIN PLAN FOR ..." statement - Initial support for non-blocking queries(no TOra support ATM) Modified Paths: -------------- branches/tora-trotl/src/trotl/src/trotl_base.h branches/tora-trotl/src/trotl/src/trotl_conn.h branches/tora-trotl/src/trotl/src/trotl_convertor.cpp branches/tora-trotl/src/trotl/src/trotl_lob.cpp branches/tora-trotl/src/trotl/src/trotl_stat.cpp Modified: branches/tora-trotl/src/trotl/src/trotl_base.h =================================================================== --- branches/tora-trotl/src/trotl/src/trotl_base.h 2010-07-27 08:00:33 UTC (rev 3638) +++ branches/tora-trotl/src/trotl/src/trotl_base.h 2010-07-28 22:06:10 UTC (rev 3639) @@ -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: branches/tora-trotl/src/trotl/src/trotl_conn.h =================================================================== --- branches/tora-trotl/src/trotl/src/trotl_conn.h 2010-07-27 08:00:33 UTC (rev 3638) +++ branches/tora-trotl/src/trotl/src/trotl_conn.h 2010-07-28 22:06:10 UTC (rev 3639) @@ -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: branches/tora-trotl/src/trotl/src/trotl_convertor.cpp =================================================================== --- branches/tora-trotl/src/trotl/src/trotl_convertor.cpp 2010-07-27 08:00:33 UTC (rev 3638) +++ branches/tora-trotl/src/trotl/src/trotl_convertor.cpp 2010-07-28 22:06:10 UTC (rev 3639) @@ -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: branches/tora-trotl/src/trotl/src/trotl_lob.cpp =================================================================== --- branches/tora-trotl/src/trotl/src/trotl_lob.cpp 2010-07-27 08:00:33 UTC (rev 3638) +++ branches/tora-trotl/src/trotl/src/trotl_lob.cpp 2010-07-28 22:06:10 UTC (rev 3639) @@ -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: branches/tora-trotl/src/trotl/src/trotl_stat.cpp =================================================================== --- branches/tora-trotl/src/trotl/src/trotl_stat.cpp 2010-07-27 08:00:33 UTC (rev 3638) +++ branches/tora-trotl/src/trotl/src/trotl_stat.cpp 2010-07-28 22:06:10 UTC (rev 3639) @@ -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. |