in src/main/cpp/odbcappender.cpp [268:356]
ODBCAppender::SQLHDBC ODBCAppender::getConnection(log4cxx::helpers::Pool& p)
{
#if LOG4CXX_HAVE_ODBC
SQLRETURN ret;
if (_priv->env == SQL_NULL_HENV)
{
ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &_priv->env);
if (ret < 0)
{
SQLException ex(SQL_HANDLE_ENV, _priv->env, "Failed to allocate SQL handle", p);
_priv->env = SQL_NULL_HENV;
throw ex;
}
ret = SQLSetEnvAttr(_priv->env, SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC3, SQL_IS_INTEGER);
if (ret < 0)
{
SQLException ex(SQL_HANDLE_ENV, _priv->env, "Failed to set odbc version", p);
SQLFreeHandle(SQL_HANDLE_ENV, _priv->env);
_priv->env = SQL_NULL_HENV;
throw ex;
}
}
if (_priv->connection == SQL_NULL_HDBC)
{
ret = SQLAllocHandle(SQL_HANDLE_DBC, _priv->env, &_priv->connection);
if (ret < 0)
{
SQLException ex(SQL_HANDLE_DBC, _priv->connection, "Failed to allocate sql handle", p);
_priv->connection = SQL_NULL_HDBC;
throw ex;
}
#if LOG4CXX_LOGCHAR_IS_WCHAR
SQLWCHAR *wUser = nullptr, *wPwd = nullptr;
if (!_priv->databaseUser.empty())
wUser = (SQLWCHAR*)_priv->databaseUser.c_str();
if (!_priv->databasePassword.empty())
wPwd = (SQLWCHAR*)_priv->databasePassword.c_str();
ret = SQLConnectW(_priv->connection
, (SQLWCHAR*)_priv->databaseURL.c_str(), SQL_NTS
, wUser, SQL_NTS
, wPwd, SQL_NTS
);
#elif LOG4CXX_LOGCHAR_IS_UTF8
SQLCHAR *wUser = nullptr, *wPwd = nullptr;
if (!_priv->databaseUser.empty())
wUser = (SQLCHAR*)_priv->databaseUser.c_str();
if (!_priv->databasePassword.empty())
wPwd = (SQLCHAR*)_priv->databasePassword.c_str();
ret = SQLConnectA(_priv->connection
, (SQLCHAR*)_priv->databaseURL.c_str(), SQL_NTS
, wUser, SQL_NTS
, wPwd, SQL_NTS
);
#else
SQLWCHAR* wURL, *wUser = nullptr, *wPwd = nullptr;
encode(&wURL, _priv->databaseURL, p);
if (!_priv->databaseUser.empty())
encode(&wUser, _priv->databaseUser, p);
if (!_priv->databasePassword.empty())
encode(&wPwd, _priv->databasePassword, p);
ret = SQLConnectW( _priv->connection
, wURL, SQL_NTS
, wUser, SQL_NTS
, wPwd, SQL_NTS
);
#endif
if (ret < 0)
{
SQLException ex(SQL_HANDLE_DBC, _priv->connection, "Failed to connect to database", p);
SQLFreeHandle(SQL_HANDLE_DBC, _priv->connection);
_priv->connection = SQL_NULL_HDBC;
throw ex;
}
}
return _priv->connection;
#else
return 0;
#endif
}