Skip to content

Commit

Permalink
Merge pull request pocoproject#14 in FSF_POCO/upstream from ~LUTKOS/u…
Browse files Browse the repository at this point in the history
…pstream:ms-develop to ms-develop

* commit '1d89fe4cbb8da4f232f22b59d3b1c786e022f80c':
  Added "const" accessors to Row
  Fixed problem of binding of null via Any()
  Made changes to allow compilation without c++11
  • Loading branch information
Kostya Lutsenko authored and Kostya Lutsenko committed Sep 1, 2015
2 parents 7f6541d + 1d89fe4 commit 6eca077
Show file tree
Hide file tree
Showing 7 changed files with 67 additions and 18 deletions.
13 changes: 12 additions & 1 deletion Data/ODBC/include/Poco/Data/ODBC/TypeInfo.h
Expand Up @@ -25,6 +25,7 @@
#include "Poco/DynamicAny.h"
#include <vector>
#include <map>
#include <typeinfo>
#ifdef POCO_OS_FAMILY_WINDOWS
#include <windows.h>
#endif
Expand Down Expand Up @@ -71,7 +72,17 @@ class ODBC_API TypeInfo
SQLINTEGER,
SQLSMALLINT> TypeInfoTup;
typedef std::vector<TypeInfoTup> TypeInfoVec;
typedef std::map<std::size_t, SQLSMALLINT> CppTypeInfoMap;
typedef const std::type_info* TypeInfoPtr;

struct TypeInfoComp : public std::binary_function<TypeInfoPtr, TypeInfoPtr, bool>
{
bool operator()(const TypeInfoPtr& left, const TypeInfoPtr& right) const
{ // apply operator< to operands
return ( left->before( *right ) );
}
};

typedef std::map<TypeInfoPtr, SQLSMALLINT, TypeInfoComp> CppTypeInfoMap;

explicit TypeInfo(SQLHDBC* pHDBC=0);
/// Creates the TypeInfo.
Expand Down
22 changes: 11 additions & 11 deletions Data/ODBC/src/TypeInfo.cpp
Expand Up @@ -32,16 +32,16 @@ TypeInfo::TypeInfo(SQLHDBC* pHDBC): _pHDBC(pHDBC)
fillSQLTypes();
if (_pHDBC) fillTypeInfo(*_pHDBC);

_cppDataTypes.insert(CppTypeInfoMap::value_type(typeid(std::string).hash_code(), SQL_C_CHAR));
_cppDataTypes.insert(CppTypeInfoMap::value_type(typeid(std::wstring).hash_code(), SQL_C_WCHAR));
_cppDataTypes.insert(CppTypeInfoMap::value_type(typeid(Poco::UTF16String).hash_code(), SQL_C_WCHAR));
_cppDataTypes.insert(CppTypeInfoMap::value_type(typeid(Date).hash_code(), SQL_TYPE_DATE));
_cppDataTypes.insert(CppTypeInfoMap::value_type(typeid(Time).hash_code(), SQL_TYPE_TIME));
_cppDataTypes.insert(CppTypeInfoMap::value_type(typeid(DateTime).hash_code(), SQL_TYPE_TIMESTAMP));
_cppDataTypes.insert(CppTypeInfoMap::value_type(typeid(BLOB).hash_code(), SQL_BINARY));
_cppDataTypes.insert(CppTypeInfoMap::value_type(typeid(float).hash_code(), SQL_REAL));
_cppDataTypes.insert(CppTypeInfoMap::value_type(typeid(double).hash_code(), SQL_DOUBLE));
_cppDataTypes.insert(CppTypeInfoMap::value_type(typeid(bool).hash_code(), SQL_BIT));
_cppDataTypes.insert(CppTypeInfoMap::value_type(&typeid(std::string), SQL_C_CHAR));
_cppDataTypes.insert(CppTypeInfoMap::value_type(&typeid(std::wstring), SQL_C_WCHAR));
_cppDataTypes.insert(CppTypeInfoMap::value_type(&typeid(Poco::UTF16String), SQL_C_WCHAR));
_cppDataTypes.insert(CppTypeInfoMap::value_type(&typeid(Date), SQL_TYPE_DATE));
_cppDataTypes.insert(CppTypeInfoMap::value_type(&typeid(Time), SQL_TYPE_TIME));
_cppDataTypes.insert(CppTypeInfoMap::value_type(&typeid(DateTime), SQL_TYPE_TIMESTAMP));
_cppDataTypes.insert(CppTypeInfoMap::value_type(&typeid(BLOB), SQL_BINARY));
_cppDataTypes.insert(CppTypeInfoMap::value_type(&typeid(float), SQL_REAL));
_cppDataTypes.insert(CppTypeInfoMap::value_type(&typeid(double), SQL_DOUBLE));
_cppDataTypes.insert(CppTypeInfoMap::value_type(&typeid(bool), SQL_BIT));
}


Expand Down Expand Up @@ -278,7 +278,7 @@ void TypeInfo::print(std::ostream& ostr)

SQLSMALLINT TypeInfo::tryTypeidToCType(const std::type_info& ti, SQLSMALLINT defaultVal) const
{
CppTypeInfoMap::const_iterator res = _cppDataTypes.find(ti.hash_code());
CppTypeInfoMap::const_iterator res = _cppDataTypes.find(&ti);
if (res == _cppDataTypes.end())
return defaultVal;
return res->second;
Expand Down
3 changes: 1 addition & 2 deletions Data/ODBC/testsuite/src/SQLExecutor.cpp
Expand Up @@ -4173,9 +4173,8 @@ void SQLExecutor::nullable()
{
try {
Nullable<int> nint;
Nullable<std::string> ns;
session() << "INSERT INTO " << ExecUtil::nullabletest() <<
" VALUES(?, ?, ?, ?)", useRef(nint), bind(Nullable<double>()), useRef(ns), bind(Nullable<DateTime>()), now;
" VALUES(?, ?, ?, ?)", useRef(nint), bind(Nullable<double>()), bind(Any()), bind(Nullable<DateTime>()), now;
}
catch(ConnectionException& ce){ std::cout << ce.toString() << std::endl; fail ("nullable()"); }
catch(StatementException& se){ std::cout << se.toString() << std::endl; fail ("nullable()"); }
Expand Down
23 changes: 22 additions & 1 deletion Data/include/Poco/Data/Row.h
Expand Up @@ -104,6 +104,15 @@ class Data_API Row
Poco::Dynamic::Var& operator [] (const std::string& name);
/// Returns the reference to data value at named column location.

const Poco::Dynamic::Var& get(std::size_t col) const;
/// Returns the reference to data value at column location.

const Poco::Dynamic::Var& operator [] (std::size_t col) const;
/// Returns the reference to data value at column location.

const Poco::Dynamic::Var& operator [] (const std::string& name) const;
/// Returns the reference to data value at named column location.

template <typename T>
void append(const std::string& name, const T& val)
/// Appends the value to the row.
Expand Down Expand Up @@ -225,7 +234,7 @@ class Data_API Row
ValueVec& values();
/// Returns the reference to values vector.

std::size_t getPosition(const std::string& name);
std::size_t getPosition(const std::string& name) const;
bool isEqualSize(const Row& other) const;
bool isEqualType(const Row& other) const;

Expand Down Expand Up @@ -287,6 +296,18 @@ inline Poco::Dynamic::Var& Row::operator [] (const std::string& name)
}


inline const Poco::Dynamic::Var& Row::operator [] (std::size_t col) const
{
return get(col);
}


inline const Poco::Dynamic::Var& Row::operator [] (const std::string& name) const
{
return get(getPosition(name));
}


inline const RowFormatter& Row::getFormatter() const
{
return *_pFormatter;
Expand Down
4 changes: 2 additions & 2 deletions Data/src/AbstractBinder.cpp
Expand Up @@ -465,7 +465,7 @@ void AbstractBinder::bind(std::size_t pos, const Any& val, Direction dir, const
else if(type == typeid(BLOB))
bind(pos, RefAnyCast<BLOB>(val), dir, nullCb);
else if(type == typeid(void))
bind(pos, Keywords::null, dir, nullCb);
bind(pos, Keywords::null, dir, type);
#ifndef POCO_LONG_IS_64_BIT
else if(type == typeid(long))
bind(pos, RefAnyCast<long>(val), dir, nullCb);
Expand Down Expand Up @@ -516,7 +516,7 @@ void AbstractBinder::bind(std::size_t pos, const Poco::Dynamic::Var& val, Direct
else if(type == typeid(BLOB))
bind(pos, val.extract<BLOB>(), dir, nullCb);
else if(type == typeid(void))
bind(pos, Keywords::null, dir, nullCb);
bind(pos, Keywords::null, dir, type);
#ifndef POCO_LONG_IS_64_BIT
else if(type == typeid(long))
bind(pos, val.extract<long>(), dir, nullCb);
Expand Down
15 changes: 14 additions & 1 deletion Data/src/Row.cpp
Expand Up @@ -94,7 +94,20 @@ Poco::Dynamic::Var& Row::get(std::size_t col)
}


std::size_t Row::getPosition(const std::string& name)
const Poco::Dynamic::Var& Row::get(std::size_t col) const
{
try
{
return _values.at(col);
}
catch (std::out_of_range& re)
{
throw RangeException(re.what());
}
}


std::size_t Row::getPosition(const std::string& name) const
{
if (!_pNames)
throw NullPointerException();
Expand Down
5 changes: 5 additions & 0 deletions Data/testsuite/src/DataTest.cpp
Expand Up @@ -901,6 +901,11 @@ void DataTest::testRow()
assert (row[3] == 3);
assert (row[4] == 4);

const Row& cr = row;
assert(cr["field0"] == 0);
assert(cr[0] == 0);
assert(cr.get(0) == 0);

try
{
int i; i = row[5].convert<int>(); // to silence gcc
Expand Down

0 comments on commit 6eca077

Please sign in to comment.