These release notes contain a summary of product changes (new features, enhancements, and bug fixes), late-breaking product issues, and migration guides.
Rogue Wave products may contain undocumented interfaces. These interfaces are not supported for general use and may be changed or removed from release to release.
The version of this document in the product distribution is a snapshot at the time the product distribution was created. Additional information may be added after that time because of issues found during distribution testing or after the product is released. To be sure you have the most up-to-date information, see the version of this document on the Rogue Wave web site: https://help.perforce.com/sourcepro/current/Release_Notes.html.
Third party directory structures have been updated. Your makefile or environment may need to be updated if it leverages third party libraries distributed with SourcePro. (SP-29686, SP-28870)
Third party library selection in RCB has been updated to improve consistency and ease of use. (SP-29725)
Guard against potential unsigned integer wrapping that could result in unexpected behavior. (SP-29641)
Corrected detection of XDR functions and libraries. (SP-29929)
Copy these files:
option Headers
to copy example source code files. (SP-29393)Added rw_forward_list, a replacement for rw_slist, that provides an efficient, forward-only list implementation that preserves iterators. (SP-29051)
Fixed a bug which caused an iterator to be invalidated when erasing an element from a collection. This affected rw_hashmap, rw_hashmultimap, rw_hashmultiset, rw_hashset, RWTPtrHashMap, RWTPtrHashMultiMap, RWTPtrHashMultiSet, RWTPtrHashSet, RWTValHashMap, RWTValHashMultiMap, RWTValHashMultiSet, and RWTValHashSet. (SP-29051)
Fixed a bug which caused the wrong iterator to be returned by rw_hashmultimap::insert(...)
and rw_hashmultiset::insert(...)
. (SP-18960)
Fixed a potential buffer overflow error when constructing or assigning to an RWBasicUString from an RWUChar16 array. (SP-26632)
Support has been added for key insertion order preservation in STL extension hash-based collections, with the addition of new classes rw_orderedhashmap, rw_orderedhashmultimap, rw_orderedhashset, rw_orderedhashmultiset, RWTPtrOrderedHashMap, RWTPtrOrderedHashMultiMap, RWTPtrOrderedHashSet, RWTPtrOrderedHashMultiSet, RWTValOrderedHashMap, RWTValOrderedHashMultiMap, RWTValOrderedHashSet, and RWTValOrderedHashMultiSet. (SP-28727, SP-28646)
round(RWDecimalPortable, ...)
did not preserve the value's sign. (SP-28795)
Added support for the %z
format specifier in RWLocaleSnapshot::asString()
for struct tm
. (SP-15605)
The RWZone parameter to RWDateTime::asString()
was being ignored, causing incorrect output for format specifiers dependent on the zone. (SP-15567)
round(RWDecimalPortable, ...)
incorrectly handled trailing 0s causing some values to round up. (SP-28311)
RW_END_STREAM_CONTENTS
has been split into two macros, RW_END_STREAM_CONTENTS
and RW_END_EXTERNAL_STREAM_CONTENTS
. This provides symmetry with the existing RW_BEGIN_STREAM_CONTENTS
and RW_BEGIN_EXTERNAL_STREAM_CONTENTS
, and allows these macros to diverge in the future. Users are encouraged to update their code to close RW_BEGIN_EXTERNAL_STREAM_CONTENTS
blocks with RW_END_EXTERNAL_STREAM_CONTENTS
instead of RW_END_STREAM_CONTENTS
. (SP-28027)Fixed the way RWDBConnection::executeSql()
handles multiple result sets from queries when executing a stored procedure. (SP-27967)
Updated the MySQL client library used for linking on Unix to libmysqlclient
(SP-28013)
Fixed error handling related to calls to mysql_stmt_store_result
. (SP-27938)
Fixed cleanup of previous result sets before statement execution. (SP-28002)
Implemented the tracing of RWDBStoredProc::drop()
so that SQL is output to the tracer when a stored procedure is dropped. (SP-27400)
Fixed RWDBTable and RWDBStoredProc to search schemas listed in search_path
for unqualified identifiers when querying for object information from the server. (SP-27231)
Fixed RWDBStoredProc to utilize object identifier (OID) when fetching metadata from the server. (SP-27231)
Fixed command-line interface to correctly handle -D
arguments that contain more than one '=' character. (SP-28032)
Fixed command-line interface to correctly handle -D
arguments that contain spaces. (SP-28034)
Improved performance when inserting RWCString, RWDBBlob, RWDate, RWDateTime, and RWTimeTuple values. (SP-27347, SP-27351)
Improved performance when fetching double
values. (SP-27351)
Improved RWDBBulkInserter performance. (SP-28017)
Fixed a performance regression when inserting values. (SP-27357)
Fixed a performance regression when executing SQL that does not contain bound parameters. (SP-27351)
Fixed a performance regression when inserting/fetching date/time values. (SP-27347)
Changed the default binding type for binary collated string columns from RWDBBlob to RWCString. (SP-27969)
Updated MySQL connections to derive their character set from the operating system locale. (SP-27966)
Fixed error handling when retrieving affected row count after a query. (SP-27962)
RWDate is now implemented as a 32-bit integral type regardless of build type or platform. This provides for a consistent size, range of values, and behavior across platforms.
Added a specialization of RWTHash for RWDate. (SP-25757)
Fixed memory allocation strategy in RWOrdered to achieve amortized constant time growth. (SP-24287)
Fixed a bug in RWTime that limited the range of values that could be constructed from a struct tm*
. Note: RWTime is deprecated. RWDateTime should be used instead. (SP-24997)
Fixed a bug in RWTime where time zone information wasn't correctly handled during construction. Note: RWTime is deprecated. RWDateTime should be used instead. (SP-24997)
Fixed bugs in RWTPtrDeque, RWTPtrDlist, RWTPtrHashMap, RWTPtrHashMultiMap, RWTPtrHashMultiSet, RWTPtrHashSet, RWTPtrMap, RWTPtrMultiMap, RWTPtrMultiSet, RWTPtrOrderedVector, RWTPtrSet, RWTPtrSlist, RWTPtrSortedDlist, RWTPtrSortedVector, and RWTPtrVector that prevented fully instantiating on a const
type. (SP-25606, SP-25607, SP-25608, SP-25609, SP-25510, SP-25611, SP-25612)
Updated the apply()
function in RWTPtrSlist and RWTValSlist to be const
correct. (SP-25687)
Fixed a bug in RWDecimalPortable where equal values had different hashes. (SP-25762)
Fixed a performance regression in RWCollectableString and other RWCollectable-derived types in their compareTo()
and isEqual()
functions. See the Migration Guide for additional information on the implications of this change. (SP-25943)
RWURegularExpression::setLocale()
. (SP-27023)Added support for SQL CASE expressions. (SP-8891)
Added a specialization of RWTHash for RWDBDateTime. Note: RWDBDateTime is deprecated. RWDateTime should be used instead. (SP-25758)
Fixed an issue in which nested join expressions were not evaluated in the correct order. (SP-25640)
Fixed an issue where binding an unknown type would result in an application crash. (SP-25748)
Fixed an issue where RWDBDatabase::createProcedure(const RWDBStoredProc&)
did not generate correct SQL. (SP-27009)
SQL_SUCCESS_WITH_INFO
status was returned. (SP-25994)Added support for prepared statements.(SP-8854)
Added support for bulk writing via RWDBBulkInserter. (SP-25674)
Added support for executing stored procedures via RWDBOSql and RWDBStoredProc. (SP-8915)
Fixed an issue where the RWDBResult returned from executing a RWDBBulkInserter resulted in an incorrect value from the rowsAffected()
method . Fixed an issue where RWDBOSql::rowsAffected()
could return incorrect values. (SP-25749)
SQLDescribeParam
was called out of sequence in some scenarios. (SP-26322)SYB_LP64
and SYB_LLP64
on the compilation line. (SP-26137)-brtl
linker flag. (SP-25711)Added support for SQL CROSS JOIN expressions. (SP-24786)
Fixed an issue where outer join escape sequences were being incorrectly applied to join expressions. (SP-25621)
Changed RCB build output result sorting to place any failures or errors at the end of output. (SP-24392)
Added new user defined linker options for Windows that will allow passing begin and end flags to the linker. This is limited to DLL and executable creation. (SP-24878)
Fixed invalid memory read when comparing RWBasicUString against a NULL
terminated RWUChar16 array. (SP-24762)
Fixed a regression that caused RWFile to be opened for exclusive access on Windows. (SP-24705)
Fixed an issue in RWStandardCString / RWStandardWString where inserting the string back into itself could lead to corruption of the string. (SP-25165)
-xO4 -xarch=sse2
instead of -xO1 -xarch=sse3
. (SP-24293)The compilation time of all SourcePro libraries was improved by optimizing string concatenation. (SP-14473)
Single-threaded and Solaris thread builds are no longer supported. All modules are built with the WIN32 thread library on Windows, and the POSIX thread library on all other platforms. (SP-22390)
New classes RWTimeTuple
and RWTimeTupleOffset
have been introduced to support manipulation of date/time information similar to a struct tm
. (SP-20987)
New classes RWTimeTupleFormatter
and RWTimeTupleOffsetFormatter
have been introduced to support converting the new RWTimeTuple
and RWTimeTupleOffset
to string representation. (SP-21619)
rw_slist
has been reimplemented to improve performance. This also improves the performance of RWTPtrSlist
and RWTValSlist
which are implemented in terms of rw_slist
. (SP-20036)
rw_hashmap
, rw_hashmultimap
, rw_hashmultiset
and rw_hashset
have been updated to take advantage of the new rw_slist
implementation. (SP-20036)
RWAnsiLocale
has been updated to no longer make unnecessary copies of std::locale
. (SP-20438)
RWBTreeDictionary
, RWHashDictionary
and RWIdentityDictionary
now implement insert
, which accepts an RWCollectableAssociation
and inserts the associated key and value. (SP-22389)
The performance of entries()
and size()
on all hash-based containers was improved. (SP-21535)
rw_slist::unique
no longer exits abnormally when called on an empty list. (SP-20036)
RWDate(struct tm*)
no longer fails if the struct tm
contains a tm_year
between -1900 and -1801. (SP-21146)
RWDateTime::asRWDate()
no longer fails when creating an RWDate
if the RWDateTime is in the years between 0 and 99. (SP-15538)
RWDateTime::compareTo()
no longer throws an exception if one or both of the arguments represent sentinel values. This change brings the behavior of RWDateTime::compareTo()
into alignment with operator<
and other relational operators. (SP-15540)
RWBasicUString(RWSize_T)
no longer asserts in debug builds when the input parameter is equal to 0 (SP-20849)
RWLocaleSnapshot
was optimized to remove an unnecessary memory allocation. (SP-20437)
RWStandardWString::toAscii()
was optimized to remove an unnecessary memory allocation. (SP-20440)
operator+=
no longer results in a double-delete when used with collections of type RWBTreeDictionary
, RWHashDictionary
and RWIdentityDictionary
. (SP-22389)
operator>>
no longer produces an invalid pointer when extracting objects that inherit from RWCollectable
and another type. (SP-22828)
Fixed memory in use errors in getRWNilCollectable()
and RWBasicUString::getNullDeallocator()
by switching from dynamic to static storage. (SP-20478)
RWLocaleSnapshot::asString
no longer generates invalid locale-dependent string representations (%x
, %c
) on Windows when the underlying locale-dependent functions use a non-Gregorian calendar. (SP-22763)
RWLocaleSnapshot::asString
now generates locale-dependent time representations (%X
) using correct AM/PM specifiers and with an appropriate 12-hour or 24-hour clock. (SP-23017)
RWSymbol
. (SP-20460)rw/functor/fwd.h
and rw/functor/list/fwd.h
was resolved. (SP-18506)RWTHash
has been specialized for RWDBBlob
, RWDBDuration
, RWDBMBString
and RWDBValue
in order to simplify the use of those classes in hash-based containers. (SP-21288)
RWDBValue::hash()
has been updated to leverage RWTHash
for the contained type in order to provide a better hash distribution. (SP-21288)
RWDBValue
has been updated to store instances of RWTimeTuple
and RWTimeTupleOffset
. (SP-20284)
RWTimeTuple
support added to RWDBTBuffer
, RWDBBuffer
, RWDBTracer
, RWDBOSql
, RWDBBulkInserter
, and RWDBBulkReader
. (SP-21208)
RWDBValue::compareTo()
now returns the correct result when comparing RWDBValue::UString
values. (SP-14593)
RWDBValue::asBlob()
now returns consistent results for RWDBValue::Date
and RWDBValue::DateTime
types. (SP-21306)
RWDBDuration::asString()
now adds 's' after the unit for plural negative values. (SP-21292)
MYSQL_TYPE_TINY
data is now correctly treated as an integral type. (SP-22068)RWDBOCISystemHandle
now properly cleans up connection when an exception is thrown from a connection callback. (SP-20467)All memory allocations in the Linear Algebra Module were updated to align memory on 16-byte boundaries when linked against the Sun Performance Library on Solaris x86. (SP-17965)
Fixed memory in use errors when building exception strings by switching from dynamic to static storage. (SP-20471)
Fixed memory in use errors in an internal class used by RWDecimal
by switching from dynamic to static storage. (SP-20473)
Fixed memory in use error in format2
example by switching from dynamic to local storage. (SP-20473)
RWSecureSocketPackageInit::seedRNGFromFile()
and RWSecureSocketContext::loadVerifyLocations()
to avoid an invalid memory access in stat()
on Windows. (SP-20476)entries()
and size()
on all hash-based containers was improved. (SP-21535)upper_bound()
, lower_bound()
and equal_range()
now return end()
if the key is not found for rw_hashmap
, rw_hashmultimap
, rw_hashmultiset
, and rw_hashset
. (SP-18968)RW_DECLARE_STREAMABLE_COLLECTABLE_MAP
has been updated to avoid a link error if it is used for the same type in multiple translation units. (SP-20412)position()
API for returning the current insertion position was added for RWDBStoredProc
, RWDBInserter
, RWDBBulkInserter
, RWDBReader
, RWDBBulkReader
, and RWDBCursor
. (SP-19269)
RWDBStoredProc::execute(const RWDBConnection&)
will now use the passed in RWDBConnection
throughout its call stack. (SP-19495)
RWDBStoredProc
now correctly recognizes Oracle stored procedure with no parameters. (SP-19494)rw_hashmultimap::operator==
was optimized. (SP-14573)
The performance of all hash-based containers was improved. (SP-18521)
rw_hashset::insert
is now overloaded to support rvalue-references. (SP-18962)
A header guard conflict between rw/rwstring.h
and rw/tools/string.h
was resolved. (SP-18456)
rw_hashset::insert()
and rw_hashmap::insert()
now return an iterator to the existing element if one was found. (SP-18961)
rw_hashmap::key_equal()
and rw_hashmap::key_hash()
now return copies of the passed in equality and hash objects. (SP-19110)
RWTIsConvertible now relies on std::is_convertible if available instead of std::tr1::is_convertible. (SP-19479)
RWDBTable::isView()
now returns true
when describing a fully qualified name. (SP-16206)
RWDBTable::describe()
now supersedes RWDBTable::fetchSchema()
to provide finer-grain control over retrieved metadata. (SP-18626)
RWHttpSocketClient
allows specifying a callback function to allow customizing how the underlying socket connection is established. (SP-19193)RWHttpsSocketClient
allows specifying a callback function to allow customizing how the underlying socket connection is established. (SP-19193)All SourcePro modules now conform to the latest security standards CWE, CERT, OWASP, DISA STIG, and MISRA, and were tested with Klocwork Insight 10 analysis rules related to these standards.
Deprecated APIs can be compiled out of the library using RW_DISABLE_DEPRECATED
Remove unnecessary memset
calls (SP-14963)
Update version numbers of all components to match SourcePro version. (SP-15005)
Undeprecate RWDate and RWCollectableDate. (SP-13885)
Template containers now allow construction and assignment from their underlying std
container type. (SP-14517)
Add a RWTValSortedVector::removeAt
implementation for consistency with other vector and list classes. (SP-14521)
Add capacity()
function to vector container types. (SP-14530)
Add C++11 style data()
functions to all vector types containers. (SP-14531)
Expand RWTValVector/RWTPtrVector interfaces to match RWTValOrderedVector API (where appropriate). (SP-14534)
occurrencesOf
are now const
for all container types. (SP-14562)
Update rwRestoreGuts()
of RWTPtrVector to be exception-safe (like RWTValVector) and enhance both rwSaveGuts()
and rwRestoreGuts()
to avoid unnecessary bounds checking. (SP-14894)
RWDateTime has multiple representations for the same date time. (SP-8203)
RWLocaleSnapshot alters the global locale, making it thread hostile. (SP-11441)
RWDateTime relational operators throw exceptions, violate strict ordering. (SP-13194)
RWTPtrSortedVector is no longer streamable. (SP-14234)
Accessing localtime_r
and RWZone::os
concurrently results in segmentation fault. (SP-14338)
Cannot instantiate rw_hashmap
with hash object with no default constructor. (SP-14490)
Hash collections can be created with zero buckets. (SP-14536)
Undefined behavior when calling data()
on empty vector. (SP-14540)
Set operations are incorrect when applied to self. (SP-14541)
HashMultiSet
containers do not properly handle intersection with duplicates. (SP-14542)
Self assignment from underlying container is broken for many containers. (SP-14543)
Removing the last element from an empty container does not behave like removing the first element from an empty container. (SP-14547)
List iterators misbehave when incrementing defaulted iterator by 0, and are inefficient when incrementing past the end. (SP-14549)
Unnecessary dependency on operator>
. (SP-14556)
Unnecessary dependency on default constructor. (SP-14558)
RWTPtrSorted*::removeAll
is broken for some scenarios. (SP-14559)
RWFile::Error
in collectableio.cpp
will not detect short reads. (SP-14603)
rw_hashmultiset
dereferences null pointer when calling upper_bound()
on empty set. (SP-14706)
snappy.dll
has a dependency on an incorrect Visual C++ library. (SP-14819)
RWTRegex<char> crashes. (SP-14831)
RWTPtrSortedVector::contains()
and RWTPtrSortedVector::index()
not working. (SP-15395)
rw/tools/ansilocale.h
doesn't include necessary header file. (SP-15601)
strXForm(const RWWString&)
calls wcsxfrm
in potentially unsafe way. (SP-17172)
Multiple definitions of rwtMakeRunnableCallback
when including rw/thr/thrfunc.h
in multiple translation units. (SP-14965)
RWThreadFunction crashes on rwSleep()
method. (SP-15889)
Typedefs RWBasicUString::iterator
and reverse_iterator
can now be used to modify the contained data. (SP-14644)
Remove code in RWUConverterBase that managed buffers (as a workaround for ICC 7.1) to allow the ICU to manage memory used in converter objects. (SP-14801)
RWUFromUnicodeConverter::convert()
won't flush if source is null. (SP-7312)
RWTTransformInputStreamImp::read(element_type*, RWSize)
returns incorrect value. (SP-17635)Provide an option to avoid storing user's database password in memory. (SP-8874)
Using an invalid RWDBConnection causes seg fault/crash due to NULL
pointer dereferencing. (SP-12630)
RWDBDatabase::storedProc()
methods taking schema should not use a connection. (SP-14445)
RWDBOCISystemHandle::describeName
doesn't assert if passed an empty string. (SP-14758)RWSockAddrFactory::instance()
has an unsafe race condition. (SP-17128)Improve the efficiency of RWCString allocation in RWDirEntry::parse
. (SP-14803)
RWHttpClient::isConnected()
does not behave correctly after connection closed. (SP-17505)
RWArrayView::boundsCheck(int, int, int)
not thread-safe. (SP-14805)RWDecimal<RWMP1Int> 0 - 0 returns a -0 value. (SP-14699)
Literal string assignment in RWDecimalInit causes access violation in dynamic loading applications. (SP-14929)
Change in behavior in RWDecimal<T>.from(double)
. (SP-16020)
Support for warning level 3 (/W3
on Windows, -Wall
on Linux) in Intel compiler builds. (SP-9596)
Enabling of C++11 features on compilers that support them, including Microsoft Visual Studio 2010 and 2012, GCC 4.3 and 4.4, and HP aCC/C++ 6.27. (SP-13769)
Windows static builds unnecessarily use /GA
compile flag. (SP-14455)
Virtual Stream Iterators The new classes RWvistreamIterator<T> and RWvostreamIterator<T> give iterator semantics to the Rogue Wave virtual stream classes. With these new classes you can insert or extract sequences of objects, which simplifies your code. See the SourcePro C++ API Reference Guide for information on these classes.
More Efficient Stream Size Data A space optimization has been employed when serializing object sizes on a binary and endian stream. This can reduce the amount of data written to the stream for many use cases.
Improved Atomics Atomics in SourcePro C++ now uses C++11-style atomic types. These types allow for efficient and thread-safe atomic operations (increment, decrement, swap, compare-and-swap, etc.) on integral and pointer types.
Performance improvements previously applied to RWCopyOnWriteCString added to RWCopyOnWriteWString. (SP-9562)
Container classes consistently support the iterator
and const_iterator
typedefs. (SP-9563)
Move construction and move assignment are now supported for all templatized container types that are based on C++ Standard Library types (SP-13193)
Format character for milliseconds added to RWDateTime. (SP-13594)
Where possible, explicit locking has been replaced with atomic operations to reduce the cost of contention. (SP-13668)
Parsing strings with the RWDateTime::iso8601
format now uses the epoch when filling in values for truncated iso8601 strings, ensuring that parsing the same string results in the same value regardless of the time of day / date that the parsing occurs. (SP-13686)
Several new methods added to support serialization of signed char
data. The new methods must be implemented by classes inheriting from RWvostream and RWvistream. (SP-13899)
Added insertion and extraction operators for bool
to virtual streams. (SP-13983)
Tools container hierarchy flattened so that each class is implemented independently, and each class reviewed to ensure the use of appropriate algorithms. (SP-13999)
Typedefs in all templatized containers made consistent with their associated C++ Standard Library container types. Member functions cbegin()
, cend()
, rbegin()
, rend()
, crbegin()
, and crend()
added to all applicable templatized containers. (SP-14058)
Iterators for templatized containers made more consistent with C++ Standard Library iterators, including support for range-based construction, assign, and insert, as well as iterator support for insert and erase. (SP-14059)
RWDateTime parses non-conforming ISO-8601 representations. (SP-9197)
Many RWCollection derived classes return void from their assignment operators instead of a reference to self. (SP-10186)
RWTBitVec<N>::operator[]
does not throw an exception on out of bounds access as documented. (SP-12927)
RWTBitVec<N>::operator[]
and operator()
should have const
overloads. (SP-12928)
Intrusive list classes do not correctly implement copy construction or copy assignment. (SP-13028)
RWDateTime ISO-8601 constructor does not handle midnight represented as 24:00:00
. (SP-13207)
RWDecimalPortable::asString
will crash if there are more than 256 digits. (SP-13571)
RWDecimalPortable can't parse strings longer than 128 characters, with parens. (SP-13572)
RWDateTime asserts when parsing dates on last day of leap year. (SP-13628)
RWDateTime asserts with some invalid input strings. (SP-13633)
RWDateTime artificially limits the maximum year in an ISO-8601 string to 4096. (SP-13673)
RWLocaleSnapshot::asString
asserts with 's' as the format character on Windows. (SP-13709)
RWbostream::putString
and RWbistream::getString
do not call virtual functions, preventing polymorphic behavior in derived classes. (SP-13804)
RWTPtrSortedDlist(const container_type&)
may result in an unsorted list. (SP-13850)
Serializing RW_LLONG_MIN
to RWeostream causes buffer overflow. (SP-13896)
Portable Streams do not produce portable data when serializing '\a' and '\v'. (SP-13979)
XDR streams have problems with large integer values. (SP-14025)
RWTValOrderedVector<bool> and RWTValSortedVector<bool> have incomplete/incorrect interface. (SP-14039)
RWios::fail()
does not indicate error if badbit is set. (SP-14135)
nilStoreSize()
does not return the number of bytes needed for saveGuts(RWFile&)
. (SP-14384)
Sorted containers do not support merge/insert of self. (SP-14538)
Sorted containers with sufficient capacity should not resize on merge/insert. (SP-14539)
insertAndLocate()
invokes undefined behavior. (SP-14553)
operator==
for templatized map containers inconsistent. (SP-14569)
Improved Functors SourcePro C++ now uses C++11-style functors, which significantly simplifies the functor API. The previous functor API is still supported, though deprecated.
The new functor API supports:
Wrapping free functions, member functions, function objects, and C++11 lambda expressions.
Up to ten function arguments, and positional, repeatable placeholders.
Code refactoring allows RWTPointer::validate()
to now be inlined. (SP-13998)
Functor list behavior incorrect when exceptions thrown. (SP-9298)
RWServerPool does not prevent new work from being enqueued when canceled. (SP-13372)
rw/functor/list/RWTCallbackList*
disables optimizations for the translation unit on Intel C++ 13. (SP-14362)
RWTThreadLocal cannot be templatized on classes with private default constructors, even if declared as a friend. (SP-13632)
Metadata Caching New classes support a cache manager that can be attached to an RWDBDatabase instance, improving performance by reducing the amount of metadata that must be obtained through database queries. Types of cacheable metadata include table schemas, table constraints, and stored procedure parameters. Rogue Wave provides an in-memory implementation of a cache manager so you can easily get started with or experiment with metadata caching, but also allows for you to write your own metadata caching implementation.
Improved and Expanded API for Table Constraints A simplified API improves the existing support for primary key and foreign key constraints, and expands support to include check constraints, unique constraints, identify columns, and default column values. The new API supports creating new tables with constraints, easily obtaining constraint information from a table, and adding and dropping constraints on an existing table. The new metadata caching feature is aware of and supports both the new and existing constraint support.
Deprecated class RWDBDateTime removed from public API wherever possible. (SP-13658)
All public classes in SourcePro DB that derive from RWCollectable have been updated to fully implement the RWCollectable interface, including support for persistence. (SP-13803)
RWDBSelector::clear()
doesn't clear the distinct property. (SP-4500, SCOPUS# 8509)
compareTo(const RWCollectable*)
methods in SP DB dereference the passed in pointer without checking if it is null. (SP-13846)
Accessing RWDBDatabase instance from various areas of SourcePro DB affects performance. (SP-13978)
RWDBTable::exists
returns false for a result table whether or not a reader was obtained. (SP-14045)
RWDBSchema does not implement COW correctly for some methods. (SP-14128)
Added support for RWDBTable::dropColumn()
in DB2 CLI 9.x and later. (SP-8902)
DB2 Access Module when fetching table schema uses unqualified table name if using qualified table name fails. (SP-9467)
MSSQL, ODBC, and DB2 uses maxStringSize()
and maxBlobSize()
incorrectly. (SP-9526)
String buffers populated by vendor functions not always null-terminated. (SP-12156)
Access violation when allocating DB2 environment handle. (SP-13737)
RWDBTable::exists(true)
if called on a non-existing table will have its status set to not OK. Subsequent calls to RWDBTable::exists(true)
return false without hitting the database. (SP-13887)
MSSQL, ODBC, and DB2 uses maxStringSize()
and maxBlobSize()
incorrectly. (SP-9526)
String buffers populated by vendor functions not always null-terminated. (SP-12156)
Memory leak when re-executing a DML object with MySQL. (SP-13614)
MySQL Access Module build fails searching for MySQL vendor library. (SP-14401)
MSSQL, ODBC, and DB2 uses maxStringSize()
and maxBlobSize()
incorrectly. (SP-9526)
String buffers populated by vendor functions not always null-terminated. (SP-12156)
Table schemas can now be retrieved for Sybase non-shareable temporary tables created in user-specified temporary databases. (SP-10156)
RWDBBulkInserter fails to insert long long
data in Sybase in column of type NUMERIC
. (SP-14016)
RWDBCursor::operator<<
does not check validity before creating buffers. (SP-14443)
Performance degradation when reading long and double values in Sybase. (SP-13415)
Support for bitwise operations on RWSocketAttribute::Attribute
. (SP-13604)
Unexpected/undefined behavior when rwSocketSelect
and rwSecureSocketSelect
called with timeouts larger than LONG_MAX
. (SP-13450)
RWInet6Host::getAddresses()
returns the same address multiple times. (SP-13852)
RWFtpAgent fails to use correct address when forming an active connection on multihomed systems. (SP-13575)
Infinite loop trying to select an accessible port when using a passive connection. (SP-14143)
FTPS Package This new package provides FTP support over secure connections.
Support added for constructing an initialized, unconnected socket. (SP-13539)
Support for bitwise operations on RWSecureSocketAttribute::Attribute
. (SP-13604)
Unexpected/undefined behavior when rwSocketSelect
and rwSecureSocketSelect
called with timeouts larger than LONG_MAX
. (SP-13450)
rwSecureSocketSelect()
does not indicate the RWSecureSocket is readable if part of the data has already been read. (SP-13550)
The libraries blalib
and lapfor
, previously required by CLAPACK, MKL, and SPL, verified to be no longer required and so removed from the product. (SP-13526)
std::complex<double> should be used instead of DComplex. (SP-13417)
cbegin()
, cend()
, rbegin()
, rend()
, crbegin()
, and crend()
added to RWGenMat, RWMathArray, and RWMathVec. (SP-14069)RWDecimal<M>::roundDecimal
doesn't handle rounding to the left of the decimal point. (SP-13680)DB2 hangs intermittently on Windows Server 2008 and Vista. (SP-13271)
Uninitialized memory read related to memcmp
and strlen
usage in DB2 Access Module. (SP-13335)
Access violation if an error occurs when allocating an env handle. (SP-13737)
RWDBBuffer::value
. (SP-13337)RWDBBulkInserter fails to insert long long
data in Sybase in column of type NUMERIC
. (SP-14016)
Invalid/Uninitialized memory reads in Sybase Access Module. (SP-14277)
Removed code guarded by deprecated macro RW_NO_STL
. (SP-10472)
Performance enhancement to update SourcePro compiler optimization flag usage for all supported platforms. (SP-12484)
Removed deprecated macros RWTOOLS4_COMPATIBLE
and RWTOOLS5_COMPATIBLE
. (SP-10510)
Eliminate include order dependencies in SourcePro C++. (SP-12786)
Rvalue Reference and Move Semantics Move constructors and assignment operators have been added to several classes in Tools to support the new rvalue reference and move semantics feature of C++ 11. Move semantics can improve performance by avoiding costly deep copies of rvalue values. (SP-12699)
Scope Guard Classes To support better resource control, the Tools Module now includes scope guard classes that implement the C++ idiom “Resource Acquisition Is Initialization” (RAII). These classes provide a simple mechanism to allow an object to take ownership of a resource and to release that resource, thus avoiding potentially unsafe or verbose error handing code. (SP-11009)
Compressed IO Streams Tools now provides a compression API for use with streams. New class RWCompressedStreamBuffer derives from std::streambuf, and provides a mechanism to compress data that is serialized to an std::ostream or deserialized from an std::istream. (SP-10959)
RWCString Improved Performance and Flexibility The Tools Module now provides two implementations of RWCString and RWWString. While these different implementations have the same basic API, each features performance characteristics that are tuned to particular usage scenarios. When you build SourcePro using RCB, you must select the implementation that best suits your development situation. See Section 4.11 “Performance Considerations” in the Essential Tools Module User’s Guide for details. (SP-12524)
RWZone updates:
Removed the RWZone implementation introduced in SourcePro 10. (SP-12953)
Enhanced the pre-SourcePro 10 RWZone API (the current API) to support complex transition rules such as those represented in the Olsen Time Zone Database. (SP-12954)
RWZone::os()
is now the default implementation for RWZone::local()
. (SP-12955)
Removed legacy generic containers. (SP-13218)
RWDecimalPortable now handles values for Infinity
, sNaN
, and NaN
. (SP-12755)
Refactored method RWWString::multiByteToWide()
for a more efficient implementation. (SP-12737)
Updated RWFile::Read()
to return the number of elements stored. (SP-9560)
An incorrect result is returned when searching for a non-existent element in RWTValSortedDlist<T>. (SP-13182)
An infinite loop occurs when merging RWTValSortedDlist<T> with self. (SP-13181)
RWTPtrVector inconsistently and unnecessarily allocates zero byte arrays. (SP-13030)
RWWTokenizer maintains a non-const
pointer to an internal string which can result in undefined behavior. (SP-13165)
Valgrind UMR: A conditional jump or move depends on uninitialized value(s) in filemanager/btreeondisk. (SP-13319)
Fix free memory read in RWTValHashMultiSet<T>::intersection()
. (SP-13303)
Possible data truncation in RWBitVec::resize()
and RWbistream::getString()
. (SP-12721)
Remove dead code from file rw/rwtsd.h
. (SP-12787)
RWCConstSubString does not define overloads for operator[](long long)
and operator[](unsigned long long)
. (SP-12812)
Valgrind UMR: A conditional jump or move depends on uninitialized value(s) in estream. (SP-13327)
RWCString::compareTo()
and RWWString::compareTo()
methods have inconsistent arguments with their related variants in other SourcePro Core Essential Tools classes. (SP-6069)
RWCString::hash()
member function returns unsigned long
but is documented to return unsigned
. (SP-9171)
RWCString::operator[](long long)
is incorrect for values greater than std::numeric_limits<std::size_t>::max()
. (SP-12701)
RWCString::operator==()
should be a global function instead of declared as member function. (SP-12681)
RWCSubString and RWCConstSubString do not bounds check substrings correctly. (SP-12814)
RWDateTime::asString()
formats some ISO-8601 strings incorrectly for time zones with sub-minute offsets. (SP-8274)
RWDateTime::asString(RWDateTime::iso8601)
does not correctly handle time zones with second offsets. (SP-13192)
RWTBitVec<N>::operator<()
doesn't behave correctly if N
is greater than 8. (SP-11491)
RWWString global operator<<(std::wostream& os, const RWWString& str)
is used before declared. (SP-12785)
RWxmsg assignment behavior is not consistent with copy construction. (SP-10202)
RWxmsg constructor does not behave as expected. (SP-10176)
Purify UMR: Uninitialized memory read occurs in RWRegexAlternator::addBetaState()
. (SP-13306)
Purify UMR: Uninitialized memory read occurs when calling memcmp
. (SP-13312)
Purify MLK: Memory leak in RW[e|b][i|o]stream. (SP-13384)
RWObjectInputStream::getString(std::string&)
does not handle embedded nulls. (SP-12767)
RWSymbol::getSeqNum()
is not thread-safe. (SP-12926)
Methods in RWTCountedPointer
and RWTPointer
are now inline. (SP-8731)
The RWTSingleton<T> default constructor now has protected access. (SP-10390)
RWBarrier does not guarantee that a thread will wait. (SP-12671)
RWTThreadLocal cleanup is executed before RWThread is completely destroyed. (SP-12573)
Data Callback Classes DB Interface Module’s Open SQL API now includes support for data callback methods that facilitate handling data in pieces. Data callbacks are useful for very large data that may not fit in memory for a single database call. A custom callback class can be invoked repeatedly as needed during SQL statement execution until all the data is fetched from or sent to the database. (SP-12950)
Added support for saving a RWDateTime into a database in any time zone. (SP-8846)
Updated RWDBStoredProc to stop syncing input parameters when fetching data, in order to increase performance. (SP-12347)
Performance enhancement while converting user-supplied data to database vendor bound buffers and vice versa. (SP-8841)
Calling RWDBTable::fetchSchema()
on a table with an unsupported datatype causes the RWDBConnection to become invalid. (SP-12753)
Multithread lifetime issue occurs when destroying RWDBInserter instances that were used with asynchronous connections. (SP-12817)
RWDBResult::rowsAffected()
returns previous execution's value when current execution fails. (SP-12688)
RWDBValue::asString()
long double decimal precision values are not observed on different operating systems. (SP-9473)
Remove deprecated function RWDBConnection::autoCommit()
. (SP-6728)
Fix multithread race conditions in SourcePro DB Interface Module, MS-SQL Access Module, ODBC Access Module and DB2 Access Module. (SP-12987)
Added support for DB2 datatype DECFLOAT
. (SP-10155)
Updated implementations to use 64-bit specific ODBC signatures. (SP-11607)
Update DB2 Access Module error handler code to check for additional error codes. (SP-13234)
Multithreading race condition in RWDBManagerProxy can cause hangs during connection initialization. (SP-12511)
Add RWBasicUString support (and fix RWWString support). (SP-13256)
Updated implementations to use 64-bit specific ODBC signatures. (SP-11607)
Updated implementations to use 64-bit specific ODBC signatures. (SP-11607)
RWDBStoredProc with output parameters of type varchar(max)
and varbinary(max)
fails to return the correct value. (SP-10286)
RWDBMySqlLibDatabaseImp::dbTables()
uses incorrect type of deallocator for RWDBWrapper. (SP-12197)Added functionality to make use of Oracle prefetching of LOB Data capabilities. (SP-8893)
DateTime and LOB adapters now use OCIArrayDescriptorAlloc()
to increase adapter performance. (SP-8917)
Silenced HP-UX aC++ compiler warning in rwocitypes.cpp
. (SP-12579)
RWDBInserter::asString()
yields a different result before and after RWDBInserter::execute()
. (SP-6395)
RWDBStoredProc with a return value of type LONG
clears pending result data on a call to RWDBStoredProc::returnValue()
. (SP-3590)
Added support for default value bulk insertion. (SP-9582)
Added support for read-only scrollable cursors. (SP-8871)
Not all errors from Sybase API calls are reported to the user via the error handler. (SP-12389)
Sybase Access Module will assert when the same RWDBOSql instance is re-used for statement execution. (SP-12013)
Purify UMR in function RWDBSybCtLibUtilities::serverVersion
. (SP-13344)
Purify UMR in function RWDBSybCtLibDatabaseImp::cleanUp
. (SP-13345)
Added support to RWFtpClient for users without passwords. (SP-4817)
Made the RWSecureSocketListener interface consistent with that of RWSocketListener. (SP-12607)
Including winsock.h
or winsock2.h
before rw/network/pkgdefs.h
causes a compiler error. (SP-10241)
rwSocketSelect
throws an RWNetSelectError if the vector of RWSocketAttribute instances has more than FD_SETSIZE
unique sockets using the same attribute. (SP-9366)
rwSocketSelect
doesn't check for overflow when determining the timeout. (SP-9352)
Suspicious dereference of pointer occurs in RWInetHost.cpp
. (SP-8370)
The copy and assignment operators of RWPortalImp are not hidden and could be used in a derived class. (SP-8386)
Requests issued through RWHttpAgent do not use timeout when waiting to receive data. (SP-12605)
RWHttpPortalImp::getChunkSize()
function should return size_t
instead of int
. (SP-9357)
RWHttpSocketClient incorrectly treats simultaneously reading/writing to a SOCK_STREAM
socket in full-duplex mode as an error state. (SP-13032)
RWHttpSocketClientImp::isConnected_()
and RWHttpSecureSocketClientImp::isConnected_()
have a race condition. (SP-12582)
RWMimeUtils::getUniqueBoundary()
function uses incorrect format specifier. (SP-9353)
Connections using RWHttpAgent are not reused. (SP-13178)
Refactored RWSecureSocket so that it no longer has numerous redundant calls to validate the current context. (SP-6905)
RWSecureSocketListener interface is now consistent with that of RWSocketListener. (SP-12607)
Multithread deadlock is possible in RWSecureSocketPackageInit when multiple sockets are being initialized. (SP-12964)
RWSecureSocket::connect()
has a race condition on rebind. (SP-10244)
Remove the RWSocket::shutdown()
call from RWSecureSocket::shutdown()
. (SP-12354)
rwSecureSocketSelect
incorrectly rounds timeout values down to nearest whole second. (SP-10251)
rwSecureSocketSelect
needs to have the same behavior as rwSocketSelect
. (SP-10245)
Memory leak in RWBRNGeneratorBase::scanFrom()
and RWBRNGeneratorBase::restoreFrom()
methods. (SP-9382)
RWMathVecConstIterator::operator-=()
does not compile. (SP-13381)
Fix problem with default constructed RWTRegexResult to avoid possible out of bounds error. (SP-10170)
Enhanced RWDateTime::asString(..)
to allow different representations of midnight. (SP-8755)
isNumber()
now returns false when RWDecimal<M> parses a string of whitespace. (SP-9404)
readme.txt
file in the examples directory.Performance improvement to RWMathArray<>::resize(.., ROW_MAJOR)
.
isNumber()
now returns false when RWDecimal<M> parses a string of whitespace. (SP-9404)
isNumber()
now returns false for an RWDecimal<M> constructed with an empty string or a string of whitespace.Performance enhancement when producing SQL statements in multithreaded builds. (SP-10325)
Fixed error in RWDBDateTime when constructed from an RWTime during a daylight savings transition. (SP-12207)
RWDBDB2CLILibEnvironmentHandle::timeout(SQLUINTEGER)
setting now affects all open connections on the next SQL statement execution. (SP-9484)
Performance enhancement by improving internal memory usage. (SP-10336)
RWDBMsSqlLibEnvironmentHandle::timeout(SQLUINTEGER)
setting now affects all open connections on the next SQL statement execution. (SP-9484)
Performance enhancement by improving internal memory usage. (SP-10327, SP-10336)
Update setting of connection and statement attributes. (SP-9437)
RWDBODBCLibEnvironmentHandle::timeout(SQLUINTEGER)
setting now affects all open connections on the next SQL statement execution. (SP-9483)
Performance enhancement by improving internal memory usage. (SP-10336)
Performance enhancement by improving internal memory usage. (SP-10336)
Fix a data loss/corruption problem when reading multibyte characters from a CLOB
column. (SP-10317)
To improve performance, queries using RWDateTime in the where clause use a literal instead of a placeholder. A placeholder is used when the where clause has an RWDBBoundExpr with an RWDateTime value. (SP-8672)
For 64-bit builds on Windows platforms, the macro SYB_LLP64
is defined instead of SYB_LP64
. (SP-10305)
Improved internal memory usage. (SP-10302)
CLOB
column crashes with signal 10. (SPDB-4949)Improved atomic ops.
Fix initialization race condition with static data in bustring.
Fix and improve RWDateTime class.
Fix and improve RWFile class.
Support linker scoping for the Sun ONE Studio compiler.
(trace) Fix definition of trace macros.
(sync) Fix RWReadersWriterLock's destructor.
(pointer) Change RWTCountingBody to use atomic reference counting.
(thread) Add RWThreadManager::setShutdownEnabled
to allow the user the ability to turn off automatic thread shutdown.
(thread) Fix RWTThreadLocal::setValue
to make sure the data is safely deleted in case something unexpected occurs.
Update rwSocketSelect()
on Windows platforms. We now more accurately emulate the behavior of ::select
on UNIX platforms.
Re-implemented portions of RWBufferedSendPortal and RWBufferedRecvPortal to address some inefficiencies in the previous implementation.
Support for delimited table names.
Support for inserting xml data greater than 4000 bytes into Oracle XMLTYPE
column.
Ability to change password in RWDBDatabase without having to recreate the RWDBDatabase object.
Support for creating columns with Oracle data types BINARY_FLOAT
and BINARY_DOUBLE
.
An error results when binding an RWDBBoundExpr for an input parameter of a Sybase stored procedure. (SPDB-4348)
RWDBReader reads incorrect values if reading a table is skipped from an execution producing multiple result sets. (SPDB-4375)
Throwing an exception from the error handler while using an RWDBBulkInserter results in the connection being in an incorrect state. (SPDB-4563)
A negative value passed to a numeric type parameter of a stored procedure using RWDBStoredProc becomes positive. (SPDB-4613)
An Assertion failure results when printing RWDBSelector's WHERE
clause which has an RWDBBoundExpr. (SPDB-3651)
RWDBTracer outputs values for stored procedure parameters not bound with any value. (SPDB-4230)
RWDBDatabase uses rand()
and srand()
on Windows and statically linked Unix builds affecting random number generation use by user applications. (SPDB-4513)
Missing explicit destructor calls in classes RWDBCTypeStockMemoryManager<RWDBDateTime> and RWDBCTypeStockMemoryManager<RWDate>. (SPDB-4654)
RWDBPhrasebook for DB2 CLI Access Module does not list the correct DB2 types used. (SPDB-4350)
RWDBReader reads incorrect values if reading a table is skipped from an execution producing multiple result sets. (SPDB-4375)
Inefficient use of memory while fetching data of VARCHAR
type. (SPDB-4)
Performance enhancement for RWDBStoredProc. (SPDB-16)
RWDBReader reads incorrect values if reading a table is skipped from an execution producing multiple result sets. (SPDB-4375)
Add support for creating columns with Oracle data types BINARY_FLOAT
and BINARY_DOUBLE
. (SPDB-9)
Add support for inserting xml data greater than 4000 bytes into Oracle XMLTYPE
column. (SPDB-10)
An Oracle procedure created with compilation errors that later becomes runnable cannot be executed. (SPDB-20)
An error results when binding an RWDBBoundExpr for an input parameter of a Sybase stored procedure. (SPDB-4348)
RWDBReader reads incorrect values if reading a table is skipped from an execution producing multiple result sets. (SPDB-4375)
Throwing an exception from the error handler while using an RWDBBulkInserter results in the connection being in an incorrect state. (SPDB-4564)
A negative value passed to a numeric type parameter of a stored procedure using RWDBStoredProc becomes positive. (SPDB-4613)
RWDecimal::convertToString
fails when global locale is RWAnsiLocale. (QA# 31714)RWDBTracer::BoundBuffers
is on. (QA# 32222)Error Code returns RWDBStatus::vendorLib
and not RWDBStatus::ok
when "sticky binds" error is encountered. (QA# 32012)
Sybase CT lib 12.5 client and Sybase ASE 15 compatibility. (QA# 32195)
Addition of zoneinfo database functionality to RWZone (new RWZone class is source incompatible to old one).
Addition of RWOnce class as a wrapper for POSIX pthread_once
.
Enhanced RWClockTimer for microseconds accuracy.
Code consolidation and cleanup: removal of obsolete compiler tests, macros names, etc.
Separated tutorial examples from examples detailed in manual.
Fixed performance issue in mutex initialization.
Fixed compile using math modules result in warnings on windows. (QA# 31490)
Fixed support long double
type for RW_abs()
. (QA# 31716)
Support for derived tables. Class RWDBTable now represents derived tables in addition to the database, memory and result tables.
Support for correlated sub-queries in RWDBUpdater and RWDBDeleter.
Configurable RWZone use for DateTime
data sent and retrieved from databases.
Ability to manipulate tables in RWDBSelector's implicitly generated FROM
clause. Ability to mark tables as extern for correlated sub-queries.
Configurable result set cache.
Support for query timeout in DB2, Informix and ODBC Access Modules.
Support for thread ids in RWDBTracer.
Support for quotes in table names in MSSQL, ODBC, Informix and DB2 Access Modules.
Addition to RWDBValue API to provide type as string.
MSSQL and ODBC - limitation to column name length. (QA# 4453)
RWDBBoundExpr constructor parameter. (QA# 14349)
Can't create RWDBBulkReader from a result table. (QA# 16644)
Inconsistency in RWDBValue copy constructor for NULL
strings. (QA# 24493)
Nested select functionality in the RWDBSelector class. (QA# 27959)
Provide a way in RWDBSelector to combine implicitly generated and explicitly supplied FROM
lists. (QA# 28002)
Dynamic builds with RW stdlib failing on AIX 5L & 4.3 on all access modules. (QA# 28146)
Make RWDBTracer record thread id's. (QA# 28146)
RWDBValue::asDecimal
may cause loss of precision when has type double
data. (QA# 29379)
Saving a DateTime
into database as GMT or UTC. (QA# 30571)
RWDBValue to return ValueType
as a String indicating the type. (QA# 30597)
RWDBTracer displays unexecuted rows in cached RWDBTable::inserter(int)
. (QA# 30777)
Inequality operator for RWDBSchema
. (QA# 30988)
__int64
support with MSVC6.0. (QA# 31281)
Error inserting into informix data type CHAR(n)
where n > 255
. (QA# 31322)
SourcePro stored procedure execution with input/output parameter is 4 to 5 times slower in system time than the native OCI stored produce execution. (QA# 31403)
RWDBResult returns an incorrect behavior when inserting values to a table with unique key constraint. (QA# 31523)
Documentation bug in RWDBDateTime::extract
and daylight saving. (QA# 31592)
fetchRow()
at the endOfFetch
raises an error handler. (QA# 28613)
Implement timeouts for DB2 access module. (QA# 28692)
Problem processing result set after stored procedure object destructed. (QA# 22782)
RWDBBoundExpr does not work with RWDBInserter. (QA# 22811)
RWDBValue type of Blob
generates varbinary
instead of image
in MS SQL Access Lib. (QA# 24139)
Names of output parameters in schema from MS-SQL stored procedure lost after execute()
call. (QA# 25664)
Output parameters held in RWCString objects are lost when return value is acquired. (QA# 26165)
Cannot use RWDBBlob in a WHERE
criterion. (QA# 27839)
Connecting using Windows Authentication with MS SQL Server. (QA# 31462)
Errors in RWDBStoredProc::execute()
on multiple execution when using SQL Server ODBC. (QA# 31655)
Application freezes on invoking commitTransaction()
. (QA# 31715)
dbTables()
doesn't return string
, string
, int
as defined. (QA# 15146)
Insert RWDecimalPortable to Decimal
data type in Informix results in "String data right truncation" error. (QA# 31483)
Memory leak using RWDBInserter::clear()
with Informix. (QA# 31500)
Inserting a RWCString into nchar
/nvarchar
data type results in "String data right truncation" error. (QA# 31590)
RWDBOSql::fetch()
on execution of an INSERT
statement. (QA# 31432)Stored procedure with text parameter, incorrectly inserts string. (QA# 22223)
Inserters with Selectors and Schemas do not function as expected. (QA# 23838)
Query timeout value for sql statements being executed via an RWDBInserter, RWDBUpdater, RWDBDeleter, etc. (QA# 23891)
The user can not access a table which has dots in its name. (QA# 28286)
Assigning global object RWDBConnection results in "Assertion failed: (impl_) != 0". (QA# 31472)
Calling RWDBValue::compareTo
with a null RWDBValue gives a GPF. (QA# 13010)
RWDBInserter not functioning properly when the string begins with a NULL
char. (QA# 13314)
RWDBBulkReader gives error when created from result of RWDBSelector using bound variables. (QA# 13378)
Support for Windows type __int64
. (QA# 15927)
Call to fetchReturnParams
coredumps on Solaris with Oracle8 Access Library. (QA# 16775)
Oracle LONG
data type reading fails for RWCString data with length exceeding 49149. (QA# 22793)
Error handler returns incorrect value for vendorError1
with Oracle Access Library. (QA# 23180)
Float value is truncated when used as a parameter in a procedure/function. (QA# 24227)
Union All with 3 RWDBSelector
s drops bound variables. (QA# 25049)
Float value returned from reader is truncated to 6 digit only. (QA# 25126)
Supplying NULL
to IN varchar
param of value-returning function causes assertion on returnValue()
. (QA# 25291)
A reader that produced a server warning acts as if it found no rows, instead of propagating the warning. (QA# 25364)
Oracle8 Access Library invokes error handler with a harmless empty message. (QA# 27948)
Single character updates using RWDBBoundExpr on Oracle 9/10 fail. (QA# 30890)
Broken rebinding on string resize after primary key violation. (QA# 31316)
SourcePro DB used with Oracle 10g produces errors migrating from RWDBStringVector to RWDBTBuffer. (QA# 31363)
Correlated Update support in SourcePro DB. (QA# 31395)
Rebinding the out parameter in the stored procedure in every execution results in creating a different bind parameter name for the new bound data, hence significant drop in performance. (QA# 31501)
Setting Oracle specific timestamp to FALSE
results in incorrect date being sent to the database. (QA# 31625)
DBTools.h++ to SourcePro migration results in increase in memory with VARCHAR2(1)
. (QA# 31803)
RWDBStoredProc - ORA-01403 error not captured by the status object. (QA# 31846)
Vendor messages at login not accessible from SourcePro DB API. (QA# 31926)
Error messages not propagated from Sybase stored procedure. (QA# 4605)
RWDBDateVector is dropping off the milliseconds from the RWDBDateTime. (QA# 16033)
Server error messages not retrieved properly. (QA# 16482)
Sybase AL TEXT
column storage length defaulted to 0 shows problem while connecting to other databases. (QA# 24070)
RWDBStoredProc call to sp_help
with parameter fails. (QA# 24640)
rwdbCount
fails in DBTools.h++ version 4.1.0. (QA# 25141)
Unable to insert CHAR
values in Sybase. (QA# 29238)
API to set password encryption parameter on a connection. (QA# 29702)
Sybase CT 12.5 Memory leak problem in stored Proc returning multiple result set. (QA# 30844)
Multi-threaded app core dumps. (QA# 31314)
RWDBTBuffer<RWCString> errors when selecting SMALLINT
into RWCString. (QA# 31359)
API on the RWDBSybCtLibEnvironmentHandle to set the binary data preallocation value. (QA# 31367)
SourcePro makefiles on AIX explicitly specify full paths to the Sybase vendor libraries, thus not dynamically searching them. (QA# 31369)
Problem reading multiple results set from a stored-proc using Asynchronous connection. (QA# 31496)
Optimized usage of atomic operations in reference counting.
Improved SPARC and Itanium assembly for atomic operations.
Various other minor optimizations and bug fixes.
Fix of formatting of timezones in ISO 8601 representation of dates/times.
Fix wide strings comparison bug.
Fix RWTime::between
constness.
Fix incorrect setting of precision in RWpostream ctor.
Fix incorrect timezone offset sign.
Fix crashes in RWDateTime ctor for MET timezone in 1970-1976 interval.
Fix RWClockTimer::elapsedTime
value truncation issue.
Fix locales parsing error eliminating leading zeroes in months.
Fix various bugs in RWTRegex related to anchoring.
Fix missing non-const
overload of find in stdlib-based containers.
Added as String overload for long double
in locales.
Added toLongDouble
function to convert RWDecimalPortable objects.
Fix discrepancy between semantics and implementation in atomic ops.
Fix broken classic strings builds in Tools.
Optimized randmtwist class for MKL users.
Persisted MKL random number classes will now save the state.
Fixed ddot
not const
correct. (QA# 27514)
Introduction of Callback Functionality. Offers execution of user code at RWDBDatabase and RWDBConnection Level to obtain customized database environment and connection handles.
Database Authentication using Kerberos. Database login using Kerberos authentication is tested for Oracle, Sybase and DB/2 using the newly introduced Callback Functionality.
Addition of support for C++ data type long double
. All Access Modules provide support for input and output binding of long double
type.
Addition of Property String to the database connection parameters in examples and RCB GUI.
Enhancement in MySQL Access Module makefile generation to support manual MySQL builds.
Convert rwint64
to RWDBValue and back. (QA# 29173)
tag()
method on the RWDBMemTable. (QA# 29215)
RWDBValue constructor doesn't support long double
type as argument. (QA# 29534)
RWDBExpr::in()
and RWDBColumn::in()
need to be changed to show RWDBCollectableExpr use. (QA# 30408)
Scale limitation when converting from double
to RWDecimalPortable. (QA# 30673)
RWDBStatus::vendorMessage2
when retrieving error from Informix stored proc. (QA# 29253)Float value is truncated when used as a parameter in a procedure/function. (QA# 24227)
Bulk insert into Oracle crash when using Edition 8. (QA# 31267)
RWDBExpr::asString()
fails to generate modulo ('%') expressions. (QA# 29398)
Bound expressions do not work correctly with the select list. (QA# 30927)
Documentation states that the "Use runtime loading of driver?" option in RCB is available for MySQL and PostgreSQL Access Module. (QA# 30892)
PostgreSQL using the C++ not operator !
in a RWDBSelector::where
clause cause the SQL NOT
to concatenated with the table name. (QA# 31241)
Setting connection properties using RWDBDatabase constructor. (QA# 29922)
Want a single SYBASE_CT string as first argument to RWDBManager::database
for both static and DLL libs. (QA# 30218)
Source Pro DB with Kerberos. (QA# 30803)
RWAny: class which can hold and help retrieve an object of arbitrary type.
RWDirectoryIterator: directory iterator.
Speed performance improvements in RWCString, RWDecimalPortable, etc.
RWLocaleSnapshot date/time format specifiers support enhancement.
Fixed ISO8601 date/time parsing.
Four new random number generation classes.
Fixed Multithreading with RWLinearRegression crashes. (QA# 29251)
Fixed scasum
inefficient conversions float
-> double
-> float
in bla.h
. (QA# 30313)
Addition of support for C++ data types long long
and unsigned long long
for all Access Modules.
ENHANCEMENT: RWDBBulkInserter column specification. (QA# 14469, SCOPUS# 10478)
Status object is empty on insertion or update failure; error info not available. (QA# 16837, SCOPUS# 11489)
Memory leak in SourcePro(R) DB using the where clause and the throw statements. (QA# 30616)
Scale limitation when converting from double
to RWDecimalPortable. (QA# 30673)
ENHANCEMENT: no RWDBSelector::groupBy
method that takes an RWDBExpr. (QA# 13141, SCOPUS# 9538)
RWDBDatabaseImp::crypt()
not thread safe. (QA# 15834, SCOPUS# 9429)
Can cross-database joins be done without setting up a view on the database side? (QA# 25083)
DB2, INF, ODBC, CTL, MSQ: Assertion failure when table contains an unsupported datatype. (QA# 27861)
RWDateTime cores on invalid DST date/time. (QA# 29113)
Loss of precision when binding double
to stored proc. (QA# 29378)
No RWDBValue::operator=
for RWDateTime. (QA# 29600)
RWDBDateTime zone confusion. (QA# 30197)
ODBC - SourcePro(R) DB ed 7 crash with DB2 in a multithreaded environment. (QA# 30652)
When using SQLGetData
we do not fetch all the rows possible. (QA# 30677)
Bad precision value for BLOB
s. (QA# 29341)
Blobs bigger than 128k were cutoff. (QA# 29619, QA# 30618)
DB2 CLOB
Problem with DB2 8.1 client/servercodepage settings. (QA# 30138)
No error check when retrieving unicode info. (QA# 30288)
SourcePro(R) DB ed 7 crash with DB2 in a multithreaded environment. (QA# 30456)
Error handler causes infinite loop, user error handler not called on ms sql server. (QA# 13409, SCOPUS# 8692)
Enhancement: saving a DateTime
into database as GMT (QA# 15185, SCOPUS# 7366)
RWDBColumn::assign(RWDBBlob)
causes failure when executing a blob update. (QA# 15494, SCOPUS# 15494)
BUG in msqstat.cpp
for MS SQL Server Access Library 4.0 1 (and 4.0.2). (QA# 22951)
RWDBOSql: INSERT
doesn't work with ID
columns (QA# 23474)
MSQ: Unable to bulk insert any values into a column of type TIMESTAMP
. (QA# 25179)
Decimal(p,0)
column is actually generated as Decimal(p,2)
. (QA# 28756)
MS SQL Server retrieving wrong sized BLOB
's. (QA# 29196)
On error, RWDBStatus contains wrong error code values. (QA# 29495)
Problem with in()
and like()
for Unicode data. (QA# 30289)
Source Pro edition 7 documentation for SQL Server. (QA# 30712)
Reader doesn't close the cursor on destruction. (QA# 30772)
Cannot use ODBC Trace
option with Informix access library. (QA# 22924)
Cannot read/write Informix INTERVAL
datatype. (QA# 23443)
Timeout dependent on number of rows fetched. (QA# 28493)
Addition of support for server ports in database connection parameters in MySQL Access Module.
MySQL: COLUMNNOTFOUND error reported when a primary key involves multiple columns. (QA# 30657)
Invalid schema results on MySQL with char(1)
column. (QA# 30684)
Cannot insert 160 char or more to MS SQL char
column via ODBC Access Lib v4.1.0. (QA# 23950)
Inserting a RWCString with embedded nulls fails using ODBC access library. (QA# 24885)
Enhancement in Oracle OCI Access Module in use of type RWDecimalPortable leading to performance improvement.
Oracle AL hold wrong error values. (QA# 24697)
ORACLE: Asynchronous connections don't work. (QA# 25110)
When Oracle throws an ORA-01403: no data found exception in an RWDBStoredProc no DBTools error handler is invoked. (QA# 29149)
How to use RWDBOSql object in order to execute PL/SQL procedure? (QA# 28139)
Updating clob
columns to NULL
gives errors. (QA# 29153)
Inconsistent behavior of RWDBInserter with a cache value. (QA# 29494)
Stored Procedures on ORACLE 9 (cursor parameters). (QA# 29617)
RWDBBoundExpr's Place Holders do not appear in the ON
clause of a selector. (QA# 30134)
Stored Procedures on ORACLE 9 (cursor parameters). (QA# 30578)
RWDBStoredProc does not return ORA-01403 errors. (QA# 30658)
Lack of precision and scale information when binding NUMBER
column. (QA# 30678)
RWDBBoundExpr problem on Oracle 9/10 with single character updates. (QA# 30890)
#INVALID
result when Timestamp
value is read from PostgreSQL. (QA# 30464)RWDBStoredProc.returnValue()
always returns 0 after a raiserror, even if the stored procedure returns a value > 0. (QA# 24774)
Could not use single quote syntax to manipulate char
type column in Sybase. (QA# 28558)
String size limits in Sybase need to be updated for 12.5. (QA# 29210)
Raising exceptions from error handler creates connection leak. (QA# 29406)
For Asynchronous Connections, the error is not thrown until all the queries have executed. (QA# 30276)
Multithreaded app dumps core. (QA# 30365)
Use of print stmt in Stored Proc forces returnValue()
== 0. (QA# 30497)
Sybase CT Access Module, a varbinary
field with a size greater than 256 bytes asserts when using a reader. (QA# 30580)
Sybase CT 12.5 Memory leak problem in stored Proc returning multiple result set. (QA# 30844)
An atomic operations API for integers was added. Some operations on some platforms, which previously existed (e.g. SPARC V9) have been improved. One important architecture that was added was Itanium. Atomic reference counting is improved to use these operations.
A [more] robust RWTMutex class was added, which is particularly suitable for the creation and use of mutex objects with static duration.
XDR operations are now more robustly detected on all supported platforms. A hyper streaming has been added for platforms that support it.
Added parser for date-time strings conformant with ISO 8601 standard. RWDateTime now can parse all of the following formats:
parsing format s of calendar dates: -YYMM -YY-MM -YY -DDD -YWwwD -Y-Www-D -YWww -Y-Www -WwwD -Www-D -Www -W-D --MMDD --MM-DD --MM ---DD YY YYYY YYDDD YYWww YYMMDD YY-DDD YYYYDDD YYYY-MM YYYYWww YYYYMMDD YYYY-Www YY-MM-DD YYYYWwwD YYYY-Www-D
.
parsing formats of time formats: HHMMSS HH:MM:SS HHMM HH:MM HH HHMMSS,SS HH:MM:SS,SS HHMM,MM HH:MM,MM HH,HH -MMSS -MM:SS -MM --SS -MMSS,SS -MM:SS,SS -MM,MM --SS,SS
.
parsing all combinations of the above.
Added RW_DEFAULT_OS_ZONE
macro (and RCB option) in RWZone::local
; its use enables the user to retrieve the DST rules from the OS instead of the ones for North America (default). The effect of calling RWZone::local
is the same with calling RWZone::os
. By default this feature is inactive.
Some operations dealing with caching of RWZone objects in the library have been properly synchronized to prevent concurrent access.
RWLocaleSnapshot access to C library locale has been synchronized.
Lookaheads in subexpressions containing repetitions which were not the last element in the subexpression were saved as lookahead retries thus giving erroneous matchings; e.g. "aabaab" was matched by "(a+b){3}"; fixed for all types of repetitions.
This release was tested against ICU 2.8.0. This has several consequent changes:
enum EastAsianWidth
has new values when linked with ICU 2.6.0. and above. These values have no particular relationship with the old values.
Turkic (un) dotted 'I' has changed its case folding behavior. We are now committed to simply mapping what ICU does in this regard, unless there is an actual error; and have rewritten our tests to assure only that the glyphic presentation of case-altered dotless or dotted 'I' would be as expected, regardless of whether one or two code points is used.
Several Han numeric code points are no longer regarded as digits. Testing with RWUCharTraits::isDigit()
that succeeded in the past may now fail. These code points do still succeed with RWUCharTraits::isNumeric()
.
Conversion to and from generic ISO-2022 is no longer supported. A particular language locale must also be specified for ISO-2022.
We were making incorrect use of the underlying ICU library to determine whether a particular code point was numeric: We were instead checking to see if it was a digit. That has been fixed. More code points are numeric than are digits, so testing isNumeric()
may now return true for code points that would have returned false previously.
Some platforms triggered a bug in ICU code when ICU was allowed to manage its own conversion buffer. ICU does allow you to manage your own buffer, but the change was link incompatible, so we provided a patch in code that was conditionally compiled only on platforms that had the problem. With this version, we are moving that change out of conditionally compiled code into the main line. The cost of doing it this way is quite small overall and is born entirely when the converter is created.
prod()
global template function has const
iterator problem. (QA# 27254)Fixed global template function has const
iterator problem. (QA# 27524)
Fixed problem with exporting classes when creating static libraries.
Fixed error when dividing 0. (QA# 29928)
Fixed inline declarations on inline globals to avoid "multiple symbol error" at link.
Re-architecture of MySQL Access Module to provide access to the MySQL database, using the MySQL C API.
Re-architecture of PostgreSQL Access Module to provide access to the PostgreSQL database using the PostgreSQL libpq API.
Addition of support for Microsoft SQL Server Access Module on Solaris and AIX Operating Systems to connect to MSSQL server through an internal driver.
Addition of support for Oracle 10g OCI client. Renaming of Oracle9 Access Module to Oracle OCI Access Module for supporting Oracle 9i and Oracle 10g OCI clients.
Enhancement of the methods RWDBSelector::groupBy()
and RWDBSelector::orderBy()
to accept an RWDBExpr.
Enhancement of the class RWDBForeignKey to add functionality for specifying constraint names, constraints, and referenced columns.
Addition of mutator API in the class RWDBNullIndicator.
Enhancement in the Outer Join functionality in Oracle OCI Access Module to support SQL-92 outer join syntax.
Bad syntax for outer join. (QA# 15190, SCOPUS# 7044)
Switch statement in forkeyi.cpp
incorrect; RWDBForeignKey::asString
wrong. (QA# 15563, SCOPUS# 11393)
RWDBSelector: No way to put selector in from clause of another selector. (QA# 15787, SCOPUS# 11530)
Missing functions. (QA# 22335)
Updater with RWDBDateTime on the criterion. (QA# 23006)
PostgreSQL 7.2.1 ODBC driver on Linux fails for RWDBCursor::deleteRow
. (QA# 28157)
DB Documentation should be updated to use class RWDBTBuffer<T> instead of class RWDBVector and related classes. (QA# 29111)
DB Documentation should be updated to use class RWDateTime instead of class RWDBDateTime. (QA# 29112)
Doc changes for PostgreSQL & MySQL. (QA# 29287)
RWDBValue::asString()
for RWDBBlob. (QA# 29342)
Writable cursor crash with PGS. (QA# 29347)
PostgreSQL RWDBStoredProc::exists()
doesn't work and other troubles. (QA# 29371)
MySQL does not generate correct create table foreign key syntax. (QA# 29376)
Invalid cursor state Error. (QA# 29805)
Examples fail w/dynamic driver loading/pgs/rw/15d on RH AS 3.0 w/icc 7.1. (QA# 29836)
Application getting Segmentation Fault(coredump) depends on number of rows returned. (QA# 30045)
Additions to ForeignKey constructors. (QA# 15460, SCOPUS# 11332)
RWDBTable::primaryKey
member function for informix doesn't work. (QA# 15540, SCOPUS# 11344)
Can not retrieve multiple result sets from Sybase stored procedure. (QA# 27528)
Instantiation of RWDBStoredProc with schema data. (QA# 28669)
RWDBBlob::clear
has insufficient explanation. (QA# 28952)
SourcePro DB User's Guide has typos in chapter 11, Asynchronous Usage. (QA# 30067)
Need mapping for SQL_BLOB
type to RWDBValue::Blob
in DB2 Access Lib. (QA# 23246)
Crashes while destroying RWDBConnection. (QA# 29414)
DB2 apar 57919,756,000 - Embedded nulls in for bit data columns cause SQLFetchScroll
to not return data. (QA# 29974)
DB2 apar 57880,756,000 - Updateable cursor where select doesn't include index column fails. (QA# 29976)
DB2 8.1 - Keyset driven cursor not available on columns of LONG VARCHAR
, LONG VARGRAPHIC
, DATALINK
and LOB
types. (QA# 29985)
mssql ODBC API and transaction savepoints. (QA# 4980)
Incorrect storageLength()
on datetime
columns with MS Sqlserver access lib. (QA# 23265)
Error obtaining foreign keys. (QA# 24155)
SQL Server procedure identifiers always case sensitive. (QA# 29156)
SourcePro DB ODBC and MSSQL access modules return incorrect error message. (QA# 29293)
Excessive assertion failures in curtst for informix on Solaris 57, 5comp. (QA# 15866, SCOPUS# 11569)
Can't update TEXT
column with RWDBUpdater - Informix bug 166210 (QA# 22720)
Informix 2.81 UC1 Client on Linux crashes in Multi Threaded builds (QA# 29707)
RWDBSchema[i].nullAllowed
returns always TRUE
. (QA# 29711)
Inserting strings with Informix and odbc32.lib
and iclit09b.lib
on the link line. (QA# 29936)
DBTools 4.01- error from tutsetup
on ODBC A.L. on HPUX11. (QA# 22220)
No test for repeated columns in a selector column list. (QA# 23473)
leftOuterJoin
with ODBC Access Library fails. (QA# 23569)
Owner name from dbTables()
has garbage value. (QA# 30035)
Enhancement ability to change locator buffer size at runtime. (QA# 15428, SCOPUS# 11321)
Error when passing Oracle table datatypes into oracle stored procedures using OSQL. (QA# 24315)
Error ORA-1026 when trying to insert/update two varchar2(4000)
with >2666 chars. (QA# 25316)
sol8/gcc3.1 with rwstdlib. (QA# 28330)
Program hangs with oracle 8.1.7.3 server when there is no associated table in the database. (QA# 28378)
ORA-01008: not all variables bound when using RWDBCursor in Write
mode generated from RWDBSelector. (QA# 28492)
Inconsistent behavior updating clob columns and ORA-24369. (QA# 29288)
Memory corruption after applying the patch for Bug ID 27661. (QA# 29390)
Oracle8 Oracle9 Environment Handle methods ociLocatorForDefaultString
and ociLocatorForDefaultBlob
are no longer required. (QA# 28505)
Oracle LONG
Adapter inserts NULL
for all rows if the first row is NULL
. (QA# 29118)
At least oracle9 and sybase - reader() core dumps after upgrading to SourcePro ed3. (QA# 29362)
RWDBSelector memory leak on linux threaded build connecting to Oracle 9. (QA# 29634)
Memory leak in RWDBInserter. (QA# 29648)
Problem with Japanese characters on HP 11 with Oracle 9. (QA# 29817)
Left outer join syntax on Oracle 9. (QA# 30102)
ora-01461 can bind a LONG
value only for insert into a LONG
column. (QA# 30143)
DEC ctlib: envhandletst
alterConns fails. (QA# 22221)
Cannot cancel large select statement via SourcePro DB. (QA# 28467)
Problem with executing SQL with "+" in the SELECT
statement. (QA# 29160)
Problem with table & stored procedures with parameters longer than 255 characters. (QA# 29501)
Maximum bind length of a string with sybase depends on server version not client. (QA# 29623)
Client state is inconsistent with server after reconnecting. (QA# 29773)
isValid
returns TRUE
status on RWDBBulkInserter::execute
in case of error. (QA# 29775)
Sybase async cancel doesn't cancel. (QA# 29965)
Sybase access module User's Guide missing information. (QA# 30115)
(xmlabstractions) Fixed an issue where if an element has multiple attributes with the same name but in different namespaces, additional attributes are lost.
(xmlabstractions) Performance improvement in RWXmlStringWriter
RWMulticastSocket was added to simplify the creation and use of UDP multicast sockets.
RWBufferedRecvPortal and RWBufferedSendPortal were added to provide additional functionality to the RWPortal hierarchy.
Additional examples for UDP sockets have been added.
NOHEADERS
mode on RWSmtpAgent to be ignored.math.h
and cmath
. Be aware, some math functions may be in namespace std, instead of the global namespace on some platforms. (QA# 28866)Addition of two new Access Modules for MySQL Database and PostgreSQL Database.
Enhancement to Oracle9's RWDBOracle9EnvironmentHandle to allow Oracle9 clients to use Oracle's DATE
type in addition to TIMESTAMP
.
Sybase storedproc execution fails when output parameter is not the last one. (QA# 4627)
RWDBSelector::clear()
method failing to clean up the instance. (QA# 25279)
notConnected
consistency across access module. (QA# 29172)
Problem in RWDBDateTime::addSeconds(rwint64 num)
. (QA# 29183)
Overload asString
method to allow an option to use literal values instead of placeholders for all possible types. (QA# 29681)
Crash when using RWDBOSql and related classes. (QA# 28644)
Unexpected exception when comparing RWDBDateTime. (QA# 28947)
Dynamically incrementing connections in connection pooling ... (QA# 29134)
RWDBTable::primaryKey()
method not returning the primary key for DB2. (QA# 28774)
Global trimming functions, rwdbTrimLeading
, rwdbTrimTrailing
and rwdbTrimBoth
, are not working with DB2. (QA# 28880)
tinyint
default parameter fails. (QA# 23049)datetime
parameters (QA# 22913)Assertion error: (o < data_->length()) != 0 in blob.cpp
, line 100. (QA# 26077)
problems with NULL-out-parameter in stored procedures. (QA# 27109)
Internal Oracle mutex is serializing parallel queries to db - performance issue. (QA# 27661)
Enhancement: Environment Handle -> System Handle 1:1 mapping. (QA# 28036)
RWDBStoredProc::returnValue()
crashes if the IN
parameter is type LONG
and has the length about 30k. (QA# 29022)
Bug reading LOB
columns containing one character. (QA# 28027)
RWDateTime Performance Issue vs OCCI Code. (QA# 28526)
Memory growth in the Oracle access modules. (QA# 28660)
RWDBTable::exists()
coredumps if the table name is a public synonym which forms a circular path. (QA# 28792)
RWDBOSql::executeNoDescribe
's behavior has changed. (QA# 24130)
Some parts of RWDBConnectionPool not exception safe. (QA# 27771)
Can't COUNT
more than 9999 VARCHAR
records on Sybase using executeSql()
. (QA# 26560)
RWDBConnection objects. (QA# 29157)
Addition of virtual function overrides of RWFilteredDataInputStreamImp getWString()
and getUString()
in derived classes to parallel existing getString()
overrides.
Updated handling of serialized null pointers. (QA# 28965)
Updated to support version 2.4 of the ICU. This has several consequent changes in the behavior of the module:
Case mapping and case folding have changed slightly for the Turkish characters LATIN CAPITAL LETTER I WITH DOT ABOVE (U+0130)
and LATIN SMALL LETTER DOTLESS I (U+0131)
; possibly in conjunction with COMBINING DOT ABOVE (U+0307)
, and the ASCII characters 'I' (U+0049)
and 'i' (U+0069)
. Here's a chart of how it works now.
Uchar | fold(T) | fold(F) | lower | lower("tr") | upper | upper("tr") |
---|---|---|---|---|---|---|
U+0049 |
U+0131 |
U+0069 |
U+0069 |
U+0131 |
U+0049 |
U+0049 |
U+0130 |
U+0069 |
U+0069 + U+0307 |
U+0069 + U+0307 |
U+0069 |
U+0130 |
U+0130 |
U+0049 + U+0307 |
U+0069 + U+0307 |
U+0069 + U+0307 |
U+0069 + U+0307 |
U+0069 + U+0307 |
U+0049 + U+0307 |
U+0049 + U+0307 |
U+0069 |
U+0069 |
U+0069 |
U+0069 |
U+0069 |
U+0049 |
U+0130 |
U+0131 |
U+0131 |
U+0131 |
U+0131 |
U+0131 |
U+0049 |
U+0130 |
U+0069 + U+0307 |
U+0069 + U+0307 |
U+0069 + U+0307 |
U+0069 + U+0307 |
U+0069 |
U+0049 + U+0307 |
U+0130 + U+0307 |
U+0131 + U+0307 |
U+0131 + U+0307 |
U+0131 + U+0307 |
U+0131 + U+0307 |
U+0131 + U+0307 |
U+0049 + U+0307 |
U+0049 + U+0307 |
The column labels are as follows:
Label | Description |
---|---|
Uchar | The original UTF16 character |
fold(T) | call RWUString::foldCase(true) |
fold(F) | call RWUString::foldCase() . Default is false |
lower | call RWUString::toLower() |
lower("tr") | call RWUString::toLower(RWULocale("tr")) |
upper | call RWUString::toUpper() |
upper("tr") | call RWUString::toUpper(RWULocale("tr")) |
foldCase
, toUpper
, toLower
and normalize
no longer commute freely. It matters in what order things are done. Once again, this is important, so far as we know, only for the Turkish characters mentioned above.
When checking BidirectionalCategory
, invalid characters are now classified as RWUCharTraits::LeftToRight
instead of the prior RWUCharTraits::NoBidirectionalCategory
.
Resource bundle lookup within the file system at runtime has changed.
Collation for the "ja" locales no longer defaults to Quaternary level, but to Tertiary level instead.
Break searches have changed:
The heuristics for finding word breaks in Chinese have been simplified. As a result, more word and line breaks are found with this version than previously.
The heuristic for word breaks in Latin-1 has been changed to find word breaks between all space characters as well as at places previously found.
String searching (not regular expression searches) have changed RWUStringSearch::next()
, when called on an newly created search object used to return an iterator pointing to the first match. It now requires you to call first()
first, as next()
will return the match after the first one.
We have seen confusion because the default constructor for RWUToUnicodeConverter and RWUFromUnicodeConverter use their own internal global default converter name, whereas the implicit conversions available from RWUToUnicodeConversionContext and RWUFromUnicodeConversionContext look at the current context. (We even had two test cases that were originally written in error.)
To clarify things, we have removed the default constructor for the two RW****UnicodeConverter classes. If you need the prior behavior, you may rewrite this line, for example:
as
This is exactly what the default constructor used to do, it is inexpensive, and it makes your intention perfectly clear, in case the code must be maintained in the future.
Or, for the behavior many users expected:
This too is reasonably inexpensive and makes your intention perfectly clear.
(xmlabstractions) Fixed a typo in the exception message returned if an end tag is not found by RWXmlReader. (QA# 28377)
(xmlabstractions) Added a new virtual method to RWXmlWriter to improve performance. (link-incompatible)
(xmlabstractions) RWXmlStringWriter now uses an internal buffer to reduce the number of string appends. (link-incompatible)
(xmlabstractions) Various internal performance improvements when writing XML data.
(xmlabstractions) Add support for validating XML input.
(xmlabstractions) RWXmlWriter::writeSimpleElement
correctly handles writing an empty string content by writing an empty element.
(xmlabstractions) Fixed an incorrect comparison in RWXmlProlog.
(http) RWHttpAgent did not restrict the maximum number of connections to a single host as it was supposed to. This has been fixed so that the maximum is respected. (QA# 28297)
(http) You can now specify a custom RWHttpClientManager instance when constructing an RWHttpAgent. This allows for multiple client manager instances in the application, instead of the previous restriction of one.
fstream
instead of cin
. Now there is no need to put the input file name when invoking these examples.Incorrect RWDBDateTime created when using add functions during daylight savings time. (QA# 4589)
Documentation: page 22-23 of Memento Style Programming. (QA# 13173)
Enhancement: API to list available stored procedures on a database. (QA# 14788)
Enhancement: Generate placeholders for RWDBCursors. (QA# 16098)
Using RWDBCursor[RWDBColumn]
does not work, but RWDBCursor[index]
does not. (QA# 16100)
No documentation explaining empty entries in phrasebook for unsupported Access Module APIs. (QA# 16318)
updating RWDBCursor with partial updateCols does not behave consistently. (QA# 16890)
Linking problems occur when more than one ODBC/CLI based client library is present in the link line. (QA# 22454)
Interface of RWDBDuration is inconsistent with const
correctness. (QA# 23784)
Errorhandler and Drop Column Problem. (QA# 23922)
RWDBSelector::clear()
method failing to clean up the instance. (QA# 25279)
Documentation: RWDBDateTime returns incorrect time during DST transition. (QA# 25409)
XA CLI drivers return ODBC 2.0 data types. (QA# 27906)
Documentation: DB Interface Module Reference Guide has incorrect statement in the table()
method of the RWDBResult class. (QA# 28550)
Setting RWDBTracer::setOn(RWDBTracer::BoundBuffers)
to object of type std::cout
causes an abnormal termination when a bulk insert is performed. (QA# 28793)
RWDBDateTime::addSeconds()
does not work properly when the input is a negative value. (QA# 28606)
Numerous warnings from GCC compiler when using optimization. (QA# 28645)
asString
enhancement fails to print values of buffers from RWDBBoundExpr. (QA# 28840)
executeSQL()
does not return the number of rows affected. (QA# 15100)
MINUS
is incorrect SQL keyword for difference operator in DB2. (QA# 16344)
DB2 Access Module does not map SQL_DATETIME
for type TIMESTAMP
. (QA# 24904)
SQLCloseCursor
returns error when there is no cursor. SQLFreeStmt()
is preferred in DB2. (QA# 27658)
incorrect API usage of SQLTables
to fetch VIEWS (QA# 28138)
Scale attribute declared as SQLSMALLINT
but assigned RWDB_NO_TRAIT
. (QA# 28773)
Enhancement: Allow bound expressions with RWWString for MS-SQL. (QA# 16779)
Stored procedures with datetime parameters are being described by the DB as ODBC 2.x types. (QA# 22315)
Insert into nvarchar
field of size 1252 to 2501 fails with an invalid precision value error. (QA# 24456)
Execution of a certain SQL executeSql()
will not appear to obey transaction control. (QA# 24461)
Call to RWDBTable::referredToBy()
generates an incorrect error message. (QA# 28697)
Incorrect SQL being generated for RWDBUpdaters. (QA# 28706)
Invalid Scale attribute of a SQL_DECIMAL
or SQL_NUMERIC
. (QA# 28762)
RWDBDatabase::dbTables()
doesn't return synonyms. (QA# 13428)
Problem with Informix transaction logging off. (QA# 13635)
RWDBTable::primaryKey()
fails to give correct results. (QA# 15718)
String truncation error using Informix AL when updating certain columns with RWDBOSql / SQLDescribeParam
. (QA# 25188)
Conflicts between Informix Access library and other CLI based Access Modules. (QA# 26150)
Incorrect precision and scale of database table columns used. (QA# 16588)
Misleading error status returned. (QA# 16591)
use fn NOW()
to get system time rather than SYSTEM_DATETIME
. (QA# 16616)
Enhancement: Add support for ODBC single thread buildtypes. (QA# 16648)
Problem reading wide char data. (QA# 23932)
RWDBReader fetches n-1 chars from a column varchar(n)
when n>=254. (QA# 26987)
Additional white space padded to flush out size of CHAR
. (QA# 4555)
Hardcoded BUFSIZE
degrades performance for reading blobs. (QA# 15436)
Storage length of a long incorrect. (QA# 15966)
Memory leak with RWDBInserter. (QA# 16748)
Inserting values into a table through oracle sequence fails. (QA# 24017)
ORA-01008: not all variables bound when using RWDBCursor in Write
mode generated from RWDBSelector. (QA# 24036)
Caching on RWDBReader seems to cause unpredictable lengths for oracle RAW
data. (QA# 25014)
When attempting to create a cursor from a selector, "The memory could not be "read"." error returned. (QA# 25253)
fetchSchema()
fails when using public synonyms. (QA# 25722)
Enhancement: RWWString data binding capability. (QA# 26702)
Documentation: Cloning a table using its RWDBSchema produces differing types. (QA# 27121)
Internal Oracle mutex is serializing parallel queries to db - performance issue. (QA# 27661)
Error retrieving values of type NUMBER
with large scale. (QA# 27730)
Failure on retrieving the raw data type output parameter in a Stored Procedure. (QA# 28016)
Enhancement: Environment Handle -> System Handle 1:1 mapping. (QA# 28036)
Multibyte CLOB
field truncated upon retrieval. (QA# 28147)
Using RWDBInserter to insert an RWDBBlob causes ORA-00936 (QA# 27295)
Bug reading LOB
columns containing one character. (QA# 28027)
Incorrect values when Selecting from a table will null values in long
column of last row. (QA# 28470)
Nested readers return incorrect results with prefetch size != 0. (QA# 28574)
Customer would like to be able to pass the error messages to his application. (QA# 12968)
Selective loading of access libraries. (QA# 13171)
Core dump while trying second connect to Oracle after first attempt fails. (QA# 13317)
String concatenation of RWDBExpr does not work. (QA# 13399)
RWDBStatus object corrupted by Oracle exceptions never is valid. (QA# 15458)
Sh_intent
lock left on table when result set left open and Cursor close attempt made. (QA# 12655)
User defined datatypes do not work. (QA# 14527)
Can not set CS_APPNAME
in Sybase-CT RWDBEnvironmentHandle. (QA# 14694)
RWDBStoredProc causes a crash trying to dereference a NULL
. (QA# 14752)
Missing Copy Constructors for some RWDB Classes. (QA# 14769)
Batched stored procedure calls in one executeSql()
do not return all result sets. (QA# 15253)
Batched commands in one executeSql()
do not finish executing. (QA# 15254)
Enhancement: Sybase CT mechanism to ensure completion of executeSql statements. (QA# 15255)
No supports for the TIMESTAMP
data type. (QA# 15282)
RWDBCursor won't work for bound column n unless cols 1..n-1 are bound. (QA# 15482)
RWDBBulkInserter truncates data. (QA# 15571)
rollbackTransaction()
API hangs when server is down. (QA# 15809)
Error handling stored procedures that return data type NUMERIC
. (QA# 22978)
RWDBBulkInserter does not report errors when they occur. (QA# 23405)
Get overflow error in RWDBReader when reading a user defined numeric type in 64 bit build. (QA# 28521)
Assertion failure while reading in the null values from the "DateTime" column. (QA# 28703)
The addition of RWAnsiLocale class that encapsulates a C++ standard library locale object and implements the RWLocale interface; when Tools library is built on top of RW C++ standard library it takes advantage of the 160+ locales distributed with it.
Note: when Tools library is built on top of GCC C++ standard library, the operations involving date and time may fail due to bugs in the implementation of time facets in GCC C++ standard library.
(xmlabstractions) RWXmlWriter did not properly encode carriage returns in generated xml. This has been corrected. (QA# 28360)
(xmlabstractions) Addressed a memory leak in RWXmlUtils when converting dates. (QA# 28599)
(xmlabstractions) Address a buffer overflow issue when converting native types to strings.
A new Unicode string class, RWBasicUString, that stores strings in UTF-16 and can convert between UTF-16 and UTF-8.
NOTE: If you need to use character encodings other than UTF-8 or UTF-16, you will want build and link the Internationalization Module. That module includes the RWUString class that extends RWBasicUString with additional support for encoding conversions and Unicode functionality such as sorting and tokenizing. See the Internationalization Module User's Guide for more information.
A new regular expression class, RWTRegex, that handles characters of wchar_t
type, to allow regular expression searches on character encodings that can be converted into arrays of wchar_t
or RWWStrings. This class also offers a more complete POSIX implementation and significantly improved speed efficiency in matching. The older regular expression classes RWCRegexp and RWCRExpr are now deprecated. RWTRegex is extended with Unicode functionality in the new SourcePro Core Internationalization (i18n) Module.
Support for International Standard ISO-8601 for formatting dates and times.
More support for the internationalization and localization of your applications, working with the new Internationalization Module. If you do not wish to take advantage of these features, or you do not need to use the Internationalization Module, you may use the Threads Module as you have in the past. You do not need to recompile or relink your applications to use these features.
If you need to work with character encodings other than US-ASCII, you will want to build and link the Internationalization Module. For information on building internationalization features into your applications, see the Internationalization Module User's Guide.
NOTE: Some functions and classes have been deprecated due to their inability to properly support the new internationalization functionality. It is recommended that you no longer use these classes and functions.
(sync) Various performance enhancements were made to the lock classes to improve performance and reduce contention.
(sync) Previously, it was possible for two threads to simultaneously change and execute the RWCancellationState function used by the RWSynchObject class. In some cases, this could lead to a segmentation violation or a core exception. This issue has been fixed. (QA# 25096)
(itc) The RWT*Escrow[Imp]::close
method previously threw an RWTHROperationCanceled exception if the escrow aborted. This method now throws the expected RWTHROperationAborted exception.
(itc) With the RWTPCVal*Guarded classes, when a guarded object was inserted that evaluated to FALSE
, the object would not automatically get passed to a waiting reader even if the evaluation changed to TRUE
. Only when an additional item is inserted into the queue,would the object be passed to a reader.
A new method, RWTPCValBufferBaseGuarded::checkGuards()
, has been added so that users can notify the stack or queue when a guard's evaluation state has been updated. The result is that all waiting readers will wake up and recheck all pending items for guards that evaluate to TRUE
. (QA# 25707)
(itc) The RWPCBufferBase::isReadable()
and RWPCBufferBase::isWriteable()
methods have been deprecated. Use instead RWPCBufferBase::canRead()
and RWPCBufferBase::canWrite()
. This change addresses a synchronization issue in the old functions. (QA# 16772)
(thread) The RWTThreadLocal template interface has been expanded to provide additional functionality. See the Threads Module Class Reference for details. (QA# 26539)
(thread) Support has been added to the RWThreadAttribute class for the POSIX stack guard feature. For more details, see the Threads Module Class Reference and the Threads Module Platform Guide. (QA# 27053)
(thread) Previously, it was possible for an RWThread handle to be dropped by the RWThreadPool, resulting in a debug assertion or exception. This issue has been fixed. (QA# 25393)
(thread) Various optimizations were made to reduce contention on expensive synchronization objects, significantly improving performance in some situations.
The Advanced Tools Module now includes more features to support the internationalization and localization of your applications. Some features are part of this module, while some require the use of the new Internationalization Module of SourcePro Core. If you do not choose to take advantage of them, you may continue to use the Advanced Tools Module as you have in the past.
If you need to use character encodings other than UTF-8 and UTF-16, you will need to build and link the new Internationalization Module of SourcePro . The Advanced Tools Module works with the Internationalization Module to allow you to build your streams in any recognized character encoding. The Internationalization Module also gives you access to other tools for localization such as locale-specific collation and resource bundles. To take advantage of these features, you must link and build the Internationalization Module . For more information on how to use these features, see the relevant sections in the Advanced Tools Module and Internationalization Module reference and user's guides.
Specific additions related to internationalization and localization include:
The addition of two new extractor and inserter interfaces to the object streams . These interfaces help you convert any data string to and from any encoding you wish, using either Unicode or wide characters. They include the RWBasicUString Unicode interface and the RWWString wide character interface.
The addition of character conversion classes that allow you to convert to and from UTF-8 and UTF-16. These classes are used by the XML Streams Module to provide support for UTF-16 in the absence of the Internationalization Module.These classes are in the Streams package and include RWFromUTF8Converter and RWToUTF8Converter.
(serial) Added support for RWWString, RWBasicUString, RWDateTime, RWDecimalPortable, and RWCollectable based classes and collections. (QA# 26286)
(xmlstreams) The XML Streams Module now includes more features to support the internationalization and localization of your applications. Some features are part of this module, while some require the use of the new Internationalization Module of SourcePro Core.
The XML Streams Module can now produce and consume UTF-8 easily and accept UTF-16 through the wchar_t
, RWWString, and RWUString interface.
Note, however, that the XML Streams Module now accepts and outputs UTF-8 exclusively. Wide and Unicode character inserters convert internally from UTF-16 to UTF-8 before inserting data into the stream . All narrow character data inserted into an XML stream must be converted to UTF-8, and all wide data converted to UTF-16. Conversely, all narrow character data extracted from an input stream will have been internally converted to UTF-8, and all wide character data internally converted to UTF-16.
If you need to use character encodings other than UTF-8 and UTF-16, you will need to build and link the new Internationalization Module of SourcePro Core. XML Streams Module works with the Internationalization Module to allow you to convert the UTF-8 used internally by the XML stream to and from any recognized character encoding. The Internationalization Module also gives you access to other tools for localization such as locale-specific collation and resource bundles . To take advantage of these features, you must link and build the Internationalization Module . For more information on how to use these features, see the relevant sections in the XML Streams Module and Internationalization Module reference and user's guides.
Addition of the XML Abstractions Package.
(xmlstreams) The following public classes and templates were added to XML Streams:
(xmlstreams) The following classes and templates were removed (placed in the xsltTransform
example directory):
(xmlstreams) A group of classes added to enable users to perform c++ transformations on streamed XML data. These transformations are defined by a transformation object.
(xmlstreams) New Enhanced Xml Input and Output Streams. These streams offer a more natural looking Xml format and more robust parsing.
Previously, attempts to bind and then to connect to a non-default address type would cause an exception to be thrown. The behavior is fixed. (QA# 26957)
Copying a RWSocketListener could lead to the underlying RWSocket being closed before the last RWSocketListener had gone out of scope. Making the RWSocketListener class a true handle fixed this problem. (QA# 25781)
The RWInetHost and RWInetPort classes didn't previously provide equality and inequality operators. The appropriate operators have been added. These operators were also added to class RWInetAddr, whose conversion operator to RWCString was used implicitly in comparisons. (QA# 27003)
RWPortalStreambuf, RWPortalIStream, RWPortalOStream, and RWPortalStreamBase have been modified and renamed (RWTPortalStreambuf, RWTPortalIStream, RWTPortalOStream, and RWTPortalStreamBase respectively) so that they take template parameters indicating the character type. The old names are still available as typedefs to the new classes, templatized on char
.
See the Essential Networking Module Class Reference for more information about the new classes.
Support for IPv6 network addresses has been added . See the Essential Networking Module Class Reference for more information about the new classes. (QA# 22590)
The Internet Protocols Module now offers more support for the internationalization and localization of your applications, working with the new Internationalization Module. If you do not wish to take advantage of these features, or you do not need to use the Internationalization Module, you may use the Internet Protocols Module as you have in the past. You do not need to recompile or relink your applications.
The following new features in the Internet Protocols Module support internationalization, but are not dependent on the Internationalization Module:
The HTTP package includes a new class, RWHttpContentTypeHeader, for parsing Content-Type information returned from web servers. This allows you to specify that the Content-Encoding header identify the data's character encoding.
The MIME package has been updated to support the creation of headers which contain non-ascii charset information. The RWMimeUtils::headerEncode()
and RWMimeUtils::headerDecode()
methods provide this functionality.
If you need to work with character encodings other than US-ASCII, you will want to build and link the Internationalization Module. The Internet Protocols Module allows you to pass these strings as RWCStrings to its methods, and also provides methods to allow you to identify the type of data being passed. For information on building internationalization features into your applications, see the Internationalization Module User's Guide.
(ftp) Added a check for a 426 command sequence that is returned from the server on a passive command, in the event that the server is having problems binding to the data port. This should prevent the rare occurrence of an FTP client hanging if blocked on the data port waiting for a connection, as a result of sending a STOR
or RETR
command to the server. (QA# 24898, QA# 24897)
(ftp) Corrected a timing issue between the destruction of an RWFtpClient body and the thread executing a functor on that body. (QA# 24205)
(ftp) Modified RWFtpAgent to allow use of an empty password string. (QA# 24439)
(http) Corrected a timing issue between the destruction of an RWIHttpClient body and the thread executing a functor on that body. (QA# 24205)
(http) Corrected an issue involving the usage of RWHttpAgent on GCC 2.96 with shared libraries. It should now be safe to use RWHttpAgent on this platform.
(http) Improved RWHttpReply's handling of invalid responses from non-conformant servers . Now properly detects and throws an exception if the status line is malformed. (QA# 27686)
(mime) Support for encoding and decoding MIME headers was added.
(pop3) Corrected a timing issue between the destruction of an RWPop3Client body and the thread executing a functor on that body. (QA# 24205)
(smtp) Corrected a timing issue between the destruction of an RWSmtpClient body and the thread executing a functor on that body. (QA# 24205)
The Secure Communication Module now offers more support for the internationalization and localization of your applications, working with the new Internationalization Module. If you do not wish to take advantage of these features, or you do not need to use the Internationalization Module, you may use the Secure Communication Module as you have in the past. You do not need to recompile or relink your applications.
If you need to work with character encodings other than US-ASCII, you will want to build and link the Internationalization Module. For information on building internationalization features into your applications, see the Internationalization Module User's Guide.
(secsock) Exception class RWCertificateOrKeyTooLargeError is no longer thrown from class RWAsymmetricKey or RWX509Certificate and is therefore deprecated . The class declaration has been wrapped with the RW_DISABLE_DEPRECATED
macro.
(secsock) Copying a RWSecureSocketListener could lead to the underlying RWSocket being closed before the last RWSecureSocketListener had gone out of scope . This issue has been fixed. (QA# 25781)
(secsock) Class RWSecureSocketMethod used to provide static instances of itself for use by users when calling the RWSecureSocketContext constructor. If an instance of RWSecureSocketContext, or any class that contained a RWSecureSocketContext object, was created at the global scope, it was possible that the necessary RWSecureSocketMethod static objects may not have had their constructors executed before being used by the RWSecureSocketContext constructor, leading to unpredictable results.
This problem has been fixed by replacing those static objects with static pointers to functions, and providing an (undocumented) constructor that converts those pointers into the appropriate RWSecureSocketMethod instance. User code does not need to change, but will need to be recompiled and linked to the new version of the Secure Sockets Package library.
(https) Updated RWHttpsSecurityManager::defaultNameCheckCallback
so that it properly parses the commonName, even if it is the last field in the subject name string.
Added new global function outerProduct()
.
Added new global function signatures for pow()
.
Added new pseudorandom number generator class RWRandGenMTwist.
double
, float
, and DComplex. For example, there were three symmetric matrix classes: DoubleSymMat, FloatSymMat, and DComplexSymMat. In this release, the three parallel class hierarchies have been replaced by a single, templatized one. In this case, the class RWSymMat<T>, where the type T is either double, float, or DComplex. In general, the old class names of the form Double{class name}, Float{class name}, and DComplex{class name} have been replaced by the single, templatized class RW{class name}<T>. The old class names are still valid, as are their corresponding header files.double
and get/set methods for the tolerance.SourcePro(R) DB now includes more features to support the internationalization and localization of your applications. Some features work with new internationalized features in the Essential Tools Module, while some require the use of the new Internationalization Module of SourcePro Core. If you need to work with character encodings other than UTF-8 or UTF-16, you will want to build and link the Internationalization Module. See the relevant access module user's guide for more details.
SourcePro(R) DB can now send and receive multibyte data in UTF-16 format (or the format supported by the database vendor). For more details, see the DB specific user's guide.
If you do not need to take advantage of these new features, you may use the DB Interface Module as you have in the past. However, the APIs that use string classes RWWString and RWDBMBString have new added features, and some behavior related to these classes may have changed. Please see the access module user's guides for more details.
If you wish to take advantage of these new features, you will need to write new code that uses either RWBasicUString from the Essential Tools Module, or RWUString from the Internationalization Module, and to provide UTF-16 data to various clients. RWBasicUString and RWUString interact with SourcePro DB code in the same way as does RWCString. Using these two classes, you can insert or read data in a similar way as with any other SourcePro DB-supported datatype.
RWDBDateTime has been reimplemented with the class RWDateTime (from the Essential Tools Module). RWDateTime is now the recommended class for dealing with dates and times in SourcePro DB.
API additions have been added to allow specification of whether empty strings are treated as NULL
values.
Support for additional Datatypes like TIMESTAMP
for Oracle and UniChar/UniVarchar for Sybase.
Exceptions are thrown for LONG
error messages. (QA# 9293, SCOPUS# 6379)
Missing functionality in RWDBDateTime. (QA# 11148, SCOPUS# 8491)
Core dump when instantiating and destructing connections. (QA# 11184, SCOPUS# 8571)
How do you generate a column alias/heading (for a union)? (QA# 12967, SCOPUS# 7492)
Overload operator-
etc for RWDBDateTime, RWDBDuration. (QA# 12970, SCOPUS# 9179)
DBTools unable to directly communicate directly with MFC string class. (QA# 14793, SCOPUS# 9505)
ENHANCEMENT: RWCString to RWDBBlob conversion routine. (QA# 15007, SCOPUS# 10918)
DB2: rwdbUpper
fails with RWCString, but works with RWWString and RWDBMBString. (QA# 15395, SCOPUS# 11287)
Insert: Binding of RWCString uses string length instead of column precision. (QA# 15489, SCOPUS# 10617)
ENHANCEMENT: instantiate a static database object inside a shared library. (QA# 15637, SCOPUS# 11462)
Logic is incorrect for assigning compiler flags for AIX 4.3. (QA# 15813, SCOPUS# 11158)
Problem with destructing RWDBCursor. (QA# 16099, SCOPUS# 8441)
How to get rid of the warning while compile DBTools.h++. (QA# 23034)
RWDBCursor::updateRow
fails. (QA# 23039)
Include a connection ID with the SQL trace text. (QA# 24597)
Padding problem while using RWDBBoundExpr. (QA# 24619)
RWDBStatusImp::setError
has multithreading bug. (QA# 25072)
After executing an insert for a function in the database, RWDBInserter doesn't remember the function for subsequent insertions. (QA# 25625)
Set RWDBInserter error handler to NULL
and get a core dump! (QA# 26598, SCOPUS# 10403)
RWDBCursor::updateRow
fails. (QA# 27307)
Repeated connections to DB result in failure to connect and memory growth. (QA# 26448)
Access violation using RWDBInserter with RWDBBoundExpr and clear()
. (QA# 27826)
core dump in RWDBExpr::isEquivalent. (QA# 27866)
Trying to select a DATETIME
column ends up with a core dump. (QA# 27906)
Unable to insert large values into a decimal
column with DB2. (QA# 24111)
Inserting a RWDBDecimalPortable w/ size > 10 into a decimal
column results in a "Numerical Value out of range" error. (QA# 25243)
DB2 stored procedures lack functionality. (QA# 25272)
Empty strings inserted as nulls with DB2. (QA# 25579)
Incorrect code in db2tab.cpp
SQLTables
. (QA# 28138)
Allow for new varchar
length with MSSQL 7.0. (QA# 4880)
RWCString as empty, inserter gives empty string, but updater gives NULL
. (QA# 14347, SCOPUS# 8117)
Error handler not capturing error msg from client when server is down. (QA# 15226, SCOPUS# 11082)
RWDBMsDbLibStoredProc should get inout param information. (QA# 15448, SCOPUS# 11264)
MS SQL Access Library does not catch RAISERROR message properly. (QA# 23706)
DBTools do not return the error #1105 from MS SQL Server. (QA# 23811)
rwdbSystemUser()
not working with MSSQL Server access library. (QA# 24106)
Result set not returned from stored proc if select follows an unsuccessful insert. (QA# 24412)
Incorrect return value from stored procedure. (QA# 25564)
RWDBCompoundSelect creates invalid SQL statement. (QA# 25818)
15d build of Informix Access Library 3.1.0 fails on AIX 4.3. (QA# 15699, SCOPUS# 10415)
ANSILevel2
(cursor stability) not implemented in 4.0. (QA# 22623)
Incorrect join syntax in Informix access library phrasebook. (QA# 22629)
fetchSchema
not returning the info when the table is created with owner name specified. (QA# 22779)
Data truncation Error in Informix when the blob size >128k. (QA# 22798)
Invalid Data Type. (QA# 28031)
Can not bind RWDBMBStrings when inserting data. (QA# 4629)
Error while executing stored proc through ODBC. (QA# 13057, SCOPUS# 9517)
ENHANCEMENT: Support for SQL_GUID
unique Identifier type. (QA# 15877, SCOPUS# 11576)
odbc: problems using RWDBDecimalPortable with Access. (QA# 16586, SCOPUS# 6215)
odbc: rowCount()
using executeSql()
. (QA# 16587, SCOPUS# 6334)
Empty strings are being set to empty strings. (QA# 16589, SCOPUS# 7280)
Issue in RWDBODBCLibSqlda::bindToSqldaAndThenToParams()
. (QA# 16590, SCOPUS# 7757)
Cannot fetch primary key with ODBC access library. (QA# 16593, SCOPUS# 8364)
Customer found a bug and has a fix for review in ODBC Access library. (QA# 16594, SCOPUS# 9289)
unable to read blob size >64k with Scrolling cursors using ODBC Access library. (QA# 16595, SCOPUS# 9307)
rwdbCast
produces errors with ODBC Access library. (QA# 16602, SCOPUS# 10010)
RWDBReader not releasing lock on table. (QA# 16604, SCOPUS# 10424)
Unable to connect to database supplied as a connection parameter. (QA# 16615, SCOPUS# 10429)
dbStoredProcedures()
, output of name and owner columns are reversed. (QA# 16617, SCOPUS# 10629)
SQL_TIME
incorrectly maps to RWDBDuration. (QA# 16619, SCOPUS# 10725)
ENHANCEMENT: Support for SQL_WVARCHAR
type. (QA# 16621, SCOPUS# 10832)
ODBC RWDBReader does not release connection. (QA# 16625, SCOPUS# 10905)
ODBC Bulk Inserter cannot have precision of zero. (QA# 16645, SCOPUS# 11154)
VARCHAR
values retrieved from SQLServer Stored Procedures padded w/blanks. (QA# 16649, SCOPUS# 11479)
ENHANCEMENT: Scrolling cursor options in ODBC access lib. (QA# 16650, SCOPUS# 11636)
bulkreader on selector with more than one bound expression in where clause fails. (QA# 16656, SCOPUS# 11786)
Trying to execute another user's storedproc with public permissions fails. (QA# 16657, SCOPUS# 11816)
Oracle Stored Procedure does not work properly using ODBC Access Lib. (QA# 23099)
Can't statically link two ODBC libraries together. (QA# 24244)
using ODBC AL, RWDBReader fetches n-1 chars from a column varchar(n)
when n>=254. (QA# 25192)
Using an Oracle synonym, DBTools will not retrieve the primary key info. (QA# 4950)
Stored procedure out LONG
into RWCString, got error. (QA# 8400, SCOPUS# 5701)
Cloning a table using its RWDBSchema produces differing types. (QA# 9296, SCOPUS# 7193)
RWDBDateTime::addSeconds()
gives incorrect results for values > 4 million. (QA# 13311, SCOPUS# 8417)
Coredumping with calling updater.asString()
twice, length >2000. (QA# 14625, SCOPUS# 10352)
Declaring an instance of RWDBDatabase causes core dump. (QA# 14632, SCOPUS# 10431)
ENHANCEMENT: Access lib guide should mention database limitation. (QA# 14828, SCOPUS# 10737)
3.0 Exception Handling - Oracle NO_DATA_FOUND
exception. (QA# 15181, SCOPUS# 8016)
Cannot shift in parameter to RWDBStoredProc. (QA# 15189, SCOPUS# 7081)
Invalid SQL when comparing against a null string. (QA# 15203, SCOPUS# 5202)
Unresolved symbol "slpmprodstab" when running examples. (QA# 15539, SCOPUS# 11370)
ENHANCEMENT: Empty string in Oracle should be NULL
. (QA# 15870, SCOPUS# 11572)
Can't get stored procedure output parameters along with result set. (QA# 16530, SCOPUS# 10159)
Bulkinserters with asynchronous connection fail with oracle access lib. (QA# 16550, SCOPUS# 10630)
Proc does not return correct output parameter with result set. (QA# 16552, SCOPUS# 10073)
Oracle8: No error loading or fetching schema of nonexistent RWDBStoredProc. (QA# 16722, SCOPUS# 10373)
Connection leak when exceptions are thrown. (QA# 16726, SCOPUS# 10485)
RWDBStoredProc: functionality in Oracle8 Access Library broken. (QA# 16731, SCOPUS# 10734)
isValid
method returns an incorrect result from an empty result. (QA# 16733, SCOPUS# 10795)
Oracle8: Truncation of trailing spaces. (QA# 16737, SCOPUS# 10999)
Oracle8: RWDBStoredProc param types are not read or set in or8utils
. (QA# 16846, SCOPUS# 10374)
Oracle8: Can't change RWDBStoredProc param after binding DecPort IN/OUT
. (QA# 16864, SCOPUS# 10376)
Number incorrectly converted to RWDBValue::Long
. (QA# 16882, SCOPUS# 10026)
Oracle Access Library 4.0.1 appears to truncate column names to 20 characters in length. (QA# 22646)
Error Code: 5 - Error Msg: [SERVERMESSAGE] ORA-01008: not all variables bound. (QA# 22664)
Problems updating w/ RWDBDateTime followed by string. (QA# 23566)
Unexpected custom error handler behavior with Dbtool V4.02. (QA# 23904)
dropColumn
method not implemented in Oracle Access Library. (QA# 23923)
RWDBStatus is not returning vendorError1
when a database error occurs at Oracle. (QA# 24125)
Receiving ORA-1001 (invalid cursor) errors when using DBTools with Oracle Access Library. (QA# 24515)
Problems connecting to Oracle using OS authentication and sqlnet. (QA# 24529)
Oracle ALs, repeated RWDBStoredProc calls grow w/o bound on Solaris 7. (QA# 25009)
Oracle stored procedure w/ an output parameter is very slow. (QA# 25553)
DBTools with Oracle classic, v4.x and above, fails to detect lost connection. (QA# 26361)
Getting incorrect default value from Oracle stored function with oracle 8 A.Lib. (QA# 15466, SCOPUS# 11336)
Oracle sequence doesn't work with oracle 8 access library. (QA# 15616, SCOPUS# 11449)
Minor memory leaks in BulkInserters with Oracle 8 access library. (QA# 15650, SCOPUS# 11477)
rwdbCast()
not working properly with oracle8 A.L. (SCOPUS# 11476)
oracle 8 A.L is not recognizing the default values of storedproc parameters. (QA# 15957, SCOPUS# 11608)
fetchSchema
assertion failure with MLSLABEL
type. (QA# 15958, SCOPUS# 11609)
Segmentation violation on updating field of LONG RAW with an empty RWDBBlob. (QA# 15972, SCOPUS# 11607)
Oracle8: RWDBSelector::cursor()
requires selector schema. (QA# 16101, SCOPUS# 11423)
Memory Leak in RWDBBulkInserter. (QA# 16234, SCOPUS# 11751)
Core on HPUX if using RWDBCriterion longer than certain length, only when using multithreading. (QA# 23583)
Can't insert data > 4000KB into Oracle's CLOB
datatype using Oracle 8 A.L. (QA# 23862)
Assertion failed in RWCString if a IN
parameter of type string is rwdbNull
in a function with Oracle8 AL when you fetch back the return value. (QA# 23946)
oracle error "[SERVERERROR] ORA-01008: not all variables bound". (QA# 23998)
Error when passing Oracle table datatypes into oracle stored procedures using OSQL. (QA# 24315)
When you update an Oracle8 table that contains a blob. (QA# 25068)
Oracle8 Multithreading crash, connections created inside threads. (QA# 25073)
cannot update CLOBs with non-string values. (QA# 25173)
Get core when updating LONG
type field for 2 records. (QA# 25250)
Error reading type LONG
from an Oracle 7 database. (QA# 25273)
Repeated connections of a lost database connection result memory leak growth. (QA# 25406)
Unchecked memory increase, connections losing scope not fully deallocated. (QA# 25566)
Using Oracle 8.0.6, the application hangs using tables with NULL
BLOB
fields. (QA# 26365)
Oracle 8: failed connections not being closed until exit. (QA# 25430)
Assertion error: (o < data_->length()) != 0 in blob.cpp
, line 100. (QA# 26077)
Using RWDBConnection::close()
with Oracle 8.1.6 causing unhandled exceptions. (QA# 26153)
Creating an RWDBStoredProc via a synonym fails. (QA# 26848)
Error handler gets called when null column is encountered in an aggregate function in ORACLE8 Access Module. (QA# 27103)
Failure in Oracle 8 module with RWDBBulkReader if Buffer is greater than 65536. (QA# 27468)
Enhancement: Add mapping for Oracle 9i datatype TIMESTAMP
. (QA# 27388)
Enhancement: Add mapping for Oracle 9i datatype TIMESTAMP
. (QA# 27875)
Oracle9 Assertion failure when table contains an unsupported datatype. (QA# 27770)
Inserting empty string ("") as NULL
. (QA# 14348, SCOPUS# 8070)
ENHANCEMENT: use << and >> operators to persist RWDBDateTime. (QA# 15188, SCOPUS# 7173)
Sybase-CT: Sybase error 2401 causes RWDBDatabase and RWDBConnection objects to become invalid. (QA# 4622)
RWDBStoredProc isValid()
and status().isValid()
always return true
. (QA# 15163, SCOPUS# 10122)
RWDBTracer does not show RWDBStoredProc execution. (QA# 15183, SCOPUS# 7649)
Small memory leaks at program termination detected by Purify. (QA# 15757, SCOPUS# 11515)
Using a cursor and an updater on the same connection. (QA# 16525, SCOPUS# 9290)
Status of RWDBResult returned from failed insert op is OK
. (QA# 16729, SCOPUS# 10707)
RWDBColumn::type()
incorrectly returns 0 for user-defined types. (QA# 16819, SCOPUS# 10879)
Assertion thrown when Sybase UDT are used with Storedprocedures in 4.01. (QA# 22689)
Sybase nested transactions roll back gives transaction mismatch error. (QA# 22921)
Problem fetching RWDBBlob with a reader in SYBASE. (QA# 24504)
SYBASE yields a 'syntax error' when you try to bulk inserter a vector of size 1. (QA# 25043)
calling ct_cancel(CS_CANCEL_ALL)
is bad and multithread unsafe. (QA# 25095)
Problem using a RWDBCursor. Cannot bind in RWCString to access native type datetime
. (QA# 25149)
SybaseCT AL, core when error handler raise/implement exceptions. (QA# 24942)
Empty strings inserted as nulls with Sybase. (QA# 25578)
Exception causes connection to freeze. (QA# 27427)
In builds with sufficiently compliant implementations of the C++ Standard Library, the new implementation of RWCString is used, which is a thin wrapper for basic_string. The classic implementations are now also always present in the library with the names RWClassicCString and RWClassicWString.
The class RWCollectableWString was added as a parallel class to RWCollectableString (also known now as RWCollectableCString).
RWT*Map classes do not have minElement
and maxElement
member functions. (QA# 12604)
Western European DST rule specifies incorrect boundary. (QA# 22695)
Default locale arguments needed for RWDateTime constructors. (QA# 25391)
Please add RWCollectableWString for wide character strings. (QA# 25442)
Please add RWLocale::stringToNum(const char *, unsigned long *)
method for unsigned long
support. (QA# 25475)
RWCString operator+()
overloads not embedded null safe. (QA# 26222)
non static RWCString::mbLength()
has different behavior than static version. (QA# 26250)
Please add fromAscii()
and fromMultiByte()
to RWWString. (QA# 26252)
RWTime: Some operations on invalid time give a valid value. (QA# 4814)
RWLocaleSnapshot: moneyAsString
and stringToMoney
no longer act as inverse operations when the attribute frac_digits_
is modified. (QA# 8142)
RWCollectable used as virtual base class causes compilation errors. (QA# 12879)
RWe[i|o]stream debug assertion prevents use of strstreams. (QA# 16575)
RWCString::replace
, stack growth failure with 0 length Regular Expression. (QA# 24552)
RWLocaleSnapshot: formatting error when month number prefixed with spaces rather than zeros. (QA# 25435)
RWDateTime::toRWDate()
can give unexpected results due to time zone issues. (QA# 26168)
(trace) Moved and renamed the following exception classes:
RWTraceEventClient::InvalidPointer
RWTraceEventClientImp::TraceClientNotConnected
RWTraceEventClientImp::TraceClientAlreadyConnected
The new names are
These exceptions also inherit from RWxmsg so that they can be treated the same as all other Rogue Wave exceptions. (QA# 24944)
(sync) Corrected RWThreadId::operator=
to set isValid_
flag after threadId_
to prevent erroneous debug assertions from RWMutexLock. Removed unnecessary locking within RWMutexLock to improve efficiency. (QA# 25355)
(sync) Corrected the spelling of a typedef in RWCondition from UnLockGuard
to UnlockGuard
. This makes the class consistent with the other synchronization classes. (QA# 25864)
(pointer) On platforms that support atomic operations, RWSafeCounter is now a typedef for RWAtomicCounter, a wrapper class for native atomic operations. RWAtomicCounter performs roughly 97% better than RWTCounter<RWMutexLock>, and retains the same thread-safety benefits. (QA# 16443, SCOPUS# 11747)
(thread) There was a race condition on program termination involving the shutdown of threads during their normal execution, and the forced shutdown by RWThreadManager. This race condition has been resolved, and it should now be safe to allow RWThreadManager to terminate threads on program exit. (QA# 13078)
(thread) The User Stack thread attribute was not supported on Linux and Compaq Tru64 in previous releases due to limitations in the thread attribute design. These issues have been resolved, and the User Stack thread attribute is available on those platforms. (QA# 25044)
(thread) When specifying the User Stack thread attribute on AIX, users previously needed to specify an additional 4K of space in order for the thread to be able to start. This limitation has been corrected, and the 4K buffer is no longer in use.
Note: This is a behavioral change in RWThreadAttribute. Previously, if a memory address of 0x0000FFFF was passed to setUserStack
, a call to getUserStackAddress
would return a memory address of 0x00010FFF (0x0000FFFF + 4096). It will now return the correct memory address of 0x0000FFFF. (QA# 25044)
(thread) Previously instances of the RWTThreadLocal template were copyable and assignable. Use of the copy constructor or assignment operator would result in an assertion or an exception upon destruction of the copy. This condition has been corrected by making these special functions private. (QA# 25735)
(thread) When calling RWServerPool::requestCancellation
it was possible for one or more of the contained RWRunnableServers to not be completely cancelled before requestCancellation()
returned.
If the RWServerPool instance was destroyed before all of the RWRunnableServers had cancelled, it was possible for them to attempt to reregister themselves with the RWServerPool. This condition has been resolved and all RWRunnableServers are allowed to complete their cancellation asynchronously. (QA# 25365)
RW_DECLARE_STREAMABLE_POINTER
) with pointers to built-in types. Support is built in now.RWInetPort now makes a call to prepare before returning the service name. This is to prevent potentially returning an alias where the primary name is expected.
RWPortalStreambuf disallows both copy construction and assignment to prevent potential memory leaks.
Previously, detaching or attaching a RWPortal on a RWPortalOStream or RWPortalIStream would not reset the stream state. The attach and detach methods have been reimplemented to clear the stream state after resetting the portal.
The MIME Package was added.
(ftp) Added timeout capability. Both RWFtpAgent and RWFtpClient now provide methods for retrieving and setting the network timeout. The timeout is in effect for all network communications. Please see the Class Reference for details. (QA# 11577)
(ftp) Modified RWFtpClient to contain a RWThreadPool to prevent unnecessary construction/destruction of RWThread objects. As a side effect, this change prevents the client from going out of scope before all threads servicing requests have been completed. (QA# 13077, QA# 13078, QA# 15119)
(ftp) RWFtpAgent leaked a socket resource when connecting to a server if either the USER
or PASS
command returned an error . This leak has been corrected. (QA# 16301, SCOPUS# 11794)
(http) Added timeout capability. Both RWHttpAgent and RWHttpClient now provide methods for retrieving and setting the network timeout. The timeout is in effect for all network communications. Please see the Class Reference for details. (QA# 11577)
(http) Modified RWHttpClient to contain a RWThreadPool to prevent unnecessary construction/destruction of RWThread objects. As a side effect, this change prevents the client from going out of scope before all threads servicing requests have been completed. (QA# 13077, QA# 13078, QA# 15119)
(http) Added functions executeServerTrace()
and executeServerOptions()
to the HTTP package. The old versions of the functions (named executeTrace()
and executeOptions()
) did not work with HTTPS servers and have been deprecated. (QA# 25585)
(http) Fixed a potential memory leak and other issues when copy assigning a RWHttpClient instance.
(pop3) Added timeout capability. Both RWPop3Agent and RWPop3Client now provide methods for retrieving and setting the network timeout. The timeout is in effect for all network communications. Please see the Class Reference for details. (QA# 11577)
(pop3) Modified RWPop3Client to contain a RWThreadPool to prevent unnecessary construction/destruction of RWThread objects. As a side effect, this change prevents the client from going out of scope before all threads servicing requests have been completed. (QA# 13077, QA# 13078, QA# 15119)
(smtp) Added timeout capability. Both RWSmtpAgent and RWSmtpClient now provide methods for retrieving and setting the network timeout. The timeout is in effect for all network communications. Please see the Class Reference for details. (QA# 11577)
(smtp) Modified RWSmtpClient to contain a RWThreadPool to prevent unnecessary construction/destruction of RWThread objects. As a side effect, this change prevents the client from going out of scope before all threads servicing requests have been completed. (QA# 13077, QA# 13078, QA# 15119)
(secsock) Previous versions of RWSecureSocket::shutdown()
were replaced with a single version void RWSecureSocket::shutdown(void) const
. This version does not block, but does ensure that secure connections are shut down appropriately . We were previously using the underlying command SSL_shutdown()
incorrectly . The types RWSSLShutdownStatus and RWSSLShutdownType have also been removed.
(secsock) All Secure Sockets Package callback functions have had their signatures changed to have "C" linkage to match what the underlying C cryptography library expects (by adding extern "C"
to the beginning of the declaration) . Secure Sockets Package callback functions written with previous releases of the Secure Communication Module MUST be changed to use "C" linkage . If you fail to do so, you may experience compiler warnings and possibly program failure. This is the only source compatibility issue in this release and it only affects the Secure Sockets Package callbacks.
(https) Added functions executeServerTrace()
and executeServerOptions()
to the HTTP package. The old versions of the functions (named executeTrace()
and executeOptions()
) did not work with HTTPS servers and have been deprecated. (QA# 25585)
Sped UP Fast Fourier Transform method. (QA# 14812)
Implemented cross product in vector class. (QA# 22948)
Eliminated memory leaks in RWSlice & [DComplex|Double]EigHessServer. (QA# 25257)
Corrected missing "eof" in stream operators typed from keyboard. (QA# 25624)
Bug fixed in RWRandGenerator. (QA# 25862)
Removed "double to float" conversion warning. (QA# 25866)
Updated Arithmetic operation with RWDecimal/RWFixedDecimal and native types. (QA# 24278)
Corrected fixeddec.h
private inheritance to remove MSVC warning. (QA# 24268)
Corrected operations between RWFixedDecimal and int
. (QA# 23050)
Corrected implicit precision loss when using long double
data type with RWDecimals. (QA# 23106)
Corrected formatting problem with extra 0 in RWDecimalFormat. (QA# 8415)
Class implementations and functions were added to the DB Interface Module that allow SourcePro DB applications to function through a transaction processing monitor. The following DB Access Modules are XA-ready: DB2, Informix, Oracle8, Oracle9, and Sybase CT. Note: Configuration and support for the DB XA Module must be purchased. Please contact your account representative for more information.
Inserter fails to generate correct SQL.
Explanation: Under some circumstances, the RWDBTable::inserter()
method that takes a schema argument fails to generate the correct SQL statement. Typically, the bug results in a syntax error message from the server.
Action: Bug fixed. QA closed. (QA# 22799)
RWZone argument is ignored.
Explanation: A bug in the RWDBDateTime constructor causes it to ignore the RWZone argument.
Action: Bug fixed. QA closed. (QA# 24167)
OUT
parameter is not returned.
Explanation: The OUT
parameter of a DB2 stored procedure is not returned (or retrieved) if the parameter is type varchar
.
Action: Bug fixed. Varchar
OUT
parameters are now fully functional. QA closed. (QA# 25622)
Stored procedures do not work with smallint
parameters.
Action: Bug fixed. The binding of smallint
parameters is now correct. QA closed. (QA# 25643)
Empty strings are converted to NULLs
on insert.
Action: Bug Fixed. Empty strings are now inserted instead of NULL
. QA closed. (QA# 24107)
Rowcount returned from trigger is incorrect.
Action: Bug fixed. Changes were made to obtain metadata when a trigger is fired. QA closed. (QA# 24289)
The stored procedure output parameter is not retrieved if an error occurs.
Explanation: When a stored procedure consists of a select into an output parameter preceded by an insert that produces an error, the output parameter is not retrieved. The error stems from SourcePro DB not calling SQLMoreResults
to see if there is any additional information in the results set (for example, an out parameter to be set), when an error occurs in earlier lines of a procedure.
Action: Bug fixed. Calls to SQLMoreResults
were added to the necessary locations in the code. QA closed. (QA# 24489)
The MS SQL Server Access Module fails to execute SQL statements involving the DECIMAL
column type.
Action: Bug fixed. Accessing the decimal type now works properly due to modification of the bindParameter()
method. QA closed. (QA# 25278)
Returned values are invalidated.
Explanation: If DELETE
is called in a stored procedure before the return value is returned, the value being returned is invalidated.
Action: Bug fixed. The correct value is now returned. QA closed. (QA# 25415)
SQL commands that return SQL_NO_DATA
do not allow fetching of rowCount
data.
Explanation: The Informix client sometimes returns SQL_NO_DATA
after a successful operation.
Action: Bug fixed. The Informix Access Module now recognizes that a successful operation has occurred even if SQL_NO_DATA
is returned. QA closed. (QA# 23237)
Some return codes are missing from ODBC.
Explanation: When a stored procedure cannot execute a statement in its body, the corresponding error code fails to propagate back to SourcePro DB code. This is somewhat due to a limitation in most ODBC drivers available.
Action: Bug fixed. Upon SQL_SUCCESS_WITH_INFO
, we assume that a severity level higher than 10 associated with the handle indicates an error has occurred, even if the ODBC driver does not report it as an error. QA closed. (QA# 23763)
RWDBCursor reads TEXT
data type values as NULL
.
Explanation: RWDBCursor reads TEXT
data type values as NULL
when a TEXT
field precedes a Char
field.
Action: This bug is no longer detected when testing against the current code base and the latest ODBC drivers. QA closed. (QA# 23880)
The output parameter is not populated when a stored proc is executed using the ODBC Access Module.
Action: Bug fixed. Logic was modified to populate the output parameters even if the stored procedure invocation produces no data. QA closed. (QA# 24418)
ROWID
truncates improperly.
Explanation: Because the size of the ROWID
changed from Oracle 7 to Oracle8, under some circumstances an Oracle8 ROWID
truncates inappropriately when using the Oracle classic Access Module.
Action: Bug fixed. QA closed. (QA# 24615)
RWDBColumn::operator==()
returns false
when column is CHAR
.
Explanation: Using the Oracle8 Access Module with a field of type CHAR
, RWDBColumn::operator==()
returns false
whether or not the entry in the column and the value passed to the operator are equal.
Action: Bug fixed. We altered our implementation to take the special case into account. QA closed. (QA# 15215, QA# 22461)
RWDBRow is missing an equality operator.
Explanation: Because of a change in the inheritance hierarchy, RWDBRow lacks an equality operator; that is, RWBoolean operator==(const RWDBRow& rhs) const
.
Action: Bug fixed. This functionality was added and backwards compatibility restored. QA closed. (QA# 23078)
Length of in/out string parameter is incorrect.
Explanation: Under some circumstances, the length of an in/out string parameter passed to a stored procedure is incorrect after fetchReturnParams()
. The parameter itself is not changed by the stored procedure, but the length is different before and after fetchReturnParams()
.
Action: Bug fixed. QA closed. (QA# 23086)
Authentication functionality is missing.
Explanation: OS-level authentication functionality, which allows a user to leave the RWDBDatabase's user name and password connection parameters empty, was added to version 3.2.1 of the Oracle Access Library, but was inadvertently omitted from version 4 of the Oracle8 Access Library.
Additional information:
For OS-level authentication, the user must be configured at the server. This is generally done by the DBA.
To get a valid connection with OS-level authentication, the user must specify the username as an empty string; the password may or may not be an empty string. The user must provide the name of a server for a valid connection.
Action: Bug fixed. QA closed. (QA# 23231)
High memory usage is increasing on Oracle stored proc calls.
Explanation: The creation of RWDBStoredProc objects leads to increased memory usage. When the RWDBStoredProc is deleted, the memory is not freed. The memory is freed when the RWDBDatabase object is deleted.
Action: Bug fixed. The memory is now freed when the RWDBStoredProc is deleted . QA closed. (QA# 23401)
Reading of a column stops at embedded nulls.
Explanation: When fetching as a string, the fetched value would stop at the NULL
.
Action: Bug fixed. The fetch is now done up to the exact length of the fetched value. The embedded NULL
no longer ends the fetched value. QA closed. (QA# 24495)
Error ORA-1405 causes the status of RWDBOracle8SystemHandleImps to be set to serverError
, which invalidates a fetch.
Explanation: When performing a fetch(
) on an RWDBOracle8HandleImp, after a query that returns NULL
CLOB
columns, the database sends an error message:
ORA-01405: fetched column value is NULL
This is interpreted as an error (status set to RWDBStatus::serverError
), and results from the fetch are invalidated, even when it is acceptable for the results to contain NULL
values.
Action: Bug fixed. The binding of null indicators was corrected for the OCIDefineByPos
call for CLOBs. QA closed. (QA# 25348)
Lost connections to DB result in memory growth.
Explanation: Zombie processes are created and not released on the server side when the client’s connection is lost (this is a catastrophic connection loss), until the program terminates. The zombie processes remain even though the program reestablishes a good connection to the database.
Action: Bug fixed. When sessionBegin()
fails, serverDetach()
is now called. QA closed. (QA# 26448)
Temp tables in Sybase are not accessible through SourcePro DB.
Explanation: Temporary tables are stored in a different system location. Previously DBTools.h++ did not check the temporary table storage location for their existence.
Action: Bug fixed. The logic was updated to check for tables in the temporary storage location. Temporary tables are now accessible via SourcePro DB. This enhancement was also added to the code base for the MS SQL Server Access Module. QA closed. (QA# 14866, QA# 13671)
executeSql()
fails when executing a stored proc that contains a union starting with SELECT NULL
.
Action: Bug fixed. We now check to see that the data type returned maps to the same C data type as the user type returned. QA closed. (QA# 15467)
Results aren't valid from stored procedure using update with tsequal.
Explanation: In general, passing back a timestamp as a part of result data from a stored procedure caused errors when reading back any subsequent data from the stored proc.
Action: Bug fixed. Method requiresResultSetFetch()
was added to the function RWDBSybCtLibHandleImp::handleResultTypes()
, to ensure that a result from a call to tsequal is fetched as a result set, and not an output parameter. QA closed. (QA# 16499)
The milliseconds portion of the datetime
column is off by 3 when updated.
Explanation: Sybase times are stored to a precision of 1/300th of a second. Translating this to milliseconds and back was causing a noticeable change in "equal" values sent back to the database.
Action: Behavior optimized. A preferable rounding method was found to minimize the magnitude of error in the translation. Both QA incidents closed. (QA# 24354, QA# 24413)
Sybase CT Access Module is not enforcing login timeouts.
Explanation: The login timeout feature doesn't work with the Sybase CT Access Module. Control is not returned to the user (or SourcePro DB) until the underlying network timeout period expires, when attempting to establish a connection.
Action: Bug fixed. QA closed. (QA# 24424, QA# 24423)
RWDBMultiRow::bufferAt()
function is undocumented.
Action: Bug fixed. Documentation for RWDBMultiRow was updated to account for the bufferAt()
method. QA closed. (QA# 24518)
After timeout occurs, connection is dead and unusable.
Explanation: When a timeout occurs, the connection is marked DEAD because of a server timeout and not reopened.
Action: Added logic so that the connection can be reopened after it has been marked dead by the client because of a server timeout. QA closed. (QA# 24875)
Examples hang.
Explanation: The SybaseCT Access Module examples hang at the end of their execution on multithreaded builds for the Gnu compiler on Solaris.
Action: Bug fixed. Global CS_CONTEXT*
maintained by the RWDBSybCtLibUtilities class was moved into the database implementation class. QA closed. (QA# 25294)
SourcePro DB crashes during large-scale multithreading.
Explanation: In a multithreaded application running on Linux, a collision occurs between the threads, causing a crash. The threads are repeatedly executing a very simply SQL query through executeSql
.
Action: Crash was caused because of a client library limitation. QA closed. (QA# 25914)
The following operators, +=, -= and *=, have been added to the RWDecimalPortable class. (QA# 23985)
RWCRegexp did not properly handle the ']' and '^' characters inside a bracketed expression. (QA# 4881)
The case of strings affected the results of case- sensitive string comparisons, even when one of the characters being compared was not alphabetic. For example, given the following strings:
With exact comparisons, s1 < s2 < s3
With ignoreCase compares, s1 < s2 and s1 == s3 and s3 < s2
A new comparison type, ignoreCaseStrict
, has been added such that when comparing s2 and s3, s2 < s3. (QA# 4884)
An assertion fired when resizing RWWString to 0 bytes. (QA# 8309)
The string representation of LONG_MIN
was not correctly converted by RWLocale::stringToNum()
. (QA# 8593)
With large messages, the RWMessage constructor accepting variable length argument lists could cause a program to core by overrunning a fixed length, stack allocated buffer. (QA# 13644)
Element removal and indexing operations on RWTValSortedVector
could fail in certain cases. (QA# 13701)
Generating string representations of double-precision floats using RWLocale::asString()
was resulting in memory access violations when the requested precision required more than 255 characters for the formatted output. (QA# 13749)
RWTimer is corrected to provide user and kernel times in both Windows and UNIX environments. (QA# 13775)
Ordered vectors could not be used with template arguments on which the comma operator was overloaded. (QA# 14665)
Endian streams could not be used with strstreambuf objects in Windows. (QA# 14955)
RWBTreeOnDisk::entries()
was not always accurate. (QA# 14984)
The performance of RWCString::replace()
is improved by guarding a call to memmove()
when it is not necessary. (QA# 15986)
The performance of the conversion from RWCSubString to RWCString is improved through guards against 0-length memcpy
operations. (QA# 15987)
In the southern hemisphere, Daylight Savings Time starts later in the calendar year than it ends. For such zones, in the first year in which DST was effective, the period before the DST end date was incorrectly reported as observing DST. (QA# 16577)
Portable ASCII streams failed in certain locales when strings containing 0xFF were stored and then then retrieved . The strings could not be retrieved because of the unescaped 0xFF. EOF was reported upon reading the 0xFF. (QA# 22257)
The ']' and '}' characters could not be escaped with RWCRExpr, as our documentation indicated they could. (QA# 22516)
Use of const
types as template arguments for RWTPtrVector would not compile on some platforms. For example,
could have resulted in a compilation error. (QA# 22692)
RWWString did not properly convert wide character strings to multi-byte strings and vice-versa. (QA# 23270)
A number of special characters could not be escaped in RWCRegexp, as described in the documentation. This set included '[', ']', '^', and others. (QA# 23302)
Use of operator<<(ostream& os, const RWCString& s)
could cause problems in Windows GUI applications. (QA# 23965)
RWTime objects created with large numbers of seconds (greater than 59) are not correctly evaluated for DST. (QA# 24179)
The stream insertion operator for RWCString improperly managed strings with embedded NULLs
. (QA# 24632)
RWWString::toMultiByte()
and the conversion constructors from multibyte strings did not correctly convert from multi-byte strings to wide-characters strings and vice-versa. (QA# 25135)
In RWCString's strXForm()
helper, it was found that conversion errors in calls to strxfrm()
were not caught . This allowed for chunks of memory to be requested that were so large as to cause a program to abort. (QA# 25259)
RWLocaleSnapshot's helper, getAmOrPm()
, parsed for the strings, "AM" and "PM", rather than parsing for the locale's representation of AM or PM. (QA# 25261)
RWLocaleSnapshot::stringToTime()
looked for ':' and '.' rather than locale-specific separators while parsing a time string. (QA# 25262)
RWDateTime::julianDay(double)
does not correctly assign a value to an RWDateTime object . While the date may be correct, the time is not correct. (QA# 25341)
Added explicit destructors for all classes. The new destructors add trace macros where appropriate to improve the completeness of output from builds with Execution Tracing enabled.
(trace) In RCB, specifying the trace detail level has been split into two questions . The first question allows you to specify the trace detail level for trace-enabled Rogue Wave packages. The second allows you to set the trace detail level for user code. We recommend that you leave the detail level for trace-enabled Rogue Wave packages at its default (Disabled) for improved performance and compile times.
Note: This change is not compatible with buildspecs generated with prior versions of RCB. Attempting to use old buildspecs will result in trace being disabled for both trace-enabled packages and user code.
(trace) Removed a minor race condition in RWThreadManagerImp::instance()
. If two threads invoked this function for the first time it was possible for one of the threads to return with instanceHandle_
before it had been fully initialized in the other thread. (QA# 24881)
(trace) Eliminated a potential memory leak in RWTraceManagerImp.
(trace) Addressed various timing issues in RWTraceEventClientImp and its derived classes.
(sync) Updated fwd.h
and sync.h
to ensure that all classes are available when these headers are used. (QA# 25245)
(pointer) Updated fwd.h
and pointer.h
to ensure that all classes are available when these headers are used. (QA# 25245)
(itc) RWTPC*BufferBase read()
and peek()
methods were inefficiently performing extra copies of the objects in the queue before returning them to the user. The number of copies has been reduced. (QA# 4547)
RWPortalIStream and RWPortalOStream previously initialized their base istream and ostream with the pointer value 0 . On some platforms the 0 value was interpreted as a file descriptor instead of a null pointer, resulting in a memory leak . The pointer is now explicitly cast to the correct type, and the memory leak has been eliminated. (QA# 15968)
Updated fwd.h
and network.h
to ensure that all classes are available when these headers are used. (QA# 25245)
(http) Updated fwd.h
and http.h
to ensure that all classes are available when these headers are used. (QA# 25245)
(http) RWHttpSocketClient had the potential of blocking for long periods of time in a call to ::getpeername()
. This primarily occurred under heavy threading. We have replaced the call to ::getpeername()
with code that does not suffer from this limitation. (QA# 25268)
(http) Added support for the HTTP CONNECT
method from RWHttpClient.
Addition of the HTTPS Package.
(secsock) RWSecureSocket::shutdown()
was modified so that it supports blocking until the complete shutdown handshake is complete. This prevents abnormal program termination when a socket may be shutdown or closed before the handshake is complete.
RWSecureSocket::shutdown()
still provides functionality for performing asynchronous (non-blocking) shutdowns. However, by default it will now block on shutdown.
(secsock) Updated fwd.h
and secsock.h
to ensure that all classes are available when these headers are used. (QA# 25245)
toGenMat
under Solaris (QA# 24827)/Op
option for IEEE compliance in lapack examples in Visual C++ With optimization set, the compiler keeps floating point values on the math coprocessor's stack, represented in 80 bit . These lose precision when moved back to memory (32bit for float, 64bit for double). Note, while use of /Op
retains precision, programs compiled with it may be slower and larger than one compiled without it.Rounding an RWDecimal<T> object produces incorrect results (QA# 25407)
Bug: Round method of RWDecimal combined with assignment gives 0.0. (QA# 4744)
Enhancement: Add support for DB2 BIGINT type
Action:
Bug fixed. The BIGINT type is new to DB2 5.2. The BIGINT type mapping was added to the DB2 Access Library. QA closed. (QA# 16850)
RWDBStoredProc causes a crash on program exit
Explanation:
A global RWDBStoredProc will crash during deallocation when it goes to clearAndRemove()
its buffer registry. The registry was already cleaned when main was deallocated.
Action:
Bug fixed. Buffer registry is no longer used. QA closed. (QA# 23192)
Incorrect bind type for loadTypeInfo()
function in CLI based access libraries.
Explanation:
The data sent for a parameter or column was incompatible with the data type of the associated table column.
Action:
Bug fixed. Respecified the output binding through SQLBindCol
and SQLGetData
. Respecified the input binding through SQLSetParam
and SQLBindParameter
. QA closed. (QA# 24901)
Application deadlocks because SQLEndTran
not called
Explanation:
There is currently a bug in the function RWDBConnection::commitTransaction()
. The current call to SQLSetStmtAttr()
is insufficient to close any open transactions.
Action:
Bug fixed. Added SQLEndTran()
code similar to code in rollbackTransaction()
. QA closed. (QA# 25186)
RWDBStoredProc::execute()
causes a syntax error
Explanation:
When the RWDBStoredProc object is created, it is passed the name of the stored procedure without the parentheses. The parentheses are supposed to be added in with the name in the function RWDBInformixStoredProcImp::asString()
, but if the stored procedure has no parameters, the parentheses are omitted.
Action:
Bug fixed. Moves the prepending and appending of the listBeginner and listEnder outside the test for whether or not the stored procedure has parameters. QA closed. (QA# 22804)
String truncation occurs when inserting data using RWDecimalPortable
Action:
Bug fixed. Default values were used, which were sometimes wrong. SQLDescribeParam
is now used to determine correct p
and s
values. QA closed. (QA# 24089)
Incorrect SQL Server Access Module data type mapping of tinyint data type
Explanation:
The documentation does not accurately describe one of the data type mappings when retrieving data from an MS SQL Server.
Action:
This was a doc bug. It has been corrected in the SourcePro DB 5.0.1 release. The Microsoft SQL Server Access Manual now correctly states that the type tinyint maps to char
. QA closed. (QA# 24180)
RWDBulkInserter to Sybase through ODBC with RWDecimalVector fails
Explanation:
Cannot use RWDBBulkInserter to insert RWDecimalVector into Sybase using ODBC access library
Action:
None; driver limitation.
Simple workaround: Use RWDBOSql with RWDBTBuffer<RWDecimalPortable> or a cached inserter. QA closed. (QA# 4548)
Added SQLExecDirect in CLI-based modules
Explanation:
Using DBTools.h++ v4.0.1, when executing a stored procedure on MS SQL Server v6.5 through RWDBConnection::executeSql
,the keyword 'execute' is needed.
Action:
Bug fixed. We now use SQLExecDirect
on all ODBC variant libraries for performance. QA closed. (QA# 22914)
RWDBBulkReader cannot read null values from a table
Explanation:
Null int values read as -842150451 instead of 0.
Action:
Bug is no longer detected in current code base. QA closed. (QA# 23147)
RWDBSchema::columnName()
returns a '?' instead of the parameter name for OUT
parameters in a stored procedure
Explanation:
When a schema retrieved from a stored procedure with the params()
function has columnName()
called with the index of a column that is an OUT
parameter with an address shifted in, columnName()
returns a question mark instead of the column name.
Action:
Bug fixed. The change was to clone the RWDBColumn that was added to the InserterEntry. QA closed. (QA# 24407)
Unable to retrieve LONGVARCHAR in ODBC when not last column
Explanation:
Reading a row with RWDBReader from a table with a column of type SQL_LONGVARCHAR returns an empty string instead of the correct data when the type SQL_LONGVARCHAR is not the last column.
Action:
Bug fixed. Modified the logic in RWODBCLibSystemHandle::getDataNonLast()
. (QA# 24521)
Columns in RWDBSchema returned by the params()
method of RWDBStoredProc are not fully populated
Explanation:
The method makeColumnFromParamData()
in odbsproc.cpp does not fully initialize the RWDBColumn it makes from the parameter data. It does not initialize the native type member.
Action:
Bug fixed. Code was added to initialize the nativeType
. QA closed. (QA# 25177)
Assertion failure occurs when using stored procedure with no parameter within a package
Explanation:
The Oracle Access Module uses the Oracle OCI function odessp()
to retrieve stored procedure parameter information in the method RWDBOracleStoredProcImp::getParams()
from orasproc.cpp. The return values of this function in different circumstances were not being accounted for.
Action:
Bug fixed. Added logic to correctly detect zero parameters. QA closed. (QA# 23817)
Problem running examples on HP-UX 11.00
Explanation:
An error with the tutorials makefile when running against Oracle 7 on HPUX 11 caused the tutorials to crash.
Action:
Bug fixed, QA closed. (QA# 24641)
Failure when executing Stored Procedure that has type LONG output
Explanation:
Using the Oracle8 Access Library, executing a stored procedure that returns a LONG data type will cause an exception/core dump because callbackBindIn does not work for the LONG type OUT
parameter.
Action:
Bug fixed. Added proper callbackBindout()
function to only deal with OUT
or INOUT
type LONG parameter for stored procedure. QA closed. (QA# 23032)
Assertion failure when an Oracle function returns a reference cursor
Explanation:
When reference cursors were passed as OUT
parameters, the system attempted to allocate a predefined buffer space, resulting in assertions.
Action:
Bug fixed. Oracle and Oracle8 Access Modules were changed to recognize return values of reference cursors and to handle them differently from other data types. QA closed. (QA# 23117)
Server message status not reported correctly
Explanation:
Server message numbers 5701, 5703, 5704 are not reported as RWDBStatus::ok
.
Action:
Bug fixed. Server messages 5701, 5703, 5704 are now reported as RWDBStatus::ok
. QA closed. (QA# 22977)
Enhancement: Add mapping for Sybase timestamp data type
Action:
Bug fixed. In the method RWDBSybCtLibUtilities::toValueType()
, RWDB_SERVER_UT_TIMESTAMP
was added to return a BLOB type. QA closed. (QA# 23276)
RWDateTime is a new class which has been added to the Essential Tools Module, it offers:
an extended range over RWTime (hundreds of thousands of years storing milliseconds as a 64 bit integral type).
interoperability with RWDate and RWTime, and an interface that will be familiar to users of these classes.
predefined sentinel values (and user defined values) for date comparisons.
Note: The incrementDay
and decrementDay
member functions appearing in the beta release have been removed, due to what turned out to be confusing semantics. Equivalent functionality may be obtained by using the incrementHour
or decrementHour
member functions with a parameter of 24. It is important to realize that if this operation crosses a DST boundary an outputted value can adjust for DST offset. This can make the output one less or more hours than the increment or decrement parameter.
RWCString now has a new implementation when building on any relatively recent implementation of the C++ Standard Library. This change was link-incompatible . This implementation is a tight wrapper for the Standard Library's basic_string, and offers:
better speed efficiency in interoperability operations with basic_string.
a significant increase in the rapidity of common string operations when used with the RW implementation of the C++ Standard Library.
RWClockTimer is a newly added class. It measures elapsed wall clock time and has the same interface as RWTimer.
The RWDecimalPortable class is a new addition. All other RW products now use this edition of the class. The RWDecimalPortable class represents an arbitrary precision number. Since its implementation is string based its most useful for I/O operations.
Added support for the streaming of long long
and long double
primitive types when supported by your compiler. Note, on Windows we use __int64
for long long
. Note also that win32 long doubles
are the same size as regular doubles
, so you will not be able to exchange bstream and estream data between Windows and platforms implementing long doubles
as bigger than a double. Pstreams can of course still be used as long as the values exchanged fall within the receiving platforms range. This change was link-incompatible.
A link-incompatible fix for certain cross-platform RWe[io]stream persistence problems was introduced in 7.0.3. It was guarded with the RW_FIX_XSIZE_T
macro and defaulted to off. In this release this fix has become a permanent part of the code base.
RWTValDlist/RWTValSlist iterators disallow item modification by returning T
instead of T&
. (QA# 14919, SCOPUS# 1151)
RWTBitVec operator&
member function not const
correct. (QA# 16704, SCOPUS# 1656)
Template classes use of DLL export decorations is inconsistent. (QA# 12618, SCOPUS# 2121)
RWT*Map classes do not have minElement
and maxElement
member functions. (QA# 12604, SCOPUS# 2533)
rwmin
and rwmax
should be overloaded for the long
type. (QA# 14916, SCOPUS# 3079)
Access to addReference()
removeReference()
without a mutex in RWReference desired. (QA# 15675, SCOPUS# 3158)
RWASSERT
macros don't allow overriding definitions (QA# 12938, SCOPUS# 6100)
Enhancement request: add insertAndLocate()
member functions for RWT[Val|Ptr]SortedVector. (QA# 13751, SCOPUS# 7805)
RWLocale interface needs additional accessor functions. (QA# 13421, SCOPUS# 9354)
RWTimer doesn't track CPU time correctly in Windows. (QA# 16707, SCOPUS# 9388)
RWCString operator[](size_t)
potential for ambiguity at compile time. (QA# 16700, SCOPUS# 9599)
Override putString()
for correct handling of endian streams. (QA# 14985, SCOPUS# 9610)
RWFile::Erase()
changes mode of file that was opened in text mode. (QA# 14666, SCOPUS# 9957)
RWLocaleSnapshot::stringToDate()
fails in "Juin" in French locales. (QA# 14339, SCOPUS# 10347)
rw_iomanip performance enhancement, do not allow copy construction on ios or ostream objects. (QA# 15057, SCOPUS# 10907)
RWTValSlist::last
incorrectly returns a copy instead of a reference. (QA# 15990, SCOPUS# 11386)
Enhancement request to add removeKeyAndValue()
to RWTPtrHashDictionary. (QA# 14476)
Enhancement request to add removeKeyAndValue()
to RWTValSlistDictionary. (QA# 14956)
Warning emitted for RWTValSlistIterator::operator++
(postfix). (QA# 14934)
RWCString header fails to compile when char
type passed to index method as a search pattern. (QA# 24029)
RWCString incorrectly converts to RWWString in Japanese locale. (QA# 23157)
RWWString::RWWString(wchar_t*)
fails in some cases. (QA# 23270)
(itc) The Visual Age 5.0 compiler does not handle implicit instantiation of default assignment operators properly in some non-trivial cases. This dependency could cause Illegal Instruction failures in applications that depended upon ITC's RWTPCValQueueGuardedPrioritized<> class.
We are working with IBM in order to find a resolution to this problem, and we have implemented a workaround to prevent the failure when using the RWTPCValQueueGuardedPrioritized<> class. (QA# 24882)
The previous release had various local includes brought in without fully qualifying their path (i.e. #include "pkgdefs.h"
) . With some compilers, this would cause problems with the lookup path for header files, which must be explicit. The code was modified to explicitly include the required headers (i.e. #include <rw/trace/pkgdefs.h>
). (QA# 22830)
The Threads Module now uses the new Essential Tools Module class RWUserTimer to track the passage of wall clock time in functions that accept a timeout . Previously, the Threads Module was using the RWTimer class to track this time, but because RWTimer measured elapsed CPU time instead of real time, users code could remain in a timeout function much longer than expected, especially on systems under heavy load.
This does not guarantee that functions will return immediately at the end of a timeout specification . As documented in the Class Reference, RWCondition must re-acquire the condition mutex before it can return from a wait call . If there is high contention for the mutex, it may take a significant amount of time before the RWCondition can return. Because RWCondition is used in a variety of other classes in the Threads Module (including RWSemaphore and RWFIFOMutexLock), timeout functions in these classes may also experience additional delays while the underlying RWCondition is re-acquiring the condition mutex. (QA# 16708, SCOPUS# 11041)
(trace) Trace is disabled by default . Because the Trace package adds additional overhead to applications, Trace is disabled and compiled out of the library by default . You will have to specifically enable tracing in order to gain this functionality.
(trace) Some of the trace macros were being mapped to other macros incorrectly. This has been fixed. (QA# 23489)
(threxcept) Some of the macros defined in RWTHRxmsg.h
had extraneous "" characters in the macros . While most compilers ignored these characters, some compilers would report errors when processing the macros. The extra "" characters have been removed. (QA# 23345, QA# 23715)
(sync) The RWBarrierExample failed to build under HP-UX with the aCC compiler. The failure was caused by a header file that should not have been included on the systems that defined RW_THR_CANT_EXTRACT_TEMPALTE_ARGS_FROM_SIGNATURE
, such as HP-UX with aCC 1.2.1. The header file has been replaced with one that is compatible across other platforms. (QA# 22509)
(sync) On Linux, some programs involving RWCondition (or classes that use RWCondition) would assert while running within the debugger. This was a result of Linux returning an EINTR
message from pthread_cond_timedwait()
. This result was not expected because other POSIX implementations do not return EINTR
from this function. We now correctly handle the situation where EINTR
is being returned on Linux. (QA# 4848)
(sync) RWThreadId exhibited a race condition where a mutex that was being rapidly acquired and released would assert in debug mode, indicating that the mutex was being recursively acquired. This problem has been corrected, and RWThreadId now behaves correctly in both the debug and release modes. (QA# 23610)
(sync) The previous release had various local includes brought in without fully qualifying their path (i.e. #include "pkgdefs.h"
). With some compilers, this would cause problems with the lookup path for header files, which must be explicit. The code was modified to explicitly include the required headers (i.e. #include <rw/trace/pkgdefs.h>
). (QA# 22830)
(pointer) The RWTOnlyPointer and RWTCountingPointer classes did not invalidate the pointer after deleting it in the destructor. These classes have been fixed so that the pointer is invalidated upon destruction. (QA# 24402)
(pointer) Some of the pointer examples would produce harmless warnings on MSVC similar to:
warning C4275: non dll-interface class 'RWTCountinBody<class RWMutexLock>' used as base for dll-interface class 'RWBodyBase'
This is a harmless warning and has been disabled via conditional pragma statements in the relevant code. (QA# 23160)
(itc) RWTPC*::tryRead()
and RWTPC*::tryPeek()
would throw an RWTHRClosedException if the object had been closed and if data was still available to be read. According to the Class Reference, the object should return the next available entry and should throw only the RWTHRClosedException when the object is both closed and empty. RWTPC* now behaves as described in the documentation. (QA# 22802)
(itc) RWTPC*::tryRead()
, RWTPC*::tryWrite()
, and RWTPC*::tryPeek()
failed to execute empty and full callbacks as documented in the class reference.
These functions have been fixed so that the proper callbacks are called. (QA# 22806)
(itc) RWTPCValStackPrioritized and RWTPCValStackGuardedPrioritized would enqueue items in a queue-like fashion if their priority was equal to the lowest priority currently in the stack. This has been corrected so that entries are enqueued in a stack-like fashion. (QA# 22865)
(thread) Some of the macros provided for backward compatibility with Threads.h++ 1.x were not defined in the previous release. The following macros have been added to correct this problem.
(in rwtMakeRunnableFunction.h)
#define rwMakeRunnableFunctionGA3 rwtMakeRunnableFunctionGA3
#define rwMakeRunnableFunctionMA3 rwtMakeRunnableFunctionMA3
(in rwtMakeRunnableIOUFunction.h)
#define rwMakeRunnableIOUFunctionGA3 rwtMakeRunnableIOUFunctionGA3
#define rwMakeRunnableIOUFuncitonMA3 rwtMakeRunnableIOUFunctionMA3
(in rwtMakeThreadFunction.h)
#define rwMakeThreadFunctionGA3 rwtMakeThreadFunctionGA3
#define rwMakeThreadFunctionMA3 rwtMakeThreadFunctionMA3
(in rwtMakeThreadIOUFunction.h)
#define rwMakeThreadIOUFunctionGA3 rwtMakeThreadIOUFunctionGA3
#define rwMakeThreadIOUFunctionMA3 rwtMakeThreadIOUFunctionMA3
(QA# 22621)
(thread) It was possible in previous versions for a cancel request to a runnable server to miss a runnable that was in the process of being dequeued and executed. This resulted in a runnable executing outside of the control of the RWRunnableServer, which could result in deadlock or errors in user code. The current release includes additional checks to insure that a dequeuing runnable is canceled when the RWRunnableServer is canceled. (QA# 16764, SCOPUS# 11124)
(thread) In previous versions of the Threading package, RWRunnable::join()
could return before callbacks associated with the runnable had completed execution. In this case, if a new thread was started on the runnable, then it was possible for the new thread to be signaled of the old thread's change in execution state, which could cause an assertion failure or exception to be thrown. To correct this problem, RWRunnable::join()
now waits for the callbacks to complete before returning. (QA# 22368)
(thread) Attempting to include the header file for RWTThreadLocal before any other headers could result in compiler errors due to a missing header. RWTThreadLocal's header has been fixed so that this header can be included first. (QA# 22679)
(thread) RWServerPool would intermittently core during program termination if it was not explicitly joined. This was due to a race condition in which RWRunnableServers would have callbacks invoked on them after they had already been terminated.
RWServerPool has been fixed. It removes all internal callbacks before destructing. (QA# 22995)
(thread) RWRunnableImp was inadvertently dereferencing a null pointer internally in some situations. Additional measures were taken to prevent this from occurring. (QA# 23286)
(thread) At some point in the RWThreadImp code, an RWTHRInternalError would be created but not thrown after an assertion call. This has been fixed, and the exception is now thrown. (QA# 24004)
RWInetHost previously treated a null-string constructed object the same as a default constructed object. This was counter-intuitive when compared with the behavior of RWInetPort, which would throw when passed a null string. RWInetHost now also throws. This may break existing code if it is using a null string to indicate any address. Users who were depending on this side-effect should instead use a default constructed RWInetHost. (QA# 24871)
Winsock 2 is now supported with the Networking package on Windows platforms. You must specify that you plan to use the Winsock 2 library during the build process. (QA# 12716, SCOPUS# 9346)
Because windows.h
attempts to automatically include the Winsock 1.1 header file by default, you must take one of the following precautions when building your application.
Define _WIN32_WINNT >= 0x0400
before any header files are included in your application. This is most conveniently done on the command-line while building the application. Defining this macro may have additional impacts on your code. See the Microsoft documentation for more information on these impacts.
Define WIN32_LEAN_AND_MEAN
before any header files are included in your application. The WIN32_LEAN_AND_MEAN
macro causes the windows.h
header file to omit the winsock header file, along with some additional header files. If functionality in your application depends on some of the header files omitted by WIN32_LEAN_AND_MEAN
, you will need to include those files explicitly.
Include winsock2.h
before any other header files in your application. The header file winsock2.h
sets the appropriate guards so that attempts to include winsock.h
will do nothing. This method is more error-prone then the previous two suggestions.
RWPortalIStream previously could not execute and attach to a new portal if the previous portal had become invalid and data still needed to be sent. Attempts to reattach the stream to a new portal would cause the stream to attempt to sync the current data, resulting in an exception being thrown from the underlying portal.
The attach()
, detach()
, and setPortal()
methods now take an optional parameter that allows you to force a detach to occur. For example:
RWPortalIStream istrm(portal);
istrm.detach( ) // Will throw an exception if portal is invalid
istrm.detach(TRUE) ; // Will attempt to sync, however any exceptions that
// are thrown are ignored.
(QA# 23845)
RWSockAddrFactory and RWInetAddrFactory had potential race conditions where initializing the factory from two separate threads could result in an extra memory allocation that would never be freed, or a factory not having valid memory associated with its pointer.
Additional checks have been added to prevent this from occurring. (QA# 15999, QA# 22189, SCOPUS# 11633)
In previous versions of the library, classes that accepted a string in order to construct an address object would automatically convert the string to lowercase before processing. This can cause problems with some name-resolving systems that are case-sensitive.
These classes no longer convert input strings to lowercase.
This may cause issues on some Unix systems where service names are case sensitive, and the conversion to lowercase is no longer occurring. If in your code you are using the string "FTP" to access the "ftp" service, you will need to change your code to use the case-correct service name. (QA# 11576, QA# 23318, QA# 23761, SCOPUS# 6770)
Constructing an RWSockAddr from a sockaddr
could result in a SIGBUS
on some platforms because of byte alignment problems in the data. This has been corrected. (QA# 24021)
RWSockAddr's operator<<
and operator>>
were incompatible (an object streamed out via << could not be read in with >>). These functions have been modified so that a RWSockAddr streamed out through << can be read back in to a RWSockAddr through >>. (QA# 23321)
Reentrancy issues concerning gethostbyname
and similar functions were not sufficiently addressed in previous versions of the library. Additional measures have been taken to ensure that calls to these functions are thread-safe. (QA# 14363, SCOPUS# 9973)
In previous versions, RWSocket::recvfrom()
with a sockaddr
argument would set the socket type to STREAM
, even if the associated socket was of type DGRAM
. This has been corrected so that the socket type is determined by the RWSocket object. (QA# 14358, QA# 16790, SCOPUS# 7034, SCOPUS# 11950)
If the functions closesocket()
and ioctlsocket()
are defined using macros, the Networking package will undefine them. Some third-party libraries define these functions to call close()
and ioctl()
respectively for cross-platform compatibility. These macros conflict with class member functions of the same name in the Networking package, and will cause failures if defined as macros.
RWSocket::recvAtLeast()
threw an RWSocketError exception if the amount of data read from the socket was 0 . Because RWSocketError was constructed with the last error reported by the Secure Sockets library, it could throw an inaccurate exception if the 0 return value was not caused by an exception (i.e. connection closure).
RWSocket::recvAtLeast()
now throws an RWNetCantRecvError if the return value from RWSocket::recv
is 0.
Also, RWSocket::sendAtLeast()
now throws an RWNetCantSendError if the return value from RWSocket::send
is 0.
Previous versions did not provide a mechanism for stopping an RWPortalIOStream request that was blocked in an underlying socket call. With the addition of the RWTimedPortal class, you can now augment a normal RWPortal instance with a timeout. The following code throws an exception after 1 second.
RWPortal portal = // ... some portal initializer ...
RWTimedPortal tPortal(portal, 1000) ; // 1 second timeout
RWPortalOStream strm(tPortal);
strm << "hello" << flush ; // throws a timeout exception after 1 sec.
Note: The original RWPortalImp associated with portal most support timed operations for the above code to work. If this functionality is not provided, an RWTimeoutNotImplementedError exception is thrown. (QA# 11587, SCOPUS# 8237)
In previous versions, attempting to bind twice to the same port on Windows would succeed, and the servers would be queued up on the port (i.e. when the first server completed, the second server would start listening on the port). This behavior was in conflict with most Unix systems, and has been modified to match the behavior of the other platforms. (QA# 11548, SCOPUS# 6722)
In previous versions, RWSocketError would not check the return value from strerror
to verify that a non-null value was returned. This has the potential of causing assertions in RWCString if a null value is inserted. The RWSocketError code now verifies that the return value from strerror
is non-null before passing it to an RWCString. (QA# 23262)
(ftp) A race condition in RWFtpClient occurred when a 200 response from the server is received at the same time that the data connection is being established. This problem has been corrected.
(http) Establishing a connection with a timeout through an RWHttpSocketClient could throw an incorrect exception under some circumstances. The problem was related to an attempt to close the underlying socket twice.
The double close problem has been addressed, and the correct RWNetOperationTimeoutError exception is thrown. (QA# 24643)
(http) The timeout parameter for RWHttpSocketClient::connect
was incorrectly being passed as seconds to the underlying select, instead of being passed as milliseconds. This has been corrected, and milliseconds are passed to the underlying select call. (QA# 24871)
(internet) RWDirEntry previously would assert when attempting to construct a date if the Essential Tools macro RW_CENTURY_REQD
was defined. This has been corrected. (QA# 4817, QA# 4984)
(internet) RWDirEntry would return a year of 1996 for any files that had been updated within the last six months. This has been corrected, and RWDirEntry returns the correct year for the file.
This fix assumes that the client and server machines have approximately the same time because we must determine the year based on the current machine's time. If the difference in time between the client and server is significant, it is possible that the year reported may be incorrect (+/- one year) (QA# 4818)
(internet) RWURL would decode a URL string before returning it from the path()
or search()
member functions. This could cause problems if the return value from these functions was used to generate a request.
These functions now leave the string encoded. (QA# 11111, SCOPUS# 6719)
(internet) RWURL failed to properly decode escaped octets with hexidecimal digits A through F . RWURL has been updated to properly handle these escaped sequences. (QA# 22625)
(internet) RWURL removed a trailing slash from a URL when returning the path portion of the URL. This could cause problems when attempting to use the path to request a document from a web server. RWURL has been updated to include a trailing slash if the original URL string contained one. (QA# 11594, SCOPUS# 6348)
(internet) The RWReply class hierarchy previously had a protected pure virtual member readFromPortal
that took an RWSocketPortal parameter. The parameter type has been changed to be an RWPortal.
This should not cause any problems for users of this library, but if you have derived a class from RWReply or RWNumReply, then that derived class must declare/define readFromPortal
to take the correct parameter type. Failure to do so should cause a compile time failure.
(internet) RWNumReplyLine::operator<
produced warnings on some systems due to a bool
< bool
comparison. Because this sort of comparison is not a valid way of determining total ordering, the comparison has been replaced with one that makes more sense. (QA# 13082, SCOPUS# 9661)
(ftp) When establishing a passive connection with the server without specifying a port, the FTP client would attempt to find a random port on the system, send a PORT
command to the FTP server, and then attempt to bind to the local port. This is an inefficient process on systems where few ports are free because failed bind attempts would result in multiple protocol PORT
commands being sent to the FTP server.
The port negotiation code has been rewritten to verify that we can bind to the local port before issuing the protocol PORT
command to the server. (QA# 23131)
(ftp) The FTP client may hang intermittently when attempting to perform a STOR
or RETR
command to the server, if the server has problems binding to the data port on the local machine. The server would send back a 425 protocol sequence on the command socket to indicate the failure, but the FTP client was already blocked waiting for the connection to occur, so was not waiting for a message on the command socket.
This problem has been corrected with this release of the product. The FTP client should no longer hang in this situation.
Note: A new bug was introduced into the product with this fix. It may result in the FTP client incorrectly reporting a protocol exception when a legitimate reply is received from the server. This will occur if the 200 success message is sent from the server at the same time that it is establishing the data connection.
The new issue was discovered in post-production and was not included in this release, however it will be addressed in the next release of the product.
Because the problem is intermittent and requires an exact timing of events, you may be able to work around the issue by repeating the request if it throws a protocol exception. Also, establishing the port explicitly avoids the problem code. (QA# 15969, SCOPUS# 10836)
(http) The HTTP classes have all been rewritten in order to provide support for the HTTP 1.1 protocol. All of the old HTTP classes have been deprecated. They will still work with this release, but you should change to the new classes.
The following enhancement requests and bug fixes have been addressed in the implementation of the new HTTP classes: QA# 4971, QA# 11577, QA# 11604, QA# 12463, QA# 15119, QA# 15476, QA# 15909, QA# 23953, SCOPUS# 8302, SCOPUS# 8931, SCOPUS# 9210, SCOPUS# 10002, SCOPUS# 11055, SCOPUS# 11351.
See the class reference for further information.
(smtp) Some mail programs refused to accept messages where the headers are not terminated by a <CRLF>
pair . While RFC821 does not make this an explicit requirement, RFC822 does. We have updated our code to append <CRLF>
to any headers that we append to the message. (QA# 4766)
The RWDecimalPortable class has been moved to the Essential Tools Module. Documentation has not yet been completely removed from Currency Reference.
Rounding a small number gives NaN
. (QA# 4755)
Bankers rounding not working as documented. (QA# 24442)
Differences in RWDecimalPortable. (QA# 23886)
Removed Java support.
Adapted to work with new RCB install/build engine.
The functionality of the legacy DBTools.h++(R) product was incorporated into SourcePro DB, the Rogue Wave(R) C++ product for database access. SourcePro DB includes the DB Interface Module and several DB Access Modules.
RWDecimalPortable was transferred from the DBTools.h++ core library and from Money.h++ into the Essential Tools Module of SourcePro Core.
RWDBEnvironmentHandle now has two methods to support result set schema caching that can dramatically improve query performance.
The code base was migrated to the new Rogue Wave Component Builder (RCB) build model and the Essential Tools Module of SourcePro Core 8.0.0.
Enhancement: Add virtual assignment operator from RWDBBinaryVectorElement to RWDBBlob.
Explanation: Assignment of an element from an RWDBBinaryVector to an RWDBBlob doesn't work, due to the lack of an appropriate assignment operator.
Action: Not implemented, already easy to do. Either wrap the data()
of a vector element with an RWDBBlob, or use an RWDBTBuffer<RWDBBlob> instead of an RWDBBinaryVector. (QA# 15023)
Money.h++ files (decport.h
) are not the same.
Explanation: The RWDecimalPortable class was defined in two separate products, Money.h++ and DBTools.h++. For some versions, there were trivial differences between the two that contributed to compiler errors when both products were used in the same application.
Action: There is now a single source for the RWDecimalPortable class in the Essential Tools Module of SourcePro Core. (QA# 16014)
RWDBConnection going out of scope should rollback, not commit, a transaction.
Action: This describes old behavior; at least since DBTools.h++ 4, the behavior has been to roll back, not commit, when an RWDBConnection goes out of scope. (QA# 22959)
RWDBInserter doesn't recognize caseCompare
setting in operator[](RWCString)
.
Action: A small change was necessary to fix the ability of RWDBInserter to distinguish column names based on the case (upper vs. lower) of the names. Bug fixed. (QA# 23601)
How we could save space using RWDBVector.
Explanation: Implementations of RWDBVector<RWCString> and RWDBVector<RWDBBlob> use space inefficiently; each element takes up the maximum possible space.
Action: The bulk operations on all databases require that there be one memory array for each column. This is a limitation of the bulk APIs, and not SourcePro DB. Switching to single-row operations provides more efficient memory usage (at the expense of performance). (QA# 23698)
Application with size 0 connection pool holds 1 connection after all connections are out of scope.
Explanation: Connections are still being held to the database for some databases, even after all were supposed to have gone out of scope.
Action: Bug fixed in the release of SourcePro DB. (QA# 23912, QA# 24440)
Enhancement: Add support for nchar
and nvarchar
datatypes in MSSQL Server 7.0.
Action: RWDBValue::WString
now maps to nvarchar
with sql70 when creating tables. Also, nchar
, nvarchar
, ntext
types are now supported (w/sql70); these map to RWWString, when retrieving data. (QA# 4753)
Need documentation on TEXTLIMIT()
in the MS SQL Server manual.
Explanation: In order to read strings from the database that are greater in length than 4096 bytes, it was necessary to use both the TEXTLIMIT()
and TEXTSIZE()
native methods to adjust the max string size that can be downloaded. However, only the use of the TEXTSIZE()
method was documented in the DBTools Access Library manual for MS SQL Server.
Action: There is no longer a need to adjust TEXTLIMIT()
and TEXTSIZE()
for reading strings greater than 4096 bytes, as of DBTools 4.x. (QA# 12963)
Enhancement: Rebinding BoundExpr(RWCString)
too frequently.
Action: All access libraries optimized for binding; variables rebound only when absolutely necessary. (QA# 14747)
MSSQL Server problems with lost connection.
Explanation: Specific problems existed when a connection was lost with the MS SQL Server access libraries of some older versions of DBTools.h++. These problems included core dumps when error handlers were invoked, failure in retrieval of client-side data after the loss of a connection, and failure to relay all associated error messages due to the lost connection.
Action: With the introduction of DBTools 4.x, the code base for the product changed considerably, and the source of each of these errors thus was removed. These errors should no longer be present within SourcePro DB. (QA# 15164)
Nested fetch with multiple cursors fails.
Action: Limitation of calling a single fetch at a time through our ODBC-based access libraries is documented. Not a bug. (QA# 24419)
Enhancement: RWDBTracer should report what stored procedures it calls.
Action: RWDBTracer class now reports the stored procedure's name, as well as its parameters, in the trace output. (QA# 15003)
Enhancement: Add RWDBReader::cancel
method.
Action: Unnecessary, with current functionality; a new query may be instigated at any time, before finishing the retrieval of all results by a reader. Enhancement not implemented. (QA# 15176)
Date, time, asString
methods broken in special cases.
Explanation: Perception that RWDBDateTime uses different formatting rules than RWDate or RWTime.
Action: Every class, RWDate, RWTime, RWLocale, RWDBDateTime, all use strftime()
formatting. It is documented that way in the asString()
for each class. No bug present. (QA# 15186)
Documentation bug: need to use strip()
and rwdbTrimTrailing()
when char
datatypes are used.
Action: Documentation was not changed; instead, code base was revised to match its old behavior. (QA# 24172)
Enhancement: ON
method for RWDBJoinExpr.
Explanation: Within the DBTools Interface Module, the ON
clause is associated with the RWDBSelector; this means that each SQL statement can have only one ON
clause.
Action: ON
clauses are moved to RWDBJoinExpr, allowing each join expression to have its own ON
and USING
clauses. This adds the functionality of writing nested join queries and multiple join queries. This also complies with the SQL 92 standard. To maintain backward compatibility, ON
methods in RWDBSelector are kept, but are marked as deprecated. (QA# 16347)
SQLGetData
usage for large data retrieval.
Action: SQLGetData
use is added for all ODBC-based Access Modules. This improves the efficiency of memory use and negates the necessity for a maxBlobSize
. (QA# 16367)
Enhancement: Enable RWDBStringVector to handle strings with embedded NULLs
.
Action: Using _RWDBTBuffer<RWCString>) with the bulk operations classes allows the handling of embedded nulls. (QA# 14902)
RWDBTable::fetchSchema()
fails for table alias or synonyms.
Action: Fixed. (QA# 15025)
RWDBBulkInserter returns RWDBStatus.
Action: Not a bug; performs as expected. (QA# 15149)
Enhancement: RWDBDatabase::maxConnections()
.
Explanation: Provide a means of setting the maximum number of connections that a process may create via SourcePro DB.
Action: All SourcePro DB customers will now have access to the Threading module of SourcePro Core. This will provide a very simple means of implementing the described functionality, for example, via the RWSemaphore class. This solution is easy and more flexible than implementing a method in the SourcePro DB product. Enhancement will not be implemented. (QA# 15194)
Enhancement: support for the GNU compiler on Solaris.
Action: Support for gnu compiler now available with SourcePro DB version 5. (QA# 15849)
Incrementing twice causes BLOB
column to be skipped.
Explanation: A bug in DBTools.h++ source code (with the locatorColumns()
method) was causing BLOB
columns to be skipped.
Action: Bug fixed. (QA# 16758)
Public synonyms broken.
Explanation: Public synonyms are not visible to DBTools.h++, as are other tables.
Action: Bug fixed; public synonyms are now visible in SourcePro DB. (QA# 24551)
readerImp()
hits database twice, pass in schema?
Action: Schema caching implemented to reduce the number of database hits from SourcePro DB fetching metadata. (QA# 14695)
Enhancement: Oracle8 performance issues.
Explanation: An optimization for the binding of parameters is suggested for Oracle8 access library.
Action: All access libraries optimized for binding; variables rebound only when absolutely necessary. (QA# 14741)
Enhancement: string and wstring support, when using the Standard C++ Library with SourcePro DB.
Action: SourcePro DB uses the new implementations of RWCString and RWWString, which are in turn built upon string and wstring. (QA# 14794)
RWDBStoredProc must load AND execute quickly.
Action: The ability to pass an RWDBSchema to an RWDBStoredProc at its creation effectively speeds up the stored procedure execution. Relates to QA# 15173 and QA# 15175. Resolved. (QA# 15217)
Enhancement: arrays as parameters for stored procedure.
Action: Now available either through RWDBStoredProc (via RWDBBoundExpr), and/or RWDBOSql.
Note: Only available on databases that support this functionality. (QA# 15767)
Enhancement: Null indicator in Bound Expression changes WHERE
semantics.
Explanation: Request that null indicator being set produces the "is Null" expression.
Action: Enhancement declined; doing this programmatically, as we currently do with placeholders, serves the same purpose. (QA# 15810)
Oracle8_815 cursor: binding an RWDate to a cursor results in an exception.
Action: Cause of exception resolved; bug fixed. (QA# 16485)
Old DBTools.h++ examples data has 2-digit years even if RW_CENTURY_REQD
is set.
Action: Recent DBTools.h++ and SourcePro DB examples use four- digit years. (QA# 16635)
RWDBVendorTypeInfo: If possible, this should be removed from the DBTools Interface Module and the Access Modules.
Action: The RWDBVendorTypeInfo class is no longer used within SourcePro DB. (QA# 16491)
Dropped connections not reported correctly.
Explanation: The internal function, rwdbConnectionDead()
, was not behaving correctly.
Action: The function is no longer present in the SourcePro DB code base, and the corresponding functionality inside SourcePro DB is now correct. (QA# 13427)
Need a way to get all stored procedures just as tables.
Explanation: An enhancement request to provide access to a table that lists available stored procedures on the database.
Action: dbStoredProcedures()
method added, to provide the described functionality. (QA# 13584)
Enhancement: Be able to pass NULL
to an IN/OUT
parameter of a stored procedure.
Action: RWDBBoundExpr objects may be shifted in to the RWDBStoredProc as stored procedure parameters. Use of this class enables parameters to the stored proc to be set to NULL
. (QA# 14925)
Can't use an updater that has a where clause referring to two tables.
Action: Use of class RWDBOSql gives the ability to implement this functionality when necessary. Implementation via other SourcePro DB classes is declined, due to the fact that the SQL necessary is not compliant with the SQL 92 standard, and not portable to other databases. (QA# 15101)
Enhancement: ability to define connection or RWDBStoredProc as NO_STRICT_CHECKING
.
Explanation: Sybase stored procedures can ignore extra parameters without failing; however, SourcePro DB will throw its own error if the number of parameters provided differs from the schema of the stored procedure as detected from the database.
Action: See Action for QA# 15175 (below). (QA# 15173)
Option to disable default checking behavior of RWDBConnection for Open Server.
Explanation: In order to help SourcePro DB work with Sybase Open Server, the query to fetch table or stored procedure schemas must be disabled, as this feature works differently on Open Server.
Action: It is possible to supply a user-defined schema to RWDBStoredProc and RWDBTable objects. This can be used in place of fetching them from the database, in effect preventing the query from taking place. (QA# 15175)
GROUP BY
expressions.
Explanation: For example, if one wants to add a TO_CHAR()
expression to a GROUP BY
statement. Currently SourcePro DB does not provide for this.
Action: This functionality can be attained via the RWDBOSql class. As it is not SQL 92 code and not database portable, the enhancement is declined for other SourcePro DB classes. (QA# 15180)
Enhancement: Add ct_con_props()
to set hostname using env or sys handle.
Action: The hostname can now be set via the sixth parameter to the RWDBManager::database()
method. For example, set the parameter to "CS_HOSTNAME=myHostName"
. This is documented in the DBTools Access Module for Sybase CT User's Guide. (QA# 15397)
No protection when using RWDBOSql with too large of a "bulk" argument on insertion.
Action: Bounds checking implemented in this case. Resolved. (QA# 16463)
RWDBDeleter: using explicit connections can dump core.
Explanation: Using an explicit connection with an invalid deleter causes a core dump if you use the same connection and change the error handler between executes.
Action: Unable to reproduce this problem; closing the bug. (QA# 16487)
The included CLAPACK third party library directory structure has changed with this release. In previous releases the CLAPACK headers and libraries were located in a directory structure following the pattern:
3rdparty\clapack-3.2.1\<os>\<architecture>
Third party libraries are now structured following this pattern:
3rdparty\<os>\<architecture>\clapack-3.2.1
Any references to the previous path in your makefile or environment should be updated to reflect the new directory structure.
The characterizations to detect the availability of XDR functionality now support detecting and leveraging libtirpc
. If libtirpc
and its associated header files are installed on your system, unsatisfied symbols could occur at link time for your executable.
Applications using XDR streams with libtirpc
need to add -ltirpc
to the link line of the executable or library.
The included Snappy third party library directory structure has changed with this release. In previous releases the Snappy headers and libraries were located in a directory structure following the pattern:
3rdparty\snappy-<version>\<os>\<architecture>
Third party libraries are now structured following this pattern:
3rdparty\<os>\<architecture>\snappy-<version>
Any references to the previous path in your makefile or environment should be updated to reflect the new directory structure.
The included ICU third party library directory structure has changed with this release. In previous releases the ICU headers and libraries were located in a directory structure following the pattern:
3rdparty\icu-<version>\<os>\<architecture>
Third party libraries are now structured following this pattern:
3rdparty\<os>\<architecture>\icu-<version>
Any references to the previous path in your makefile or environment should be updated to reflect the new directory structure.
The included OpenSSL third party library directory structure has changed with this release. In previous releases the OpenSSL headers and libraries were located in a directory structure following the pattern:
3rdparty\openssl-<version>\<os>\<architecture>
Third party libraries are now structured following this pattern:
3rdparty\<os>\<architecture>\openssl-<version>
Any references to the previous path in your makefile or environment should be updated to reflect the new directory structure.
RWDate is now implemented as a 32-bit integral type regardless of build type or platform. This can result in incompatibilities when sharing data with an application using a previous version of SourcePro.
Applications using RWFile to share RWDate representations should be updated to use virtual streams.
Applications using virtual streams to share RWDate representations must set the virtual stream version to ensure compatibility with existing SourcePro applications:
const unsigned requested_version = 3;
RWbostream bos(os);
const unsigned default_version = bos.version();
if (default_version < requested_version) {
throw RWxmsg("Invalid stream version requested");
}
bos.version(requested_version);
The requested version number must be the same for both applications, and it should not be greater than the default stream version.
RWDate objects are stored to RWFile as 32-bit integral values regardless of build type or platform. This can result in incompatibilities when the serialized data is shared with an application using a previous version of SourcePro.
To avoid this problem, applications should use the virtual streams classes.
The following function overloads in pointer-based template classes taking bool(*)(value_type, void*)
as an argument have been removed, as they prevented instantiation on a const
type.
bool contains(bool(*)(value_type, void*), void*) const;
value_type find(bool(*)(value_type, void*), void*) const;
size_type index(bool(*)(value_type, void*), void*) const;
size_type occurrencesOf(bool(*)(value_type, void*), void*) const;
value_type remove(bool(*)(value_type, void*), void*);
size_type replaceAll(bool(*)(value_type, void*), void*, value_type);
size_type removeAll(bool (*)(value_type, void*), void*);
Instead, use the corresponding function taking a bool(*)(const T*, void*)
argument. This affects the following classes: RWTPtrDeque, RWTPtrDlist, RWTPtrOrderedVector, RWTPtrSlist, and RWTPtrVector.
To modify the value, use apply(void (*)(reference, void*), void*)
.
const
correctThe const
qualifier has been removed from the apply()
overloads without a const
value parameter in the function pointer. If you need to modify the value in the container, you should call apply()
from a non-const object.
A specialization of the class template RWTHash was added for RWDate. Applications that implement this specialization will fail to link.
To avoid this problem, the specialization should be removed from the application code.
RWCollectable-derived classes were modified so that their compareTo()
and isEqual()
functions no longer leverage dynamic_cast
in their implementations. This change was made to address a performance regression from previous versions of the product that did not use a dynamic_cast
, as well as to avoid throwing an exception from these classes if the parameter was not of the expected type (which could easily break containers that held heterogeneous collections of types).
RWCollectable-derived types in SourcePro that override the default compareTo()
functions implement comparisons similar to the following:
int DerivedCollectableType::compareTo(const RWCollectable* rhs) {
const int type_difference = isA() - rhs->isA();
if (type_difference) {
return type_difference;
}
const DerivedCollectableType* derived_rhs =
static_cast<const DerivedCollectableType*>(rhs);
// return the results of type-specific comparisons between this and
// derived_rhs.
}
It is recommended that user-derived RWCollectable types follow a similar pattern in order to provide consistent results with Rogue Wave provided RWCollectable types.
This approach has drawbacks, particularly when deriving from types that implement compareTo()
. In those cases, if base classes are compared against derived classes, the isA()
check will report a difference, and the base class type comparison will not be performed. For those situations, the compareTo()
function will need to be updated to account for both the base and derived types when determining if they can be compared.
-brtl
flag for linking applicationsThe Secure Sockets Package linker arguments for dynamic builds have been updated to include the -brtl
linker flag that allows dependent libraries to be linked as shared libraries . Any application makefiles leveraging the Secure Communication Module should be updated to use the -brtl
linker option.
A specialization of the class template RWTHash was added for the deprecated class RWDBDateTime. Applications that implement this specialization will fail to link.
To avoid this problem, the specialization should be removed from the application code.
Nested joins now have parentheses placed around them to clarify the order of evaluation to the database.
Previously this code snippet:
RWDBJoinExpr join =
rwdbNaturalLeftOuter(table1, rwdbRightOuter(table2, table3).on(table2["pn"] == table3["pn"]))
would have generated this SQL:
As formed, this query can be problematic since each database must apply its own join expression evaluation order rules. Parentheses to inner joins now clarify the order in which to evaluate the query, so that the following SQL will now be generated:
To generate a logically equivalent join expression to the original query, update the order in which joins are constructed:
RWDBJoinExpr join =
rwdbRightOuter(rwdbNaturalLeftOuter(table1, table2), table3).on(table2["pn"] == table3["pn"]))
which will generate this SQL:
SourcePro Analysis no longer ships with Intel's Math Kernel Library. For information on options for downloading the Math Kernel Library from Intel, see: http://software.intel.com/en-us/articles/free_mkl.
The enumerator RWDateTime::iso8601_compat
was deprecated. Applications should use one of the other RWDateTime::Format
enumerators instead.
The function RWLocaleSnapshot::refresh()
was removed. Applications that need custom locale definitions should generate them using the tools provided with the operating system.
The package-level tracing option was removed from the RCB GUI and package-level tracing was removed from all SourcePro packages. Configuring user-level tracing is still available from the RCB GUI.
RWDBValue::compareTo()
return value specification was expanded. (SP-21296)The return values for RWDBValue::compareTo()
were over specified, implying that only the values -1
, 0
and 1
should be expected. This was incorrect; a less than relationship will return a value less than 0, and a greater than relationship will return a value greater than 0. The documentation has been updated to reflect the actual behavior of RWDBValue::compareTo()
. User code that is defined to check for a specific value other than 0
should be updated to instead check the value relative to 0
.
By default, OpenSSL 1.0.2h has disabled the SSLv2
protocol, along with various ciphers from multiple protocols that are considered unsafe. An exception is thrown when an RWSecureSocketMethod
is constructed with RWSecureSocketMethod::SSLv2
, RWSecureSocketMethod::SSLv2Client
, or RWSecureSocketMethod::SSLv2Server
. User code should use one of the currently supported protocols documented in the RWSecureSocketMethod
section of the reference guide. For more information about OpenSSL's removal of SSLv2
see: https://www.openssl.org/news/changelog.html
root
instead of default localeWith ICU 55.1, the behavior of Unicode algorithms has been changed so that it will fall back to the root
instead of the default locale. This may result in a change in behavior from previous releases (built with ICU 52.1) where the algorithms would fall back to the ICU default locale.
In the Internationalization Module, this scenario occurs most often when the RWULocale
default is not set (RWULocale::setDefault
), and when the environment variable LANG
is not set. In this case, the default locale is en_US_POSIX
. In order to avoid this scenario, either the LANG
environment variable should be set before running the application, or the application should explicitly set the locale that should be used with RWULocale::setDefault
.
See the ICU Ticket #10823 (http://bugs.icu-project.org/trac/ticket/10823) for more information about this change.
Exceptions thrown by user callback functions are no longer propagated through SourcePro DB class destructors. This prevents program termination if the destructor was called in response to unwinding the stack due to an exception.
The following callback functions are affected by this change:
RWDBDatabaseCallbackImp::preEnvDestroy()
RWDBConnCallbackImp::preDisconnect()
RWDBConnCallbackImp::preConnDestroy()
In previous releases, rw_hashset::insert()
and rw_hashmap::insert()
returned end()
if an item already in the collection matched the item being inserted. This behavior was inconsistent with the C++ Standard Library as well as other containers that would return an iterator to the existing item in the collection. rw_hashset::insert()
and rw_hashmap::insert()
now return an iterator to the existing item in the collection (if one was found), or an iterator to the newly inserted item.
In previous releases, RWTPtrSlist::sort()
used the greater-than operator to sort objects stored within the container in ascending order. This behavior was inconsistent with other sorted containers. RWTPtrSlist::sort()
now sorts using the less-than operator. The sort order has not changed.
In previous releases, If a schema with no primary key was passed to RWDBDatabase::table()
, the schema would try to retrieve the key from the database when queried. This would cause a performance hit for schemas that did not specify a primary key, as an attempt would be made to retrieve it.
With SourcePro 13.1, it is now assumed that the provided schema is complete; If the schema does not contain a primary key, it is assumed that one does not exist and no query to the database is performed.
In cases where it is not known if a primary key exists, leaving the schema unspecified when calling RWDBDatabase::table()
, allows all of the schema information to be retrieved from the database when needed.
In SourcePro 12.5, support for accessing default column values and identity constraints was added to the product, and RWDBTable::fetchSchema()
was updated to retrieve this information. This unfortunately increased the cost (in some cases significantly) of calling this function. In order to address this performance regression, RWDBTable::fetchSchema()
was reverted to its pre-SourcePro 12.5 behavior, and no longer retrieves default column values and identity constraints.
For users who would like to access this information, a new API has been added, RWDBTable::describe
, which allows for greater control over which metadata properties are fetched. For applications that need access to the default column values and identity constraints, this information can be retrieved with:
Please see the Class Reference for additional information about RWDBTable::describe()
and additional flags that can be passed to it to customize the retrieved metadata.
RWDateTime sentinel values are no longer treated specially by the RWDateTime comparison operators. All RWDateTime instances, including all sentinel values, are ordered based on the value held internally, and exceptions are no longer thrown when comparing invalid RWDateTime instances.
Any code that requires the old behavior needs to use a comparison function that checks for sentinel values before comparing RWDateTime instances. For example:
bool old_datetime_less(const RWDateTime& lhs, const RWDateTime& rhs) {
if (lhs.isInvalid() || rhs.isInvalid()) {
throw RWInternalErr("[DTINVALIDOP] RWDateTime: Operation "
"attempted with invalid object");
}
else if (lhs.isNull() || rhs.isNull()) {
return false;
}
else if ((lhs.isPast() || lhs.isFuture() || lhs.isValid()) &&
(rhs.isPast() || rhs.isFuture() || rhs.isValid())) {
return lhs < rhs;
}
return false;
}
bool old_datetime_equal(const RWDateTime& lhs, const RWDateTime& rhs) {
if (lhs.isInvalid() || rhs.isInvalid()) {
throw RWInternalErr("[DTINVALIDOP] RWDateTime: Operation "
"attempted with invalid object");
}
else if (lhs.isNull() || rhs.isNull()) {
return false;
}
else if ((lhs.isPast() || lhs.isFuture() || lhs.isValid()) &&
(rhs.isPast() || rhs.isFuture() || rhs.isValid())) {
return lhs == rhs;
}
return false;
}
The PostgreSQL Access Module now supports the PostgreSQL server setting standard_conforming_strings
set to ON. This is the default setting on PostgreSQL Server version 9.1 and later.
Setting standard_conforming_strings
to OFF, or connecting to PostgreSQL server version 9.0 and prior in which the setting is by default OFF, results in a warning from the server when sending character or binary data that includes characters that are escaped using traditional escape format rather than the SQL standard conforming escape format. In testing, this has not shown to affect the data that is inserted in the database. You can turn off the warning by setting the escape_string_warning
setting to OFF.
The definition of iso8601
has changed, and now enforces the newer ISO-8601:2000 format. This is stricter than the previous format, and may result in errors when parsing some non-conforming ISO-8601 strings that were accepted in previous releases. In order to continue to parse non-conforming ISO-8601 representations, you'll need to specify the iso8601_compat
enumeration value instead. The rules for handling implied date and time components have changed. These changes are discussed in the documentation for the two available parsers.
Previously the current time of day / date was used when filling in values for truncated iso8601 strings. Now the epoch is used.
To restore the behavior of using the current time of day / date when filling in values for truncated ISO-8601 strings, you will need to specify the RWDateTime::iso8601_compat
flag instead of RWDateTime::iso8601
when parsing the string. RWDateTime::iso8601_compat
has other differences from RWDateTime::iso8601
. See the SourcePro C++ API Reference Guide for more details.
The copy constructor and assignment operator for these classes has been made private. They were compiler defined and did not actually copy anything.
Existing applications that depend on these interfaces will fail to compile. Any code that called these functions relied on incorrect behavior, and should be reviewed to verify that a copy is really necessary. If you truly need to make copies of a linked list, consider using RWTValSlist or RWTValDlist.
Previously this method checked only for std::ios::failbit
. It now checks for std::ios::badbit
as well, as specified by the C++ Standard.
Since fail()
indicates that either badbit
or failbit
is set, if your application needs to know specifically if failbit is set, it can check if that bit is set in the return of rdstate()
:
These classes previously checked only the keys when determining equality. They now check both the keys and the values, as do the other Rogue Wave map-based containers.
Applications that depend on the previously documented behavior of only comparing the keys in the container will need to implement their own equality functions for these containers.
New methods explicitly supporting signed char
data have been added to the virtual streams classes RWvistream and RWvostream. Previously signed char
data was implicitly converted to an int
for serialization.
For backward compatibility, default implementations are provided for these methods that attempt to maintain previous behavior. However it is recommended that if you have derived your own classes from RWvistream or RWvostream, you should provide explicit implementations of these functions.
Enhancements to the virtual streams classes have been made to reduce the amount of data stored on the stream. The default stream version has been changed to make these enhancements available by default. If you need to read data stored with an older stream version, you will need to make an explicit call to set the stream version.
Prior to this release, these stream versions existed:
Version 0: the initial version when virtual streams were introduced
Version 1: an enhancement to the initial version
In this release, the following versions have been added:
Version 2: avoids storing the size of an RWCString to a binary or endian stream twice, and fixes a data portability issue seen when writing to a portable stream
Version 3: avoids writing unnecessary data to the virtual stream when serializing size_t
values with the putSizeT()
method
If you try to read data that was streamed with a previous version of SourcePro, or to write data that will be consumed by a previous version, you may experience errors. Use the version()
method on the steams classes to set the required version.
While the new class RWTFunctor supports implicit conversion to and from the deprecated types RWTFunctorR0 et al, there may still be some instances where existing code will fail to compile. Typically this will occur in situations where the code is depending on an implicit conversion from RWTFunctorR0 et al to some other type. In those cases, you will need to either update your code to use RWTFunctor, or provide an explicit cast to RWTFunctorR0 et al.
The behavior of RWUAvailableEncodingListIterator, RWUAvailableLocaleListIterator, RWUEncodingAliasListIterator, and RWUEncodingNameStandardListIterator was over-specified in previous releases, indicating that incrementing an iterator that was already past-the-end of the collection or decrementing an iterator that was already at the beginning of the collection would leave the iterator unchanged. Incrementing an iterator that is already past-the-end or decrementing an iterator that is already at the beginning should be treated as undefined behavior, and you should take appropriate precautions in your code to prevent this from happening.
RWDBDateTime is deprecated and where possible it has been replaced by RWDateTime in the SourcePro DB API.
While RWDBDateTime and RWDateTime provide constructors and operators to allow implicit conversion between the two types, there may still be instances where the switch from RWDBDateTime to RWDateTime will cause compilation failures in your code. Normally this would occur in code that is counting on an implicit conversion from RWDBDateTime to some other type. In those cases, you will either need to update your code to use RWDateTime instead, or you will need to explicitly cast the result of a function to an RWDBDateTime.
The Access Module for DB2 CLI uses the table name supplied by the user to retrieve the schema associated with that table. Previously it attempted to qualify/unqualify the name if the schema could not be retrieved using the original name, but this sometimes resulted in returning the schema for the wrong table so this behavior has been removed.
If your code depends on the previous fallback behavior you will need to update your code to explicitly look up the table schema using an unqualified name if the lookup with a qualified name fails.
Previously both of these were checked for a result column, but now only one or the other will be checked based on the result column type.
If your code currently depends on either maxBlobSize()
or maxStringSize()
, but not both, you may need to set both values if the value needs to be applied to both binary and character data.
Previously both of these were checked for a result column, but now only one or the other will be checked based on the result column type.
If your code currently depends on either maxBlobSize()
or maxStringSize()
, but not both, you may need to set both values if the value needs to be applied to both binary and character data.
Previously both of these were checked for a result column, but now only one or the other will be checked based on the result column type.
If your code currently depends on either maxBlobSize()
or maxStringSize()
, but not both, you may need to set both values if the value needs to be applied to both binary and character data.
DComplex was a legacy class for platforms that did not provide an std::complex<double> implementation. It was defined in the header file rw/rcomplex.h
. All supported platforms now support std::complex<double>, so DComplex is no longer used. A typedef for DComplex to std::complex<double> is still provided in the header file rw/dcomplex.h
.
Applications that explicitly include rw/rcomplex.h
may see compilation errors due to the removal of this header file. It should be safe to remove this header file include from your code. In some cases you may need to instead include rw/dcomplex.h
in order to find a definition for DComplex, however this should only be required if you are not including any other types that rely on DComplex.
Because they are unneeded, these libraries are no longer built in SourcePro. You will need to remove references to the blalib
and lapkfor
libraries from your build systems as these libraries are no longer present.
These functions no longer throw an exception if called with very long timeout values. Any timeout value is subject to the limits of the underlying library function select()
.
If you application relies on an exception being thrown from these functions when they are passed large timeout values, you may need to manually check for those large values before calling these functions.
Free functions operator==
and operator!=
have been added for RWSocket, where previously operator==
was a member function. Changing operator==
to a free function may cause existing code to break if the operator was accessed as a function (s1.operator==(s2)
or &RWSocket::operator==
). It is recommended that you update your code to use the free function.
The function RWCString::hash(caseCompare) const
has been updated to return an unsigned int
instead of an unsigned long
. This brings the signature into alignment with other Essential Tools Module hash()
functions.
RWClassicCString and RWClassicWString have been renamed to RWCopyOnWriteCString and RWCopyOnWriteWString respectively, and their APIs have been updated to bring them into alignment with RWCString and RWWString respectively. While the classes RWClassicCString and RWClassicWString have been retained for compatibility, a number of other minor changes have been introduced that may affect migration from previous releases.
Functions that returned RWClassicCSubString in previous releases now return RWClassicCSubString or RWClassicCConstSubString, depending on whether the called member function was const
. Users will need to update explicit references to RWClassicCSubString to use the correct version.
RWDecimalBase has two added states: SNaNstate
and infinitystate
. Instances of RWDecimalPortable can be created with these values. Functions toDouble(const RWDecimalPortable&)
and toLongDouble(const RWDecimalPortable&)
will return the corresponding values in std::numeric_limits<double> and std::numeric_limits<long double> respectively.
The behavior of operations on RWDecimalPortable instances with these values is defined in the documentation for RWDecimalBase.
RWFileErr methods errorType()
and descriptor()
have been made const
. This makes it possible to catch an RWFileErr by const
reference and still have access to information about the error.
RWAnsiLocale is no longer supported with STLPort on Solaris. Applications that were previously using RWAnsiLocale to describe the “C” locale with STLPort should use RWLocaleSnapshot instead.
Method RWDateTime::second()
has been updated to take an RWZone instance, similar to RWDateTime::hour()
and RWDateTime::minute()
. This overload defaults to RWZone::local()
if a parameter is not provided, and is added to support RWZone instances where the offset is not evenly divisible by 60. RWDateTime::secondGMT()
was added to the API and can be used to mimic the old behavior of RWDateTime::second()
.
The version of RWZone introduced in SourcePro C++ version 10 has been removed. If you adopted the Source Pro 10 RWZone implementation, you will need to restore your application to use pre-SourcePro 10 APIs, or to use some of the new APIs introduced in SourcePro C++ version 12.
The build option to choose whether RWZone::local()
is based on the current time with North American time zone rules or on the rules defined by the OS has been removed. RWZone::local()
now always defaults to the rules defined by the OS. Users can manually restore the previous behavior by specifying an RWZoneSimple instance based on the North American time zone rules.
The default constructor for class RWTSingleton is now protected as documented. (SP-10390)
Methods RWDBConnection::autoCommit()
and RWDBConnection::autoCommit(bool)
have been removed from the SourcePro DB API. These functions have not affected the behavior of the product since DBTools.h++ 4.
Executing an Oracle stored procedure using class RWDBOSql now requires parameter types of its out
or in/out
parameters to be explicitly specified on the bound RWDBTBuffer instances using the method RWDBTBuffer::paramType()
. If parameter type is not set, the default parameter type of RWDBColumn::inParameter
is assumed and the out value of the parameters will not be retrieved.
Example:
RWDBOSql osql ("BEGIN myProc (:ph1); END;",
RWDBOSql::Procedure);
RWDBTBuffer<RWDBBlob> out(1);
osql << out;
osql.execute(conn);
In the above example, the paramType
is not set and so uses the default setting RWDBColumn::inParameter
. Therefore, this value is not retrieved into the bound RWDBTBuffer object. To resolve this, paramType
should be set explicitly to outParameter
:
RWDBOSql osql ("BEGIN myProc (:ph1); END;",
RWDBOSql::Procedure);
RWDBTBuffer<RWDBBlob> out(1);
out.paramType(RWDBColumn::outParameter);
osql << out;
osql.execute(conn);
The MySQL Access Module now links against release MySQL client libraries for all build configurations on the Windows platform. Applications that are linking directly against the MySQL client libraries should update their build environments to use the new recommended libraries. Refer to the SourcePro DB examples for the MySQL Access Module for examples of recommended link libraries. (SP-11919)
Class RWDecimalBase has two added states: SNaNstate
and infinitystate
. Instances of RWDecimal<M> and RWFixedDecimal<M> can be created with these values. Functions toDouble(const RWDecimal<M>&)
and toDouble(const RWFixedDecimal<M>&)
return the corresponding values in std::numeric_limits<double>.
Division by zero operations on numbers other than zero or sentinel values now return an instance containing infinitystate
. For more information on the behavior of operations on instances with these values, see the documentation for RWDecimalBase.
RWMultiPrecisionInt now uses type int32
instead of type long
for the precision. This reduces the precision on certain 64-bit platforms where a long
is 64 bits. To increase the precision, increase the value of the template parameter passed to RWMultiPrecisionInt. See Section 6.3 of the Currency Module User's Guide for details. (SP-7927)
The rwSocketSelect()
overload that takes a timeout truncates the timeout value provided to LONG_MAX
seconds without reporting an error. It does not throw an exception as previously documented.
RWPortalImp and its derived classes (RWBufferedPortalImp, RWHttpPortalImp, RWNoPortalImp, RWSecureSocketPortalImp, RWSocketPortalImp, and RWTimedPortalImp) now hide their copy constructors and assignment operators. This avoids any potential usage confusion and potential memory leaks in user derived classes.
The rwSecureSocketSelect()
overload that takes a timeout truncates the timeout value provided to LONG_MAX
seconds without reporting an error. It does not throw an exception as previously documented.
Function rwSecureSocketSelect()
now behaves consistently with rwSocketSelect()
. Instead of returning multiple socket attribute objects for the same socket, the attributes for each socket are masked together and returned as a single socket attribute. Also, selecting on a vector with no attributes and no timeout will sleep indefinitely.
Function rwSecureSocketSelect()
now correctly handles fractional timeout values.
Method RWSecureSocket::shutdown()
no longer calls shutdown()
on the underlying RWSocket.
If your existing code passes an initialized RWSocket to the RWSecureSocket constructor and is relying on RWSecureSocket to call shutdown()
on the RWSocket, you will need to add an explicit call to RWSocket::shutdown()
.
Method RWSecureSocket::connect()
will no longer try to rebind a bound socket on error. The socket will just be closed.
SourcePro 11.1 now ships with a prebuilt version of Basic Linear Algebra (BLA) library, Netlib CLAPACK 3.2.1, in addition to the Intel Math Kernel Library (MKL) shipped in 11.0.
The RWTRegexResult class provides a conversion to bool
to indicate the status of a regular expression search/match operation.
In SourcePro 11.0, the default-constructed RWTRegexResult instance, and the RWTRegexResult instance obtained by dereferencing a default-constructed RWTRegexMatchIterator, converted to a boolean value that evaluated to true
.
In SourcePro 11.1, these same instances convert to a boolean value that evaluates to false
. If you have code that depends on a default-constructed RWTRegexResult or RWTRegexMatchIterator to convert to true
, you will have to update your code.
Streaming in a signed char
now fetches the data as an int
rather than a char
, in order to retrieve the data using the same type as sending the data. This will affect your code only in the rare case that your code does not use RWDataToVirtualOutputStreamImp to stream out an unsigned char
read by a RWDataFromVirtualInputStreamImp. In SourcePro 11.0:
When streaming out a signed char
using an instance of body class RWDataToVirtualOutputStreamImp, the data is sent using the underlying RWvostream as an int
.
When streaming in a signed char
using an instance of body class RWDataFromVirtualInputStreamImp, the data is fetched from the underlying RWvistream as a char
.
In SourcePro 11.1:
When streaming out a signed char
using an instance of body class RWDataToVirtualOutputStreamImp, the data is sent using the underlying RWvostream as an int
.
When streaming in a signed char
using an instance of body class RWDataFromVirtualInputStreamImp, the data is fetched from the underlying RWvistream as an int
.
If your code does use an alternate way (other than RWDataToVirtualOutputStreamImp ) to stream out data read by an RWDataFromVirtualInputStreamImp, you will need to change the way you stream out a signed char
to be streamed out as an int
than a char
, in order to be read correctly by RWDataFromVirtualInputStreamImp.
Classes RWThreadId and RWSynchObject now each have a constructor taking an RWStaticCtor argument. These constructors do not perform any direct initialization and hence enable users to create static instances of these classes.
Applications that already have static instances of RWThreadID and RWSynchObject classes should be updated to use the new constructors taking RWStaticCtor for such instances. This may avoid order of initialization problems in the event that any static instances of these objects are performing initialization.
In multithreaded builds, the RWFIFOMutexLock constructor that takes an RWStaticCtor argument does not behave correctly for static instances, because the class contains some data members that lack noninitialization constructors. The result is that these data members are initialized, even for static instances of RWFIFOMutexLock.
This behavior was also true in SourcePro 11.0, but was not documented. (The current reference guide entry for class RWFIFOMutexLock states that the static constructor functions correctly only in singlethreaded builds.)
Applications that currently rely on this constructor to perform no initialization should be updated to either remove the use of static instances of RWFIFOMutexLock or ensure that the initialization of static instances of RWFIFOMutexLock do not result in order of initialization issues.
For code that uses SQL statements produced for an RWDBSelector with a WHERE
clause, a select-list, or a having
clause against an Oracle DATE or TIMESTAMP column, the 11.1 release differs in output for literal and bound expressions:
RWDBTracer& tracer = aDB.tracer();
tracer.setOn(RWDBTracer::SQL);
tracer.stream(std::cout);
RWDateTime dt(13,1,2010,23,32,22);
RWDBSelector sel = aDB.selector();
RWDBTable tbl = aDB.table("mytable");
sel << tbl;
sel.where(tbl[0] < dt);
sel.execute(); // sel.asString();
Bound expression:
RWDBTracer& tracer = aDB.tracer();
tracer.setOn(RWDBTracer::SQL);
tracer.stream(std::cout);
RWDateTime dt(13,1,2010,23,32,22);
RWDBBoundExpr be(&dt);
RWDBSelector sel = aDB.selector();
RWDBTable tbl = aDB.table("mytable");
sel << tbl;
sel.where(tbl[0] < be);
sel.execute(); // sel.asString();
Output: In SourcePro 11.0: Both the above code snippets produced a placeholder:
01/14/2010 09:22:08 SQL> SELECT t0.* FROM mytable t0 WHERE t0.C1 < :ph10
In SourcePro 11.1: Only the code using a literal produces a literal value:
01/14/2010 09:22:08 SQL> SELECT t0.* FROM mytable t0 WHERE
t0.C1 < TO_TIMESTAMP('2010/01/13 23:32:22.000','YYYY/MM/DD
HH24:MI:SS.FF3')
...while the code using RWDBBoundExpr produces a placeholder:
01/14/2010 09:22:08 SQL> SELECT t0.* FROM mytable t0 WHERE t0.C1 < :ph10
On 64-bit systems, the method RWDBODBCLibEnvironmentHandle::timeout()
was previously documented to return SQLUINTEGER
. It now returns SQLULEN
:
SQLULEN RWDBODBCLibEnvironmentHandle::timeout(); // Version 11.1
SQLUINTEGER RWDBODBCLibEnvironmentHandle::timeout(); // Version 11.0
This does not affect 32-bit users, as these two types are the same size. However, 64-bit users need to update their application local variable from SQLUINTEGER
to SQLULEN
in order to avoid compilation warnings or failures.
-DSYB_LLP64
Command Line MacroSybase requires its 64-bit application compilations to use -DSYB_LLP64
command line macro on 64-bit Windows systems. Previously, makefiles generated for 64-bit Sybase builds on Windows included an incorrect macro.
In SourcePro 11.1, makefiles are now generated for Windows 64-bit Sybase builds with the correct macro.
Any custom-generated MSVC projects or makefiles based on the macros and flags defined from SourcePro 11 definitions should be updated to reflect the new macros and flags found in the example makefiles.
Prior to SourcePro 11.1, makefiles generated for Sybase multi-threaded builds on Red Hat Enterprise Linux 5 did not add the Sybase Access Module to the link line. With 11.1, the Sybase Access Module is added to these generated makefiles.
Custom-generated makefiles based on the macros and flags defined from 11.0 definitions should be updated to reflect the new macros and flags in the example makefiles.
const
With support for OpenSSL 1.0.0a, some methods in RWSecureSocketMethod now accept or return a SSL_METHOD*
. In SourcePro 11.0:
RWSecureSocketMethod::RWSecureSocketMethod(SSL_METHOD* method);
RWSecureSocketMethod::operator SSL_METHOD*() const;
In SourcePro 11.1:
RWSecureSocketMethod::RWSecureSocketMethod(const SSL_METHOD* method);
RWSecureSocketMethod::operator const SSL_METHOD*() const;
In your application code, use const SSL_METHOD*
where appropriate.
In SourcePro 11.0: A listening socket configured to do protocol fallback would accept connections from clients using SSLv2. For example:
// uses fallback by default
const RWSecureSocketContext default_context;
// uses fallback as requested explicitly
const RWSecureSocketContext
explicit_context(RWSecureSocketMethod::TLSv1WithFallback);
In SourcePro 11.1: Connections from SSLv2 clients to sockets that use fallback will fail with a handshake error by default.
The preferred solution is to change clients to use SSLv3 or TLSv1 where possible. If SSLv2 support is required, the context on the server side can be modified to allow these connections. The following code would be sufficient to work around the problem on the server side.
RWDecimalPortable and RWDecimal< M > now correctly set a Not A Number
state when parsing a string of whitespace(s).
In SourcePro 11.0:
RWDecimalPortable and RWDecimal< M > incorrectly parsed a string of whitespace(s) as a number, with the result that the method isNumber()
returned true
.
In SourcePro 11.1 RWDecimalPortable and RWDecimal< M > now correctly set a Not A Number
state when parsing an empty string (i.e. a string of whitespace(s)). The result is a return value of false
when calling isNumber()
on RWDecimal< M > for a string of whitespace(s).
If you have code that depends on a return value of true
when the method isNumber()
is called on an RWDecimalPortable or RWDecimal< M > with a string of whitespace(s), you will have to update your code.
General changes that affect all modules include:
Removal of Apache C++ Standard Library (STDCXX
) With the release of SourcePro 11.0, Rogue Wave Software has discontinued distribution of the Apache C++ Standard Library, and will cease to provide support for using the library with SourcePro C++. Users should build using the native standard library implementations shipped with the compiler for their operating system.
RWZone with Olson Timezone Database With the release of SourcePro 11, the RWZone implementation that uses the Olson Timezone Database has been deprecated. The classic RWZone and classic RWZoneSimple are chosen by default. Because this API is no longer available, please use the classic implementations instead.
Removal of RWBoolean The type RWBoolean has been removed from the Rogue Wave public APIs. The typedef remains for backward compatibility reasons, and this removal should result in no noticeable change in behavior.
Change to Static Build Dependencies All static builds of SourcePro C++ modules have been changed to use the runtime options /MD
or /MDd
.
Note: This was the behavior prior to SourcePro 10 update 1, so this will not affect your applications unless you are migrating to SourcePro 11 directly from SourcePro 10 update 1.
As a result, the libraries and any applications built with them now depend on the Microsoft C Runtime Library DLLs (MSVCRT.DLL
for release-mode, and MSVCRTD.DLL
for debug-mode). If you are upgrading from Rogue Wave products that used the Microsoft static runtime libraries, you must switch to the DLL runtime libraries. You can use one of the following methods:
If you work in the Visual Studio environment, choose Project | Settings..., click the C++ tab of the settings window, choose Code Generation from the Category drop-down box, and choose Multithreaded DLL or Debug Multithreaded DLL, for release or debug mode builds, respectively.
If you invoke the compiler directly (for example, through a makefile), replace the /ML
and /MT
flags with /MD
for release mode builds, or replace the /MLd
and /MTd
flags with /MDd
for debug mode builds.
Note: Throughout this document, a class member may be described as “undocumented.” This means that its use is not described anywhere in Rogue Wave documentation, and it is not public. Using undocumented APIs is not recommended or supported. In this release, several of these methods have been removed from the product.
RWFile now works in 64-bit mode for Windows.
The behavior of the following methods has changed:
GetStream()
always returns a non-null pointer for a valid file.
Access()
returns a null pointer for invalid files.
SeekTo()
, SeekTo64()
, CurOffset()
and CurOffset64()
now work for both large and small files.
The following, undocumented API methods have been removed.
RWCString::restoreFrom(...)
If a failure occurs in the stream, this method now returns the original unmodified string (rather than returning truncated or incorrect data), and relies on the user to check the stream for failure.
RWClassicCString::restoreFrom(...)
If a failure occurs in the stream, this method now returns the original unmodified string (rather than returning truncated or incorrect data), and relies on the user to check the stream for failure.
RWClassicWString::restoreFrom(...)
If a failure occurs in the stream, this method now returns the original unmodified string (rather than returning truncated or incorrect data), and relies on the user to check the stream for failure.
The following undocumented APIs have been removed.
RWWString::restoreFrom(...)
If a failure occurs in the stream, this method now returns the original unmodified string (rather than returning truncated or incorrect data), and relies on the user to check the stream for failure.
The following method is now const
:
Overall changes to SourcePro DB include:
dbTables()
methods have a new parameter with a default value.dbStoredProcedures()
methods have a new parameter with a default value.passWord()
method has a new overload to allow password changes.serverVersion()
accessor has been removed.noLongCharCapability()
mutator takes CS_BOOL instead of const CS_BOOL&
.logTextUpdates()
accessor is now const
.rowsPerCursorFetch()
accessor is now const
.maxStringSize()
accessor is now const
.unicodeMode()
accessor is now const
.useTimestamp()
accessor is now const
.Overall changes to Net include:
rw/network/RWBufferedRecvPortalImp.h
rw/network/RWBufferedSendPortalImp.h
rwSocketSelect
no longer blocks on Windows if passing an empty RWSocketAttribute.The maximum allowed buffered size is now limited by the maximum value for an int
, or approximately 2 gigabytes on most systems.
This change enforces consistency in the constructor to disallow the allocation of a buffer that is larger than the size of MAX_INT
. Previously the class would allow the creation of a buffer up to the size of max size_t
. No exception will be thrown or error will occur.
int
, or approximately 2 gigabytes on most systems. See also RWBufferedRecvPortal.RWBufferedSendPortal::buffered_recv
RWBufferedSendPortal::buffered_send
RWBufferedSendPortal::buffered_both
SourcePro no longer ships or builds modified versions of the BLA and LAPACK C implementation from <netlib.org>. Instead, SourcePro now depends on:
gcc
The following overload has been added:
This overload is preferred for performance reasons, if you're using the MKL/linux/64 bit, or SPL/32 bit.
Each SourcePro release is a replacement for, not an upgrade to, the previous version. Always perform an installation into a new area, and not into the same install directory as a previous version.
If you don't have administrator privileges, the installer will prompt you to enter the administrator's password.
For network installs on Windows, using a UNC path to specify the installation location is not supported. The problem is actually in RCB which, in such installs, is unable to create valid makefiles. So instead, create a mapped network drive to the desired network location. For the mapped network drive, be sure to check "Reconnect at Logon" checkbox. If this option is not selected, the mapped network drive will not appear when browsing for an install location.
Whenever you invoke RCB to build some set of libraries, there should be a build results HTML page at <buildspace>
/records/results/index.html
. However, this occurs only the first time you invoke RCB; for subsequent builds, this file is missing. You can, however, find the same information by looking in the subdirectory for the buildtype of the build just performed. For example, the results for a 12d build would be found at <buildspace>
/records/results/12d/index.html
. (SP-15699)
RCB-generated makefiles do not put quotes around include path strings. If the path to the installation directory (local buildspace), export buildspace, or a user-provided third party library contains spaces, then compile failures will result. One way to prevent these failures is to ensure that the paths for the locations in question don't contain spaces. However, this may not be possible in some environments. If it isn't possible to remove all spaces from the paths, select the build action of "just generate makefiles" and then perform the build through RCB. Once RCB has generated the required makefiles, alter the makefiles to quote the path(s) which contain spaces, then execute the relevant makeall_
<buildtype>
script (located in the root of the buildspace) to perform your build manually. (SP-15689)
Numerous optimization issues have been noted when compiling with -xO4
with Oracle Developer Studio 12.6 on Linux and Solaris/SPARC.
To avoid these issues, we've reduced the optimization level from -xO4
to -xO3
for all SourcePro modules. (SP-25946)
SLES 12.4 ships with binutils 2.31, which has a known issue when linking shared libraries (https://sourceware.org/bugzilla/show_bug.cgi?id=23409). This issue can result in errors such as:
/usr/lib64/gcc/x86_64-suse-linux/ld: ../lib/libexample.so: _edata: invalid version 21 (max 0)
/usr/lib64/gcc/x86_64-suse-linux/ld: ../lib/libexample.so: error adding symbols: bad value
If you encounter this problem, it is recommended that you upgrade to a newer version of binutils (>=2.32). To specify an alternate binutils version in RCB, enable the "Advanced Questions" option, then set the "Start Flags" property in the "Custom Library Linking Flags" section to:
-B<binutils_installdir>/bin
(SP-28259)
Optimization issues have been noted when using Oracle Developer Studio 12.6 to build 64-bit binaries on x86 platforms.
To avoid these issues, we've changed the compiler target architecture from -xarch=sse3
to -xarch=sse2
for the Essential Math, Linear Algebra, and Business Analysis modules. (SP-24293, SP-25937, SP-25507)
Multiplication where the result contains insignificant trailing zeros may cause an inexact exception to be thrown, even if the result is represented exactly. In the following example, in which the class RWDecimal<RWMultiPrecisionInt<2>> can represent numbers with 18 decimal digits, an inexact exception will be generated:
RWDecimal< RWMultiPrecisionInt<2> > valA = "5282.80977864";
RWDecimal< RWMultiPrecisionInt<2> > valB = "1000000000";
RWDecimal< RWMultiPrecisionInt<2> > valMul = valA * valB;
cout << "valA : " << valA << endl;
cout << "valB : " << valB << endl;
cout << "valMul: " << valMul << endl;
The program creates the following output:
[MULINEXACT] RWDecimal: inexact result in multiplication
valA : 5282.80977864
valB : 1000000000
valMul : 5282809778640.00000 // 18 digit result still exact
In one sense, the inexact exception is correct, since a certain number of significant digits are lost in the calculation. It just happens that those digits are all zeros. (SP-10262)
-ffloat-store
recommended when compiling with GCCGCC compiler optimizations include storing floating point variables in registers. On some machines this results in greater precision than a double should have.
According to the GCC man page:
"For most programs, the excess precision does only good, but a few
programs rely on the precise definition of IEEE floating point. Use
'-ffloat-store' for such programs."
This advice applies to portions of the Currency Module code, and we have disabled this particular optimization for non-debug library builds and example-program builds by adding the -ffloat-store
option to the compiler command line.
We strongly recommend that you add -ffloat-store
to the command line of any non-debug programs built using the Currency Module and the GCC compiler.
When using the Solaris SunPro compiler and the native C++ Standard Library, the number of bytes counted by an RWAuditStreamBuffer cannot be printed without forcing the compiler to invoke the member conversion operator. The following code demonstrates the issue:
This problem affects the Essential Tools examples manual/auditbuf
and manual/auditbufx
. The problem is not observed when using the GCC C++ Standard Library. (SP-9247)
The C++ Standard Library that comes with the HP aC++ compiler has problems with locales other than the "C" locale. This can cause failures in RWAnsiLocale::stringToDate()
. (SP-10843 / HP CR# QXCR1000990079)
ICU binaries built with Oracle Developer Studio and the GCC C++ Standard Library will have a runtime dependency on the GCC libraries bundled with the compiler. The runtime shared library path must be set to include the GCC libraries. (SP-24358)
The Threads Platform Guide documents that user-defined stack attributes are supported on Linux. This is not currently the case. We continue to investigate providing stack attribute support on this platform; however, we are unable to do so at this time. (SP-13419)
const
in copy constructor and assignment operatorThe RWTOnlyPointer copy constructor and assignment operator take const
RWTOnlyPointer references, but casts away const
on the parameter in order to invalidate it.
The parameters should be changed to non-const
references to be correct, but this could potentially break user code which depends on being able to pass a const
parameter. This issue will be fixed in the future.
Do not use RWTOnlyPointer instances in containers that expect assignability and copy constructability. This could cause issues because the value passed to the copy constructor or assignment operator will be invalidated. (SP-10222)
Oracle Solaris 11 changed the behavior of various functions related to setting and retrieving thread attributes. These changes are incompatible with assumptions the SourcePro Threads Module makes and may lead to unexpected exceptions, silent failures, or other errors. For this release, it is recommended that users avoid thread attributes related to priority, scheduling or inheritance on Solaris 11. This behavior will be reviewed in a future release. (SP-14298)
-lsocket
The DB2 client library is unable to load the socket library on Solaris. When this happens the database returns:
SQL1042C An unexpected system error occurred. SQLSTATE=58004
The workaround is to add -lsocket
to the link line of the executable. (SP-21466)
In multithreaded applications, producing RWDBDatabase objects using an RWDBManager::database()
call in each thread simultaneously results in a segmentation fault. This is due to a MySQL native call that is not multithread-safe.
To work around this problem, serialize the production of the first RWDBDatabase object. Alternatively, call MySQL native API mysql_server_init()
(mysql_library_init()
for MySQL 5.x) before accessing the DB Access Module for MySQL. (SP-8553)
ODBC allows the driver implementer to decide how to handle return values from stored procedures. A common convention is to support a bound return value. In this scenario, SourcePro DB allows retrieving the return value in the following manner:
RWDBDatabase db = ...
RWDBConnection conn = db.getConnection();
RWDBStoredProc sproc = db.storedProc("procedurename", conn);
// execute the stored procedure
sproc.execute(conn);
// retrieve the return value
RWDBValue val = sproc.returnValue();
The Informix ODBC driver supports multiple return values, and as a result follows an alternate convention, in which the return values are returned as a result set for the function. In that scenario, the return value can be retrieved from the result set, like so:
// execute the stored procedure
RWDBResult res = sproc.execute(conn);
// create a reader for the result set.
RWDBReader reader = res.table().reader();
RWDBValue val;
reader() >> val ; // retrieve the return value
This behavior is consistent with the legacy Informix Access Module.
ODBC defines the call semantics for a stored procedure with no parameters as:
Informix does not support this syntax and instead uses an alternate syntax in this scenario:
The Informix syntax is interpreted by conforming ODBC implementations as calling the procedure procedurename with one argument, where that argument has a default value.
The ODBC Access Module's RWDBStoredProcedure implementation uses the first calling convention when invoking a stored procedure with no parameters. In order to call an Informix stored procedure with no parameters, use the RWDBOSql interface instead. For example:
RWDBDatabase db = /* ... */
RWDBConnection conn = db.getConnection();
const RWCString callStmt = "{ call procedurename() }";
RWDBOSql osql(callStmt, RWDBOSql::Procedure);
osql.execute(conn);
The SQL syntax for dropping a column allows for an optional COLUMN
keyword. The syntax is:
Some databases require the optional COLUMN
keyword, others allow it, and Informix prohibits it. The ODBC Access Module emits the COLUMN
keyword, causing a conflict when connecting to Informix. To resolve this, use the RWDBOSql interface. For example:
RWDBDatabase db = /* ... */
RWDBTable table = db.table("table");
// ...
RWDBColumn col;
col.type(RWDBValue::Int).name("col");
// ...
table.dropColumn(col);
This last line could be rewritten to use RWDBOSql
as:
char buf [1024];
snprintf(buf, sizeof buf, "ALTER TABLE %s DROP %s",
table.name().data(), col.name().data());
RWDBOSql osql(buf);
osql.execute(con);
If you use RWDBBulkInserter to insert an array of strings with a length of 255 or less into a TEXT
column, the insertion will fail and the Informix Database will return the error:
HY000 Illegal attempt to convert Text/Byte blob type.
Resolve this by specifying the width parameter while constructing the RWDBTBuffer that is bound against the TEXT
column. For example:
// Bulk inserting 100 rows of strings with width of 256
RWDBTBuffer<RWCString> buff(100, 256);
buff[0] = "abc";
// ...
If you encounter the same Informix database error from any other operation, use the RWDBOSql interface along with RWDBTBuffer. For example:
RWDBDatabase db = /* ... */
RWDBInserter inserter = db.inserter("table");
RWCString str1;
RWDBBoundExpr expr1(&str1, &nullIndicator1);
inserter << expr1;
str1 = "abc";
inserter.execute();
Here's an example using RWDBOSql and specifying the width parameter of the RWDBTBuffer with the SQL statement obtained by using the RWDBTracer interface:
RWDBDatabase db = /* ... */
RWDBOSql sql("INSERT INTO table VALUES (?)");
RWDBTBuffer<RWCString> str1(1, 256);
sql << str1;
str1[0] = "abc";
sql.execute();
The SQL syntax for creating a clustered index is slightly different for Informix than other databases. The normal syntax is:
Informix uses CLUSTER
instead of CLUSTERED
. The ODBC Access Module emits CLUSTERED
, causing a conflict when connecting to Informix. Resolve this using the RWDBOSql interface. For example:
RWDBDatabase db = /* ... */
RWDBTable table = db.table("table");
// ...
RWDBColumn col;
col.type(RWDBValue::Int).name("col");
// ...
table.createIndex("index", schema, conn, true, true);
Rewrite the last line to use RWDBOSql as:
char buf [1024];
snprintf(buf, sizeof buf, "CREATE UNIQUE CLUSTERED INDEX %s ON %s(%s)",
"index", table.name().data(), col.name().data());
RWDBOSql osql(buf);
osql.execute(con);
Informix does not correctly handle inserting multibyte string literal values. Attempted insertions may result in either data corruption or an application crash, in some cases. Inserting multibyte strings via bound values works correctly. (SP-16804, IT02280)
RWDBOSql::rowsAffected()
may return an incorrect value when a row is inserted using data-at-execution. Inserting a single row at a time avoids this issue. (SP-16579, IT02184)
On some platforms, reading BIGINT
data in to a long long
datatype may result in the return of an incorrect value in which the upper and lower 32-bit values are swapped in the resulting output. This issue was observed with 32-bit Solaris x86 builds, but may affect other platforms as well. To ensure portability, it is recommended that values not be read in to the long long
or unsigned long long
datatypes. (SP-17188, IT02278)
Attempting to describe a column that has a default value may result in incorrect or incomplete information. This issue affects only describing a column with a default value, creating a column with a default value and leveraging default values when inserting data are unaffected. (SP-16582, IT02230)
Binding a 64-bit integral type as an input parameter results in incorrect data being passed to the database. This affects only bound values; literal values are unaffected. (SP-17293, IT02552)
When strings are inserted into a VARCHAR
column, trailing whitespace is removed. This behavior is not observed when inserting strings into a TEXT
column. (SP-17187, IT01262)
On Linux, setting the login timeout (RWDBODBCLibEnvironmentHandle::timeout
) has no effect. This is caused by a conflict in the handling of this value between unixODBC and the Informix driver. (SP-17187, IT02279)
Informix requires delimited table names to be quoted when passed to ODBC API functions such as SQLColumns
and SQLProcedures
. This conflicts with the ODBC Access Module and other ODBC drivers that expect those names to be unquoted. Due to this limitation, delimited names are not currently supported with Informix. (SP-16743, IT01153)
The Sybase Client-Library CS_INT
datatype is strictly 4 bytes, even on 64-bit platforms. Binding a long
or unsigned long
on a platform with an 8-byte long
results in data truncation. Use the int
datatype instead. (SP-14608)
This library has problems handling decimal columns with NULL
values through cursors. On some platforms, deleting a row with null values in decimal columns through a cursor causes a core dump. In some platforms, it returns non-null values for NULL
columns. Sybase has identified this as a bug. (Sybase #94310 / SP-7765)
If a user attempts to bind RWCString data having length greater than 16384 bytes into a column of type TEXT
, the data gets truncated to 16384 bytes. This is due to the page-size limitation in Sybase.
A workaround is to insert the data as a literal rather than a placeholder. All DB Data Manipulation Classes will put RWCString data greater than 16384 bytes as literal in the SQL sent for execution. However, while using class RWDBOSql, the user must perform this before passing the statement to the RWDBOSql instance. (Sybase case #10832821 / SP-7789)
The DB Access Module for Sybase supports bulk writing through the array interface provided by the Sybase Bulk-Library function blk_bind()
, which is part of the Open Client and Open Server common libraries. However, Sybase Bulk-Library does not support insertion with column-list. Here are some other specifics on using bulk insertion with SourcePro DB and Sybase:
The RWDBBulkInserter associated with the DB Access Module for Sybase can accept RWDBTBuffer<RWDBBlob> with elements up to 64K in width. Elements of width greater than 64K may corrupt the database.
Bulk insertion is implemented based on the Sybase Bulk-Library, which may impact the recoverability of the database in case of failures. See the Sybase documentation on "Bulk-Library client programming" for full details.
The Sybase Bulk-Library call blk_bind()
doesn't report errors when NULLS
are inserted into a column that doesn't accept NULL
values.
Executables using Sybase Access Module multithreaded dynamic libraries on Solaris and Linux need to link the Sybase vendor libraries. Not linking the Sybase vendor libraries to the executable has been observed to produce intermittent segmentation faults. The Sybase vendor libraries can be linked directly or by linking the Sybase Access Module library to the executable. The Sybase Access module examples link the Sybase Access Module library.
As these failures are intermittent, if you do not observe these failures, you do not need to link these libraries to your executables. (SP-8505/SP-9426/SP-9472)
When using Oracle Heterogeneous Services for SQL execution, you need to use explicit Transaction Management using beginTransaction()
and commitTransaction()
. By default, this module uses OCI_COMMIT_ON_SUCCESS
, whereas heterogeneous services require transactions.
When a result set fetched from Oracle has a LONG
column in it and no buffer is bound for the LONG
column, then Oracle returns either ORA-03106: fatal two-task communication protocol
or ORA-00127 dispatcher %s does not exist
. (Oracle bug #4919068 / SP-8671)
Calling OCIBreak
to terminate polling operations doesn't work. This results in ORA-03127 when the next operation is attempted on the connection. OCIBreak
is called when:
Reading into a RWDBTBuffer<char> when the buffer is not large enough to hold the data.
Returning false or throwing an exception from RWDBDataCallback::onFetch()
. This has been identified as Oracle bug #10606993.
The Oracle datatypes SYS.XMLTYPE
is supported by SourcePro DB, but extra steps are required in some cases. When inserting data using RWDBInserter, to use the best transfer mechanism the DB Interface Module needs to know that the underlying table has a SYS.XMLTYPE
column. The easiest way to do this is by calling the RWDBTable::fetchSchema()
method before creating your RWDBInserter instance. Here's an example that demonstrates this:
// CREATE TABLE foo(c NUMBER(9), xmlcol SYS.XMLTYPE);
RWDBTable foo = myDb.table("foo");
foo.fetchSchema(myConn);
RWDBInserter ins = foo.inserter();
int c;
RWCString xml;
// fill in data ...
ins << c << xml;
ins.execute(myConn);
Applications using the Oracle Access Module on HP-UX 11i v3 crash with a bus error if the first connection established by the application is inside a child thread. Increasing the thread stack size using thread_attr_setstacksize()
resolves the issue. (SP-9006)
Clients using SSLv2 may no longer be able to connect to servers using TLSv1WithFallback. This is because the default cipher list used by OpenSSL 1.0.0 and later no longer includes the necessary ciphers for this fallback to work. While it is strongly encouraged to avoid using SSLv2, fallback support for SSLv2 can be enabled by enabling the necessary ciphers on a context. The following code snippet demonstrates.
The PDF documents shipped with SourcePro are provided so customers can print the documents if they wish. These documents are not intended as primary access to the product documentation, and may not be as fully functional as the HTML documentation. One known issue is that hyperlinks between these documents do not work, and other issues may exist.