SourcePro® 2023.1 Release Notes

Sections

Introduction

In this Document

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.

Changes

Updated Platform Support

SourcePro 2022.1

SourcePro Core - Essential Tools Module

SourcePro Core - Advanced Tools Module

SourcePro DB - DB Access Module for Oracle OCI

SourcePro Net - Secure Communication Module

SourcePro 2021.1

SourcePro Net - Internet Protocols Module

General

Installer

SourcePro 2021

SourcePro Core - Essential Tools Module

SourcePro DB

SourcePro DB - DB Access Module for MySQL

RCB

SourcePro 2020

SourcePro Core - Essential Tools Module

SourcePro 2018.3

SourcePro Core - Essential Tools Module

SourcePro 2018.2

SourcePro Core - Essential Tools Module

SourcePro 2018.1

SourcePro Core - Essential Tools Module

SourcePro Core - Advanced Tools Module

SourcePro DB

SourcePro DB - DB Access Module for Oracle OCI

SourcePro DB - DB Access Module for MySQL

SourcePro DB - DB Access Module for PostgreSQL

SourcePro Net - Secure Communication Module

RCB

SourcePro 2018.0.1

SourcePro DB - DB Access Module for MySQL

SourcePro DB - DB Access Module for Sybase

SourcePro 2018

SourcePro Core - Essential Tools Module

SourcePro Core - Internationalization Module

SourcePro DB

SourcePro DB - DB Access Module for Microsoft SQL Server

SourcePro DB - DB Access Module for MySQL

SourcePro DB - DB Access Module for ODBC

SourcePro DB - DB Access Module for Oracle

SourcePro DB - DB Access Module for Sybase

SourcePro Net - Secure Communication Module

SourcePro 2016.3

SourcePro DB

SourcePro DB - DB Access Module for ODBC

SourcePro DB - DB Access Module for Oracle

SourcePro Net - Essential Networking Module

SourcePro Net - Secure Protocols Module

RCB

SourcePro 2016.2

SourcePro Core - Essential Tools Module

SourcePro DB - DB Access Module for PostgreSQL

SourcePro DB - DB Access Module for Sybase

SourcePro Net - Essential Networking Module

SourcePro Net - Internet Protocols Module

SourcePro 2016.1

General

SourcePro Core - Essential Tools Module

SourcePro 2016

General

SourcePro Core - Essential Tools Module

SourcePro Core - Advanced Tools Module

SourcePro Core - Threads Module

SourcePro DB

SourcePro DB - DB Access Module for DB2 CLI

SourcePro DB - DB Access Module for MySQL

SourcePro DB - DB Access Module for Oracle

SourcePro Analysis - Linear Algebra Module

SourcePro Analysis - Currency Module

SourcePro Net - Secure Communications Module

SourcePro 13.2.1

SourcePro Core - Essential Tools Module

SourcePro 13.2

SourcePro Core - Essential Tools Module

SourcePro Core - Advanced Tools Module

SourcePro DB

SourcePro DB - DB Access Module for Oracle OCI

Installer/RCB

SourcePro 13.1

SourcePro Core - Essential Tools Module

SourcePro DB

SourcePro Net - Internet Protocols Module

SourcePro Net - Secure Communications Module

SourcePro Analysis

SourcePro 13

General

SourcePro Core - Essential Tools Module

SourcePro Core - Threads Module

SourcePro Core - Internationalization Module

SourcePro Core - XML Streams Module

SourcePro DB

SourcePro DB - DB Access Module for ODBC

SourcePro DB - DB Access Module for Oracle OCI

SourcePro DB - DB Access Module for Sybase

SourcePro Net - Essential Networking Module

SourcePro Net - Internet Protocols Module

SourcePro Analysis - Essential Math Module

SourcePro Analysis - Currency Module

SourcePro Analysis - Linear Algebra Module

SourcePro 12.5

General

SourcePro Core - Essential Tools Module

SourcePro Core - Threads Module

SourcePro Core - Internationalization Module

SourcePro DB

SourcePro DB - DB Access Module for DB2

SourcePro DB - DB Access Module for Microsoft SQL Server

SourcePro DB - DB Access Module for MySQL

SourcePro DB - DB Access Module for ODBC

SourcePro DB - DB Access Module for Sybase

SourcePro Net

SourcePro Net - Essential Networking Module

SourcePro Net - Internet Protocols Module

SourcePro Net - Secure Communications Module

SourcePro Analysis

SourcePro Analysis - Essential Math Module

SourcePro Analysis - Currency Module

SourcePro Analysis - Linear Algebra Module

SourcePro 12.0.1

General

SourcePro DB - DB Access Module for DB2 CLI

SourcePro DB - DB Access Module for Microsoft SQL Server

SourcePro DB - DB Access Module for Sybase

SourcePro Net - Internet Protocols Module

SourcePro Analysis - Essential Math Module

SourcePro 12

General

SourcePro Core

SourcePro Core - Essential Tools Module

SourcePro Core - Advanced Tools Module

SourcePro Core - Threads Module

SourcePro DB

SourcePro DB - DB Access Module for DB2 CLI

SourcePro DB - DB Access Module for ODBC

SourcePro DB - DB Access Module for Microsoft SQL Server

SourcePro DB - DB Access Module for MySQL

SourcePro DB - DB Access Module for ODBC

SourcePro DB - DB Access Module for Oracle

SourcePro DB - DB Access Module for Sybase

SourcePro Net - Essential Networking Module

SourcePro Net - Internet Protocols Module

SourcePro Net - Secure Communications Module

SourcePro Analysis - Essential Math Module

SourcePro Analysis - Currency Module

SourcePro 11.1

General

SourcePro Core - Essential Tools Module

SourcePro Core - Threads Module

SourcePro Net - Essential Networking Module

SourcePro Analysis - Essential Math Module

SourcePro Analysis - Linear Algebra Module

SourcePro Analysis - Currency Module

SourcePro DB

SourcePro DB - DB Access Module for DB2 CLI

SourcePro DB - DB Access Module for Microsoft SQL Server

SourcePro DB - DB Access Module for ODBC

SourcePro DB - DB Access Module for Oracle

SourcePro DB - DB Access Module for PostgreSQL

SourcePro DB - DB Access Module for Sybase

SourcePro 11.0.2

SourcePro DB - DB Access Module for Oracle

SourcePro 11

SourcePro Core - Essential Tools Module

SourcePro Core - Threads Module

SourcePro Net - Essential Networking Module

SourcePro DB

SourcePro DB - DB Access Module for DB2 CLI

SourcePro DB - DB Access Module for Microsoft SQL Server

SourcePro DB - DB Access Module for ODBC

SourcePro DB - DB Access Module for Oracle

SourcePro DB - DB Access Module for PostgreSQL

SourcePro DB - DB Access Module for Sybase

SourcePro 10.1

SourcePro Analysis - Currency Module

SourcePro DB - DB Access Module for Oracle

SourcePro DB - DB Access Module for Sybase

SourcePro 10

SourcePro Core - Essential Tools Module

SourcePro Analysis - Essential Math Module

SourcePro DB

SourcePro DB - DB Access Module for DB2 CLI

SourcePro DB - DB Access Module for Microsoft SQL Server

SourcePro DB - DB Access Module for Informix

SourcePro DB - DB Access Module for MySQL

SourcePro DB - DB Access Module for ODBC

SourcePro DB - DB Access Module for Oracle

SourcePro DB - DB Access Module for Sybase

SourcePro 9.1

SourcePro Core - Essential Tools Module

SourcePro 9

SourcePro Core - Essential Tools Module

SourcePro Core - Internationalization Module

SourcePro Analysis - Essential Math Module

SourcePro Analysis - Currency Module

SourcePro DB

SourcePro DB - DB Access Module for Informix

SourcePro DB - DB Access Module for MySQL

SourcePro DB - DB Access Module for Oracle

SourcePro DB - DB Access Module for PostgreSQL

SourcePro DB - DB Access Module for Sybase

SourcePro 8

SourcePro Core - Essential Tools Module

SourcePro Core - Threads Module

SourcePro Core - Advanced Tools Module

SourcePro Core - XML Streaming Module

SourcePro Analysis - Essential Math Module

SourcePro Analysis - Linear Algebra Module

SourcePro Analysis - Business Analytics Module

SourcePro Analysis - Currency Module

SourcePro DB

SourcePro DB - DB Access Module for DB2 CLI

SourcePro DB - DB Access Module for Microsoft SQL Server

SourcePro DB - DB Access Module for Informix

SourcePro DB - DB Access Module for MySQL

SourcePro DB - DB Access Module for ODBC

SourcePro DB - DB Access Module for Oracle

SourcePro DB - DB Access Module for PostgreSQL

SourcePro DB - DB Access Module for Sybase

SourcePro 7

SourcePro Core - Essential Tools Module

SourcePro Core - Advanced Tools Module

SourcePro Core - Internationalization Module

SourcePro Net - Internet Protocols Module

SourcePro Net - Secure Communications Module

SourcePro Analysis - Essential Math Module

SourcePro Analysis - Linear Algebra Module

SourcePro Analysis - Business Analytics Module

SourcePro Analysis - Currency Module

SourcePro DB

SourcePro DB - DB Access Module for DB2 CLI

SourcePro DB - DB Access Module for Microsoft SQL Server

SourcePro DB - DB Access Module for Informix

SourcePro DB - DB Access Module for ODBC

SourcePro DB - DB Access Module for Oracle8

SourcePro DB - DB Access Module for Oracle

SourcePro DB - DB Access Module for Sybase

SourcePro 6

SourcePro Core - XML Streaming Module

SourcePro Net - Essential Networking Module

SourcePro Net - Internet Protocols Module

SourcePro Analysis

SourcePro DB

SourcePro DB - DB Access Module for DB2 CLI

SourcePro DB - DB Access Module for Microsoft SQL Server

SourcePro DB - DB Access Module for Informix

SourcePro DB - DB Access Module for ODBC

SourcePro DB - DB Access Module for Oracle8

SourcePro DB - DB Access Module for Oracle9

SourcePro DB - DB Access Module for Oracle

SourcePro DB - DB Access Module for Sybase

SourcePro 5

SourcePro Core - Advanced Tools Module

SourcePro Core - Internationalization Module

SourcePro Core - XML Streaming Module

SourcePro Net - Internet Protocols Module

SourcePro Analysis - Linear Algebra Module

SourcePro DB

SourcePro DB - DB Access Module for DB2 CLI

SourcePro DB - DB Access Module for Microsoft SQL Server

SourcePro DB - DB Access Module for Informix

SourcePro DB - DB Access Module for ODBC

SourcePro DB - DB Access Module for Oracle8

SourcePro DB - DB Access Module for Oracle9

SourcePro DB - DB Access Module for Oracle

SourcePro DB - DB Access Module for Sybase

SourcePro 4.1

SourcePro Core - Essential Tools Module

SourcePro Core - XML Streaming Module

SourcePro 4

SourcePro Core - Essential Tools Module

SourcePro Core - Threads Module

SourcePro Core - Advanced Tools Module

SourcePro Core - XML Streaming Module

SourcePro Net - Essential Networking Module

SourcePro Net - Internet Protocols Module

SourcePro Net - Secure Communications Module

SourcePro Analysis - Essential Math Module

SourcePro Analysis - Linear Algebra Module

SourcePro Analysis - Business Analytics Module

SourcePro DB

SourcePro DB - DB Access Module for DB2 CLI

SourcePro DB - DB Access Module for Microsoft SQL Server

SourcePro DB - DB Access Module for Informix

SourcePro DB - DB Access Module for ODBC

SourcePro DB - DB Access Module for Oracle

SourcePro DB - DB Access Module for Oracle8

SourcePro DB - DB Access Module for Oracle9

SourcePro DB - DB Access Module for Sybase DB

SourcePro DB - DB Access Module for Sybase

SourcePro 3

SourcePro Core - Essential Tools Module

SourcePro Core - Threads Module

SourcePro Core - Advanced Tools Module

SourcePro Net - Essential Networking Module

SourcePro Net - Internet Protocols Module

SourcePro Net - Secure Communications Module

SourcePro Analysis - Essential Math Module

SourcePro Analysis - Linear Algebra Module

SourcePro Analysis - Business Analytics Module

SourcePro Analysis - Currency Module

SourcePro DB

SourcePro DB - DB Access Module for DB2 CLI

SourcePro DB - DB Access Module for Microsoft SQL Server

SourcePro DB - DB Access Module for Informix

SourcePro DB - DB Access Module for ODBC

SourcePro DB - DB Access Module for Oracle

SourcePro DB - DB Access Module for Oracle8

SourcePro DB - DB Access Module for Sybase

SourcePro 2

SourcePro Core - Essential Tools Module

SourcePro Core - Threads Module

SourcePro Net - Essential Networking Module

SourcePro Net - Internet Protocols Module

SourcePro Net - Secure Communications Module

SourcePro Analysis - Essential Math Module

SourcePro Analysis - Linear Algebra Module

SourcePro Analysis - Currency Module

SourcePro DB - DB Access Module for DB2 CLI

SourcePro DB - DB Access Module for Informix

SourcePro DB - DB Access Module for Microsoft SQL Server

SourcePro DB - DB Access Module for ODBC

SourcePro DB - DB Access Module for Oracle

SourcePro DB - DB Access Module for Oracle8

SourcePro DB - DB Access Module for Sybase

SourcePro 1

SourcePro Core - Essential Tools Module

SourcePro Core - Threads Module

SourcePro Net - Essential Networking Module

SourcePro Net - Internet Protocols Module

SourcePro Analysis - Currency Module

SourcePro DB

SourcePro DB - DB Access Module for Microsoft SQL Server

SourcePro DB - DB Access Module for Informix

SourcePro DB - DB Access Module for ODBC

SourcePro DB - DB Access Module for Oracle8

SourcePro DB - DB Access Module for Oracle

SourcePro DB - DB Access Module for Sybase DB

SourcePro DB - DB Access Module for Sybase

Migration Guide

SourcePro 2022.1

SourcePro Core - Essential Tools Module

Custom Error Handling Support Removed

In previous releases, the Essential Tools Module supported the option of specifying a custom error handler to be invoked when an exception was raised by the library, for example:

void myOwnErrorHandler(const RWxmsg& error)
{
    std::cout << "myOwnErrorHandler(" << error.why() << ")" << std::endl;
}

int main()
{
    rwSetErrHandler(myOwnErrorHandler);
    RWTValOrderedVector<size_t> sampleData;
    sampleData.removeAt(1);
    return 0;
}

With SourcePro 2022.1, support for specifying a custom error handler has been removed, and when the library raises an exception, it will always be thrown. In order to invoke a custom error handler now, the exception will need to be caught and passed to the error handler manually, for example:

void myOwnErrorHandler(const RWxmsg& error)
{
    std::cout << "myOwnErrorHandler(" << error.why() << ")" << std::endl;
}

int main()
{
    RWTValOrderedVector<size_t> sampleData;
    try {
        sampleData.removeAt(1);
    }
    catch (const RWxmsg& err) {
        myOwnErrorHandler(err);
    }
}
struct tm tm_isdst field is being correctly handled

In previous releases, a provided struct tm with the tm_isdst field set to 0 or 1 would result RWDateTime values that would be inconsistent with equivalent system calls (RWDateTime always treated tm_isdst as having a value of -1 regardless of the contents of the struct tm), for example:

void output(struct tm* tm_data)
{
    const RWDateTime dt(tm_data);
    std::cout << dt.asString(RWDateTime::iso8601) << std::endl;
}

int main()
{
    const RWZoneSimple zone(RWZone::USPacific, RWZone::NoAm);
    RWZone::local(&zone);

    // 07-04-2020 1:00:00 AM UTC-8
    struct tm isdst_0 = {0, 0, 1, 4, 6, 120, 0, 186, 0};
    output(&isdst_0);

    // 07-04-2020 1:00:00 AM UTC-7
    struct tm isdst_1 = {0, 0, 1, 4, 6, 120, 0, 186, 1};
    output(&isdst_1);

    return 0;
}

Output From prior to SourcePro 2022.1

2020-07-04T01:00:00-07:00
2020-07-04T01:00:00-07:00

Output from SourcePro 2022.1

2020-07-04T02:00:00-07:00
2020-07-04T01:00:00-07:00

With SourcePro 2022.1, the tm_isdst field of struct tm is now set and read correctly in the RWDateTime and RWZone APIs.

In order to restore the behavior previous to SourcePro 2022.1, manually set the tm_isdst field of struct tm explicitly to -1.

void output(struct tm* tm_data)
{
    tm_data->tm_isdst = -1;
    const RWDateTime dt(tm_data);
    std::cout << dt.asString(RWDateTime::iso8601) << std::endl;
}

Output from SourcePro 2022.1

2020-07-04T01:00:00-07:00
2020-07-04T01:00:00-07:00

SourcePro 2021.1

SourcePro Analysis - Essential Math Module

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.

SourcePro Core - Essential Tools Module

XDR Streams uses libtirpc when available

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.

Snappy Package

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.

SourcePro Core - Internationalization Module

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.

SourcePro Net - Secure Communication Module

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.

SourcePro 2018

SourcePro Core - Essential Tools Module

RWDate serialization incompatible with previous versions of SourcePro

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 serialization on RWFile incompatible with previous versions of SourcePro

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.

Pointer based template class function overloads using function pointers with value_type arguments have been removed

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*).

apply() functions in RWTPtrSlist and RWTValSlist are now const correct

The 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.

Specialization of RWTHash on RWDate

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 types no longer leverage dynamic_cast in compareTo()

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.

SourcePro Net - Secure Communication Module

AIX dynamic builds now use the -brtl flag for linking applications

The 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.

SourcePro DB

Specialization of RWTHash on RWDBDateTime

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.

Join expression evaluation order

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:

SELECT * FROM J1 t1 NATURAL LEFT JOIN J2 t2 RIGHT OUTER JOIN J3 t3 ON ( t2.pn = t3.pn )

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:

SELECT * FROM J1 t1 NATURAL LEFT JOIN (J2 t2 RIGHT OUTER JOIN J3 t3 ON ( t2.pn = t3.pn ) )

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:

SELECT * FROM (J1 t1 NATURAL LEFT JOIN J2 t2 ) RIGHT OUTER JOIN J3 t3 ON ( t2.pn = t3.pn )

SourcePro 2016

SourcePro Analysis

Intel Math Kernel Library

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.

SourcePro Core - Essential Tools Module

ISO8601 Compatibility Parser was deprecated. (SP-21129)

The enumerator RWDateTime::iso8601_compat was deprecated. Applications should use one of the other RWDateTime::Format enumerators instead.

RWLocaleSnapshot::refresh() was removed. (SP-20437)

The function RWLocaleSnapshot::refresh() was removed. Applications that need custom locale definitions should generate them using the tools provided with the operating system.

SourcePro Core - Threads Module

Package-level tracing was removed. (SP-17826)

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.

SourcePro DB

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.

SourcePro Net - Secure Communication Module

Important OpenSSL Security Migration (SP-22901)

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

SourcePro 13.2

SourcePro Core - Internationalization Module

ICU Unicode algorithms fall back to root instead of default locale

With 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.

SourcePro DB

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:

SourcePro 13.1

SourcePro Core - Essential Tools Module

rw_hashset::insert() and rw_hashmap::insert() no longer return end() if an item already exists (SP-18961)

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.

RWTPtrSlist::sort() no longer uses greater-than operator to sort objects (SP-14556)

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.

SourcePro DB

RWDBDatabase::table() assumes the schema provided as an argument is complete (SP-18626)

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.

RWDBTable::fetchSchema() no longer retrieves default column values or identity constraints (SP-18626)

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:

RWDBSchema schema =
table.describe(RWDBTable::DefaultValues | RWDBTable::IdentityConstraint);

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.

SourcePro 13

SourcePro Core - Essential Tools Module

RWDateTime relational operators no longer throw exceptions

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;
}

SourcePro DB - DB Access Module for PostgreSQL

The standard_conforming_strings server setting

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.

SourcePro 12.5

SourcePro Core - Essential Tools Module

ISO-8601 Format Parsing

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.

Parsing Strings with RWDateTime::iso8601

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.

API Change to RWTIsvSlist and RWTIsvDlist

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.

RWios::fail() Behavior

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():

if (bis.rdstate() & std::ios::failbit) {
// std::ios::failbit is set.
}
RWTPtrHashMap and RWTPtrHashMultiMap Equality

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.

Signed Char Support in Virtual Streams

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.

Default Stream Version Changed to Support Optimization in Virtual Streams Data

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:

In this release, the following versions have been added:

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.

SourcePro Core - Threads Module

New Functor API

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.

SourcePro Core - Internationalization Module

Iterator Classes

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.

SourcePro DB

RWDBDateTime

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.

SourcePro DB - DB Access Module for DB2 CLI

Stored Procedures

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.

Dependency on maxStringSize() and maxBlobSize()

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.

SourcePro DB - DB Access Module for Microsoft SQL Server

Dependency on maxStringSize() and maxBlobSize()

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.

SourcePro DB - DB Access Module for ODBC

Dependency on maxStringSize() and maxBlobSize()

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.

SourcePro Analysis - Essential Math Module

Removal of DComplex

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.

Removal of blalib and lapfor Libraries

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.

SourcePro Net - Essential Networking Module

rwSocketSelect and rwSecureSocketSelect

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.

RWSocket Equality/Inequality Operators

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.

SourcePro 12

SourcePro Core - Essential Tools Module

RWCString

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

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

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

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

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.

RWDateTime

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().

RWZone

SourcePro Core - Threads Module

RWTSingleton

The default constructor for class RWTSingleton is now protected as documented. (SP-10390)

SourcePro DB

RWDBConnection

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.

SourcePro DB - DB Access Module for Oracle

Oracle Stored Procedures

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);

SourcePro DB - DB Access Module for MySQL

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)

SourcePro Analysis

RWDecimalBase

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

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)

SourcePro Net - Essential Networking Module

Global Function rwSocketSelect

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 Derived Classes

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.

SourcePro Net - Secure Communications Module

Global Function rwSecureSocketSelect()
RWSecureSocket

SourcePro 11.1

RCB

CLAPACK Basic Linear Algebra (BLA) Library Now Provided with SourcePro

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.

SourcePro Core - Essential Tools Module

RWTRegexResult and RWTRegexMatchIterator

The RWTRegexResult class provides a conversion to bool to indicate the status of a regular expression search/match operation.

SourcePro Core - Advanced Tools Module

RWDataFromVirtualInputStreamImp

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:

In SourcePro 11.1:

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.

SourcePro Core - Threads Module

RWThreadId and RWSynchObject Now Have Static Constructors

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, RWFIFOMutexLock’s Static Constructor Not Supported

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.

SourcePro DB - DB Access Module for Oracle OCI

Using SQL statements Against an Oracle DATE or TIMESTAMP Column

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 

SourcePro DB - DB Access Module for ODBC

RWDBODBCLibEnvironmentHandle

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.

SourcePro DB - DB Access Module for Sybase CT

Sybase 64-bit Builds on Windows Must Use -DSYB_LLP64 Command Line Macro

Sybase 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.

SourcePro Net - Secure Communications Module

Some Methods in RWSecureSocketMethod are now 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.

Support for OpenSSL 1.0.0a Disallows Connections from Clients Using SSLv2.

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.

RWSecureSocketContext context;
context.setCipherList("ALL:!NULL"); 

SourcePro Analysis

RWDecimalPortable and RWDecimal< M >

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.

SourcePro 11

General

General changes that affect all modules include:

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.

SourcePro Core - Essential Tools Module

RWFile
RWCString
RWClassicCString

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

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.

RWDecimalPortable
RWWString

SourcePro Core - Threads Module

The following method is now const:

getTerminationSignal(void) const;

SourcePro DB

Overall changes to SourcePro DB include:

SourcePro DB - Microsoft SQL Server Access Module

RWDBDatabase
RWDBMsSqlLibSystemHandle
RWDBSybCtLibEnvironmentHandle
RWDBSybCtLibSystemHandle
RWDBDB2CLILibEnvironmentHandle
RWDBOCIEnvironmentHandle

SourcePro Net

Overall changes to Net include:

RWBufferedRecvPortal
RWBufferedSendPortal
RWFtpClient

SourcePro Analysis

SourcePro no longer ships or builds modified versions of the BLA and LAPACK C implementation from <netlib.org>. Instead, SourcePro now depends on:

RWQRCalc and RWQRCalcP3

The following overload has been added:

static bool computeQR(RWGenMat<T>& A, RWMathVec<T>& tau, int *const pivots);

This overload is preferred for performance reasons, if you're using the MKL/linux/64 bit, or SPL/32 bit.

Known Limitations

Installation

General

SourcePro should not be installed into an existing directory

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.

Windows

The user needs to have administrator privileges to run the installer

If you don't have administrator privileges, the installer will prompt you to enter the administrator's password.

UNC installation paths are not supported

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.

RCB

General

Missing Top-Level Build Results HTML Page

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)

No spaces in #include path strings

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)

SourcePro

General

Optimization issues with Oracle Developer Studio 12.6 on Linux and Solaris/SPARC

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)

Linker failure on SuSE 12.4

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)

SourcePro Analysis

General

Optimization errors with Oracle Developer Studio 12.6 on x86 (64-bit only)

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)

Currency Module

Inexact exception for results with insignificant trailing zeros

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)

GCC 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.

SourcePro Core

Essential Tools Module

Using the Solaris SunPro Compiler and the native C++ Standard Library

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:

RWAuditStreamBuffer buf;
RWbostream bcount(&buf);
std::cout << buf << std::endl;

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)

HP aC++ Standard Library does not support locales other than "C"

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)

Internationalization Module

ICU binaries and Oracle Developer Studio with the GCC C++ Standard Library

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)

Threads Module

User-defined stack attributes are not supported on Linux

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)

RWTOnlyPointer casts away const in copy constructor and assignment operator

The 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)

Thread attribute support inconsistent on Solaris 11

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)

SourcePro DB

DB Access Module for DB2 CLI

Linking DB2 10.5 fixpack 5 on Solaris requires explicit -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)

DB Access Module for MySQL

RWDBDatabase and multithreaded applications

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)

DB Access Module for ODBC - Informix Driver

Return values from stored procedures returned as result sets

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.

Calling stored procedures with no parameters

ODBC defines the call semantics for a stored procedure with no parameters as:

{ call procedurename }

Informix does not support this syntax and instead uses an alternate syntax in this scenario:

{ call procedurename() }

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);
Dropping columns

The SQL syntax for dropping a column allows for an optional COLUMN keyword. The syntax is:

ALTER TABLE <table> DROP [COLUMN] <column>

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);
Operations involving a TEXT column

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();
Clustered indexes

The SQL syntax for creating a clustered index is slightly different for Informix than other databases. The normal syntax is:

CREATE UNIQUE CLUSTERED INDEX <index> ON <table>(<column>)

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);
Inserting multibyte string literals not supported

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)

Incorrect value returned by RWDBOSql::rowsAffected() when inserting with data-at-execution

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)

Reading BIGINT values into a long long type is not portable

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)

Unable to describe default values for columns in a table schema

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 64-bit integral types not supported with input parameters

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)

Trailing whitespace removed when inserting into a VARCHAR column

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)

Unable to set login timeout on Linux

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)

Delimited names not supported

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)

DB Access Module for Sybase

Binding 8-byte long and unsigned long data

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)

Limitations in cursor API when handling decimal columns

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)

RWDBOSql limitation for RWCString data

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)

Bulk Insertion Limitations

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:

Intermittent segmentation fault if Sybase vendor libraries are not linked

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)

DB Access Module for Oracle OCI

Oracle Heterogeneous Services requires explicit transaction management

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.

Oracle and LONG columns

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)

Breaking out of polling operations with OCIBreak

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:

Using SYS.XMLTYPE datatype

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);
Application crash on HP-UX if first connection is established within a spawned thread

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)

SourcePro Net

Secure Communication Module

SSLv2 fallback support no longer supported by default

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.

RWSecureSocketContext context;
context.setCipherList("ALL:!NULL");

Documentation

General

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.