mirror of
				https://github.com/Telecominfraproject/wlan-cloud-lib-poco.git
				synced 2025-10-30 02:02:30 +00:00 
			
		
		
		
	fix(Extractor): check encoding validity early and make Extractor encodings SharedPtr
This commit is contained in:
		| @@ -56,7 +56,7 @@ public: | ||||
|  | ||||
| 	Extractor(const StatementHandle& rStmt,  | ||||
| 		Preparator::Ptr pPreparator, | ||||
| 		const std::string& dbEncoding = "UTF-8"); | ||||
| 		Poco::TextEncoding::Ptr pDBEncoding = nullptr); | ||||
| 		/// Creates the Extractor. | ||||
|  | ||||
| 	~Extractor(); | ||||
| @@ -586,7 +586,7 @@ private: | ||||
| 		val.clear(); | ||||
| 		if (ret) | ||||
| 		{ | ||||
| 			Poco::TextConverter conv(_dbEncoding, _toEncoding); | ||||
| 			Poco::TextConverter conv(*_pDBEncoding, *_pToEncoding); | ||||
| 			val.resize(res.size()); | ||||
| 			C::iterator vIt = val.begin(); | ||||
| 			C::iterator it = res.begin(); | ||||
| @@ -622,9 +622,9 @@ private: | ||||
| 	PreparatorPtr              _pPreparator; | ||||
| 	Preparator::DataExtraction _dataExtraction; | ||||
| 	std::vector<SQLLEN>        _lengths; | ||||
| 	Poco::TextEncoding&        _dbEncoding; | ||||
| 	Poco::TextEncoding&        _toEncoding; | ||||
| 	Poco::TextEncoding::Ptr    _pDBEncoding; | ||||
| 	bool                       _transcode; | ||||
| 	Poco::TextEncoding::Ptr    _pToEncoding; | ||||
| }; | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -25,6 +25,7 @@ | ||||
| #include "Poco/Data/ODBC/Handle.h" | ||||
| #include "Poco/Data/ODBC/ODBCException.h" | ||||
| #include "Poco/Data/AbstractSessionImpl.h" | ||||
| #include "Poco/TextEncoding.h" | ||||
| #include "Poco/SharedPtr.h" | ||||
| #include "Poco/Mutex.h" | ||||
| #ifdef POCO_OS_FAMILY_WINDOWS | ||||
| @@ -302,12 +303,6 @@ inline int SessionImpl::queryTimeout() const | ||||
| } | ||||
|  | ||||
|  | ||||
| inline void SessionImpl::setDBEncoding(const std::string&, const Poco::Any& value) | ||||
| { | ||||
| 	_dbEncoding = Poco::AnyCast<std::string>(value); | ||||
| } | ||||
|  | ||||
|  | ||||
| inline Poco::Any SessionImpl::getDBEncoding(const std::string&) const | ||||
| { | ||||
| 	return _dbEncoding; | ||||
|   | ||||
| @@ -34,13 +34,13 @@ const std::string Extractor::FLD_SIZE_EXCEEDED_FMT = "Specified data size (%z by | ||||
|  | ||||
| Extractor::Extractor(const StatementHandle& rStmt,  | ||||
| 	Preparator::Ptr pPreparator, | ||||
| 	const std::string& dbEncoding): | ||||
| 	TextEncoding::Ptr pDBEncoding): | ||||
| 	_rStmt(rStmt),  | ||||
| 	_pPreparator(pPreparator), | ||||
| 	_dataExtraction(pPreparator->getDataExtraction()), | ||||
| 	_dbEncoding(Poco::TextEncoding::byName(dbEncoding)), | ||||
| 	_toEncoding(Poco::TextEncoding::byName("UTF-8")), | ||||
| 	_transcode(!_dbEncoding.isA("UTF-8")) | ||||
| 	_pDBEncoding(pDBEncoding), | ||||
| 	_transcode(_pDBEncoding && !_pDBEncoding->isA("UTF-8")), | ||||
| 	_pToEncoding(_transcode ? Poco::TextEncoding::find("UTF-8") : nullptr) | ||||
| { | ||||
| } | ||||
|  | ||||
| @@ -679,7 +679,7 @@ bool Extractor::extract(std::size_t pos, std::string& val) | ||||
| 			ret = extractManualImpl(pos, result, SQL_C_CHAR); | ||||
| 		else | ||||
| 			ret = extractBoundImpl(pos, result); | ||||
| 		Poco::TextConverter converter(_dbEncoding, _toEncoding); | ||||
| 		Poco::TextConverter converter(*_pDBEncoding, *_pToEncoding); | ||||
| 		converter.convert(result, val); | ||||
| 	} | ||||
|  | ||||
|   | ||||
| @@ -146,7 +146,7 @@ void ODBCStatementImpl::addPreparator() | ||||
| 		_preparations.push_back(new Preparator(*_preparations[0])); | ||||
|  | ||||
| 	_extractors.push_back(new Extractor(_stmt, _preparations.back(), | ||||
| 		Poco::RefAnyCast<std::string>(session().getProperty("dbEncoding")))); | ||||
| 		TextEncoding::find(Poco::RefAnyCast<std::string>(session().getProperty("dbEncoding"))))); | ||||
| } | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -170,6 +170,14 @@ void SessionImpl::open(const std::string& connect) | ||||
| } | ||||
|  | ||||
|  | ||||
| void SessionImpl::setDBEncoding(const std::string&, const Poco::Any& value) | ||||
| { | ||||
| 	const std::string& enc = Poco::RefAnyCast<std::string>(value); | ||||
| 	Poco::TextEncoding::byName(enc); // throws if not found | ||||
| 	_dbEncoding = enc; | ||||
| } | ||||
|  | ||||
|  | ||||
| bool SessionImpl::isConnected() const | ||||
| { | ||||
| 	SQLULEN value = 0; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Alex Fabijanic
					Alex Fabijanic