Skip to content

wyyrepo/dtl

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

<html>

<head>
<meta http-equiv="Content-Type"
content="text/html; charset=iso-8859-1">
<meta name="GENERATOR" content="Microsoft FrontPage Express 2.0">
<title>Read Me</title>
</head>

<body>

<h1>Instructions for using the Database Template Library </h1>

<ol>
  <li><font size="2"><b>Contents</b></font> 
    <ol>
      <li><font size="2">When you unpack dtl.tar.gz it should create the following 
        directories:</font></li>
      <li><font size="2">\docs: Documentation and examples on how to use the Database 
        Template Library. To read, open the main file called index.htm.</font></li>
      <li><font size="2">\lib: This is the main code for the DTL. </font></li>
      <li><font size="2">\example_db: Table definitions and sample data for the 
        code in the &quot;example&quot; and &quot;tests&quot; directories.</font></li>
      <li><font size="2">\example: Example code for using the DTL.</font></li>
      <li><font size="2">\tests: Regression tests for the DTL / further examples.<br>
        </font></li>
      <li><font size="2">\profile: Simple profiling tests versus raw ODBC calls.<br>
        </font></li>
    </ol>
  </li>
  <br>
  <li><font size="2"><b>Getting Started:</b></font> 
    <ol>
      <li><font size="2">Take a look at the docs files starting at index.htm. Be sure to read &quot;Introduction 
        to the DTL&quot; as this gives a good overview of the capabilities of 
        the library.</font></li>
      <li><font size="2">Create the sample database from the example_db directory.</font> 
        <ol>
          <li><font size="2">If you have a copy of Access97 there is nothing to 
            do here. We have a sample Access database in the example_db directory.</font></li>
          <li><font size="2">If you are using Oracle perform the following steps 
            from SQL*PLUS:</font> 
            <ol>
              <li><font size="2">&gt;create user example identified by example;</font></li>
              <li><font size="2">&gt;grant dba to example; -- actually we need 
                less than this, but it's easier to grant dba</font></li>
              <li><font size="2">&gt;connect example/example;</font></li>
              <li><font size="2">&gt;@e:\dtl\example_db\tables.sql -- run the 
                tables script to create the example tables</font></li>
              <li><font size="2">&gt;@e:\dtl\example_db\data.sql -- insert sample 
                data into the example tables</font></li>
            </ol>
          </li>
          <li><font size="2">If you are using MySQL perform the following steps:</font> 
            <ol>
              <li><font size="2">create a user called &quot;example&quot; with 
                password &quot;example&quot;.</font></li>
              <li><font size="2">&gt;mysql &lt;database_name&gt; -u example &lt; 
                tables_mysql.sql -- run the tables script to create the example tables</font></li>
              <li><font size="2">&gt;mysql &lt;database_name&gt; -u example &lt; 
                data_mysql.sql -- insert sample data into the example tables</font></li>
            </ol>
          </li>
          <li><font size="2">If you are using Microsoft SQL Server:</font> 
            <ol>
              <li><font size="2">create a user called &quot;example&quot; with 
                password &quot;example&quot;.</font></li>
              <li><font size="2">Use the data import tool to import the table 
                definitions and data from the Access97 file example.mdb</font></li>
            </ol>
          </li>
        </ol>
      </li>
      <li><font size="2">Create an ODBC data source called &quot;example&quot; 
        from the ODBC Data Source Administrator tool in the control panel:</font> 
        <ol>
          <li><font size="2">The example code uses the following ODBC connect 
            string: &quot;UID=example;PWD=example;DSN=example;&quot;; Therefore 
            it connects as user &quot;example&quot;, password &quot;example&quot; 
            to the ODBC data source named &quot;example&quot;. We assume that 
            the user and password are already set up as explained above &amp; 
            show how to set up the data source name.</font></li>
          <li><font size="2">Choose the tab labeled &quot;System DSN&quot;. Choose 
            &quot;Add --&gt; Microsoft Access Driver (*.mdb)&quot;. For the data 
            source name enter &quot;example&quot; and choose the file called example.mdb 
            in the example_db directory. (If you prefer to use Oracle choose the 
            Oracle ODBC driver and enter your SQL*NET connect string etc.)</font></li>
        </ol>
      </li>
      <li><font size="2">Build and run the example code.</font> 
        <ol>
           <li><font size="2">Go to the directory called \example. Open the file 
           example.dsw and build from VC++ 6.0 to create the example executable.
           <b>Make sure if you are using Visual Studio 6.0 that you have at least Service Pack 
           5 installed!!! </b> To compile under UNIX type &quot;sh build.sh&quot; 
           which will run the makefile appropriate to your environment (LINUX, CYGWIN, HP, SOLARIS) and place the result in a ./debug directory. 
	   For Linux see <a href="ReadMeLinux.htm">ReadMeLinux.htm</a> 
           for details. Also, when compiling under a UNIX environment make sure the ODBC include and
	   link directories are in your path which should be done by default. 
	   To compile under Borland (BCC) we have set up a number of makefiles in the form *.mak 
           see <a href="ReadMeBorland.htm"> ReadMeBorland.htm</a>.
         </font></li>
          <li><font size="2">Run the example.<br>
	    <font size="4"><pre>
	    &gt;example.exe 'DSN=example;UID=example;PWD=example;'
	  </pre></font>(If you are running from UNIX you will need to provide the ODBC connection string as an argument to the program in quotes,
          in VC++ we have already done this via the debug settings).</font></li>
        </ol>
      </li>
    </ol>
  </li>
  <br>
  <li><font size="2"><b>Using the library in your own code:</b></font> 
    <ol>
      <li><font size="2">To use the library in your own code you will need to 
        do two things:</font> 
        <ol>
          <li><font size="2">Include the \lib directory in the include (\I) path 
            for your compiler.</font></li>
          <li><font size="2">Include the library file (DTL.lib or libDTL.a) in the 
            set of files that you link to in producing your executable.<br>
            </font></li>
        </ol>
      </li>
    </ol>
  </li>
  <br>
</ol>
<br>
<hr>

<font size="2"><strong>Release Notes</strong></font><em><strong><font size="2"> 
</font></strong></em> 
<ol>

<li><font size="2"><em><strong>Version 3.6.11; Released May 22, 2008</strong></em></font><br>
    <font size="2"><b>***Bugfixes*** </b></font>
  <ol> 
      <li><font face="Times New Roman, Times, serif" size="2">Minor changes to compile under gcc 4.1.2.</font></li> 
      <li><font face="Times New Roman, Times, serif" size="2">Minor changes to compile under 64 bit Linux.</font></li>    
  </ol>
<br>


<li><font size="2"><em><strong>Version 3.6.10; Released Aug 14, 2005</strong></em></font><br>
    <font size="2"><b>***Bugfixes*** </b></font>
  <ol> 
      <li><font face="Times New Roman, Times, serif" size="2">Fixed bug in DynamicDBView that caused key fields to sometimes
incorrectly append field names.</font></li> 
      <li><font face="Times New Roman, Times, serif" size="2">Minor header change to support GCC 4.0 and
latest STLPort version 5.0 from Darko Miletic.  Also, updated Borland build files from Darko.</font></li>
      <li><font face="Times New Roman, Times, serif" size="2">Fixes to user defined validation support.  These
mostly corrected some errors that would manifest in nullable, dtl_enum and dtl_set types from Paul Harris.</font></li>     
       <li><font face="Times New Roman, Times, serif" size="2">Fixes to nullable class to correct problems when working
with NULL fields and select_update iterator.</font></li>     
  </ol>
  <br>
    <font size="2"><b>***New Features/Improvements/Removed features *** </b></font> 
    <ol>
      <li><font face="Times New Roman, Times, serif" size="2">New posix_time and other types from Paul Harris. </font></li>
    </ol>
<br>

<li><font size="2"><em><strong>Version 3.6.9; Released Mar 25, 2005</strong></em></font><br>
    <font size="2"><b>***Bugfixes*** </b></font>
  <ol> 
      <li><font face="Times New Roman, Times, serif" size="2">Fixed bug in select_iterator that caused ++ to not increment correctly
on the first call if the iterator was not dereferenced.</font></li> 
      <li><font face="Times New Roman, Times, serif" size="2">Fixed bug in assignment of view.begin() to sql_iterator which
caused the iterator to not reset properly.</font></li>
      <li><font face="Times New Roman, Times, serif" size="2">Applied fixes for Borland 6 build, updated docs.</font></li>          
  </ol>
  <br>
    <font size="2"><b>***New Features/Improvements/Removed features *** </b></font> 
    <ol>
      <li><font face="Times New Roman, Times, serif" size="2">Improved DBStmt and LocalBCA docs. </font></li>
    </ol>
<br>

<li><font size="2"><em><strong>Version 3.6.8; Released Feb 28, 2005</strong></em></font><br>
    <font size="2"><b>***Bugfixes*** </b></font>
  <ol> 
      <li><font face="Times New Roman, Times, serif" size="2">Fixed bug in RandomDBView that caused null field flags to not be
correctly passed to SelValidate - hence rows with null values were not correctly recognized.</font></li>          
  </ol>
  <br>
    <font size="2"><b>***New Features/Improvements/Removed features *** </b></font> 
    <ol>
      <li><font face="Times New Roman, Times, serif" size="2">Added expanded table.h and generation code from Tim Walkenhorst to support 
more parameters. </font></li>
      <li><font face="Times New Roman, Times, serif" size="2">Add support for SQL-server LEFT JOIN syntax from Paul Harris. </font></li>
      <li><font face="Times New Roman, Times, serif" size="2">Added new set of Borland makefiles from Darko Miletic. Also added
improved solution from Darko for creating blob class as basic_string<unsigned char>.</font></li>
    </ol>
<br>

<li><font size="2"><em><strong>Version 3.6.7; Released January 1, 2005</strong></em></font><br>
    <font size="2"><b>***Bugfixes*** </b></font>
  <ol> 
      <li><font face="Times New Roman, Times, serif" size="2">Clean up casts and dummy parameters (Paul Harris).</font></li>    
      <li><font face="Times New Roman, Times, serif" size="2">Clean up header includes so that iterator headers can be
individually included correctly.</font></li>        
  </ol>
  <br>
    <font size="2"><b>***New Features/Improvements/Removed features *** </b></font> 
    <ol>
      <li><font face="Times New Roman, Times, serif" size="2">Add support for user defined validations when creating
bindings for user defined types. </font></li>
      <li><font face="Times New Roman, Times, serif" size="2">Add new types from Paul Harris: <b>nullable, set, enum</b>.  See
lib/nullable.h, lib/dtl_enum.h, lib/dtl_set.h for details and examples. </font></li>
      <li><font face="Times New Roman, Times, serif" size="2">Add makefile changes from Janusz Piwowarski to support mingw. </font></li>
    </ol>
<br>


<li><font size="2"><em><strong>Version 3.6.6; Released October 5, 2004</strong></em></font><br>
    <font size="2"><b>***Bugfixes*** </b></font>
  <ol> 
      <li><font face="Times New Roman, Times, serif" size="2">Fixed bug in RandomDBView so that it will
correctly handle empty tables.</font></li>    
      <li><font face="Times New Roman, Times, serif" size="2">Switched calls from strtok to strtok_r to support
multi-threading under Linux.</font></li>  
 <li><font face="Times New Roman, Times, serif" size="2">Removed variant_row::_jtime_c method since this is not supported.
Users should use _timestamp method to bind times.</font></li>         
  </ol>
  <br>
    <font size="2"><b>***New Features/Improvements/Removed features *** </b></font> 
    <ol>
      <li><font face="Times New Roman, Times, serif" size="2">Upgraded RandomDBView to support MySQL. </font></li>
      <li><font face="Times New Roman, Times, serif" size="2">Updated multi-theading FAQ. Improved docs. </font></li>
    </ol>
<br>

<li><font size="2"><em><strong>Version 3.6.5; Released August 23, 2004</strong></em></font><br>
    <font size="2"><b>***Bugfixes*** </b></font>
  <ol> 
      <li><font face="Times New Roman, Times, serif" size="2">Fixed bug introduced in 3.6.4 that caused DynamicDBView with
parameters to potentially trash memory.</font></li>    
      <li><font face="Times New Roman, Times, serif" size="2">Fixed bug in LocalBCA that caused columns to be numbered
incorrectly.  This made sql_iterator with a local BCA not work correctly for > 2 columns.</font></li>       
  </ol>
  <br>
    <font size="2"><b>***New Features/Improvements/Removed features *** </b></font> 
    <ol>
      <li><font face="Times New Roman, Times, serif" size="2">Upgraded global error handler callback to be able to take a functor
as well as a function pointer. </font></li>
    </ol>
<br>

<li><font size="2"><em><strong>Version 3.6.4; Released July 27, 2004</strong></em></font><br>
    <font size="2"><b>***Bugfixes*** </b></font>
  <ol> 
      <li><font face="Times New Roman, Times, serif" size="2">Upgraded sql logging functionality so that sql logs are associated
with a DBConnection.  This should make logging thread safe for applications that use a separate connection per thread.</font></li>      
      <li><font face="Times New Roman, Times, serif" size="2">Fixed ETIMap initialization to be called from the
DBEnvironment constructor.  This should avoid a potential multi-threaded bug.</font> </li>
      <li><font face="Times New Roman, Times, serif" size="2">Cleaned up DataObj and ParamObj in dynamic DBView so that fields
which are not used in these objects do not get added.  (Previously the DataObj and ParamObj would both contain placholders
for all parameters and columns).</font> </li>
  </ol>
  <br>
    <font size="2"><b>***New Features/Improvements/Removed features *** </b></font> 
    <ol>
      <li><font face="Times New Roman, Times, serif" size="2">Added ability to register global error handler callback. </font></li>
      <li><font face="Times New Roman, Times, serif" size="2">Upgraded to support gcc 3.4. </font></li>
      <li><font face="Times New Roman, Times, serif" size="2">Cleaned up installation docs for Redhat Linux.  Enabled bulk fetch
          flag since the MyODBC 3.5.1 driver now supports this. </font></li>
      </ol>
<br>



<li><font size="2"><em><strong>Version 3.6.3; Released July 12, 2004</strong></em></font><br>
    <font size="2"><b>***Bugfixes*** </b></font>
  <ol> 
      <li><font face="Times New Roman, Times, serif" size="2">Renamed MIN to DTL_MIN to avoid possible macro conflicts.</font> </li>
      <li><font face="Times New Roman, Times, serif" size="2">Fixed sql_iterator to point to end() if the executed statement does not return any rows.</font> </li>
      <li><font face="Times New Roman, Times, serif" size="2">Fixed bug with BoundIO::ClearNull() that caused it to not work correctly with insert statements.</font> </li>
  </ol>
  <br>
    <font size="2"><b>***New Features/Improvements/Removed features *** </b></font> 
    <ol>
      <li><font face="Times New Roman, Times, serif" size="2">Added ODBCINT64 support to support long integers. </font></li>

      <li><font face="Times New Roman, Times, serif" size="2">Upgraded writing of strings and blobs to use SQLPutData more efficiently 
- this should make blobs write slightly faster. </font></li>

      <li><font face="Times New Roman, Times, serif" size="2">Upgraded sql logging functionality.<br>
PrintLog(ostream &amp;o) = SQL statements in execution order<br> 
PrintSortedLog(ostream &amp;o) = list of SQL statements in alphabetical order with no duplicates (what PrintLog() used to be).</font></li>
      
      <li><font face="Times New Roman, Times, serif" size="2">Minor adjustments to run with Visual C++ 2005 Express. </font></li>
      <li><font face="Times New Roman, Times, serif" size="2">Added variant_row::tchar_star type to allow the binding of fixed length strings with a variant_row.
	</font></li>
      </ol>
<br>

<li><font size="2"><em><strong>Version 3.6.2; Released May 17, 2004</strong></em></font><br>
    <font size="2"><b>***Bugfixes*** </b></font>
  <ol> 
      <li><font face="Times New Roman, Times, serif" size="2">Added compiler flag to fix iterator definitions under .NET with STLPort</font> </li>
      <li><font face="Times New Roman, Times, serif" size="2">Added enhancements to support SQL batches under SQL server and to better handle generic
sql_iterator queries with dummy column names or repeated column names.</font> </li>
      <li><font face="Times New Roman, Times, serif" size="2">Added workaround for Microsoft Access 2000 bug that was causing memo fields
longer than 2000 bytes to be fetched incorrectly.</font> </li>
      
  </ol>
  <br>
    <font size="2"><b>***New Features/Improvements/Removed features *** </b></font> 
    <ol>
      <li><font face="Times New Roman, Times, serif" size="2">Added DBConnection::GetDataSources() to retrieve a list of ODBC data sources. </font></li>

      <li><font face="Times New Roman, Times, serif" size="2">Added support for calling ODBC catalog functions as SQL statements.  
Currently supported functions are _SQLTables, _SQLColumns. </font></li>

      <li><font face="Times New Roman, Times, serif" size="2">Added the ability to log the SQL executed by DTL.
See DBStmt for details.</font></li>
      
      <li><font face="Times New Roman, Times, serif" size="2">Added the ability to convert from tcstring's of one length to tcstring's of a different 
length by adding templated conversion constructors and assignment operators to the tcstring class. </font></li>
      <li><font face="Times New Roman, Times, serif" size="2">Added change by A. Motzkau
to improve variant_row performance.</font></li>
      <li><font face="Times New Roman, Times, serif" size="2">Added draft RPM spec by Ben Martin.</font></li>
   </ol>
<br>

<li><font size="2"><em><strong>Version 3.6.1; Released February 3, 2004</strong></em></font><br>
    <font size="2"><b>***Bugfixes*** </b></font>
  <ol> 
      <li><font face="Times New Roman, Times, serif" size="2">Removed keyword "explicit" in dtl_variant_t constructor when using Visual C++
compiler since this causes Visual C++ 7.0 to choke.  Other compilers will continue to use the explicit qualification here.</font></li>
  </ol>
<br>

<li><font size="2"><em><strong>Version 3.6; Released February 1, 2004</strong></em></font><br>
    <font size="2"><b>***Bugfixes*** </b></font>
  <ol> 
      <li><font face="Times New Roman, Times, serif" size="2">Renamed variant_t to dtl_variant_t to avoid a clash with
the MFC component BCGControlBar which defines variant_t as a macro.</font> </li>
      <li><font face="Times New Roman, Times, serif" size="2">Added keyword "explicit" to dtl_variant_t constructor to avoid compiler
ambiguity that erroneously caused the dtl_variant_t constructor to be called when cout << foo is called for a class with no ostream operator.</font></li>
  </ol>
  <br>
    <font size="2"><b>***New Features/Improvements/Removed features *** </b></font> 
    <ol>
      <li><font face="Times New Roman, Times, serif" size="2">Changed dtl::blob from std::basic_string&lt;unsigned char&gt; to a class
which holds a counted pointer to this basic_string.  The reason for doing this is that blobs are often quite large so for performance
we want to avoid copying these objects whenever possible.  Now this class will merely copy the counted pointer on copy construction and assingment which
is much faster when working with blobs.  One limitation is that we have only forwarded the most common basic_string functions so you may find one is missing 
that you need.  If this happens, the trivial class definition can be found in array_string.h.</font></li>
      <li><font face="Times New Roman, Times, serif" size="2">Upgraded DynamicDBView so that it will now automatically detect any parameters
in a query and bind them to a ParamObj for the view. This extends DynamicDBView so that it can now have both columns and parameters that
are not defined until runtime. It also makes the syntax for parameters more intuitive for this case since any parameters can just be
assigned to a variant_row parameter object. See SimpleDynamicWhere() or <a href="fmtDynamicQueryExample.htm">ExecQuery()</a> in example/SimpleDynamicRead.cpp for an example.  The downside is that now DynamicDBView
no longer allows you to pass in a custom BPA since it automatically detects parameters. Instead, if you want to use a custom BPA with a DynamicDBView
you should use a DBView&lt;variant_row&gt; and just pass it a DynamicRowBCA() as is done in DynaDBView.h in the definition of a DynamicDBView. </li>
      <li><font face="Times New Roman, Times, serif" size="2">Upgraded the DBConnection::Connect method so that now it allows users to browse for a connection
via ODBC dialogs when DTL_NO_POOLING is set.  Also, you can pass a flag to the Connect method telling it not to turn off auto-commit for those drivers that
don't support this. </font></li>
      <li><font face="Times New Roman, Times, serif" size="2">Added new #define called DTL_VARIANT_USE_FIXED_LEN_STRING which causes DynamicDBView to bind
strings to a fixed length string buffer instead of using std::string.  This can improve performance if you know your strings will be of limited length. </font></li>
   </ol>

   </li>
    <p>&nbsp;</p>

  <li><font size="2"><em><strong>Version 3.5.3; Released November 21, 2003</strong></em></font><br>
    <font size="2"><b>***Bugfixes*** </b></font>
      <ol> 
      <li><font face="Times New Roman, Times, serif" size="2">Fixed bug that caused InsValidate to be called twice
the first time an insert or update iterator is assigned.</font></li>
      <li><font face="Times New Roman, Times, serif" size="2">Added static_cast labels as needed to remove warnings
and clarify code for MSVC 7.1. (Contributed by <a href="http://www.paulgrenyer.co.uk">Paul Greyner</a>. ). </font></li>
    <li><font face="Times New Roman, Times, serif" size="2">Changed defintions of MAX_JTIME to be less than ULONG_MAX.
This was to resolve potential overflow error reported by gcc 3.3.</font></li>
  </ol>
  <br>
    <font size="2"><b>***New Features/Improvements/Removed features *** </b></font> 
    <ol>
      <li><font face="Times New Roman, Times, serif" size="2">Changed default binding for SQL_BLOB so that DynamicDBView
now binds this to a C++ data type of dtl::blob rather than std::string.</font></li>
   </ol>

   </li>
    <p>&nbsp;</p>

  <li><font size="2"><em><strong>Version 3.5.2; Released September 10, 2003</strong></em></font><br>
    <font size="2"><b>***Bugfixes*** </b></font>
      <ol> 
      <li><font face="Times New Roman, Times, serif" size="2">Fixed bug when using STLport with MSVC .NET.  
         This bug caused the code not to use stlport::std::iterator so that the code would not compile.</font></li>
      <li><font face="Times New Roman, Times, serif" size="2">Empty strings, wstrings were errouneously written
 with the value of &quot;\0&quot; rather than NULL.</font></li>
    <li><font face="Times New Roman, Times, serif" size="2">If the database driver does not tell us what quote
character to use when quoting table or field names with blanks in them then default to &quot;.  Previous versions
were supposed to have logic to do this but it was buggy.</font></li>
  </ol>
  <br>
    <font size="2"><b>***New Features/Improvements/Removed features *** </b></font> 
    <ol>
      <li><font face="Times New Roman, Times, serif" size="2">If the database is not of a recognized type and it
 does not support AutoCommit, then throw an errror, but still allow a connection to be made as indicated by
DBConnection.state == CONNECTED. </font></li>
      <li><font face="Times New Roman, Times, serif" size="2">The dbstmt.MoreResults() method now gives extended 
  error information when the underlying ODBC function indicates an error.  This is helpful in debugging stored procedures
  that may give multiple result sets and error codes.</font></li>
   </ol>

   </li>
    <p>&nbsp;</p>

  <li><font size="2"><em><strong>Version 3.5.1; Released May 19, 2003</strong></em></font><br>
    <font size="2"><b>***Bugfixes*** </b></font> 
    <ol>
      <li><font face="Times New Roman, Times, serif" size="2">Fixed bug introduced in release 3.5 
        that broke bulk_fetch for dates.  This also affected IndexDBViews which use bulk fetch.</font></li>
      <li><font face="Times New Roman, Times, serif" size="2">Added flag -DHAVE_LONG_LONG to linux config to let unixODBC know
	to use the &quot;long long&quot; data type for ODBCINT64.</font></li>
    </ol>
    <br>
    <font size="2"><b>***New Features/Improvements/Removed features *** </b></font> 
    <ol>
      <li><font face="Times New Roman, Times, serif" size="2">None.</font></li>
   </ol>
   </li>
    <p>&nbsp;</p>

  <li><font size="2"><em><strong>Version 3.5; Released May 2, 2003</strong></em></font><br>
    <font size="2"><b>***Bugfixes*** </b></font> 
    <ol>
      <li><font face="Times New Roman, Times, serif" size="2">Fixed bug 
        where blob type would not fetch the last byte from the database field.</font></li>
    </ol>
    <br>
    <font size="2"><b>***New Features/Improvements/Removed features *** </b></font> 
    <ol>
      <li><font face="Times New Roman, Times, serif" size="2">Added random access container, RandomDBView, 
          to support scrollable static ODBC cursors. (Please note that in our tests we found that this container
          does not work with the MySQL ODBC driver 3.51 since this ODBC driver does not support a scrollable cursor property we need).</font></li>
      <li><font face="Times New Roman, Times, serif" size="2">Added support for large integers, ODBCINT64, as defined in sqltypes.h. 
          (Under windows ODBCINT64 generally 
          resolves to "_int64"; under UNIX it generally resolves to "long long"). </font></li>
      <li><font face="Times New Roman, Times, serif" size="2">Upgraded bulk_fetch_helper
	    to support bulk fetches for variant_row objects.</font></li>
	<li><font face="Times New Roman, Times, serif" size="2">Made changes suggested by R. Kotha to support compilation under FreeBSD using
          GCC 2.95.4 and STLPort.</font></li>
      <li><font face="Times New Roman, Times, serif" size="2">Added performance tuning suggested by "bowlbear_aa" to improve speed of
          reading blob data.</font></li>
   </ol>
   </li>
    <p>&nbsp;</p>
   
  <li><font size="2"><em><strong>Version 3.4.2; Released March 06, 2003</strong></em></font><br>
    <font size="2"><b>***Bugfixes*** </b></font> 
    <ol>
      <li><font face="Times New Roman, Times, serif" size="2">Fixed bugs 
        in bulk insert to where one could overflow the buffer.</font></li>
      <li><font face="Times New Roman, Times, serif" size="2">Added fix for
        broken ODBC drivers so that now double quote is always assumed as the default quote mark.</font></li>
      <li><font face="Times New Roman, Times, serif" size="2">Fixed problem with 
        IndexedDBView::erase(). When the underlying vec_multiset became empty, 
        all iterators referring to that container would become invalidated as 
        the sorted flag would be set to false. Fixed by keeping the sorted flag 
        set to true though it means vec_multiset will run a bit slower for this 
        case. </font></li>
      <li><font face="Times New Roman, Times, serif" size="2">Fixed inconsistencies 
        in GetLastCount() for the different basic DTL iterator types. GetLastCount() 
        now refers to the number of rows processed in the last operation performed 
        on that iterator, regardless of iterator type.</font><font size="2"></font></li>
    </ol>
    <br>
    <font size="2"><b>***New Features/Improvements/Removed features *** </b></font> 
    <ol>
      <li><font face="Times New Roman, Times, serif" size="2">Provide DTL_TABLE 
        and DTL_STRUCT macros to automatically generate the C++ data objects, 
        DefaultBCA, and DBViews given a table name and the types and names of 
        the columns in the table you wish to process. This feature makes it a lot easier
        to quickly create a simple structure and bind it directly to a database table.</font></li>
      <li><font face="Times New Roman, Times, serif" size="2">Added new set of DTL class diagrams from
        Robert Modolo (these are great!).</font></li>
      <li><font face="Times New Roman, Times, serif" size="2">Added bulk_insert_helper 
        functions to make it easy to perform bulk operations against any iterator.</font></li>
      <li><font face="Times New Roman, Times, serif" size="2">More improvements 
        to build script.  Now by default unix builds will go to a ./debug directory for debug builds
        and a ./release directory for release builds.</font></li>
      <li><font face="Times New Roman, Times, serif" size="2">Added ability to 
        disable printing of ROWIDs for dynamic views through the new DTL_OUTPUT_ROWIDS 
        config flag. If the flag is defined, the ROWIDs will be outputted as in 
        previous versions. Otherwise, a #### ROWID #### marker is printed instead 
        of the actual ROWID.</font></li>
      <li><font face="Times New Roman, Times, serif" size="2">Improvements in 
        regression test output. By leaving DTL_OUTPUT_ROWIDS undefined and adding 
        ORDER BY clauses to all DBViews that read objects, we get consistent output 
        for all runs of the example and tests projects. If printing of ROWIDs 
        were enabled for the regression tests, we'd get diffs whch mean nothing 
        as the DBMS is free to generate new autokeys on different runs of the 
        code. Our new ORDER BY clauses force a consistent ordering among all fields 
        in the view.</font></li>
    </ol>
   </li>
    <p>&nbsp;</p>
   <li><font size="2"><em><strong>Version 3.4.1; Released February 8th, 2003</strong></em></font><br>
    <font size="2"><b>***Bugfixes*** </b></font> 
    <ol>
      <li><font face="Times New Roman, Times, serif" size="2">Fixed bug where 
        sql_iterator would not correctly handle stored procedures that take parameters 
        and return result sets.</font><font size="2"></font></li>
      <li><font face="Times New Roman, Times, serif" size="2">Added enhancement 
        for SQL Server so that sql_iterator could support statments that return 
        more than one result set (e.g. stored procedures that return values). 
        See the sql_iterator documentation for details.</font><font size="2"></font></li>
      <li><font face="Times New Roman, Times, serif" size="2">Fixed bug where 
        IndexedDBView::find() would not work correctly for tcstring classes.</font><font size="2"></font></li>
    </ol>
    <br>
    <font size="2"><b>***New Features/Improvements/Removed features *** </b></font> 
    <ol>
      <li><font face="Times New Roman, Times, serif" size="2">New compiler/platform support.
	Visual C++ .Net.</font></li>
      <li><font face="Times New Roman, Times, serif" size="2">Added bulk_fetch_helper functions to make
	it easy to perform bulk operations against any iterator.</font></li>	
      <li><font face="Times New Roman, Times, serif" size="2">Improved build script so that we can now build
	more easily across multiple platforms.</font></li>
    </ol>
   </li>
    <p>&nbsp;</p>

  <li><font size="2"><em><strong>Version 3.4.0; Released November 25th, 2002</strong></em></font><br>
    <font size="2"><b>***Bugfixes*** </b></font> 
    <ol>
      <li><font face="Times New Roman, Times, serif" size="2">Fixed bug where autokeys in
	DynamicDBView could go into endless loop.</font><font size="2"></font></li>
      <li><font face="Times New Roman, Times, serif" size="2">Upgraded DynamicDBView to
	use field names as specified by the user when the list of field names is not &quot;*&quot;.
	This allows the use of qualified field names like table.field and also gives
	support for functions like sum(salary).</font><font size="2"></font></li>   
      <li><font face="Times New Roman, Times, serif" size="2">Removed broken char binding.  Replaced 
        with tcstring<1> binding.</font></li>   
    </ol>
    <br>
    <font size="2"><b>***New Features/Improvements/Removed features *** </b></font> 
    <ol>
      <li><font face="Times New Roman, Times, serif" size="2">New compiler/platform support.
	HP with aCC A.03.35, Solaris with Sun Workshop 6 update 1, Cygwin with gcc 3.2.</font></li>
      <li><font face="Times New Roman, Times, serif" size="2">Bulk select and bulk insert operation
 	support via the new bulk_copy function.</font></li>
      <li><font face="Times New Roman, Times, serif" size="2">Upgraded IndexedDBView to automatically 
	use bulk fetch when retrieving records.</font></li>
      <li><font face="Times New Roman, Times, serif" size="2">Removed support for binding
	to char, char[N], replaced with tcstring<N> binding for increased portability.</font></li>
	
    </ol>
   </li>
    <p>&nbsp;</p>

  <li><font size="2"><em><strong>Version 3.3.0; Released June 7th, 2002</strong></em></font><br>
    <font size="2"><b>***Bugfixes*** </b></font> 
    <ol>
      <li><font face="Times New Roman, Times, serif" size="2">Fixed bug where 
        select_update_iterator wasn't committing to the database on postfix increment. 
        See below for the major change we made in iterator semantics which fixed 
        this problem.</font><font size="2"></font></li>
    </ol>
    <br>
    <font size="2"><b>***New Features/Improvements/Removed features *** </b></font> 
    <ol>
      <li><font face="Times New Roman, Times, serif" size="2">Major change in 
        iterator semantics:</font></li>
      <ul>
        <li><font face="Times New Roman, Times, serif" size="2">Input iterators 
          (select_iterator, sql_iterator for SELECT/input iterator like ops, select_update_iterator 
          to march to next record) still read from the database on operator++().</font></li>
        <li><font face="Times New Roman, Times, serif" size="2"> Output iterators 
          (insert_iterator, update_iterator, delete_iterator, sql_iterator for 
          output iterator like ops, select_update_iterator to update current record) 
          now commit on the proxy assignment operator , as in iterator::operator=(const 
          DataObj &amp;). </font></li>
        <li><font face="Times New Roman, Times, serif" size="2"><b>Note that previous 
          versions of DTL committed all operations to the database on operator++(). 
          Existing code using DTL may break if you make Params() calls between 
          operator*() and operator++(), i. e.:</b></font><b><font face="Times New Roman, Times, serif" size="2"> 
          *it = dataObj; it.Params(...); ++it;. You must make the Params() call 
          before the operator*() call as the iterator will write to the database 
          on the proxy assignment call. Thus, you must change your code in the 
          example to read: it.Params(...); *it = dataObj; ++it;.</font></b></li>
        <li><font face="Times New Roman, Times, serif" size="2">Made necessary 
          changes to the example/tests projects to reflect the new semantics.</font></li>
        <li><font face="Times New Roman, Times, serif" size="2">Changes in IndexedDBView 
          to obey the new semantics and remain exception safe.</font></li>
      </ul>
      <li> <font size="2">User can now specify iterator execution behavior at 
        construction time or through DB_iterator::SetPrepare(bool bPrepare): if 
        bPrepare is true, internally, SQLPrepare() and SQLExecute() will be used 
        to run the query; otherwise, SQLExecDirect() will be called. Default behavior 
        is to set bPrepare to true for all output iterators as they will get executed 
        multiple times normally, but to use bPrepare = false for select_iterators 
        as they will be usually executed only once. Also made changes in IndexedDBView 
        to use bPrepare = false in all cases for the queries used by DBView::iterators 
        inside the routines as those iterators always get thrown away after a 
        single execute call.</font>
      <li><font size="2">Support for field names with spaces added. See &quot;Using 
        Field Names with Spaces in DTL&quot; document for more details.</font>
      <li><font size="2">Widespread changes to run under the Borland 5.5 compiler.</font>
      <li><font size="2">Select_iterator, select_update_iterator, sql_iterator 
        now all return a proxy on postincrement so that future DataObj access 
        can be made within the same expression.<b> Note that now for field access 
        in select_update_iterator and sql_iterator that you must use static_cast&lt;DataObj&gt;(*it).field 
        instead of (*it).field due to these changes. Use it-&gt;field where possible 
        for sql_iterator to avoid this syntactic headache.</b></font>
      <li><font size="2">Performance tweaks: string_util.cpp modifications and 
        added string::reserve() calls throughout.</font>
    </ol>
   </li>
    <p>&nbsp;</p>
  <li><font size="2"><em><strong>Version 3.2.4; Released March 29th, 2002</strong></em></font><br>
    <font size="2"><b>***Bugfixes*** </b></font> 
    <ol>
      <li><font size="2" face="Courier New, Courier, mono">DBStmt::SetStmtAttr()</font><font size="2"> 
        added to allow user to override stmt. attribute defaults. Added mainly 
        to allow for execution of complex stored procedures in SQL Server. These 
        complex stored procedures caused <font face="Courier New, Courier, mono">DBException</font>s 
        to be thrown without the ability for the user to set the statement attributes. 
        </font></li>
      <li><font size="2">Changes in <font face="Courier New, Courier, mono">variant_row.h</font> 
        and <font face="Courier New, Courier, mono">variant_row.cpp</font> for 
        compatability of DTL on .NET (Peter Schregle's work). </font></li>
      <li><font size="2">Resolved ambiguity bug for <font face="Courier New, Courier, mono">operator<<() 
        </font>for<font face="Courier New, Courier, mono"> TIMESTAMP_STRUCT</font> 
        to fix <font face="Courier New, Courier, mono">variant_t::get_string()</font>. 
        </font></li>
      <li><font size="2"> Bugs with unneeded <font face="Courier New, Courier, mono">_TEXT()</font> 
        macros in the same <font face="Courier New, Courier, mono">operator<<()</font> 
        routines as #4. Changed to use <font face="Courier New, Courier, mono">char</font>s 
        for the<font face="Courier New, Courier, mono"> ostream </font>overload 
        and<font face="Courier New, Courier, mono"> wchar_t</font>s for the <font face="Courier New, Courier, mono">wostream</font> 
        one. </font></li>
      <li><font size="2">Fixed problems with potential statement handle leaks 
        inside the<font face="Courier New, Courier, mono"> DBStmt</font> class 
        in the case where the underlying ODBC implementation has an access violation.</font></li>
    </ol>
    <br>
    <b><font size="2">***New Features/Improvements/Removed features *** </font></b> 
    <ol>
      <li><font face="Times New Roman, Times, serif" size="2">Added four-field 
        <font face="Courier New, Courier, mono">find()</font> and <font face="Courier New, Courier, mono">equal_range()</font> 
        members to<font face="Courier New, Courier, mono"> IndexedDBView</font>.</font></li>
      <li><font face="Times New Roman, Times, serif" size="2">Improved error handling 
        dealing with<font face="Courier New, Courier, mono"> TIMESTAMP_STRUCT</font> 
        fields in<font face="Courier New, Courier, mono"> variant_row</font>s. 
        Now, the user must initialize the date field when he tries to insert a 
        record or he will get a <font face="Courier New, Courier, mono">VariantException</font>.</font></li>
    </ol>
 
<li><font size="2"><em><strong>Version 3.2.3; Released February 24, 2002.</strong></em></font><br>
  <font size="2"><b>***Bugfixes*** </b></font> 
    <ol>
      <li><font size="2">Fixed </font><font size="2" face="Courier New, Courier, mono">DBStmt::GetData()</font><font size="2"> 
        and <font face="Courier New, Courier, mono">DBStmt::PutData()</font> problems 
        for long strings (strings greater than 255 in length). Most of the changes 
        occurred with BoundIO::MoveRead(), BoundIO::MoveWrite(), and BoundIO::MoveWriteAfterExec().</font></li>
      <li><font size="2">Fixed typedefs in <font face="Courier New, Courier, mono">vec_multiset::iterator</font> 
        and <font face="Courier New, Courier, mono">vec_multiset::const_iterator</font> 
        to get rid of GCC compiler warnings.</font></li>
      <li><font face="Times New Roman, Times, serif" size="2">SelValidate() calls 
        moved from operator*() to operator++() for select_iterator and sql_iterator 
        to get proper for-loop behavior.</font> </li>
      <li><font face="Times New Roman, Times, serif" size="2">Changed default 
        key mode for DynamicDBView and DynamicIndexedDBView to USE_ALL_FIELDS.</font> 
      </li>
      <li><font face="Times New Roman, Times, serif" size="2">Fixed case sensitivity 
        bugs dealing with column names in DBIndex and BoundIO/BoundIOs structures.</font></li>
      <li><font face="Times New Roman, Times, serif" size="2">Fixed bug to where 
        parameters were getting bound to nonexistent parameter numbers in the 
        case of<font face="Courier New, Courier, mono"> insert_iterator</font>s. 
        In the fix, we don't bind the extra parameters anymore.</font></li>
	  </ol>
	  
    <b><font size="2">***New Features/Improvements/Removed features ***</font></b> 
    <ol>
          <li><font face="Times New Roman, Times, serif" size="2">Changed default 
            key mode for</font><font face="Courier New, Courier, mono" size="2"> 
            DynamicDBView <font face="Times New Roman, Times, serif">and</font> 
            DynamicIndexedDBView <font face="Times New Roman, Times, serif">to</font> 
            USE_ALL_FIELDS.</font></li>
          <li><font face="Times New Roman, Times, serif" size="2">Limited OpenAccess 
            support now provided: <font face="Courier New, Courier, mono">DBView</font> 
            and <font face="Courier New, Courier, mono">IndexedDBView</font> support 
            all data types in OpenAccess except for <font face="Courier New, Courier, mono">string</font>, 
            <font face="Courier New, Courier, mono"> wstring</font>, and <font face="Courier New, Courier, mono">blob</font>.</font></li>
        </ol>
      </li>
 
  <li><font size="2"><em><strong>Version 3.2.2; Released January 31, 2002.</strong></em></font><br>
    <font size="2"><b>***Bugfixes*** </b></font> 
    <ol>
      <li><font size="2" face="Courier New, Courier, mono">SQL_C_BIT</font><font size="2"> 
        is now the mapping for the<font face="Courier New, Courier, mono"> bool 
        </font>type ... <font face="Courier New, Courier, mono">SQL_C_USHORT </font>was 
        buggy.</font></li>
      <li><font size="2">Fix for single <font face="Courier New, Courier, mono">char 
        </font>binding.</font></li>
      <li><font size="2">Fixed bug in<font face="Courier New, Courier, mono"> 
        BuildDefaultQry()</font>.</font></li>
      <li><font size="2">Fixed<font face="Courier New, Courier, mono"> iterator/const_iterator 
        typedef</font>s in <font face="Courier New, Courier, mono">IndexedDBView.</font></font></li>
      <li><font size="2" face="Times New Roman, Times, serif">Added missing constructor 
        initializers.</font></li>
      <li><font size="2">Fixed bug in storing of <font face="Courier New, Courier, mono">IndexName</font> 
        for key into indexes map. Also more<font face="Courier New, Courier, mono"> 
        IndexNamesAndFields </font>parsing fun.</font></li>
      <li><font size="2">Fixed support for <font face="Courier New, Courier, mono">char[]</font> 
        binding yet again.</font></li>
      <li><font size="2">Fixed <font face="Courier New, Courier, mono">const</font> 
        problems in comparison operators for<font face="Courier New, Courier, mono"> 
        select_iterator</font> and <font face="Courier New, Courier, mono">sql_iterator</font> 
        and added commutative form of these operators.</font></li>
      <li><font size="2">Glitches in the docs.</font></li>
      <li><font size="2">Fixed yet some more missing <font face="Courier New, Courier, mono">STD_::</font> 
        qualifcations.</font></li>
      <li><font size="2">Moved header guards for<font face="Courier New, Courier, mono"> 
        IndexedDBView.h </font>and<font face="Courier New, Courier, mono"> DBIndex.h 
        </font>to proper places.</font></li>
      <li><font size="2"><b>Bug identified for SQLServer: execution of a bad statement 
        may result in a rollback, regardless of the IOHandler semantics.</b></font></li>
      <li><font size="2"><b>Note that unicode is not supported by Oracle 8.x or 
        lower. Oracle only support unicode for version 9.01 and higher, but we 
        haven't tested this yet. We've only tested unicode for SQLServer and MS 
        Access.</b></font></li>
      <li><font size="2">Fixed bug in assignment operator for <font face="Courier New, Courier, mono">variant_field</font> 
        that caused problem when copying from one <font face="Courier New, Courier, mono"> 
        DynamicDBView</font> iterator to another.</font></li>
      <li><font size="2">Changed default SQL binding for float data parameters 
        from SQL_FLOAT to SQL_REAL.</font></li>
      <li><font size="2">Removed bug that caused wide strings over 255 bytes in 
        length to not be written to the database correctly.</font></li>
    </ol>
  <br>
    <font size="2"><b>***New Features/Improvements/Removed features *** </b></font> 
    <ol>
      <li><font size="2" face="Courier New, Courier, mono">GetData()</font><font size="2"> 
        and <font face="Courier New, Courier, mono">PutData()</font> used to handle 
        &quot;binding&quot; of all <font face="Courier New, Courier, mono">basic_string&lt;&gt;</font> 
        types. Now by default binding a string or blob has the capability to fetch 
        a field of an arbitrarily large size.</font></li>
      <li><font size="2">Added <font face="Courier New, Courier, mono">DBView::select_update_iterator</font>.</font></li>
      <li><font size="2">Changed<font face="Courier New, Courier, mono"> DEFAULT_IDXCONTAINER 
        </font>to be <font face="Courier New, Courier, mono">std::hash_multiset</font> 
        for STLPort. Other configurations default to <font face="Courier New, Courier, mono">dtl::vec_multiset</font>. 
        This makes IndexDBView containers run *much* faster. This included downgrading 
        <font face="Courier New, Courier, mono">IndexedDBView::iterator </font>from 
        bidirectional iterator to forward iterator if <font face="Courier New, Courier, mono">std::hash_multiset 
        </font>is the default index container as it only supports forward iterators.</font></li>
      <li><font size="2" face="Courier New, Courier, mono">TCHAR/tstring</font><font size="2"> 
        concept made universal: <font face="Courier New, Courier, mono">TCHAR[]</font> 
        and<font face="Courier New, Courier, mono"> TCHAR</font> bindings used 
        instead of <font face="Courier New, Courier, mono">char</font> and <font face="Courier New, Courier, mono">char[]</font> 
        being allowed regardless of the<font face="Courier New, Courier, mono"> 
        UNICODE</font> setting.</font></li>
      <li><font size="2" face="Courier New, Courier, mono">star_bidirectional_iterator 
        </font><font size="2">conversion constructors and comparison operators. 
        Also added <font face="Courier New, Courier, mono">star_forward_iterator</font>.</font></li>
      <li><font size="2">Added <font face="Courier New, Courier, mono">DTL_LC 
        </font>and<font face="Courier New, Courier, mono"> DTL_UC</font> macros 
        to lower-caseify and upper-caseify (respectively) the SQL passed to ODBC.</font></li>
      <li><font size="2">Added autokey support. Forced some changes in <font face="Courier New, Courier, mono">DynamicBCA</font>, 
        <font face="Courier New, Courier, mono">DBView</font>, <font face="Courier New, Courier, mono">IndexedDBView</font>, 
        <font face="Courier New, Courier, mono">DynamicIndexedDBView</font> to 
        properly support this.</font></li>
      <li><font size="2">Changed <font face="Courier New, Courier, mono">MAX_J_DATE</font>. 
        Old max date was incorrect & too small.</font></li>
      <li><font size="2" face="Courier New, Courier, mono">Vec_multiset</font><font size="2"> 
        cleanup.</font></li>
      <li><font size="2">Removed <font face="Courier New, Courier, mono">BoundIO::BoundColMode</font>.</font></li>
      <li><font size="2">Added <font face="Courier New, Courier, mono">BoundIO::SetSQLType() 
        </font>so that user may specify a different SQL type to bind to other 
        than the one specified in the ETI Map in <font face="Courier New, Courier, mono">bind_basics.cpp</font>. 
        </font></li>
      <li><font size="2">Added index of code examples.</font></li>
      <li><font size="2">Added <font size="2" face="Courier New">SetParamsFromClass</font> 
        template to make it easier to set parameters when creating <font size="2" face="Courier New">IndexedDBViews</font>.</font></li>
      <li><font size="2">General performance tuning. Replace internal wrappers 
        for BCA, BPA, InsVal and SelVal plus did general performance tuning to 
        improve overall speed of execution.</font></li>
    </ol>
  </li>
  <li><font size="2"><em><strong>Version 3.1; Released August 13, 2001.</strong></em></font><br>
    <font size="2"><b>***Bugfixes*** </b></font> 
    <ol>
      <li><font size="2">Fixed bug with <font face="Courier New, Courier, mono">IndexedDBView</font> 
        so that any changes made by <font face="Courier New, Courier, mono">InsVal</font> 
        to the <font face="Courier New, Courier, mono"> DataObj </font> will be 
        recognized by <font face="Courier New, Courier, mono">insert()</font> 
        and <font face="Courier New, Courier, mono">replace()</font>.</font></li>
      <li><font size="2" face="Courier New, Courier, mono">BoundIO::CopyMember() 
        </font><font size="2">performed only a shallow copy for <font face="Courier New, Courier, mono">char[] 
        </font>members</font><font face="Times New Roman, Times, serif" size="2"><font face="Times New Roman, Times, serif">. 
        This has now been fixed with the<font face="Courier New, Courier, mono"> 
        MakeActualCopyOfMember()</font> template.</font></font></li>
      <li><font size="2" face="Courier New, Courier, mono">GenericCmp()</font><font size="2"> 
        incorrectly handled<font face="Courier New, Courier, mono"> doubles</font> 
        by making <font face="Courier New, Courier, mono">epsilon</font> equal 
        to<font face="Courier New, Courier, mono"> 1 &gt;&gt; 20</font>, yielding 
        an actual value of<font face="Courier New, Courier, mono"> 0.0000000</font> 
        due to the fact that this old value operates on integers and thus the 
        fractional part was dropped. The change to make <font face="Courier New, Courier, mono">epsilon</font> 
        equal to <font face="Courier New, Courier, mono">pow(2, -20)</font> fixed 
        the problem.</font></li>
      <li><font size="2">Fixed <font face="Courier New, Courier, mono">DBException::what() 
        </font>error messages so that multiple database messages can be returned.</font></li>
      <li><font size="2">Binding for char arrays now uses the size of the array 
        to set the maximum buffer size, this prevents a potential buffer overflow 
        bug.</font></li>
      <li><font size="2" face="Courier New, Courier, mono">BYTE</font><font size="2"> 
        typedef now at global scope to avoid potential clash with the typedef 
        from Windows header files.</font></li>
    </ol>
  <br>
    <font size="2"><b>***New Features/Improvements*** </b></font> 
    <ol>
      <li><font size="2">Added support for binary data / blob data types.</font></li>
      <li><font size="2">Variable size buffer for binding </font><font size="2" face="Courier New, Courier, mono">basic_string<CharT>.</font><font size="2"> 
        </font><font size="2">This allows us to control buffer sizes to bind larger 
        strings and blobs in the BCA without adding unnecessary overhead.</font></li>
      <li><font size="2">In<font face="Courier New, Courier, mono"> IndexedDBView</font>, 
        addition of <font face="Courier New, Courier, mono">begin_AK()</font>, 
        <font face="Courier New, Courier, mono">end_AK() </font>and friends to 
        return iterators to beginning and end of<font face="Courier New, Courier, mono"> 
        DataObj </font>lists for a given key.</font></li>
      <li><font size="2">Cleaned up several semantic nits with destructors and 
        also<font face="Courier New, Courier, mono"> STD_::</font>.</font></li>
      <li><font size="2" face="Courier New, Courier, mono">Variant_row::operator[](const 
        string &amp;fieldName)</font><font size="2"> now case insensitive for<font face="Courier New, Courier, mono"> 
        fieldName</font>.</font></li>
      <li><font size="2">Return type of <font face="Courier New, Courier, mono">DBView::select_iterator::operator++(int</font>) 
        changed to void to improve efficiency and C++ standard compliance. It 
        is now equivalent to its preincrement cousin.</font></li>
      <li><font size="2">Reimplemented internal comparison function for <font face="Courier New, Courier, mono">DBIndex 
        </font>to be more efficient by using raw function objects instead of callbacks 
        in the default implementation. This improves the speed of <font face="Courier New, Courier, mono">IndexedDBView</font> 
        containers.</font></li>
      <li><font size="2">Upgraded to run against gcc 3.0.</font></li>
      <li><font size="2">Exposed<font face="Courier New, Courier, mono"> DBConnection::GetDefaultEnvironment() 
        </font>and<font face="Courier New, Courier, mono"> DBEnvironment::Release(</font>) 
        to support manual release of <font face="Courier New, Courier, mono">HENV</font>.</font></li>
    </ol>
  <br> 
  <li><font size="2"><em><strong>Version 3.0; Released July 19, 2001.</strong></em></font><br>
    <font size="2"><b>***Bugfixes*** </b></font> 
    <ol>
      <li><font size="2">Fixed <font face="Courier New, Courier, mono">IndexedDBView::replace() 
        </font>bug where it threw a <font face="Courier New, Courier, mono">DBException</font> 
        when <font face="Courier New, Courier, mono">*it == dataObj </font>(replacing 
        object with itself).</font></li>
      <li><font size="2">Fixed parsing of<font face="Courier New, Courier, mono"> 
        IndexNamesAndFields </font>string in <font face="Courier New, Courier, mono">IndexedDBView 
        </font>constructor. It crapped out on obstacles such as extra whitespace.</font></li>
      <li><font size="2">Typedef for<font face="Courier New, Courier, mono"> IndexedDBView::reverse_iterator 
        </font>and its const cousin properly fixed to be <font face="Courier New, Courier, mono">std::reverse_bidirectional_iterator.</font></font></li>
      <li><font face="Times New Roman, Times, serif" size="2">Fixed bug with <font face="Courier New, Courier, mono">DB_iterator</font> 
        copy involving incorrect management of internal buffers for parameter 
        and row data. <font face="Times New Roman, Times, serif">This bug resulted 
        in incorrect behavior when iterators were copied, most noticeably in standard 
        functions such as <font face="Courier New, Courier, mono">std::copy()</font>, 
        which accept their arguments by value.</font></font></li>
    </ol>
<br>
    <font size="2"><b>***New Features/Improvements*** </b></font> 
    <ol>
      <li><font size="2">Full unicode support. (Not avalable for gcc 2.96 due 
        to lack of wide stream support; still a bit flaky for the Oracle ODBC 
        due to driver bugs from Oracle). Also, we have added a pure unicode example 
        project and converted the tests project converted to a pure unicode format.</font></li>
      <li><font size="2">&quot;Header Hell&quot; - broke out the implementation 
        of non-template classes into .cpp files to make for faster compile times 
        and give fewer header dependencies.</font></li>
      <li><font size="2">Changed code to use stringstream instead of deprecated 
        C++ strstream. NOTE FOR LINUX USERS, this new version requires at least 
        gcc 2.96-85 as older versions of libstdc++ that come with gcc do not support 
        stringstream.</font></li>
      <li><font size="2" face="Courier New, Courier, mono">DBConnection</font><font size="2">s 
        now may reference already existing connections using the <font face="Courier New, Courier, mono">Share()</font> 
        method.</font></li>
      <li><font size="2">More efficient<font face="Courier New, Courier, mono"> 
        IndexedDBView::local_insert() <font face="Times New Roman, Times, serif">implementation. 
        Redundant searches were eliminated by making use of the form of<font face="Courier New, Courier, mono"> 
        multiset::insert()</font> that takes an iterator hint for where the element 
        should be put into the container.</font></font></font></li>
      <li><font face="Times New Roman, Times, serif" size="2">Facility for passing 
        named arguments to the constructors for<font face="Courier New, Courier, mono"> 
        DBView, IndexedDBView, DynamicDBView, <font face="Times New Roman, Times, serif">and</font> 
        DynamicIndexedDBView </font>objects. </font></li>
      <li><font face="Courier New, Courier, mono" size="2">DBView</font><font face="Times New Roman, Times, serif" size="2"> 
        and<font face="Courier New, Courier, mono"> DynamicDBView</font> constructors 
        now accept an initial <font face="Courier New, Courier, mono">IOHandler 
        </font>as an argument.</font></li>
      <li><font size="2" face="Courier New, Courier, mono">BuildSpecialQry </font>functors 
        now allow the user to customize the SQL query generated for <font size="2" face="Courier New, Courier, mono">DBView</font> 
        iterators through the use of template specialization. This is primarily 
        useful for custom queries such as &quot;select distinct&quot; etc.</li>
    </ol>
  </li>

  <li><font size="2"><em><strong>Version 2.5</strong></em></font> 
    <ol>
      <li> NOTE: If you are upgrading from a previous version of DTL then the 
        major changes that will affect your old code are: 1. The new signature 
        for InsValidate, which now requires BoundIOs as a parameter. 2. The default 
        error handler for DBView and IndexDBView now throws rather than logging 
        and suppressing errors. This default is user definable -- see DEFAULT_IO_HANDLER 
        below for details. </li>
      <li> Added <font size="2" face="Courier New, Courier, mono">DBView&lt;DataObj, 
        ParamObj&gt;::sql_iterator</font> class (support for general queries). 
        This enables DTL to work with all kinds of SQL queries, including stored 
        procedures.</li>
      <li>Changed syntax of binding operator for BCA's and BPA's to indicate directional 
        flow of information while keeping the old syntax around for backwards 
        compatibility.</li>
      <li><font size="2" face="Courier New, Courier, mono">DBStmt::Execute()</font> 
        now allows <font size="2" face="Courier New, Courier, mono">SQL_NO_DATA</font> 
        to be returned.</li>
      <li>Proper error checking of <font size="2" face="Courier New, Courier, mono">RETCODE</font>'s 
        in <font size="2" face="Courier New, Courier, mono">DBConnection()</font> 
        and <font face="Courier New, Courier, mono" size="2">DBEnvironment()</font>.</li>
      <li>Enhanced facilities for handling null fields in the following classes: 
        <font face="Courier New, Courier, mono" size="2">BoundIO, BoundIOs, variant_row, 
        variant_field.</font></li>
      <li>Modified implementation of <font face="Courier New, Courier, mono" size="2">IndexedDBView</font> 
        routines mostly in relation to when validation functions are invoked.</li>
      <li>Fixed some bugs with dynamic views.</li>
      <li>Moved <font face="Courier New, Courier, mono" size="2">DataObj() <font face="Times New Roman, Times, serif" size="3">methods 
        from dynamic views and dynamic indexed views to <font face="Courier New, Courier, mono" size="2">DBView 
        <font face="Times New Roman, Times, serif"> <font size="3">and</font></font> 
        IndexedDBView</font></font> <font face="Times New Roman, Times, serif" size="3">under 
        the method name </font><font face="Courier New, Courier, mono" size="2">GetDataObj().</font></font></li>
      <li>Now can create <font face="Courier New, Courier, mono" size="2">variant_field's</font><font face="Times New Roman, Times, serif"> 
        on the fly, especially for use in BCA's and BPA's using the <font size="2" face="Courier New, Courier, mono">variant_row::_typename()</font> 
        syntax.</font></li>
      <li><font face="Times New Roman, Times, serif">Support for <font face="Courier New, Courier, mono" size="2">variant_row's</font> 
        as<font face="Courier New, Courier, mono" size="2"> ParamObj's</font>. 
        </font></li>
      <li><font face="Times New Roman, Times, serif">Reentrancy of BCA's and BPA's.</font></li>
      <li>Fixed bugs in parsing of <font size="2" face="Courier New, Courier, mono">IndexNamesAndFields</font> 
        string passed into constructor for <font size="2" face="Courier New, Courier, mono">IndexedDBView</font>.</li>
      <li>Rationale of example and test projects changed. The examples now also 
        will serve as a preliminary battery of test code for DTL as well as being 
        code meant to clearly show the new user how various things work in the 
        library. Tests contains further code to exercise DTL.</li>
      <li>Removed all using-clauses from DTL and explicitly qualified all code 
        which uses the C++ standard namespace. This involved some tricky preprocessor 
        macros to get the right behavior.</li>
      <li>Generalized the underlying associative container that <font face="Courier New, Courier, mono" size="2">DBIndex's</font> 
        use to store <font size="2" face="Courier New, Courier, mono">DataObj 
        *'s.</font> The underlying associative container now is passed in as a 
        template parameter at the <font size="2" face="Courier New, Courier, mono">IndexedDBView</font> 
        level and whether it's hashable or not as another template parameter. 
        Added <font size="2" face="Courier New, Courier, mono">GenericHash()</font> 
        as well as a <font size="2" face="Courier New, Courier, mono">ContainerFactory 
        </font> function object to help accomplish this purpose.</li>
      <li>Added support for null fields in <font size="2" face="Courier New, Courier, mono">BoundIO, 
        variant_field, GenericCmp()</font> and <font size="2" face="Courier New, Courier, mono">GenericHash()</font>.</li>
      <li>Added<font face="Courier New, Courier, mono" size="2"> MoreResults()</font> 
        support to grab more record sets if a statement contains multiple ones.</li>
      <li><font face="Courier New, Courier, mono" size="2">cb_ptr_fun()</font> 
        and <font face="Courier New, Courier, mono" size="2">cb_ptr_fun_w_ret()</font> 
        now also accept pointer-to-member methods.</li>
      <li>Added <font face="Courier New, Courier, mono" size="2">DEFAULT_IO_HANDLER 
        <font face="Times New Roman, Times, serif" size="3">macro by which the 
        user can specify the default<font size="2" face="Courier New, Courier, mono"> 
        IOHandler</font> to use. If the user doesn't define this macro, DTL defines 
        <font face="Courier New, Courier, mono" size="2">AlwaysThrowsHandler </font>to 
        be the default. Previously, the default handler was hardwired to be <font size="2" face="Courier New, Courier, mono">LoggingHandler</font>.</font></font></li>
      <li><font face="Times New Roman, Times, serif" size="3">Added a <font face="Courier New, Courier, mono" size="2">dtl_config.h</font> 
        file for user-defined macros and other settings into the lib directory.</font></li>
      <li>Added full set of comparison operators to <font size="2" face="Courier New, Courier, mono">variant_row's 
        <font face="Times New Roman, Times, serif"> <font size="3">so objects 
        of that type can be used in STL constructs that require these operators.</font></font></font></li>
      <li><font face="Times New Roman, Times, serif" size="3">Fixed more <font size="2" face="Courier New, Courier, mono">typename</font> 
        bugs internally.</font></li>
      <li><font face="Times New Roman, Times, serif" size="3">Fixed bug in <font face="Courier New, Courier, mono"> 
        <font size="2">DBIndex::lt()</font></font> to compare based on the order 
        of fields that the user passed in. The code now properly uses the first 
        field listed as the most significant field to search on and it compares 
        fields in the order specified in that list, through the last field in 
        the list (the least significant), if necessary. In previous versions, 
        this comparison function mistakenly considered the first field name in 
        alphabetical order as the most signficant and proceeded in pure alphabetical 
        order to make necessary comparisons.</font></li>
      <li>Fixed global initialization bug with the <font size="2" face="Courier New, Courier, mono">SQL_types_to_C 
        ETI_Map</font>. Problem was found when certain global <font size="2" face="Courier New, Courier, mono">IndexedDBView's</font> 
        were not having the map already built so they could construct themselves 
        as initialization order of globals/class statics is undefined. Fixed by 
        replacing with a global function <font size="2" face="Courier New, Courier, mono">GetSQL_types_to_C() 
        </font>that returns a reference to a local static <font size="2" face="Courier New, Courier, mono">ETI_Map</font> 
        that is built properly on the first call to the function, which ensures 
        the proper order of initialization.</li>
    </ol>
  </li>
  <br>
  <li><font size="2" face="Times New Roman, Times, serif"><em><strong>Version 
    2.01</strong></em></font> 
    <ol>
      <li><font size="2">Added support for <font size="2" face="Courier New">bool</font> 
        data type.</font></li>
      <li><font size="2">Successfully ported code to Microsoft SQL Server.</font></li>
      <li><font size="2">Fixed minor bug with aliased views that did not allow 
        table names to be aliased in queries.</font></li>
      <li><font size="2">Renamed <font size="2" face="Courier New">std_inc.h </font> 
        to <font size="2" face="Courier New">std_dtl_inc.h </font> and <font size="2" face="Courier New">iterator.h</font> 
        to <font size="2" face="Courier New">DB_iterator.h </font>to avoid filename 
        clashes.</font></li>
      <li><font size="2">Added<font size="2" face="Courier New"> DBException::GetAllODBCErrors() 
        </font>method.</font></li>
    </ol>
  </li>
  <br>
  <li><font size="2"><em><strong>Version 2.0</strong></em></font> 
    <ol>
      <li><font size="2">Added support for Boris Fomitchev's STLPort implementation 
        of the SGI Standard Template Library.</font></li>
      <li><font size="2">Successfully ported code to Red Hat Linux 7 under gcc 
        2.95 running unixODBC and a MySQL 3.23.33 database.</font></li>
      <li><font size="2">Corrected constness throughout DTL. This fixed some issues 
        that we had in 1.1 which prevented us from running correctly versus some 
        of the standard STL algorithms.</font></li>
      <li><font size="2">Rewrote the code to make it exception safe.</font></li>
      <li><font size="2">Added error handling support for all DTL iterator classes, 
        DBView, and IndexedDBView in the form of IOHandler.</font></li>
      <li><font size="2">Iterator refinements: </font> 
        <ul>
          <li><font size="2" face="Courier New">DB_select_iterator::operator*() 
            </font><font size="2">now returns a </font><font size="2"
                                face="Courier New">const DataObj &amp; </font><font size="2">to 
            make that operation truly read-only.</font> </li>
          <li><font size="2">All output iterators now use proxies to emulate </font><font size="2"
                                face="Courier New">*it = value to </font><font size="2">enforce 
            their write-only quality.</font> </li>
          <li><font size="2">Also fixed prefix/postix implementation for </font><font
                                size="2" face="Courier New">operator++() </font><font size="2">on 
            all iterators. </font></li>
        </ul>
      </li>
      <li><font size="2">Enhanced </font><font
                        size="2" face="Courier New">DBConnection </font><font
                        size="2">class to use ODBC connection pooling. </font></li>
      <li><font size="2">Added Julian date support through the </font><font size="2"
                        face="Courier New">jtime_c </font><font
                        size="2">class. <br>
        </font></li>
      <li><font size="2">Simplified the structure for </font><font size="2"
                        face="Courier New">DBView </font><font
                        size="2"> to need fewer template parameters. In version 
        1.1 the structure was </font><font size="2"
                        face="Courier New">DBView&lt;DataObj, ParamObj, BCA, BPA&gt; 
        </font><font
                        size="2"> in version 2.0 the structure is simplified to 
        </font><font size="2"
                        face="Courier New">DBView&lt;DataObj, ParamObj&gt; </font><font
                        size="2">.<br>
        </font></li>
    </ol>
  </li>
</ol>

</ol></body>
</html>