fix ODBC: losing input data in case PD_IN_OUT paramater type (#1280)

* fix: losing input data in case PD_IN_OUT paramater type

* - fix allso applied for wide string
- added test case 'testStoredProcedureAnyString()' for reproducing
This commit is contained in:
Ostropik 2017-10-07 02:32:29 +03:00 committed by Aleksandar Fabijanic
parent 14076f75b4
commit 23d7d2c6cb
4 changed files with 29 additions and 0 deletions

View File

@ -185,6 +185,10 @@ void Binder::bind(std::size_t pos, const std::string& val, Direction dir, const
{
getColumnOrParameterSize(pos, size);
char* pChar = (char*) std::calloc(size, sizeof(char));
if (isInOutBound(dir))
std::strcpy(pChar,val.c_str());
pVal = (SQLPOINTER) pChar;
_outParams.insert(ParamMap::value_type(pVal, size));
_strings.insert(StringMap::value_type(pChar, const_cast<std::string*>(&val)));
@ -240,6 +244,8 @@ void Binder::bind(std::size_t pos, const UTF16String& val, Direction dir, const
getColumnOrParameterSize(pos, size);
CharT* pChar = (CharT*)std::calloc(size, sizeof(CharT));
pVal = (SQLPOINTER)pChar;
if (isInOutBound(dir))
std::wcscpy(pChar,val.c_str());
_outParams.insert(ParamMap::value_type(pVal, size));
_utf16Strings.insert(UTF16StringMap::value_type(pChar, const_cast<UTF16String*>(&val)));
}

View File

@ -355,6 +355,20 @@ void ODBCOracleTest::testStoredProcedureAny()
}
}
void ODBCOracleTest::testStoredProcedureAnyString()
{
Any sInOut = std::string("Hello");
*_pSession << "CREATE OR REPLACE "
"PROCEDURE storedProcedure(inParam IN OUT VARCHAR2) IS "
" BEGIN inParam := inParam||' world!'; "
"END storedProcedure;" , now;
*_pSession << "{call storedProcedure(?)}", io(sInOut), now;
assert("Hello world!" == AnyCast<std::string>(sInOut));
*_pSession << "DROP PROCEDURE storedProcedure;", now;
}
void ODBCOracleTest::testStoredProcedureDynamicAny()
{
@ -933,6 +947,7 @@ CppUnit::Test* ODBCOracleTest::suite()
CppUnit_addTest(pSuite, ODBCOracleTest, testStoredProcedure);
CppUnit_addTest(pSuite, ODBCOracleTest, testCursorStoredProcedure);
CppUnit_addTest(pSuite, ODBCOracleTest, testStoredProcedureAny);
CppUnit_addTest(pSuite, ODBCOracleTest, testStoredProcedureAnyString);
CppUnit_addTest(pSuite, ODBCOracleTest, testStoredProcedureDynamicAny);
CppUnit_addTest(pSuite, ODBCOracleTest, testStoredFunction);
CppUnit_addTest(pSuite, ODBCOracleTest, testCursorStoredFunction);

View File

@ -45,6 +45,7 @@ public:
void testStoredFunction();
void testCursorStoredFunction();
void testStoredProcedureAny();
void testStoredProcedureAnyString();
void testStoredProcedureDynamicAny();
void testAutoTransaction();

View File

@ -405,6 +405,9 @@ public:
static bool isInBound(Direction dir);
/// Returns true if direction is in bound;
static bool isInOutBound(Direction dir);
/// Returns true if direction is in and out bound;
};
@ -422,6 +425,10 @@ inline bool AbstractBinder::isOutBound(Direction dir)
return PD_OUT == dir || PD_IN_OUT == dir;
}
inline bool AbstractBinder::isInOutBound(Direction dir)
{
return PD_IN_OUT == dir;
}
inline bool AbstractBinder::isInBound(Direction dir)
{