diff --git a/Data/ODBC/include/Poco/Data/ODBC/ODBCMetaColumn.h b/Data/ODBC/include/Poco/Data/ODBC/ODBCMetaColumn.h index e090e3f564..f85d0c01fe 100644 --- a/Data/ODBC/include/Poco/Data/ODBC/ODBCMetaColumn.h +++ b/Data/ODBC/include/Poco/Data/ODBC/ODBCMetaColumn.h @@ -51,6 +51,9 @@ class ODBC_API ODBCMetaColumn: public MetaColumn /// null-termination byte that ends the character string. /// This information is returned from the SQL_DESC_LENGTH record field of the IRD. + bool isUnsigned() const; + /// Returns true if column is unsigned or a non-numeric data type. + private: ODBCMetaColumn(); diff --git a/Data/ODBC/src/ODBCMetaColumn.cpp b/Data/ODBC/src/ODBCMetaColumn.cpp index e1b5c3a382..ff90818f63 100644 --- a/Data/ODBC/src/ODBCMetaColumn.cpp +++ b/Data/ODBC/src/ODBCMetaColumn.cpp @@ -21,14 +21,14 @@ namespace Data { namespace ODBC { - ODBCMetaColumn::ODBCMetaColumn(const StatementHandle& rStmt, std::size_t position) : +ODBCMetaColumn::ODBCMetaColumn(const StatementHandle& rStmt, std::size_t position) : MetaColumn(position), _rStmt(rStmt) { init(); } - + ODBCMetaColumn::~ODBCMetaColumn() { } @@ -58,6 +58,23 @@ void ODBCMetaColumn::getDescription() } +bool ODBCMetaColumn::isUnsigned() const +{ + SQLLEN val = 0; + if (Utility::isError(Poco::Data::ODBC::SQLColAttribute(_rStmt, + (SQLUSMALLINT)position() + 1, // ODBC columns are 1-based + SQL_DESC_UNSIGNED, + 0, + 0, + 0, + &val))) + { + throw StatementException(_rStmt); + } + return (val == SQL_TRUE); +} + + void ODBCMetaColumn::init() { getDescription(); @@ -97,16 +114,20 @@ void ODBCMetaColumn::init() setType(MetaColumn::FDT_WSTRING); break; case SQL_TINYINT: - setType(MetaColumn::FDT_INT8); break; + setType(isUnsigned() ? MetaColumn::FDT_UINT8 : MetaColumn::FDT_INT8); + break; case SQL_SMALLINT: - setType(MetaColumn::FDT_INT16); break; + setType(isUnsigned() ? MetaColumn::FDT_UINT16 : MetaColumn::FDT_INT16); + break; case SQL_INTEGER: - setType(MetaColumn::FDT_INT32); break; + setType(isUnsigned() ? MetaColumn::FDT_UINT32 : MetaColumn::FDT_INT32); + break; case SQL_BIGINT: - setType(MetaColumn::FDT_INT64); break; + setType(isUnsigned() ? MetaColumn::FDT_UINT64 : MetaColumn::FDT_INT64); + break; case SQL_DOUBLE: case SQL_FLOAT: diff --git a/Data/ODBC/src/SessionImpl.cpp b/Data/ODBC/src/SessionImpl.cpp index c5be5fed0c..603a8b57b4 100644 --- a/Data/ODBC/src/SessionImpl.cpp +++ b/Data/ODBC/src/SessionImpl.cpp @@ -232,7 +232,11 @@ bool SessionImpl::canTransact() void SessionImpl::setTransactionIsolation(Poco::UInt32 ti) { +#if POCO_PTR_IS_64_BIT + Poco::UInt64 isolation = 0; +#else Poco::UInt32 isolation = 0; +#endif if (ti & Session::TRANSACTION_READ_UNCOMMITTED) isolation |= SQL_TXN_READ_UNCOMMITTED; diff --git a/Foundation/src/ThreadPool.cpp b/Foundation/src/ThreadPool.cpp index 385b93b367..65f946e773 100644 --- a/Foundation/src/ThreadPool.cpp +++ b/Foundation/src/ThreadPool.cpp @@ -181,7 +181,7 @@ void PooledThread::activate() void PooledThread::release() { const long JOIN_TIMEOUT = 10000; - + _mutex.lock(); _pTarget = 0; _mutex.unlock();