OCILIB v4.7.0 now available for download !

Dear all,

OCILIB v4.7.0 is now available for download !

Get the release and enjoy it !

Enhancements (C API)

    - Library internal design changes (preparing v5.0.0)
        * OCILIB code base has been layered in 2 distinct API layers:
            - Internal API that has now its own separate design
                - v4.7.0 internal API, while matching the public one in this version, has most of its methods renamed
                - It will evolve differently, preparing new public APIs for future versions
            - Public APIs exposing features to clients
                - v4.7.0 is exposing the same public API as previous versions
                - v5.0.0 will expose a different API
                - Both will use same internal API
            - Contextual error management enhancements
                - As internal APIs cannot be called from outside the library, last error management has been simplified and improved    
            - Enhancements on internal methods implementation:
                - Since v3.0.0 (back in 2008), OCILIB methods implementations are standardized to follow the same single exit point pattern
                - Standardized entry point checks and exit points are based on extentive macros usage
                - But the control flow was handled by a status variable leading to continuous and nested checks
                - With 4.7.0, no more "if (STATUS) {...}" in the code.
                - Instead, in case of errors, code directly jumps to exit points that can have cleanup code sections.
                - See it as try {...} finally{...}  
                - Thus, code is now very sequential, much easier to read, with no nested error management/branching.
    - Public headers reorganization:
        * Broke up ocilib.h content into multiple headers located in /include/ocilibc/
        * Broke up C++ headers content into multiple headers located in /include/ocilibcpp/            

    - Enhanced Error handing:
        * Updated OCI_Cleanup(): if there are any unfreed allocated bytes by the library itself (e.g. OCILIB user objects not freed)
            - it raises an error of type OCI_ERR_UNFREED_BYTES (with the amount of bytes in the error message)
            - it completes cleanup and returns FALSE
        * Added method OCI_ErrorGetLocation() to return the method name where the exception occured
        * Updated method OCI_ErrorGetString() to return a string using the following format "Error occured at {Location}: {Description}"

Fixes (C API)

    - Issue 239: Fetching nclobs as strings return value in hexa format truncated values when nsl_lang is UTF8
    - Issue 238: Fetching clobs as strings return truncated values when nsl_lang is UTF8
    - Issue 236: Memory issue with OCI_BAM_INTERNAL and OCI_CDT_NUMERIC        
    - Fixed OCI_EnqueuePut() and OCI_DequeueGet() in OCI_CHARSET_WIDE charset mode (added a workaround for a known oracle client UTF16 bug)
    - Fixed a minor memory leak when using implicit resultsets     

Fixes (C++ API)

    - Issue 230: Memory leaks while rebinding vectors


    - Extended C API Test suite that has now a much wider coverage