diff --git a/Data/include/Poco/Data/Row.h b/Data/include/Poco/Data/Row.h index 560bdfbec..0d6b3890d 100644 --- a/Data/include/Poco/Data/Row.h +++ b/Data/include/Poco/Data/Row.h @@ -192,7 +192,7 @@ public: /// Inequality operator. bool operator < (const Row& other) const; - /// Less-then operator. + /// Less-than operator. const NameVecPtr names() const; /// Returns the shared pointer to names vector. diff --git a/Data/src/Row.cpp b/Data/src/Row.cpp index d3cd42bcc..0a00c5a8d 100644 --- a/Data/src/Row.cpp +++ b/Data/src/Row.cpp @@ -45,8 +45,8 @@ namespace Data { std::ostream& operator << (std::ostream &os, const Row& row) { - os << row.valuesToString(); - return os; + os << row.valuesToString(); + return os; } @@ -182,14 +182,18 @@ void Row::replaceSortField(std::size_t oldPos, std::size_t newPos) ComparisonType ct; - if ((_values[newPos].type() == typeid(Poco::Int8)) || - (_values[newPos].type() == typeid(Poco::UInt8)) || - (_values[newPos].type() == typeid(Poco::Int16)) || - (_values[newPos].type() == typeid(Poco::UInt16)) || - (_values[newPos].type() == typeid(Poco::Int32)) || - (_values[newPos].type() == typeid(Poco::UInt32)) || - (_values[newPos].type() == typeid(Poco::Int64)) || - (_values[newPos].type() == typeid(Poco::UInt64)) || + if (_values[newPos].isEmpty()) + { + throw IllegalStateException("Empty value not sortable."); + } + else if ((_values[newPos].type() == typeid(Poco::Int8)) || + (_values[newPos].type() == typeid(Poco::UInt8)) || + (_values[newPos].type() == typeid(Poco::Int16)) || + (_values[newPos].type() == typeid(Poco::UInt16)) || + (_values[newPos].type() == typeid(Poco::Int32)) || + (_values[newPos].type() == typeid(Poco::UInt32)) || + (_values[newPos].type() == typeid(Poco::Int64)) || + (_values[newPos].type() == typeid(Poco::UInt64)) || (_values[newPos].type() == typeid(bool))) { ct = COMPARE_AS_INTEGER; diff --git a/Foundation/include/Poco/DynamicAny.h b/Foundation/include/Poco/DynamicAny.h index 969ff4360..8c3ec4c22 100644 --- a/Foundation/include/Poco/DynamicAny.h +++ b/Foundation/include/Poco/DynamicAny.h @@ -495,7 +495,7 @@ inline void DynamicAny::swap(DynamicAny& ptr) inline const std::type_info& DynamicAny::type() const { - return _pHolder->type(); + return _pHolder ? _pHolder->type() : typeid(void); } @@ -525,6 +525,7 @@ inline DynamicAny& DynamicAny::operator += (const char*other) inline bool DynamicAny::operator == (const DynamicAny& other) const { + if (isEmpty() || other.isEmpty()) return false; return convert() == other.convert(); } @@ -537,6 +538,7 @@ inline bool DynamicAny::operator == (const char* other) const inline bool DynamicAny::operator != (const DynamicAny& other) const { + if (isEmpty() || other.isEmpty()) return false; return convert() != other.convert(); } @@ -562,37 +564,37 @@ inline bool DynamicAny::isEmpty() const inline bool DynamicAny::isArray() const { - return _pHolder->isArray(); + return _pHolder ? _pHolder->isArray() : false; } inline bool DynamicAny::isStruct() const { - return _pHolder->isStruct(); + return _pHolder ? _pHolder->isStruct() : false; } inline bool DynamicAny::isInteger() const { - return _pHolder->isInteger(); + return _pHolder ? _pHolder->isInteger() : false; } inline bool DynamicAny::isSigned() const { - return _pHolder->isSigned(); + return _pHolder ? _pHolder->isSigned() : false; } inline bool DynamicAny::isNumeric() const { - return _pHolder->isNumeric(); + return _pHolder ? _pHolder->isNumeric() : false; } inline bool DynamicAny::isString() const { - return _pHolder->isString(); + return _pHolder ? _pHolder->isString() : false; } diff --git a/Foundation/testsuite/src/DynamicAnyTest.cpp b/Foundation/testsuite/src/DynamicAnyTest.cpp index 938b764ed..3bf2512db 100644 --- a/Foundation/testsuite/src/DynamicAnyTest.cpp +++ b/Foundation/testsuite/src/DynamicAnyTest.cpp @@ -2228,6 +2228,15 @@ void DynamicAnyTest::testEmpty() { DynamicAny da; assert (da.isEmpty()); + assert (da.type() == typeid(void)); + assert (!da.isArray()); + assert (!da.isInteger()); + assert (!da.isNumeric()); + assert (!da.isSigned()); + assert (!da.isString()); + assert (!(da == da)); + assert (!(da != da)); + da = "123"; int i = da.convert(); assert (123 == i); @@ -2236,6 +2245,14 @@ void DynamicAnyTest::testEmpty() assert (!da.isEmpty()); da.empty(); assert (da.isEmpty()); + assert (da.type() == typeid(void)); + assert (!da.isArray()); + assert (!da.isInteger()); + assert (!da.isNumeric()); + assert (!da.isSigned()); + assert (!da.isString()); + assert (!(da == da)); + assert (!(da != da)); try {