Skip to content
ChangeLog 145 KiB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000
2017-10-25 Version 4.4.0 Vincent Rogier vince.rogier@ocilib.net

    * Fixes (C API)

        - Issue #112: OCI_GetString behaves badly with empty LOBs
        - Issue #104: XA connection open failed with ORA-12154
            * Fixed broken support for XA connections
            * Added 2 new error codes related to XA connections management (OCI_ERR_XA_ENV_FROM_STRING, OCI_ERR_XA_CONN_FROM_STRING)
        - Issue #101: Wrong OCI_STRING_FORMAT_TIMESTAMP constant
         - Fix for Oracle bug #9838993 workaround
            * Version 4.2.1 introduced support for an experimental workaround for Oracle bug 9838993 (memory leak when using unicode and re-preparing/executing same statement multiple times)
            * This support was not anlways working as column names where sometimes not null terminated
            
    * Enhancements (C API)
              
        - OCI_Object: Supporting now non final object types
            * if an OCI_Object instance real type is a sub type of its column object type, OCILIB is dynamically retrieving its real and right type instead of processing it as its base type
            * Added missing synchronized access when iterating the list of existing OCI_TypeInfo in OCI_TypeInfoGet()
        - Allocation Binding mode updates
            * Added BindGetAllocationMode()
            * updated OCI_GetBindAllocation() and OCI_SetBindAllocation() documentation to properly specify their usage
        - Extended 12cR2 support:
            * Increased identifier size to 128
            * Added OCI_ColumnGetCollationID
            * Added more Oracle Session Mode               
        - Refactored OCI_List implementation (Internal change
            * No more access to OCI_List fields from other compilation units (encapsulation purposes)
            * Refactored OCI_List implementation
        
 2017-06-07 Version 4.3.3 Vincent Rogier vince.rogier@ocilib.net

    * Fixes (C API)

        - Issue #81: Fixed OCI_GetInt() on string columns 
            * Wrong implicit string to integer conversion (returning 0 whatever string value) occurred under following conditions: 
                - Column is string based
                - Oracle client < 12gR1
                - Using OCI_GetInt() or OCI_GetUnsignedInt()
        - Issue #86: Fixed wrong error information when statement execution failed involving 64bit integer binds
            * It occurred under following conditions:     
                - Binding 64bit integer host variables with OCI_BDM_OUT flag set (default if OCI_BindSetDirection() has not been called)
                - Statement execution failed on the server for any reasons (server side error, constraint violation, ..) 
            * Real server side error information was not reported by OCI_GetLastError() or error callback
            * Instead an error "OCI-22060: argument [2] is an invalid or uninitialized number" was reported
        - Issue #88: Fixed OCI_GetString() on BLOB columns with blob size > 1024 bytes
            * Filling the resulting string with BLOB data led to a buffer overflow 
        - Issue #89: Fixed Segfault occurring in OCI_Execute()
            * The issue was a wrong offset computation when trying to update user strings after execution.
            * It occurred under following conditions:     
                - OCI_CHARSET_WIDE (Unicode) ocilib build 
                - Unix/Linux (wchar_t implemented as 32bit integers)
                - Binding host string variable with OCI_BDM_OUT flag set (default if OCI_BindSetDirection() has not been called)
           
    * Fixes (C++ API)
 
        - Issue #63: (Re)Added cstddef header in ocilib_core.hpp as on some platforms/compiler versions, it was reported as needed (including <iterator> was not enough)

    * Enhancements (C API)

        - Issue #84: Add support for numeric type in OCI_ColumnGetSubType() with limitations as real numeric type cannot really be identified
        
2017-02-08 Version 4.3.2 Vincent Rogier vince.rogier@ocilib.net

    * Fixes (C API)
    
        - Issue #69: Fixed OCI_StatementGetConnection() that was returning erroneous values (regression introduced in v4.3.0)
        - Issue #70: Fixed Subscriptions issues when OCILIB charset is OCI_CHARSET_WIDE (Unicode builds)
		    * Bug with table names, objects names and rowids reported from CDN event callbacks:
				- Up to Oracle 10g, theses strings were reported as ANSI strings instead of UTF16 strings, thus OCILIB was doing a translation to UTF16 before calling user callbacks
				- From Oracle 11g, this Oracle bug seems fixed while OCILIB is still trying to perform translation fron ANSI to UTF16
				- Thus, now OCILIB, in Unicode builds, is performing the translation to UTF16 only if reported strings seems to be ANSI
			* Bug with Oracle call OCISubscriptonUnRegister()
				- OCI_SubscriptionUnregister() encounters an error ora-24015 when calling OCISubscriptonUnRegister() in Unicode build but not in ANSI builds 
				- Error ORA-24915 is now discarded if returned from OCISubscriptonUnRegister() in OCI_SubscriptionUnregister()
		- Issue #71: Fixed regresson introduced in v4.3.0 about binding big_uint variables (only unsigned 64bit integers)
			* Pre and post statement execution methods were only handling big_int and not big_uint host variables
			* Root cause was a wrong numeric sub type check (using == instead of operator &) as subtypes are handled using flags not unitary values
		- Issue #72: Fixed OCI_LobErase() return value that was wrong since v4.3.0 (1 on success and 0 on failure) instead of the number of elements erased from the LOB
		- Issue #75: Fixed OCI_ElemIsNull() that was marking the call as failed is the value was not NULL (regression introduced in v4.3.0)
		- Issue #78: Fixed usage of OCI_SetBindAllocation() when switching bind allocation mode that may result in memory leaks
        - Issue #79: Fixed issues in implicit conversion in OCI_GetString()
			* Updated outdated OCI_GetString() documentation
			* Reduce temporary buffer size in  OCI_GetString() conversions
			* Fixed implicit conversions in OCI_GetString() for LONG, BLOB

	* Changes and Enhancements
	
        - Issue #73: Activate support for N' substitution (nchar replacement in SQL statement strings) when source code is unicode (Only for Oracle Client >= 10gR2)
	    - Issue #74: Added support for OCI_Number in format calls	   
			* Added token '%n' for parsing OCI_Number in OCI_xxxFmt() calls
			* Added OCI_ARG_NUMBER for fetching OCI_Number in OCI_Immediate() and OCI_ImmediateFmt() calls
		- Issue #79: Added support for OCI_Statement (cursors) in OCI_GetString()
			
	* Miscellaneous
	
        - Removed outdated unmaintained Visual Studio 2005, 2008 an 2010 projects for building OCILIB DLLs and C/C++ tests apps
		- Keeping visual Studio 2013 projects
        - Added Visual Studio 2015 projects
		- Prebuilt Windows OCILIB dlls are now compiled using Visual Studio 2015
		
2017-01-25 Version 4.3.1 Vincent Rogier vince.rogier@ocilib.net

    * Fixes (C API) 
    
        - Issue #60: Fixed bug introduced in v4.3.0 related to binding arrays of big ints
        - Issue #64: Fixed structure size computation for Object members that are Objects
        - Issue #65: Fixed Binding null/non initialized OCI_Number
            * Even if OCI_BindSetNullAtPos() was called, attempting to bind a non initialized or null OCI_Number led to statement execution failure
        - Issue #68: Fixed OCI_Excecute() behavior with PL/SQL "select into" and no data found
            * When executing a PL/SQL block with inner PL/SQL code like "select into :<bind_variable> from table" that does fetch anything, Oracle call OCIStmtExecute() returns OCI_NO_DATA, which is handled by OCILIB as an failure
            * Now OCI_Excecute() considers OCI_NO_DATA as success
            * Updated OCI_GetAffectedRows() documentation for determining if inner PL/SQL "select into" was successful
            
    * Fixes (C++ API) 

        - Issue #63: Added cstddef header in ocilib_core.hpp as on some platorms/compiler versions, it was reported as needed
        - Issue #67: Fixed memory leak when using Number objects
            * Removed attempt to use move semantics 
            * It is currently causing memory leaks  and does not bring that much as C API handles are already handled using smart pointers

    * Changes:
        - Request #66: Increased value of OCI_BIND_MAX
            * Increased value of OCI_BIND_MAX from 1024 to 65535
            * Now Internal Arrays of OCI_Bind can grow and are reallocated by blocks of 128 binds

2016-11-09 Version 4.3.0 Vincent Rogier vince.rogier@ocilib.net

    * New Features: 
    
         - Added NUMBER SQL type native wrapping 
         
            * Optional type as NUMBER type can still be fetched/binded using regular C native numeric types
            * New OCI_Number type can be used when precision matters or for dealing with special values such as positive and negative infinity
            * C API : 
                - Added OCI_NUM_NUMBER numeric type
                - Added OCI_Number type
                - Added OCI_NumberCreate()
                - Added OCI_NumberFree()
                - Added OCI_NumberArrayCreate()
                - Added OCI_NumberArrayFree()
                - Added OCI_NumberAssign()
                - Added OCI_NumberGetContent()
                - Added OCI_NumberSetContent()
                - Added OCI_NumberSetValue()
                - Added OCI_NumberGetValue()
                - Added OCI_NumberAdd()
                - Added OCI_NumberSub()
                - Added OCI_NumberMultiply()
                - Added OCI_NumberDivide()
                - Added OCI_NumberCompare()
                - Added OCI_GetNumber()
                - Added OCI_GetNumber2()
                - Added OCI_BindNumber()
                - Added OCI_BindArrayOfNumbers()
                - Added OCI_RegisterNumber()
                - Added OCI_NumberFromText()
                - Added OCI_NumberToText()
                - Added OCI_ElemGetNumber()
                - Added OCI_ElemSetNumber()
                - Added OCI_ObjectGetNumber()
                - Added OCI_ObjectSetNumber()
                
            * C++ API: 
                - Added ocilib::Number type encapsulating the C API OCI_Number type
                - This new type comes with all possible operator overloads for better usability
 
    * Fixes:

        - OCI_ObjectGetString(): Fixed usage of internal temporary buffers
        - OCI_FileRead(): Return value was not the correct one
        - OCI_PoolGetConnection() : was returning NULL connections for session pool using external credentials
        - OCI_StringGetFromType() : Fixed segfault when converting CLOBs (with length > to 512) to UTF8 strings in OCI_GetString() if an UTF8 charset is used
        - Fix indicators usage for collections : OCI_IsNull() always returned FALSE even if fetched collection was NULL
        - Fix compilation under C compilers not supporting C99 feature allowing declaring variables anywhere in blocks
        
    * Miscellaneous:
    
        - C API: Major internal code re-factoring
        
            * Code factorization
            * Replaced verbose macros with more compact ones
            * Code base reduced by few thousands lines of code
            * Fixed some error handling logic
            
        - C API: 
        
            * Added OCI_GetDataSize() and OCI_GetDataSize2()
        
        - C++ API: 

            * Rewrote iterators for ocilib::Collection<> 
                - Collection Iterators are now random iterators allowing Collections being used with STL algorithms such as std::sort()
                - Added Collection const_iterators
            * Addressed various code analysis hints
            * Added C++ compiler capabilities detection (C+11)

        - Updated samples in folder /demo

            * Added required DDL and DML for all samples
            * Updated some samples
                 
2016-03-21 Version 4.2.1 Vincent Rogier vince.rogier@ocilib.net

    * Licensing
    
        - Re-licensing OCILIB to Apache License Version 2.0 instead of LGPL 2.1: this is merely for overcoming the static linkage issue of the LGPL V2.1
        
    * Fixes

        - C++ API: Fixed memory leak caused by Statement::Bind() with non scalar types when Connection objects are closed before their child Statement objects get out of scope
        - C++ API: Fixed minor compilation warnings
        - C API: Compilation was broken when targeting Oracle 8i
        - C API: PL/SQL statements starting with keyword "CALL" where not identified as PL/SQL commands and thus output bind buffers were not updated accordingly
        - C API: OCI_Execute() ignored custom fetch and prefetch values with Oracle clients >= 9.2
        - C API: OCI_ElemSetString() caused memory retention when dealing repetitively with string attributes
        - C API: OCI_Cleanup() leaked of few bytes
        - C API: OCI_BindLob() caused access violation when binding CLOB/BLOB to PL/SQL OUT parameters using OCI_BDM_OUT bind direction mode   
        - C API: OCI_DirPathSetEntry() may passed Wrong SQL type passed to OCI_NumberFromString() for some numeric columns
        - C API: OCI_GetLastError() wWas not reporting errors/warnings after the following calls: OCI_FetchPrev(), OCI_FetchNext(), OCI_FetchFirst() and OCI_FetchLast()
        - C API: OCI_MemRealloc() may manipulate dandling pointers
        - C API: Fixed some usage of OCI_BIND_CALL() macro
        - C API: OCI_ObjectGettring(): When the attribute type was not a string, the application error handler
          was called with error code OCI_ERR_ATTR_NOT_FOUND and then the method was converting the attribute to a string without problem as expected.
     
    * Changes

        - Added "Environment Variables" section in the C API documentation
        - C++ API: Added silent parameter to Date::Date()
        - C API: Fetch and Prefetch values are not reset any more to default values when statement is re-prepared
        - C API: Added support for specific environment variables: Now specific documented environment variables can be set for activating
          experimental or optional behaviours mostly for implementing workaround for Oracle Bugs.
        - C API: Added experimental workaround for unsolved Oracle OCI bug #9838993 using the environment variable "OCILIB_WORKAROUND_UTF16_COLUMN_NAME"

2015-09-21 Version 4.2.0 Vincent Rogier vince.rogier@ocilib.net

    * New Features:
                   
        - Implemented Oracle 12c extended support for PL/SQL types (PL/SQL boolean, records and index by tables)
        
            * These types can be now used in binding calls
            * C API: PL/SQL records can now be used using OCI_Object
            * C API: PL/SQL Index by tables can now be used using OCI_Coll
            * C API: PL/SQL boolean can be used using boolean C type
            * C API: Added OCI_BindBoolean()
            * C API: Added OCI_ElemSetBoolean(), OCI_ElemGetBoolean()
            * C API: Added OCI_ObjectSetBoolean(), OCI_ObjectGetBoolean()
            * C API: OCI_TypeInfoGet() supports now records these PL/SQL types
            * C API: Added collection type OCI_COLL_INDEXED_TABLE
            * C API: Added data type OCI_CDT_BOOLEAN
            * C++ API: PL/SQL records can now be used using ocilib::Object
            * C++ API: PL/SQL Index by tables can now be used using ocilib::Collection<T>
            * C++ API: PL/SQL boolean can be used using bool C++ type
            * C++ API: Added template specializations for supporting PL/SQL boolean using C++ bool in the following calls:
                - ocilib::Statement::Bind()
                - ocilib::Object::Get()
                - ocilib::Object::Set()
            * C++ API: Added ocilib::Collection<T> specializations for supporting bool data type
            * C++ API: Added ocilib::TypeBoolean
            * C++ API: Added ocilib::Collection::IndexedTable
            * C++ API: Added internal core class ocilib::BindTypeAdaptor<T1, T2>

         - Added Memory usage information

            * C API: Added OCI_GetAllocatedBytes
            * C API: Added OCI_MEM_ORACLE, OCI_MEM_OCILIB and OCI_MEM_ALL
            * C++ API: Added ocilib::Environment::GetAllocatedBytes()
            * C++ API: Added ocilib::Environment::OracleClientBytes, ocilib::Environment::OcilibBytes, ocilib::Environment::AllBytes

         -  Added Session Max Cursor information
        
            * C API: Added OCI_GetMaxCursors()
            * C++ API: Added ocilib::Connection::GetMaxCursors()
 
    * Enhancements:

        - C++ API:: Enhanced pre/post statement execution check for binds
        
            * Before execution, bind buffers are only updated from host variables if Bind Direction has the ocilib::BindInfo::In flag
            * After execution, host variables are only updated from bind buffers if Bind Direction has the ocilib::BindInfo::Out flag
            
    * Fixes:
        
        - C API: Fixed OCI_GetLastError() that returned NULL after OCI_Initialize() if OCI shared lib cannot be loaded
        - C API: Fixed OCI_ColumnGetSQLType() that has its break statements within the switch removed by mistake leading to return "?" in all cases
        - C API: Fixed OCI_ElemSetXXX() where XXX is a numeric type
        - C API: Fixed OCI_IterFree() when dealing with numbers
        - C API: Fixed Memory retention in local OCI objects cache when calling OCI_ObjectFree(): Objects indicator structures were not freed until calling OCI_Cleanup()
        - C API: Fixed OCI_ElemSetXXX() for numeric types when element is created using OCI_ElemCreate() instead of being retrieved with OCI_IterGetPrev() or OCI_IterGetNext()
        - C API: When OCI_SubscriptionRegister() failed, the input connection was freed leading the caller to hold a dangling pointer to the connection handle
        - C API: Fixed comparison call in OCI_TimestampCompare()
        - C API: Fixed alignment computation in OCI_GetStruct()
        - C API: Fixed alignment computation in OCI_ObjectGetUserStructSize()
        - C API: Fixed compilation under compilers that require variable to be declared at the beginning of blocks (example : VS2010)
        - C API: Fixed minor internal bugs and issues
        - C++ API: ocilib::HandleHolder<T>::Acquire() => Made sure that a smart handle is not allocated if the input C handle is NULL (even if it shall not happen as the C API must raise an error if it cannot return a valid handle)
        - C++ API: ocilib::HandleHolder<T>::SmartHandle::~SmartHandle() => the C API handle free function is now called only if the handle is not NULL
        - C++ API: Fixed compilation error when using OCI_CHARSET_WIDE
        - C++ API: Fixed ocilib::Raw binding when using OCI_CHARSET_WIDE
        - C++ API: Fixed ocilib::BindArray::BindArrayObject<Raw, unsigned char>::SetInData()
        - C++ API: Fixed binding array of Blobs
        - C++ API: Fixed binding array of Raw

    * Miscellaneous

        - Doxygen documentation: Added C and C++ data types mappings documentation page
        - Removed references to sourceforge.net
        - Minor internal code changes to fixing hypothetical issues found by code analysis (CppCheck)
        - Fixed some typos and formatting issues

2015-05-05 Version 4.1.0 Vincent Rogier vince.rogier@ocilib.net

    * C API

        - Major library code update:
            * All public functions entry and exit points have been rewritten in order to satisfy requirements of the OCI_ENV_CONTEXT environment flag
            * Fixed some functions that were not setting context result properly when using OCI_ENV_CONTEXT flag
            * various internal code updates and minor fixes
            * OCI_EnableWarnings() and OCI_SetErrorHandler() are now return a boolean values
            * Factorized internal OCILIB objects clean up in various places
           
        - Enhanced implicit string conversion for Date, Timestamps and Numeric values
            * Conversion formats can be now set at both library and connection level
                - The library is using its own default format if none are set
                - Program can define formats at library level
                - Program can define formats for a specific connection
            * It is now possible define specific conversion formats for:
                - OCI_Date
                - OCI_Timestamp
                - All Numeric types
                - Binary double
                - Binary float             
            * Added new methods:
                - OCI_SetFormat()
                - OCI_GetFormat()
            * Removed the following methods that are now defined as macros for backward compatibility reasons:
                - OCI_SetDefaultFormatDate()
                - OCI_GetDefaultFormatDate()
                - OCI_SetDefaultFormatNumeric()
                - OCI_GetDefaultFormatNumeric()

        - Fixes      
            * Fixed compilation under oracle 11gR1 caused by wrong oracle version checking in the file pool.c
            * Fixed few warnings raised by Clang C compiler
            * Fixed Binary Float implicit conversion to string when using Oracle 12g
            * Fixed UTF8 strings bytes size computing when passing them to Oracle client
            * Fixed binding double and float when Oracle client >= 10.1 and Oracle Server < 10.1 (usage of binary_double and binray_float supported by the client from 10gR1 but not supported by Oracle 8i and 9i)
            * Fixed memory leak in internal method OCI_StringFromStringPtr() used in OCI_ElemGetString() and OCI_ObjectGetString()
            * Fixed possible memory retention related to OCI Object cache (depending on the Oracle Client version)
 
        - Warning : Programs must be recompiled (with no code change needed) as some methods have been removed from the library

    * C++ API      

        - Enhancements
            * Added abstract Streamable class:
                - It allows derived classes to be compatible with any external stream class supporting the operator << (std::(w)string)
                - The following classes derives now from Streamable : Date, Interval, Timestamp, Collection, Object and Reference
            * Added Support for the enhancements made to the string conversion format in the C API:
                - Added Enum FormatType
                - Added Environment::GetFormat() and Environment::SetFormat()
                - Added Connection::GetFormat() and Connection::SetFormat()
                - Removed Connection::SetDefaultDateFormat() and Connection::GetDefaultDateFormat()
                - Removed Connection::SetDefaultNumericFormat() and Connection::GetDefaultNumericFormat()
            * Added support for Clang C++ compiler 
            * Statement::Bind<>(): Added specializations for Collection and std::vector<Collection<T>> instead of relying on default the implementation that is now removed
            * Added parametrized constructors for Date, Interval and Timestamp classes
            * Made sure that translation from C raw buffer to the C++ Raw class does not fail in case of NULL buffers with non zero size parameter
            * Modified internal access to environment singleton object instance
            * Added enum values for Oracle Versions
            * Added new template methods to Resultset class 
                - Get<T1, T2>() : template method allowing to return a user defined type from a resultset current row content using a translator user defined method/functor/lambda (e.g. return an user defined struct/class from a select on a table)
                - ForEach<T1>() : convenient method wrapping the while(rs.Next)) pattern and that call the an user defined method/functor/lambda for each row fetched
                - ForEach<T1, T2>() : version of ForEach<T1> and Get<T1, T2> combined
                - See the updated main demo application for examples
            * Added template methods Statement::Execute() and Statement::ExecutePrepared():
                - theses overloaded methods can take fetch callbacks and also datatype adater callbacks
                - It makes the code much compact as it hides the resultset fetch calls
                - It also allow adapting resultsets returned values to user defined types
                - See the updated main demo application for examples
            * Added Resultset::Get<>() overloads with input value arguments to fill instead of returning values. This allow to no specify the data type in the Get<>() call.
                - void Get(unsigned int, TDataType &value) const        
                - void Get(const ostring &name, TDataType &value) const;
                
        - Changes:
            * Exception class  does not derive any more from HandleHolder<>
            * Date::SysDate() is now a static method that returns a now a Date Object with system date time
            * Timestamp::SysTimestamp() is now a static method that returns a now a Timestamp Object with system timestamp
            * Renamed Statement::Execute(void) to ExecutePrepared(void)
            * Added default constructors for classes holding datatypes. 
                - Using the default constructor, we have objects holding no C handles -
                - Their IsNull() properties return is true. 
                - They can now be stored in structures and classes without the need of passing parameters 
                - Their initialization can be deferred from declaration using function return values or using their class constructor with class name
                
        - Fixes        
            * Fixed missing  operator "|" for recently Enum promoted to Flags
            * Fixed HandleHolder<>::operator bool
            * Fixed Statement::Prepare() and Statement::Execute() : when called again for the same object, the internal map of binds was not cleared although bind objects were freed, leading to a segfault
            * Fixed Statement::Bind<ostring> : strings binded to statements with Out or InOut direction mode had their content padded up to max provided size after execution
            * Fixed C++03 standard violation : Removed usage of std::vector::data() that was introduced in C++11 in order to be compliant with C++03
            * Fixed Timestamp::SetDate()
            * Removed unimplemented prototype Lob<TLobObjectType>:: operator TLobObjectType()
            * Fixed segfault when Environment::Initialize() fails to load the oci shared library
        - C++ compilers validated versions:
             * Microsoft C++ compiler : all versions from Visual Studio 2008
             * GCC : all versions from 4.1 
             * Clang : all versions from 3.1 
             * OCILIB++ shall also compile with older versions of these compilers and with other C++ compilers, but not tested 
        - Miscellaneous
             * Internal code clean up
             * Updated some demo files

2015-01-13 Version 4.0.1 Vincent Rogier vince.rogier@ocilib.net

    * C API
    
        - Fixed OCI_ObjectGetXXX() and OCI_ObjectSetXXX() : internal access to some field members could cause segfaults with complex object types having deep nested objects
        - Fixed possible segfaults in OCI_Execute() when string input binds are used in Unicode build on Unix platforms if the bind direction is not explicitly set
        - Added error type OCI_ERR_ARG_INVALID_VALUE
           - Input arguments handled as unsigned int value that correspond to a set of possible value are now checked. 
           - If the provided value does not fit within the set of expected values, an error is raised
        - Factorised some internal code using new methods OCI_ExternalSubTypeToSQLType() and OCI_ExternalSubTypeToSQLType()
        - Replaced some TAB occurrences with spaces
        - Internal code cleanup and refactoring
        - Internal minor code changes to remove GCC warnings with all possible paranoid options activated. 
        - Fixed internal macro OCI_CHECK_STMT_STATUS that had been wrongly modified in previous some refactoring

    * C++ API

        - Some Enum<> definitions where promoted to Flags<>
        - Fixed possible race condition in internal smart pointer members access in multithreaded applications
        - Fixed Statement::Bind<ostring>() : inadequate memory allocation parameter in BindAdaptor class constructor initialization
        - Fixed access violation in Pool object destructor when a global Pool object is not explicitly closed and destructor called after Environment::Cleanup()
        - Code refactoring and enhancements
        
    * Miscellaneous
    
        - Update Copyright to 2015
        - Fixed some typos in some files

2014-12-10 Version 4.0.0 Vincent Rogier vince.rogier@ocilib.net

    * Introducing new C++ API
    
      - Full C API ported to C++
      - Implemented as a small set of header files, no library compilation needed
      - Based on C++ and STL paradigms (Strong typing, templates, containers, RAII, exception handling, operators, stack objects)
      - Based on design patterns (RAII, delegation, reference counting, smart pointers, proxies, singleton)
      - No user dynamic object allocation required
      - The only dependences are : STL and OCILIB C API
      
    * Extended C API
    
      - Removed support for OCI_CHARSET_MIXED
         - This charset mode was introduced in early versions of OCILIB in order to support Unicode Data binding and fetching for Oracle8i that does not support full Unicode
         - It introduced high complexity in OCILIB code and had been source a bugs
         - This releases removes its support and now, OCILIB charset handling is much simplier
         - Thus OCILIB still support :
            - All Oracle versions : OCI_CHARSET_ANSI => ANSI/UTF8 strings (char* )
            - Oracle 9i and above : OCI_CHARSET_WIDE => UTF16/UTF32 strings (wchar_t *)
         
      - Added Support for some Oracle 12cR1 new features:      
          - Added support for "PL/SQL Implicit Results"          
              - No API changes, internal code updates
              - Added demo file          
          - Added Support for "Identity columns" :          
              - Added OCI_ColumnGetPropertyFlags()
          
      - Collections:          
          - Added OCI_CollDeleteElem()
          - Added OCI_CollGetCount()     
          - Added OCI_IterGetCurrent()
          - Fixed OCI_IterGetPrev() and OCI_IterGetNext() : Last error flag for OCI_GetLastError() was wrongly set if it returned FALSE 
          - Fixed OCI_ElemGetRaw() : possible segfault could happen
          - Fixed OCI_ElemSetNull() : it was not setting correctly the element indicator for collections of objects
          - Renamed some methods:
              - OCI_CollGetAt() to OCI_CollGetElem()
              - OCI_CollGetAt2() to OCI_CollGetElem2()
              - OCI_CollSetAt() to OCI_CollSetElem().
              - Note that older method names are still supported using #define for backward compatibility reasons 

      - Connection/Session Pools:
          - Fixed OCI_PoolGetConnection() that could return NULL connection handles (particularly when program is using OCI_PoolGetOpenedCount())
          - Removed connection pooling emulation for Oracle 8i
          - Refactored Oracle pooling implementation (code is now simpler and much more robust)

      - Unicode builds:  
          - Fixed LONG data type fetching when using Unicode builds on Unix/Linux platforms. Returned strings could have extraneous trailing characters
          - Fixed Buffer overwrite in OCI_LobRead2() in Unicode builds
          
      - Strings conversions:      
          - Added OCI_ObjectToText()
          - Added OCI_CollToText()
          - Extended OCI_GetString() : supports now all types
          - Extended OCI_ObjectGetString() : supports now all types
          
      - Miscellaneous additions:
          - Added OCI_IsRebindingAllowed()
          - Added OCI_TypeInfoGetConnection() 
          - Added OCI_SubscriptionGetConnection()
          - Added OCI_BindSetNotNullAtPos()
          - Added OCI_BindSetNotNull()
          - Added OCI_GetBindIndex()
		  - Added OCI_ObjectGetRawSize()
		  - Added OCI_ElemGetRawSize()
		  - Added OCI_LobGetConnection()
		  - Added OCI_FileGetConnection()
          - Added compile time (OCI_IMPORT_LINKAGE) and runtime (OCI_IMPORT_RUNTIME) detection of OCI shared library version for Oracle 12cR1
          - Added new error code OCI_ERR_ITEM_NOT_FOUND
          - Added VS 2013 solutions
          - Important code refactoring

     - Miscellaneous fixes:
          - Fixed OCI_ObjectGetObject() that could cause segfault when an object had 2 members of object type on a row
          - Fixed OCI_IntervalAdd() and OCI_IntervalSubstract() that were not performing OCI calls due to wrong return code initialization
          - Fixed NULL lob handle input checking in OCI_LobWrite() and OCI_LobWrite2()
          - Fixed OCI_PoolGetConnection() prototype : added const qualifier on tag argument
          - Fixed memory usage of internal arrays (for numeric, text and raw types) when using OCI_BAM_INTERNAL bind allocation mode. Memory was not freed when the statement was freed but only at OCI_Cleanup() time.
          - Fixed segfault in OCI_HashCreate() if internal memory allocation failed
          - SQL warnings occurring in OCI_ExecuteXXX() calls were not propagated correctly to the global error handler and couldn't be retrieved with OCI_GetLastError() in OCI_ENV_CONTEXT mode
          - Fixed runtime (OCI_IMPORT_RUNTIME) detection of OCI shared library version for Oracle 11gR2 that was reported as OCI 11gR1
          - Fixed segfault if a statement was executing more than once SQL statement with a "returning clause" (since statement cache support). It was due to an nice bug in the OCI client ! 
          - Fixed OCI_BindSetNull() : if called prior executing an insert statement that had OCI_Object handles binded to it, objects content were inserted in the DB instead of NUL
          - Fixed OCI_TimestampGetTimeZoneOffset() : returned offsets may have unattended values if negative
          - Fixed OCI_TypeInfoGet() that was failing if :
              - object had been created with case sensitivity (e.g. using quotes)
              - object were related to the PUBLIC role

2013-03-04 Version 3.12.1 Vincent Rogier vince.rogier@ocilib.net

    * Fixed Unicode support (OCI_CHARSET_WIDE and OCI_CHARSET_MIXED)

      - Unix plaftorms : Fixed OCI_LongWrite() for OCI_CLONG type : string may wrongly be inserted into DB
      - Unix plaftorms : Fixed OCI_LongRead()  for OCI_CLONG type : strings may contain trailing garbage data
      - Unix plaftorms : Fixed OCI_LobRead2()  for OCI_CLOB type  : strings may contain trailing garbage data
      - Unix plaftorms : Fixed OCI_GetString() : strings may be truncated
      - All platforms  : Fixed OCI_GetString() : when column is number based, the string resulting from number conversion may have trailing dot or comma

    * Miscellaneous fixes

      - Reduced size of buffers used to store string column data when nls_lang is UTF8
      - Fixed error variable checking in internal call OCI_DirPathArrayToStream()

    * Miscellaneous changes
    
      - Update all files Copyright strings to current year (2013)

2013-02-07 Version 3.12.0 Vincent Rogier vince.rogier@ocilib.net

    * Added support for lob prefetching introduced in 11gR1
    
       - Added OCI_GetDefaultLobPrefetchSize()
       - Added OCI_SetDefaultLobPrefetchSize()
       
    * Enhanced Direct Path API  
    
       - Added OCI_DirPathSetConvertMode() that gives the ability to force direct path conversions
       - Modified OCI_DirPathGetErrorRow() and OCI_DirPathGetErrorColumn() behavior that can return all erred rows/columns after a conversion or load operation
       - Added direct path demo file dirpath_complete.c
       - Updated documentation
       
     * Fixed Direct Path API  
      
       - Fixed direct path logic when stream buffer are too small (OCI_DirPathConvert() returning OCI_DRP_FULL)
       - Fixed direct path logic when conversion and loading errors occur
       - Fixed OCI_DirPathConvert() that support now resuming conversion when an error occurs by fixing values and calling OCI_DirPathConvert() again in default mode (in previous releases duplicated rows were inserted in database)
       - Fixed OCI_DirPathGetErrorRow() and OCI_DirPathGetErrorColumn() that returned zero based row/column indexes instead of being 1 based row/column indexes 
       - Fixed OCI_DirPathSetEntry() : Setting NULL values on column that had decimal/date format throwed an Oracle error
    
    * Fixed Oracle Streams AQ (Advanced Queues) asynchrounous notifications :
    
       - Fixed possible race condition in OCI_DequeueSubscribe() that could cause to have the internal callback called before the user callback was assigned to the dequeue object
       
    * Fixed numeric/ string conversions :

       - Fixed OCI_GetInt(), OCI_GetShort(), OCI_GetBigInt() and unsigned versions when the column type was string based (bug in string/number conversion introduced in v3.11.0)

    * Miscellaneous fixes :   

       - Fixed wrong column buffer size computation for strings, rowids and longs when using OCI_CHARSET_WIDE or OCI_CHARSET_MIXED on unixes platforms

2012-12-19 Version 3.11.1 Vincent Rogier vince.rogier@ocilib.net

    * Fixed broken support for Oracle Database Change notifications
    
       - Fixed OCI_SubscriptionRegister() : Previous version 3.11.0 introduced a bug in subscription registration  

    * OCILIB Thanks file was missing in 3.11.0 packages. It is reintroduced within this release.     

2012-12-12 Version 3.11.0 Vincent Rogier vince.rogier@ocilib.net

    * Extended Oracle Streams AQ (Advanced Queues) support :
    
       - Added support for asynchrounous notifications (Petr Vanek proposal) :       
          - Added OCI_DequeueSubscribe()
          - Added OCI_DequeueUnsubscribe()
          - Added demo file queue_async.c
          
    * Fixed And Enhhanced support of BINARY FLOAT and BINARY DOUBLE types :     
      - Updated OCI_GetDouble(), OCI_GetDouble2(), OCI_GetFloat(), OCI_GetFloat2() : 
          - In previous releases, BINARY FLOAT and BINARY DOUBLE were fetched as NUMBER and locally converted to native double and float types using Oracle Client API
          - With this release, BINARY FLOAT and BINARY DOUBLE are directly fetched as native double and float types
      - BINARY FLOAT and BINARY DOUBLE were not supported in Oracle Objects and Oracle Collections (TYPES, VARRAYs and NESTED TABLES)
          - In previous releases, segfaults could happen when manipulating objects with BINARY FLOAT and BINARY DOUBLE members or collections of BINARY FLOAT and BINARY DOUBLE
          - With this release, BINARY FLOAT and BINARY DOUBLE are fully supported within OCI_Elem and OCI_Object
      - Updated OCI_BindDouble(), OCI_BindArrayOfDoubles(), OCI_BindFloat(), OCI_BindArrayOfFloats() 
          - If the Oracle client supports BINARY FLOAT and BINARY DOUBLE types (Oracle 10g and above), host double and float variables are binding as BINARY FLOAT and BINARY DOUBLE instead of NUMBER.
          - This prevent the Oracle client from performing internal conversions. 
      - Enhanced String conversions :
          - When OCILIB has to convert BINARY DOUBLE values to/from strings, it now supports the double type full range of values.
          - OCILIB uses now the C runtime to perform BINARY DOUBLE and BINARY FLOAT conversions to/from strings as the Oracle Client API cannot handle the full double datatype wihtin its string conversion API
 
    * Miscellaneous changes :
    
      - OCI_GetString() : Conversion from numeric types has been rewritten, much cleaner code now
      - Internal numeric types handling (conversions between numeric types, to/from strings) has been rewritten
      - Miscellaneous code updates : OCILIB source code has been tested against various code analysis tools
      - Documentation updates
      - Added pkgconfig support for Unixes/Linux platforms (thanks to Petr Vanek)
          
    * Miscellaneous fixes :
    
      - OCI_GetBatchErrorCount() always returned 0
      - OCI_FileGetDirectory() did not set error flag for OCI_GetLastError()
      - OCI_ElemGetRaw() was setting error flag to TRUE in all cases for OCI_GetLastError()
      - OCI_PoolGetStatementCacheSize() was setting error flag to FALSE in all cases for OCI_GetLastError()
      - OCI_LobRead() and OCI_LobRead2() : In OCI_CHARSET_WIDE and OCI_CHARSET_MIXED builds, values could be truncated with Oracle clients 8i and 9i only
      - OCI_LobWrite2() and OCI_LobAppend2() : returned byte count may not been accurate for CLOB when using OCI_CHARSET_WIDE or OCI_CHARSET_MIXED builds
      - OCI_ColumnGetCharUsed() : Attribute introduced in Oracle 9.2 but OCILIB tried to retrieve it from Oracle 9.0 as well
      - OCI_ConnectionFree() could generate a segfault on a reused connection retrieved from a connection pool since version 3.10.0
      - OCI_TypeInfoGet() could generate a segfault in OCI_CHARSET_WIDE builds when a table/view column or object member was an Oracle Type (Object and Collection)
      - OCI_xxxFmt() calls : Timestamp arguments were not formatted correctly (missing quotes in the formatted SQL)     
      - Scrollable Statements : 
          - An Oracle error (ORA-01001 or ORA-01002) was thrown when fetching a statement (PL/SQL Cursor or Nested table) that was returned by a select statement that contained more thant one column
          - This happened only if the statement was retrieved from a scrollable statement using array fetching (internal OCILIB default behavior)
          - This is an Oracle bug and a workaround has been found
          - Now, OCILIB internally sets the resultset internal array size to 1 and thus ignore any values set using OCI_SetFetchSize() for such statements

    * Modified Prebuilt MS Windows binaries
    
      - Official Windows OCILIB Binaries are now built using MS C compiler optimization capabilities (compiler remains MS Visual Studio 2010 Express) :
          - Full optimization compiler flag (/Ox)
          - Whole program optimization flag (/GL)
        
2012-08-08 Version 3.10.0 Vincent Rogier vince.rogier@ocilib.net

    * Added support for native C float datatype :

      - Added OCI_GetFloat()
      - Added OCI_GetFloat2()
      - Added OCI_BindFloat()
      - Added OCI_BindArrayOfFloats()
      - Added OCI_RegisterFloat()
      - Added OCI_ElemGetFloat()
      - Added OCI_ElemSetFloat()
      - Added OCI_ObjectGetFloat()
      - Added OCI_ObjectSetFloat()
      - Added constant OCI_ARG_FLOAT
      - Added constant OCI_NUM_FLOAT
      - Use the input identifier '%g' for OCI_StmtxxxxFmt() calls when passing float variables
      - Updated demo application to use float datatype 
      
    * Fixed OCI_IntervalArrayCreate() : wrong internal handle type caused the function to fail to allocate the array with the right interval type
      
2012-06-29 Version 3.9.4 Vincent Rogier vince.rogier@ocilib.net

    * Miscellaneous fixes

      - Connection and Session Pools : Fixed few bugs related to OCILIB automatic adaptation to runtime client versions and features that could lead OCI_PoolGetConnection() to return NULL
      - Statement cache was not properly activated when feature was available
      - OCI_PoolGetStatementCacheSize() : an error was raised as an invalid internal oci attibute code was used
      - Fixed broken compilation support for Oracle 8i and 9i clients on unix platforms when oracle shared lib import mode is OCI_IMPORT_LINKAGE
      - Oracle 11g : OCILIB driver name could not be properly set in the view V$SESSION_CONNECT_INFO
      - Oracle XA :
          - Unix platforms : No change, XA is supported for all Oracle Clients >= 8i
          - MS Windows Platforms :
              * When using the Dlls provided in OCILIB releases, XA wis now enabled only if the Oracle client loaded at runtime has XA symbols embedded in oci.dll (usually >= Oracle 10g)
              * When compiling yourself OCILIB, support is enabled only with Oracle Client 10g and above as on MS Windows, for 8i and 9i, specific import libraries are used and can be missing in some installations             
              * So when XA is not enabled, using the flag OCI_SESSION_XA with OCI_ConnectionCreate() will now throw an exception
     
    * Miscellaneous changes
    
      - default transaction behavior :
      
          - Prior to v3.9.4, a default transaction object was created in OCI_ConnectionCreate() and associated to the returned connection object. 
          - From v3.9.4
              * No changes for regular standalone transactions and transactions retrieved from connection pool.
              * For XA connections and connections retrieved from session pool, no transaction object is created anymore and thus, OCI_GetTransaction() will return NULL for newly created connections.
              * Note that transaction objects must not be set to connections retrieved from a session pool or to XA connections
              * For other types of connections (regular or retrieved from connection pool), transaction objects can be used as normal
      
      - Various internal minor code change
      - Note that all sources files have been updated to include year 2012 in the copyright section 
       
2011-12-05 Version 3.9.3 Vincent Rogier vince.rogier@ocilib.net

    * Miscellaneous fixes

      - Fixed broken support for Oracle 8i client since v3.9.0
      - Fixed OCI_ObjectSetObject() : a bug had been introduced in v3.8.1 when computing internal object structure offsets and paddings 
      - Fixed OCI_LobRead(), OCI_LobRead2() : in OCI_CHARSET_WIDE charset builds only, a segfault could happen caused by an internal buffer overwrite    
      - Fixed OCI_SetStatementCacheSize(), OCI_GetStatementCacheSize() : an error ORA-24315 (with no incidence) could be thrown by some versions of Oracle clients
      - Fixed OCI_BindXXX() : All binding methods returned TRUE instead of FALSE when an exception OCI_ERR_MAX_BIND occured
      - Fixed OCI_GetString() : an error OCI-22061 was happening when the column was numeric and a user defined numeric format where provided with OCI_SetDefaultFormatNumeric()
      - Fixed OCI_GetServerRevisionVersion() : it was returned the same value as OCI_GetServerMajorVersion() since v3.4.0
      - Fixed internal method OCI_ParseSqlFmt() used in OCI_xxxFmt() calls : Quoted strings were not properly output since v3.9.0
      - Fixed internal allocation mode : 

          - some OCI_BindXXX() calls were not compatible with OCI_BAM_INTERNAL allocation mode and when used with it, were causing segfaults if the host variable parameter was NULL
          - now these methods raise an OCI_ERR_NULL_POINTER error if the host variable parameter is NULL and the statement bind allocation mode is set to OCI_BAM_INTERNAL

    * Miscellaneous changes

      - OCILIB library compilation

          - Modified compile time detection of OCI client version when using OCI_IMPORT_LINKAGE as Oracle backported some defines introduced at version (X) in patches for version (X-1) !

      - OCILIB documentation

         - Updated Bind allocation mode description : added list of incompatible OCI_BindXXX() methods
         - Added OCI_BAM_INTERNAL compatibility information in all OCI_BindXXX calls() documentation
         - Added OCI_ENV_EVENTS requirements for subscriptions and HA methods
         - Minor changes

     - few code internal minor changes

     - Removed in each OCILIB source file, the version number and date time (updated at each new release, using diff tools was a nigthmare !)

2011-07-13 Version 3.9.2 Vincent Rogier vince.rogier@ocilib.net

    * Miscellaneous fixes

      - Detection of the 'long long' type on unix/linux platforms is now working as expected in all situations
      - version 3.9.0 broke support of Oracle client versions < 10g when using OCI import mode OCI_IMPORT_LINKAGE (default option on unix/linux platforms)

2011-07-08 Version 3.9.1 Vincent Rogier vince.rogier@ocilib.net

    * Miscellaneous fixes

      - Fixed OCI_BindString() : version 3.9.0 introduced a memory leak when using this method
      - Fixed OCI_IsNull()     : version 3.7.0 introduced a bug when OCI_IsNull() was called for OCI_CDT_OBJECT columns. It always returned FALSE
      - Fixed OCI_GetStruct()  : version 3.7.0 introduced a bug (same as above) that caused the indicator array parameter filled with wrong indicator values for OCI_CDT_OBJECT columns
      - Fixed use of "Returning into" SQL clause : version 3.9.0 broke re-execution of a prepared statment that contains a "returning into" sql clause

2011-04-20 Version 3.9.0 Vincent Rogier vince.rogier@ocilib.net

    * Added support Oracle XA

      - Oracle XA integration in OCLIB is transparent by using OCI_ConnectionCreate() and requires just :
      
         - an XA db name for parameter 'db'
         - an extra flag OCI_SESSION_XA for parametrer 'mode'
         - no user or password
          
      - See the OCI_ConnectionCreate() documentation for the XA open string needed by OCILIB to pass to the TMP 

    * Added support for statement cache

      - Statement cache is now automatically enabled when using an Oracle client >= 9iR2
      - Added statement cache size customization when using an Oracle client >= 10gR1 :
        
        - Added OCI_SetStatementCacheSize()
        - Added OCI_GetStatementCacheSize()
        - Added OCI_PoolSetStatementCacheSize()
        - Added OCI_PoolGetStatementCacheSize()

    * Added support for TAF (Transparent Application Failover) and HA (High availabality) 
    
      - The following handler has been added when using an Oracle client >= 10gR2

        - Added OCI_IsTAFCapable()
        - Added OCI_SetTAFHandler()
        - Added OCI_SetHAHandler()

    * Added support for Connection attributes introduced in Oracle 10gR2 

      - Added OCI_GetDBName()
      - Added OCI_GetInstanceName()
      - Added OCI_GetServiceName()
      - Added OCI_GetServerName()
      - Added OCI_GetDomainName()
      - Added OCI_GetInstanceStartTime()

    * Improved bind tuning. Now it is possible to set the bind direction mode (in, out, in/out) for slightly better performance 
    
      - Added OCI_BindSetDirection()
      - Added OCI_BindGetDirection()

    * Miscellaneous new calls :

      -  Added OCI_Describe() and OCI_DescribeFmt() to enable the retrieving of an OCI_Resultset object for 'select' statement wihtout exectuing the SQL

    * Miscellaneous changes :

      - Reenforced checks on OCI_Statement handle related methods that checks the statement state (prepared, executed, parsed,...) that now can throw more exceptions
      - Updated layout of some internal structure to supress unnecessary padding
      - Manual update of source code formatted with Uncrustify (wrong indentation of preprocessor directives)
      - User callbacks were not correctly documented
      - Updated Doxygen version used to generate the documentation (update in the output html style)

    * Miscellaneous fixes :

      - Fixed Binding call using the binding mode OCI_BAM_INTERNAL :

        - arrays of Lobs, Files, Intervals and timestamps : internal objects were not properly initialized
        - big_int : single bind and array bind were incorrectly implemented (allocation size wrongly computed that lead to a segfault for arrays)	
        - strings : 
          
          - single binds : if the length parameter was set to 0, a segfault happened 
          - Wide strings : if the native Oracle Unicode used a different size than the C runtime for wchar_t (like unix like system) translation were not performed by OCILIB 

      - Fixed 11Gr2 compile time detection when using OCI_IMPORT_LINKAGE (default on Unix platform)   
      - Fixed OCI_ImmediateFmt() : the method returned FALSE even on success
      - Fixed OCI_PoolGetConnection() : OCILIB tried to set the driver name attribute (appeared in 10gR2) on the session that is not allowed anymore in 11g
      - Fixed OCI_SetFormatDate() macro : fixed macros parameters declaration
      - Fixed OCI_ColumnGetNullable() returned value
      - Fixed OCI_ConnectionCreate() : 2 OCI handles not freed if connection failed
      - Fixed OCI_SetPrefetchSize(), OCI_SetPrefetchMemory() : the given value was not really passed to Oracle
      - Fixed OCI_TypeInfoGet() called internally when fetching object owned by a different schema
      - Fixed OCI_Parse() : the method was internally doing a describe operation instead of just a parse (which gave same results from an end user view)
      - Fixed OCI_LobAssign() that was not handling correclty Lob arrays created with OCI_LobArrayCreate()
      - Fixed OCI_BindDouble() and OCI_BindArrayOfDoubles() : internal sub numeric type OCI_NUM_DOUBLE was not set on the bind handle
      - Fixed OCI_StringGetFromAttrHandle() allocation of insuffucient buffer in unicode mode
      - Fixed OCI_ObjectSetxxx() could return true if attribute not found
      - Fixed Queues function in OCI_CHARSET_MIXED mode

2010-12-13 Version 3.8.1 Vincent Rogier vince.rogier@ocilib.net

    * Miscellaneous fixes

      - Fixed internal computation of OCI_Object attributes null indicator offsets
      - Fixed OCI_Elem handle initialization by OCI_CollGetAt() and OCI_CollGetAt2()
      - Fixed OCI_Ping() : OCI symbol OCIPing() was not dynamically loaded if OCI_IMPORT_RUNTIME was used (default for precompiled MS Windows Dlls)
      - Fixed OCI_ConnectionCreate() : in case of an unsuccessfull attempt to create a connection, an OCI internal handle was not freed since v3.7.0 (-> memory leak)
      - Fixed OCI_LongWrite()   + OCI_CHARSET_WIDE charset mode : internal length passed to internal OCI calls was expressed in chars instead of bytes
      - Fixed OCI_TypeInfoGet() + OCI_TYF_TYPE : an Oracle error was raised when passing as type name a builtin system type like "SYS.RAW"
      - Fixed OCI_GetLastError() that could return NULL when errors occured in OCI_FetchXXX() calls (although the global error handler was correctly fired) 
      - Fixed OCI_DequeueGet() : a segfault happened if the queue payload was of type RAW 
      - Fixed OCI_DequeueFree() : internal structure member that hold the value set by OCI_DequeueSetConsumer() was not freed (memory leak)
      - Fixed OCI_MsgFree() : internal message ID allocated at enqueue time by OCI_EnqueuePut() was not freed (memory leak)
      - Fixed OCI_IterFree() : internal OCI_Elem handle was not freed for local collections resulting a small memory leak
      - Fixed OCI_EnqueuePut() and OCI_DequeueGet() : possible memory leak on Unix platforms + OCI_CHARSET_WIDE/OCI_CHARSET_MIXED charset mode
      - Fixed OCI_DequeueFree() : Internal OCI_Msg handle deallocation forgot to deallocate internal message ID resulting a small memory leak
      - Fixed OCI_SetPassword() and OCI_SetUserPassword() : in OCI_CHARSET_WIDE and OCI_CHARSET_MIXED builds, theses functions failed to change the password
      - Fixed OCI_LobRead2() and OCI_LobWrite2() that could block when using UTF8 through NLS_LANG environment variable
      - Fixed OCI_GetStruct() : structure padding was not handled properly
      - Fixed internal allocation of ROWID and UROWID internal buffers when using UTF8 through NLS_LANG environment variable

    * Miscellaneous changes

      - Added Exception type OCI_ERR_REBIND_BAD_DATATYPE if a rebinding call attempts to bind a datatype different than the initial one
      - Updated documentation about datatypes for rebinding
      - Added support for numeric subtypes in OCI_BindGetSubtype() + documentation update
      - Manual update of source code formatted with Uncrustify (wrong indentation of witch case and some variable initialization)
      - Pre built MS Windows 32/64bits Dlls are now built using MS Visual Studio 2010 Express (instead of MS Visual Studio 2008 Professional)
      - A MS Visual Studio 2010 Express solution and project has been added to the Windows package to rebuild the Dlls
      
2010-10-24 Version 3.8.0 Vincent Rogier vince.rogier@ocilib.net

    * Added support for Oracle Streams AQ (Advanced Queues)

      - See section in the documentation (page <module>, section <Oracle Advanced Queues (A/Q)>)
      - Added demo file queue.c
      - Added type OCI_Msg
      - Added type OCI_Agent
      - Added type OCI_Enqueue
      - Added type OCI_Dequeue
      - Added OCI_MsgCreate()
      - Added OCI_MsgFree()
      - Added OCI_MsgReset()
      - Added OCI_MsgSetObject()
      - Added OCI_MsgGetObject()
      - Added OCI_MsgGetRaw()
      - Added OCI_MsgSetRaw()
      - Added OCI_MsgGetAttemptCount()
      - Added OCI_MsgSetEnqueueDelay()
      - Added OCI_MsgGetEnqueueTime()
      - Added OCI_MsgGetExpiration()
      - Added OCI_MsgSetExpiration()
      - Added OCI_MsgGetState()
      - Added OCI_MsgGetPriority()
      - Added OCI_MsgSetPriority()
      - Added OCI_MsgGetID()     
      - Added OCI_MsgGetOriginalID()
      - Added OCI_MsgSetOriginalID()
      - Added OCI_MsgGetSender()
      - Added OCI_MsgSetSender()
      - Added OCI_MsgSetConsumers()
      - Added OCI_MsgGetCorrelation()
      - Added OCI_MsgSetCorrelation()
      - Added OCI_MsgSetExceptionQueue()
      - Added OCI_MsgGetExceptionQueue()
      - Added OCI_EnqueueCreate()
      - Added OCI_EnqueueFree()
      - Added OCI_EnqueuePut()
      - Added OCI_EnqueueSetSequenceDeviation()
      - Added OCI_EnqueueGetSequenceDeviation()
      - Added OCI_EnqueueSetVisibility()
      - Added OCI_EnqueueGetVisibility()
      - Added OCI_EnqueueSetRelativeMsgID()
      - Added OCI_EnqueueGetRelativeMsgID()
      - Added OCI_DequeueCreate()
      - Added OCI_DequeueFree()
      - Added OCI_DequeueGet()
      - Added OCI_DequeueSetConsumer()
      - Added OCI_DequeueGetConsumer()
      - Added OCI_DequeueSetCorrelation()
      - Added OCI_DequeueGetCorrelation()
      - Added OCI_DequeueSetRelativeMsgID()
      - Added OCI_DequeueGetRelativeMsgID()
      - Added OCI_DequeueSetVisibility()
      - Added OCI_DequeueGetVisibility()
      - Added OCI_DequeueSetMode()
      - Added OCI_DequeueGetMode
      - Added OCI_DequeueSetNavigation()
      - Added OCI_DequeueGetNavigation()
      - Added OCI_DequeueSetWaitTime()
      - Added OCI_DequeueGetWaitTime()
      - Added OCI_DequeueListen()
      - Added OCI_DequeueSetAgentList()
      - Added OCI_AgentCreate()
      - Added OCI_AgentFree()
      - Added OCI_AgentSetName()
      - Added OCI_AgentGetName()
      - Added OCI_AgentSetAddress()
      - Added OCI_AgentGetAddress()
      - Added OCI_QueueCreate()
      - Added OCI_QueueAlter()
      - Added OCI_QueueDrop()
      - Added OCI_QueueStart()
      - Added OCI_QueueStop()
      - Added OCI_QueueTableCreate()
      - Added OCI_QueueTableAlter()
      - Added OCI_QueueTableDrop()
      - Added OCI_QueueTablePurge()
      - Added OCI_QueueTableMigrate()

    * Added support for SQL parsing only
 
      - Added OCI_Parse()
      - Added OCI_ParseFmt()

    * Miscellaneous changes

      - All OCILIB source files have been reformatted using uncrustify (best source code formatter ever tried !!)
      - Source code max line length have been modified (80 -> 100 characters)

    * Miscellaneous fixes

      - Fixed memory leak : if an OCI_Bindxxx() returned FALSE (eg. non present binds in the sql statment), the newly internal allocated bind object was not freed
      - Fixed possible segfault in OCI_Cleanup() if OCI_SubscriptionRegister() had been previouly called call unsuccessfully
      - Fixed internal array allocation when using OCI_ArraySetSize() called many times on the same prepared SQL statement
      - Fixed OCI_ElemGetTimeStamp() and OCI_ElemGetInterval() when collections are retreived from the server 
      - Fixed possible segfault in OCI_TimestampFromCTime() and OCI_TimestampFromCTime() if the libc function localtime() returns a NULL tm structure pointer
      - Fixed OCI_GetSessionTag() linkage : the function was internally named OCI_GetSessionData() instead of OCI_GetSessionTag() in connection.c
      - Fixed binding of date arrays : the introduction of OCI_XXXArrayCreate() in v3.6.0 has introduced a bug in dates array binding that would cause to pass NULL data for some elements of the array
      - Fixed some API naming inconstancy (lower/upper case)

        - OCI_ElemGetTimeStamp()      renamed to OCI_ElemGetTimestamp()
        - OCI_ObjectGetTimeStamp()    renamed to OCI_ObjectGetTimestamp()
        - OCI_TimestampSysTimeStamp() renamed to OCI_TimestampSysTimestamp()
        - Macros have been added for backward compatibility

        - Existing programs must be recompiled (in order to use this new version of ocilib) with no code change (as compatibility macros are provided)
  

2010-07-26 Version 3.7.0 Vincent Rogier vince.rogier@ocilib.net

    * Added support for Session Pools

      - Added support for Oracle Session pools :

        - This features has beed introduced in Oracle 9.2
        - For Oracle clients < 9.2, sessions are handled as regular connection pools

      - Renamed type OCI_ConnPool to OCI_Pool
      - Renamed all OCI_ConnPooXXX() calls to OCI_PoolXXX()
      - Added macros that maps old OCI_ConnPoolXXX() prototypes to OCI_PoolXXX() functions
      - Added new parameter 'type' to OCI_PoolCreate(). Possible values are

        - OCI_POOL_CONNECTION : creates a connection pool
        - OCI_POOL_SESSION    : creates a session pool

      - Added support for session pool tagging:

        - Added OCI_GetSessionTag()
        - Added OCI_SetSessionTag()

      - Added new parameter 'tag' to OCI_PoolGetConnection() 

      - Updated documentation:

        - Renamed page <module>, section <Connection pooling> to <Oracle pooling>
        - Added Information about session pooling

    * Extended fetch interface

      - Added OCI_GetStruct()
      - Added OCI_SetStructNumericType()
      - Added demo file fetch_struct.c