#3041: PostgreSQL and TEXT column type

This commit is contained in:
Günter Obiltschnig
2021-06-15 07:00:48 +02:00
parent 417bbc41ca
commit 1ba0f8e45b
2 changed files with 33 additions and 30 deletions

View File

@@ -34,7 +34,7 @@ const std::size_t RecordSet::UNKNOWN_TOTAL_ROW_COUNT = std::numeric_limits<std::
RecordSet::RecordSet(const Statement& rStatement, RecordSet::RecordSet(const Statement& rStatement,
RowFormatter::Ptr pRowFormatter): RowFormatter::Ptr pRowFormatter):
Statement(rStatement), Statement(rStatement),
_currentRow(0), _currentRow(0),
_pBegin(new RowIterator(this, 0 == rowsExtracted())), _pBegin(new RowIterator(this, 0 == rowsExtracted())),
@@ -45,9 +45,9 @@ RecordSet::RecordSet(const Statement& rStatement,
} }
RecordSet::RecordSet(Session& rSession, RecordSet::RecordSet(Session& rSession,
const std::string& query, const std::string& query,
RowFormatter::Ptr pRowFormatter): RowFormatter::Ptr pRowFormatter):
Statement((rSession << query, now)), Statement((rSession << query, now)),
_currentRow(0), _currentRow(0),
_pBegin(new RowIterator(this, 0 == rowsExtracted())), _pBegin(new RowIterator(this, 0 == rowsExtracted())),
@@ -119,7 +119,7 @@ void RecordSet::reset(const Statement& stmt)
_pEnd = 0; _pEnd = 0;
_currentRow = 0; _currentRow = 0;
_totalRowCount = UNKNOWN_TOTAL_ROW_COUNT; _totalRowCount = UNKNOWN_TOTAL_ROW_COUNT;
RowMap::iterator it = _rowMap.begin(); RowMap::iterator it = _rowMap.begin();
RowMap::iterator end = _rowMap.end(); RowMap::iterator end = _rowMap.end();
for (; it != end; ++it) delete it->second; for (; it != end; ++it) delete it->second;
@@ -188,6 +188,7 @@ Poco::Dynamic::Var RecordSet::value(const std::string& name, std::size_t row, bo
case MetaColumn::FDT_STRING: return value<std::string>(name, row, useFilter); case MetaColumn::FDT_STRING: return value<std::string>(name, row, useFilter);
case MetaColumn::FDT_WSTRING: return value<UTF16String>(name, row, useFilter); case MetaColumn::FDT_WSTRING: return value<UTF16String>(name, row, useFilter);
case MetaColumn::FDT_BLOB: return value<BLOB>(name, row, useFilter); case MetaColumn::FDT_BLOB: return value<BLOB>(name, row, useFilter);
case MetaColumn::FDT_CLOB: return value<CLOB>(name, row, useFilter);
case MetaColumn::FDT_DATE: return value<Date>(name, row, useFilter); case MetaColumn::FDT_DATE: return value<Date>(name, row, useFilter);
case MetaColumn::FDT_TIME: return value<Time>(name, row, useFilter); case MetaColumn::FDT_TIME: return value<Time>(name, row, useFilter);
case MetaColumn::FDT_TIMESTAMP: return value<DateTime>(name, row, useFilter); case MetaColumn::FDT_TIMESTAMP: return value<DateTime>(name, row, useFilter);
@@ -210,7 +211,7 @@ Row& RecordSet::row(std::size_t pos)
{ {
if (_rowMap.size()) if (_rowMap.size())
{ {
//reuse first row column names and sorting fields to save some memory //reuse first row column names and sorting fields to save some memory
pRow = new Row(_rowMap.begin()->second->names(), pRow = new Row(_rowMap.begin()->second->names(),
_rowMap.begin()->second->getSortMap(), _rowMap.begin()->second->getSortMap(),
getRowFormatter()); getRowFormatter());
@@ -218,7 +219,7 @@ Row& RecordSet::row(std::size_t pos)
for (std::size_t col = 0; col < columns; ++col) for (std::size_t col = 0; col < columns; ++col)
pRow->set(col, value(col, pos)); pRow->set(col, value(col, pos));
} }
else else
{ {
pRow = new Row; pRow = new Row;
pRow->setFormatter(getRowFormatter()); pRow->setFormatter(getRowFormatter());
@@ -228,7 +229,7 @@ Row& RecordSet::row(std::size_t pos)
_rowMap.insert(RowMap::value_type(pos, pRow)); _rowMap.insert(RowMap::value_type(pos, pRow));
} }
else else
{ {
pRow = it->second; pRow = it->second;
poco_check_ptr (pRow); poco_check_ptr (pRow);

View File

@@ -131,15 +131,15 @@ std::size_t StatementImpl::executeWithLimit()
do do
{ {
bind(); bind();
while (count < limit && hasNext()) while (count < limit && hasNext())
count += next(); count += next();
} while (count < limit && canBind()); } while (count < limit && canBind());
if (!canBind() && (!hasNext() || limit == 0)) if (!canBind() && (!hasNext() || limit == 0))
_state = ST_DONE; _state = ST_DONE;
else if (hasNext() && limit == count && _extrLimit.isHardLimit()) else if (hasNext() && limit == count && _extrLimit.isHardLimit())
throw LimitException("HardLimit reached (retrieved more data than requested)."); throw LimitException("HardLimit reached (retrieved more data than requested).");
else else
_state = ST_PAUSED; _state = ST_PAUSED;
int affectedRows = affectedRowCount(); int affectedRows = affectedRowCount();
@@ -177,8 +177,8 @@ std::size_t StatementImpl::executeWithoutLimit()
void StatementImpl::compile() void StatementImpl::compile()
{ {
if (_state == ST_INITIALIZED || if (_state == ST_INITIALIZED ||
_state == ST_RESET || _state == ST_RESET ||
_state == ST_BOUND) _state == ST_BOUND)
{ {
compileImpl(); compileImpl();
@@ -298,7 +298,7 @@ void StatementImpl::setStorage(const std::string& storage)
if (0 == icompare(DEQUE, storage)) if (0 == icompare(DEQUE, storage))
_storage = STORAGE_DEQUE_IMPL; _storage = STORAGE_DEQUE_IMPL;
else if (0 == icompare(VECTOR, storage)) else if (0 == icompare(VECTOR, storage))
_storage = STORAGE_VECTOR_IMPL; _storage = STORAGE_VECTOR_IMPL;
else if (0 == icompare(LIST, storage)) else if (0 == icompare(LIST, storage))
_storage = STORAGE_LIST_IMPL; _storage = STORAGE_LIST_IMPL;
else if (0 == icompare(UNKNOWN, storage)) else if (0 == icompare(UNKNOWN, storage))
@@ -317,32 +317,34 @@ void StatementImpl::makeExtractors(std::size_t count)
{ {
case MetaColumn::FDT_BOOL: case MetaColumn::FDT_BOOL:
addInternalExtract<bool>(mc); break; addInternalExtract<bool>(mc); break;
case MetaColumn::FDT_INT8: case MetaColumn::FDT_INT8:
addInternalExtract<Int8>(mc); break; addInternalExtract<Int8>(mc); break;
case MetaColumn::FDT_UINT8: case MetaColumn::FDT_UINT8:
addInternalExtract<UInt8>(mc); break; addInternalExtract<UInt8>(mc); break;
case MetaColumn::FDT_INT16: case MetaColumn::FDT_INT16:
addInternalExtract<Int16>(mc); break; addInternalExtract<Int16>(mc); break;
case MetaColumn::FDT_UINT16: case MetaColumn::FDT_UINT16:
addInternalExtract<UInt16>(mc); break; addInternalExtract<UInt16>(mc); break;
case MetaColumn::FDT_INT32: case MetaColumn::FDT_INT32:
addInternalExtract<Int32>(mc); break; addInternalExtract<Int32>(mc); break;
case MetaColumn::FDT_UINT32: case MetaColumn::FDT_UINT32:
addInternalExtract<UInt32>(mc); break; addInternalExtract<UInt32>(mc); break;
case MetaColumn::FDT_INT64: case MetaColumn::FDT_INT64:
addInternalExtract<Int64>(mc); break; addInternalExtract<Int64>(mc); break;
case MetaColumn::FDT_UINT64: case MetaColumn::FDT_UINT64:
addInternalExtract<UInt64>(mc); break; addInternalExtract<UInt64>(mc); break;
case MetaColumn::FDT_FLOAT: case MetaColumn::FDT_FLOAT:
addInternalExtract<float>(mc); break; addInternalExtract<float>(mc); break;
case MetaColumn::FDT_DOUBLE: case MetaColumn::FDT_DOUBLE:
addInternalExtract<double>(mc); break; addInternalExtract<double>(mc); break;
case MetaColumn::FDT_STRING: case MetaColumn::FDT_STRING:
addInternalExtract<std::string>(mc); break; addInternalExtract<std::string>(mc); break;
case MetaColumn::FDT_WSTRING: case MetaColumn::FDT_WSTRING:
addInternalExtract<Poco::UTF16String>(mc); break; addInternalExtract<Poco::UTF16String>(mc); break;
case MetaColumn::FDT_BLOB: case MetaColumn::FDT_BLOB:
addInternalExtract<BLOB>(mc); break; addInternalExtract<BLOB>(mc); break;
case MetaColumn::FDT_CLOB:
addInternalExtract<CLOB>(mc); break;
case MetaColumn::FDT_DATE: case MetaColumn::FDT_DATE:
addInternalExtract<Date>(mc); break; addInternalExtract<Date>(mc); break;
case MetaColumn::FDT_TIME: case MetaColumn::FDT_TIME:
@@ -391,7 +393,7 @@ void StatementImpl::addExtract(AbstractExtraction::Ptr pExtraction)
{ {
poco_check_ptr (pExtraction); poco_check_ptr (pExtraction);
std::size_t pos = pExtraction->position(); std::size_t pos = pExtraction->position();
if (pos >= _extractors.size()) if (pos >= _extractors.size())
_extractors.resize(pos + 1); _extractors.resize(pos + 1);
pExtraction->setEmptyStringIsNull( pExtraction->setEmptyStringIsNull(
@@ -411,7 +413,7 @@ void StatementImpl::removeBind(const std::string& name)
AbstractBindingVec::iterator it = _bindings.begin(); AbstractBindingVec::iterator it = _bindings.begin();
for (; it != _bindings.end();) for (; it != _bindings.end();)
{ {
if ((*it)->name() == name) if ((*it)->name() == name)
{ {
it = _bindings.erase(it); it = _bindings.erase(it);
found = true; found = true;
@@ -446,7 +448,7 @@ std::size_t StatementImpl::rowsExtracted(int dataSet) const
if (_extractors[dataSet].size() > 0) if (_extractors[dataSet].size() > 0)
return _extractors[dataSet][0]->numOfRowsHandled(); return _extractors[dataSet][0]->numOfRowsHandled();
} }
return 0; return 0;
} }
@@ -459,7 +461,7 @@ std::size_t StatementImpl::subTotalRowCount(int dataSet) const
poco_assert (dataSet >= 0 && dataSet < _subTotalRowCount.size()); poco_assert (dataSet >= 0 && dataSet < _subTotalRowCount.size());
return _subTotalRowCount[dataSet]; return _subTotalRowCount[dataSet];
} }
return 0; return 0;
} }