SourcePro® 2018.1 Release Notes

Introduction

In this Document

These release notes contain a summary of new features and enhancements, late-breaking product issues, migration guides, and bug fixes. This document covers changes to the product since the SourcePro 2018 release.

For change logs or other information on previous releases, please contact Technical Support.

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://docs.roguewave.com/en/sourcepro/current/.

New Features and Enhancements

Updated Platform Support

Support for Intel C++ is deprecated and may be removed in a future release. For questions about the future of Intel C++ support in SourcePro, please contact technical support.

SourcePro Core

Advanced Tools Module

SourcePro DB

DB Access Module for MySQL

DB Access Module for Oracle OCI

SourcePro Net

Secure Communication Module

Bug Fixes

SourcePro Core

Essential Tools Module

SourcePro DB

General

DB Access Module for MySQL

DB Access Module for PostgreSQL

DB Access Module for Sybase

RCB

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

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)

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)

Intel C++ 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 Intel C++ compiler User's Guide:

-fp-model option or /fp:precise (Windows) Tells the compiler to
strictly adhere to value-safe optimization when implementing
floating-point calculations. It disables optimizations that can
change the result of floating-point calculations, which is required
for strict ANSI conformance

This advice applies to portions of the Currency Module code.

We strongly recommend that you add -fp-model precise (Linux) or /fp:precise (Windows) to the command line of any non-debug programs built using the Currency Module and the Intel C++ compiler.

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)

Library conflict between Oracle vendor libraries and Intel C++ on Linux

Using the Intel C++ compiler may result in unresolved symbols errors. Supplying the path to the lib subdirectory of the compiler installation as the first path for the linker to search for libraries (for example: -L<path to compiler>/lib) resolves the errors. (SP-8484)

In addition, the path to the Intel libraries should also appear before the path to the Oracle libraries in the LD_LIBRARY_PATH environment variable. (SP-8585)

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

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.

Windows 8 PDF Reader May Behave Inconsistently

The native Windows 8 PDF Reader may behave inconsistently; it has been observed that hypertext links are not processed correctly. Instead, use Adobe's free Acrobat Reader.