EnvironmentHolder() { if (SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &Env) != SQL_SUCCESS) throw EnvironmentException("Error allocate environment", eeErrorAllocate); if (SQLSetEnvAttr(Env, SQL_ATTR_ODBC_VERSION, reinterpret_cast<SQLPOINTER>(SQL_OV_ODBC3), 0) != SQL_SUCCESS) { SQLFreeHandle(SQL_HANDLE_ENV, Env); throw EnvironmentException("Error set ODBC vrsion", eeErrorSetODBCVersion); } }
Utility::DSNMap& Utility::dataSources(Utility::DSNMap& dsnMap) { static const EnvironmentHandle henv; const int length = sizeof(SQLCHAR) * 512; const int dsnLength = sizeof(SQLCHAR) * (SQL_MAX_DSN_LENGTH + 1); SQLCHAR dsn[dsnLength]; std::memset(dsn, 0, dsnLength); SQLSMALLINT len1 = sizeof(SQLCHAR) * SQL_MAX_DSN_LENGTH; SQLCHAR desc[length]; std::memset(desc, 0, length); SQLSMALLINT len2 = length; RETCODE rc = 0; while (!Utility::isError(rc = Poco::Data::ODBC::SQLDataSources(henv, SQL_FETCH_NEXT, dsn, SQL_MAX_DSN_LENGTH, &len1, desc, len2, &len2))) { dsnMap.insert(DSNMap::value_type(std::string((char *) dsn), std::string((char *) desc))); std::memset(dsn, 0, dsnLength); std::memset(desc, 0, length); len2 = length; } if (SQL_NO_DATA != rc) throw EnvironmentException(henv); return dsnMap; }
Utility::DriverMap& Utility::drivers(Utility::DriverMap& driverMap) { static const EnvironmentHandle henv; const int length = sizeof(SQLCHAR) * 512; SQLCHAR desc[length]; std::memset(desc, 0, length); SQLSMALLINT len1 = length; SQLCHAR attr[length]; std::memset(attr, 0, length); SQLSMALLINT len2 = length; RETCODE rc = 0; if (!Utility::isError(rc = SQLDrivers(henv, SQL_FETCH_FIRST, desc, length, &len1, attr, len2, &len2))) { do { driverMap.insert(DSNMap::value_type(std::string((char *) desc), std::string((char *) attr))); std::memset(desc, 0, length); std::memset(attr, 0, length); len2 = length; }while (!Utility::isError(rc = SQLDrivers(henv, SQL_FETCH_NEXT, desc, length, &len1, attr, len2, &len2))); } if (SQL_NO_DATA != rc) throw EnvironmentException(henv); return driverMap; }