ODBCAppender::SQLHDBC ODBCAppender::getConnection()

in src/main/cpp/odbcappender.cpp [285:373]


ODBCAppender::SQLHDBC ODBCAppender::getConnection(LOG4CXX_NS::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
}