Merge from pocoproject/develop

Signed-off-by: FrancisANDRE <zosrothko@orange.fr>
This commit is contained in:
FrancisANDRE
2016-03-23 15:22:06 +01:00
parent 2af693c412
commit 4a82c83587
7 changed files with 95 additions and 78 deletions

View File

@@ -319,6 +319,16 @@ public:
/// Returns true if there is at least one row in the RecordSet, /// Returns true if there is at least one row in the RecordSet,
/// false otherwise. /// false otherwise.
using Statement::reset;
/// Don't hide base class method.
void reset(const Statement& stmt);
/// Resets the RecordSet and assigns a new statement.
/// Should be called after the given statement has been reset,
/// assigned a new SQL statement, and executed.
///
/// Does not remove the associated RowFilter or RowFormatter.
Poco::Dynamic::Var value(const std::string& name) const; Poco::Dynamic::Var value(const std::string& name) const;
/// Returns the value in the named column of the current row. /// Returns the value in the named column of the current row.
@@ -473,7 +483,6 @@ private:
void filter(RowFilter* pFilter); void filter(RowFilter* pFilter);
/// Sets the filter for the RecordSet. /// Sets the filter for the RecordSet.
const RowFilter* getFilter() const; const RowFilter* getFilter() const;
/// Returns the filter associated with the RecordSet. /// Returns the filter associated with the RecordSet.
@@ -493,6 +502,7 @@ private:
/// inlines /// inlines
/// ///
inline Data_API std::ostream& operator << (std::ostream &os, const RecordSet& rs) inline Data_API std::ostream& operator << (std::ostream &os, const RecordSet& rs)
{ {
return rs.copy(os); return rs.copy(os);
@@ -534,8 +544,8 @@ inline std::size_t RecordSet::columnCount() const
inline Statement& RecordSet::operator = (const Statement& stmt) inline Statement& RecordSet::operator = (const Statement& stmt)
{ {
_currentRow = 0; reset(stmt);
return Statement::operator = (stmt); return *this;
} }
@@ -663,36 +673,6 @@ inline size_t RecordSet::storageRowCount() const
return impl()->rowsExtracted(); return impl()->rowsExtracted();
} }
/* TODO
namespace Keywords {
inline const std::string& select(const std::string& str)
{
return str;
}
inline const RecordSet& from(const RecordSet& rs)
{
return rs;
}
inline RecordSet from(const Statement& stmt)
{
return RecordSet(stmt);
}
inline const std::string& where(const std::string& str)
{
return str;
}
} // namespace Keywords
*/
} } // namespace Poco::Data } } // namespace Poco::Data

View File

@@ -70,6 +70,7 @@ RecordSet::RecordSet(const RecordSet& other):
_pFilter(other._pFilter), _pFilter(other._pFilter),
_totalRowCount(other._totalRowCount) _totalRowCount(other._totalRowCount)
{ {
if (_pFilter) _pFilter->duplicate();
} }
@@ -79,7 +80,7 @@ RecordSet::~RecordSet()
{ {
delete _pBegin; delete _pBegin;
delete _pEnd; delete _pEnd;
if(_pFilter) _pFilter->release(); if (_pFilter) _pFilter->release();
RowMap::iterator it = _rowMap.begin(); RowMap::iterator it = _rowMap.begin();
RowMap::iterator itEnd = _rowMap.end(); RowMap::iterator itEnd = _rowMap.end();
@@ -92,6 +93,27 @@ RecordSet::~RecordSet()
} }
void RecordSet::reset(const Statement& stmt)
{
delete _pBegin;
_pBegin = 0;
delete _pEnd;
_pEnd = 0;
_currentRow = 0;
_totalRowCount = UNKNOWN_TOTAL_ROW_COUNT;
RowMap::iterator it = _rowMap.begin();
RowMap::iterator end = _rowMap.end();
for (; it != end; ++it) delete it->second;
_rowMap.clear();
Statement::operator = (stmt);
_pBegin = new RowIterator(this, 0 == rowsExtracted());
_pEnd = new RowIterator(this, true);
}
Poco::Dynamic::Var RecordSet::value(std::size_t col, std::size_t dataRow, bool useFilter) const Poco::Dynamic::Var RecordSet::value(std::size_t col, std::size_t dataRow, bool useFilter) const
{ {
if (useFilter && isFiltered() && !isAllowed(dataRow)) if (useFilter && isFiltered() && !isAllowed(dataRow))
@@ -101,26 +123,26 @@ Poco::Dynamic::Var RecordSet::value(std::size_t col, std::size_t dataRow, bool u
switch (columnType(col)) switch (columnType(col))
{ {
case MetaColumn::FDT_BOOL: return value<bool>(col, dataRow, useFilter); case MetaColumn::FDT_BOOL: return value<bool>(col, dataRow, useFilter);
case MetaColumn::FDT_INT8: return value<Int8>(col, dataRow, useFilter); case MetaColumn::FDT_INT8: return value<Int8>(col, dataRow, useFilter);
case MetaColumn::FDT_UINT8: return value<UInt8>(col, dataRow, useFilter); case MetaColumn::FDT_UINT8: return value<UInt8>(col, dataRow, useFilter);
case MetaColumn::FDT_INT16: return value<Int16>(col, dataRow, useFilter); case MetaColumn::FDT_INT16: return value<Int16>(col, dataRow, useFilter);
case MetaColumn::FDT_UINT16: return value<UInt16>(col, dataRow, useFilter); case MetaColumn::FDT_UINT16: return value<UInt16>(col, dataRow, useFilter);
case MetaColumn::FDT_INT32: return value<Int32>(col, dataRow, useFilter); case MetaColumn::FDT_INT32: return value<Int32>(col, dataRow, useFilter);
case MetaColumn::FDT_UINT32: return value<UInt32>(col, dataRow, useFilter); case MetaColumn::FDT_UINT32: return value<UInt32>(col, dataRow, useFilter);
case MetaColumn::FDT_INT64: return value<Int64>(col, dataRow, useFilter); case MetaColumn::FDT_INT64: return value<Int64>(col, dataRow, useFilter);
case MetaColumn::FDT_UINT64: return value<UInt64>(col, dataRow, useFilter); case MetaColumn::FDT_UINT64: return value<UInt64>(col, dataRow, useFilter);
case MetaColumn::FDT_FLOAT: return value<float>(col, dataRow, useFilter); case MetaColumn::FDT_FLOAT: return value<float>(col, dataRow, useFilter);
case MetaColumn::FDT_DOUBLE: return value<double>(col, dataRow, useFilter); case MetaColumn::FDT_DOUBLE: return value<double>(col, dataRow, useFilter);
case MetaColumn::FDT_STRING: return value<std::string>(col, dataRow, useFilter); case MetaColumn::FDT_STRING: return value<std::string>(col, dataRow, useFilter);
case MetaColumn::FDT_WSTRING: return value<UTF16String>(col, dataRow, useFilter); case MetaColumn::FDT_WSTRING: return value<UTF16String>(col, dataRow, useFilter);
case MetaColumn::FDT_BLOB: return value<BLOB>(col, dataRow, useFilter); case MetaColumn::FDT_BLOB: return value<BLOB>(col, dataRow, useFilter);
case MetaColumn::FDT_CLOB: return value<CLOB>(col, dataRow, useFilter); case MetaColumn::FDT_CLOB: return value<CLOB>(col, dataRow, useFilter);
case MetaColumn::FDT_DATE: return value<Date>(col, dataRow, useFilter); case MetaColumn::FDT_DATE: return value<Date>(col, dataRow, useFilter);
case MetaColumn::FDT_TIME: return value<Time>(col, dataRow, useFilter); case MetaColumn::FDT_TIME: return value<Time>(col, dataRow, useFilter);
case MetaColumn::FDT_TIMESTAMP: return value<DateTime>(col, dataRow); case MetaColumn::FDT_TIMESTAMP: return value<DateTime>(col, dataRow);
default: default:
throw UnknownTypeException("Data type not supported."); throw UnknownTypeException("Data type not supported.");
} }
} }
@@ -134,25 +156,25 @@ Poco::Dynamic::Var RecordSet::value(const std::string& name, std::size_t dataRow
switch (columnType(name)) switch (columnType(name))
{ {
case MetaColumn::FDT_BOOL: return value<bool>(name, dataRow, useFilter); case MetaColumn::FDT_BOOL: return value<bool>(name, dataRow, useFilter);
case MetaColumn::FDT_INT8: return value<Int8>(name, dataRow, useFilter); case MetaColumn::FDT_INT8: return value<Int8>(name, dataRow, useFilter);
case MetaColumn::FDT_UINT8: return value<UInt8>(name, dataRow, useFilter); case MetaColumn::FDT_UINT8: return value<UInt8>(name, dataRow, useFilter);
case MetaColumn::FDT_INT16: return value<Int16>(name, dataRow, useFilter); case MetaColumn::FDT_INT16: return value<Int16>(name, dataRow, useFilter);
case MetaColumn::FDT_UINT16: return value<UInt16>(name, dataRow, useFilter); case MetaColumn::FDT_UINT16: return value<UInt16>(name, dataRow, useFilter);
case MetaColumn::FDT_INT32: return value<Int32>(name, dataRow, useFilter); case MetaColumn::FDT_INT32: return value<Int32>(name, dataRow, useFilter);
case MetaColumn::FDT_UINT32: return value<UInt32>(name, dataRow, useFilter); case MetaColumn::FDT_UINT32: return value<UInt32>(name, dataRow, useFilter);
case MetaColumn::FDT_INT64: return value<Int64>(name, dataRow, useFilter); case MetaColumn::FDT_INT64: return value<Int64>(name, dataRow, useFilter);
case MetaColumn::FDT_UINT64: return value<UInt64>(name, dataRow, useFilter); case MetaColumn::FDT_UINT64: return value<UInt64>(name, dataRow, useFilter);
case MetaColumn::FDT_FLOAT: return value<float>(name, dataRow, useFilter); case MetaColumn::FDT_FLOAT: return value<float>(name, dataRow, useFilter);
case MetaColumn::FDT_DOUBLE: return value<double>(name, dataRow, useFilter); case MetaColumn::FDT_DOUBLE: return value<double>(name, dataRow, useFilter);
case MetaColumn::FDT_STRING: return value<std::string>(name, dataRow, useFilter); case MetaColumn::FDT_STRING: return value<std::string>(name, dataRow, useFilter);
case MetaColumn::FDT_WSTRING: return value<UTF16String>(name, dataRow, useFilter); case MetaColumn::FDT_WSTRING: return value<UTF16String>(name, dataRow, useFilter);
case MetaColumn::FDT_BLOB: return value<BLOB>(name, dataRow, useFilter); case MetaColumn::FDT_BLOB: return value<BLOB>(name, dataRow, useFilter);
case MetaColumn::FDT_DATE: return value<Date>(name, dataRow, useFilter); case MetaColumn::FDT_DATE: return value<Date>(name, dataRow, useFilter);
case MetaColumn::FDT_TIME: return value<Time>(name, dataRow, useFilter); case MetaColumn::FDT_TIME: return value<Time>(name, dataRow, useFilter);
case MetaColumn::FDT_TIMESTAMP: return value<DateTime>(name, dataRow, useFilter); case MetaColumn::FDT_TIMESTAMP: return value<DateTime>(name, dataRow, useFilter);
default: default:
throw UnknownTypeException("Data type not supported."); throw UnknownTypeException("Data type not supported.");
} }
} }
@@ -379,7 +401,7 @@ void RecordSet::filter(RowFilter* pFilter)
{ {
if (_pFilter) _pFilter->release(); if (_pFilter) _pFilter->release();
_pFilter = pFilter; _pFilter = pFilter;
if(_pFilter) _pFilter->duplicate(); if (_pFilter) _pFilter->duplicate();
} }

View File

@@ -21,7 +21,7 @@ POrtable COmponents C++ Libraries are:
- Open Source, licensed under the [Boost Software License](https://spdx.org/licenses/BSL-1.0). - Open Source, licensed under the [Boost Software License](https://spdx.org/licenses/BSL-1.0).
---- ----
To start using POCO, see the [Guided Tour](http://pocoproject.org/docs-1.5.3/00100-GuidedTour.html) and [Getting Started](http://pocoproject.org/docs-1.5.3/00200-GettingStarted.html) documents. To start using POCO, see the [Guided Tour](http://pocoproject.org/docs/00100-GuidedTour.html) and [Getting Started](http://pocoproject.org/docs/00200-GettingStarted.html) documents.
---- ----
POCO has an active user and contributing community, please visit our [web site](http://pocoproject.org), [forum](http://pocoproject.org/forum) and [blog](http://pocoproject.org/blog). POCO has an active user and contributing community, please visit our [web site](http://pocoproject.org), [forum](http://pocoproject.org/forum) and [blog](http://pocoproject.org/blog).

View File

@@ -1038,7 +1038,7 @@ XML_GetFeatureList(void);
*/ */
#define XML_MAJOR_VERSION 2 #define XML_MAJOR_VERSION 2
#define XML_MINOR_VERSION 1 #define XML_MINOR_VERSION 1
#define XML_MICRO_VERSION 0 #define XML_MICRO_VERSION 1
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@@ -1685,6 +1685,10 @@ XML_ParseBuffer(XML_Parser parser, int len, int isFinal)
void * XMLCALL void * XMLCALL
XML_GetBuffer(XML_Parser parser, int len) XML_GetBuffer(XML_Parser parser, int len)
{ {
if (len < 0) {
errorCode = XML_ERROR_NO_MEMORY;
return NULL;
}
switch (ps_parsing) { switch (ps_parsing) {
case XML_SUSPENDED: case XML_SUSPENDED:
errorCode = XML_ERROR_SUSPENDED; errorCode = XML_ERROR_SUSPENDED;
@@ -1696,8 +1700,11 @@ XML_GetBuffer(XML_Parser parser, int len)
} }
if (len > bufferLim - bufferEnd) { if (len > bufferLim - bufferEnd) {
/* FIXME avoid integer overflow */
int neededSize = len + (int)(bufferEnd - bufferPtr); int neededSize = len + (int)(bufferEnd - bufferPtr);
if (neededSize < 0) {
errorCode = XML_ERROR_NO_MEMORY;
return NULL;
}
#ifdef XML_CONTEXT_BYTES #ifdef XML_CONTEXT_BYTES
int keep = (int)(bufferPtr - buffer); int keep = (int)(bufferPtr - buffer);
@@ -1726,7 +1733,11 @@ XML_GetBuffer(XML_Parser parser, int len)
bufferSize = INIT_BUFFER_SIZE; bufferSize = INIT_BUFFER_SIZE;
do { do {
bufferSize *= 2; bufferSize *= 2;
} while (bufferSize < neededSize); } while (bufferSize < neededSize && bufferSize > 0);
if (bufferSize <= 0) {
errorCode = XML_ERROR_NO_MEMORY;
return NULL;
}
newBuf = (char *)MALLOC(bufferSize); newBuf = (char *)MALLOC(bufferSize);
if (newBuf == 0) { if (newBuf == 0) {
errorCode = XML_ERROR_NO_MEMORY; errorCode = XML_ERROR_NO_MEMORY;
@@ -2918,6 +2929,8 @@ storeAtts(XML_Parser parser, const ENCODING *enc,
unsigned long uriHash = hash_secret_salt; unsigned long uriHash = hash_secret_salt;
((XML_Char *)s)[-1] = 0; /* clear flag */ ((XML_Char *)s)[-1] = 0; /* clear flag */
id = (ATTRIBUTE_ID *)lookup(parser, &dtd->attributeIds, s, 0); id = (ATTRIBUTE_ID *)lookup(parser, &dtd->attributeIds, s, 0);
if (!id || !id->prefix)
return XML_ERROR_NO_MEMORY;
b = id->prefix->binding; b = id->prefix->binding;
if (!b) if (!b)
return XML_ERROR_UNBOUND_PREFIX; return XML_ERROR_UNBOUND_PREFIX;
@@ -5482,6 +5495,8 @@ getAttributeId(XML_Parser parser, const ENCODING *enc,
return NULL; return NULL;
id->prefix = (PREFIX *)lookup(parser, &dtd->prefixes, poolStart(&dtd->pool), id->prefix = (PREFIX *)lookup(parser, &dtd->prefixes, poolStart(&dtd->pool),
sizeof(PREFIX)); sizeof(PREFIX));
if (!id->prefix)
return NULL;
if (id->prefix->name == poolStart(&dtd->pool)) if (id->prefix->name == poolStart(&dtd->pool))
poolFinish(&dtd->pool); poolFinish(&dtd->pool);
else else