Xbase64  (11/09/25)
------------------------

4.2.6 - 11/09/25

1)   Added logic to support Min, Max, Default, Required and Database constraints in level 7 dbf files.
     This version can process contraints set in the database by dBASE or other tool.

     Constraint logic target for future release (not included in this verion):
       -  Ability to add or modify constaints
       -  Referential integrity constaints
       -  Additional support for custom properties

2)   Added build folder (raspPi) for Raspberry Pi platform, tested on a PI 5.
3)   Misc documentation updates xbc2.html.



4.2.5 - 09/22/25

1)   Updated xbExp expression processing logic to handle mixed case operators and mixed case function names
2)   Added method xbDbf::Find( const char * );
3)   Major rewrite of documentation chapter 5 (xbc5.html) for index processing.
4)   Added logic to verify only one auto increment field per table allowed.
5)   Added logic to prevent mixed case duplicate field names in table.
6)   Added =8.21.0, =8.21.1 and =8.21.2 options to program xb_dbfutil.
7)   Added new method xbString::Mid( const xbString &sSource, xbUInt32 ulStartPos, xbUInt32 ulTargLen )  
     and xbString::Mid( const char *sSource, xbUInt32 ulStartPos, xbUInt32 ulTargLen )  
8)   Added additional testing scenarios to xb_test_mdx program.
9)   Removed -q option from xb_dumprecs
10)  Updated xbDbf::CreateTable to support upper/lower/mixed case in file extension dbf
11)  Updated the xbIxMdx::CreateTag() method to create mdx file with upper case extension to match what dBASE does
12)  Updated error logging when NDX index file referenced in INF file not found.
13)  New methods xbTimeStamp::SetTimeStamp( const char * ) and xbTimeStamp::SetTimeStamp( const xbString & )
14)  Fix to xb_reindex, issue with table name parm addressed.
15)  Fix to xbMdx::CreateTag()  was incorreclty calculating location of index tag field in dbf file for a given index key.
16)  Misc documentation updates.
17)  Added functions in xb_dbfutil:  GetFieldNumber() and GetFieldName()
18)  Updated constraint the level 4 table logic to support standard constraint, option 4 (field defaults).
19)  Updated xb_dbfutil menu 3, removed duplicate menu options.


4.2.4 - 08/20/25

1)   Updated xbDate::IsNull() routine to flag null date value for date of all spaces.
2)   Updated return codes in methods xbMdx::GetNextKey() and xbMdx::GetPrevKey() to return XB_EMPTY if index is empty.
3)   Updated xbDbf::GetFieldNo() to be case indifferent for field names with varied case "MyFiElDnAmE" is the same as "MYFIELDNAME"
4)   New expression functions  DATETIME(), DTTOD(), DTTOT() and DTODT()
5)   Updated the xbIxMdx index class to support version 3 (dBASE 7 and greater) format index files in addition to version 2 that
     is/was already supported.
6)   Renamed the xbBcd::to...()  methods to xbBcd.Get(.)
7)   New xbTimeStamp( xbString ) constructor.  Accept string input formatted as "YYYY-MM-DD hh:mm:ss".


4.2.3 - 07/27/25

1)   Updated chapter 3 html file - doc/html/xbc3.html.
2)   Added thee new error codes to be more description of error condition.
      XB_NOT_LVL5_DBF
      XB_NOT_LVL7_DBF
      XB_IX_FILE_NOT_FOUND
3)   Addressed issue in xbXBase::CloseAllTables() routine throwing XB_INVALID_OBJECT error.
4)   Misc cleanup of compiler warnings from older Borland 5.5 compiler
5)   Updated xbFilter::GetFirst(), GetLast(), GetPrev(), GetNext() to not throw an exception on XB_EMPTY condition.
6)   Made cosmetic updates to header display in program xb_dbfutil.
7)   Additional progress towards level 4 (dBASE 7 and higher) support.
     - Mods to xbFile::DetermineXbaseTableVersion() routine
     - Updates to work in progress xbDbf7 class, added routines to read Field Properties structures
8)   Created new utility program "xb_clearix" for clearing the production index flag in mdx files.
     Useful in situations where MDX index file is missing or corrupt which prevents the library from opening the table.
9)   Added sort order option to the xbLinkListOrd link list logic (A-Ascending, D-Descending).
10)  Added dbf7 version logic to read the constraint table off the dbf file and provide
     programming method to access constraint information.  xbDbf::GetConstraintList()
11)  Added options 3.2.1, 3.2.2 and 3.2.3 to xb_dbutil program
12)  Updated formatting options in xbDate class.


4.2.2 - 06/26/25

1)   Updated program xb_dumpdbt to skip records flagged as deleted.
2)   Updated error messages for link list routines. Made more specific, less generic.
     XB_LL_KEY_NOT_UNIQUE, XB_LL_NOT_FOUND, XB_LL_NODELINO_INVALID
3)   Reorganized error messages in xb_retcod.h
       Significantly updated the error codes.  If any of your programs look for specific error 
       code numbers instead of the XB_ERROR_MNEMONICs you will need to review your code for impacts.
4)   Misc Doxygen documentation updates
5)   Update to xbDbf7::Open(), fix for mixed case file extension.
6)   Updated syntax checking logic for SQL DROP INDEX statement.
7)   Gave the table manager logic a tuneup
       Updated xbXBase::DisplayTableList method to include the number of open index files for a given open table
       Renamed xbTblMgr::GetDbfPtr( xbInt16 ) to xbTblMgr::GetDbfPtrForItemNo( xbInt16 )
       Created new methods xbTblMgr::GetDbfPtrForFqfn( const xbString & sToken )
                           xbTblMgr::GetDbfPtrForTableName( const xbString & sToken )
                           xbTblMgr::GetDbfPtrForTableName( const xbString & sToken )
                           xbTblMgr::GetDbfPtrForToken( const xbString & sToken )
                           xbTblMgr::RemoveTblFromTblListForAlias( const xbString & sToken)
                           xbTblMgr::RemoveTblFromTblListForFqfn( const xbString & sTokensFqTblName )
8)   Updated chapter 2 (xbc2.html) documentation.  Address some incorrectly defined tags and added a section on the table manager.
9)   Clean up of ndx delete index logic
10)  Prep work for Version 7 support
11)  Updates to xb_dbfutil program, prep for V7 support, fixed a segfault error when no corresponding open index for dbf file
12)  Updated xbMdx logic to verify version 2 file being used.  New error XB_UNSUPPORTED_INDEX_VERSION thrown for version 03 index.
13)  Updated xbDbf::DumpHeader() to use xbDbf::GetVersion(). Updated xbDbf::GetVersion() documentation to include V5, V7 reference.
14)  Created new html chapter for xbTimeStamp
15)  Updated code to use all lower case as default for file extension dbf, ndx, md, inf, dbt
16)  Created new xbDbf::CreateTag() method, does not require parms for ix file pointer and tag pointer.
17)  Renamed method xbFile::Dump() to xbFile::DumpFileInternals().
18)  Updated xbDbf:DumpRecord() to handle OLE and Binary fields more gracefully.
19)  Additional test screnarios added to test program xb_test_dbv_v7.
20)  Combined two V3 test programs into one test program.
21)  Combined two V4 test programs into one test program.
22)  Clean up of warning messages from 32 bit GCC compiler.
23)  Added new xbString constructor xbString( std::string & )
24)  Added additional testing logic to xb_test_ndx program.
25)  Sunset method xbFile::NameSuffixMissing()
26)  Misc cleanup of various test functions in the tstfuncs.cpp, used in the xb_test* programs


4.2.1 - 05/30/25

1)   Updated xbFile::NameSuffixMissing() routine to support INF file types.
2)   Created new methods xbFile::QueryFileExtension() and xbFile::SwapExt() used for
     logic to determine correct case of a give file extension.
3)   Fix to method xbFile::GetFileDirPart() when there is no dir part, set to ""
4)   Replaced method "const xbString& xbFile::GetDirectory() const"
     with "void xbFile::GetDirectory( xbString &sDir )"
5)   Created new xbFile::CreateFqfn() method.
6)   Removed method xbFile::GetDirectory() - redundant
7)   Added logic to automatically support file extensions of differing case ie; DBF vs dbf
     Mainly needed in *nix environments when co existing with Windows file updates.
8)   Added method xbString::c_str()


4.2.0 - 02/21/25

1)   Added initial support for Version 5 dBASE files - Mainly OLE and Binary field support.
2)   Started the work for Version 7 and greater dBASE files.

     - Added class xbDbf5, xbDbf7 supporting header file updates and .cpp file
     - Updated method xbFile::DetermineXbaseTableVersion()
     - Updated method xbDbf::Dump() to support version 5 files
     - Renamed class xbDateTime to xbTimeStamp
     - Added support for the following field types
       @ - Timestamp - 8 bytes, two longs, first for date, second for time
       L - Long - 4 bytes. Leftmost bit used to indicate sign, 0 negative
       + - Autoincrement - Same as long
       O - Double - 8 bytes, no conversion, stored as a double
       B - Binary - 10 digits representing a .DBT block number. Stored as a string rjlbf.
       G - OLE - 10 digits representing a .DBT block number. Stored as a string rjlbf.


4.1.12 - 11/21/24

1)   Add new constructor for xbDate.  xbDate( time_t ).
2)   Fix to the xbTime::Add() method to correctly return accurate day count.
3)   Added new class xbDateTime.
4)   Added new class xbBlob for supporting binary large ojects up to 2G in size.


4.1.11 - 11/06/24

1)   Updated xbTime(xbInt32)  constructor to take a parameter of 0 to initialize to system time.
2)   Updated xbTime class.  Added method xbTime.Str()
3)   Updated xbTime class.  Added methods  xbTime.SetDefaultTimeFormat( const char *) and xbTime::SetTimeFormat( const char *)
4)   Updated xbString::Mid( ulStartPos, ulTargLen ).  Added a default value 0 to ulTargLen to copy remainder of string.
5)   Updated xbDate.  Added constructor xbDate( iMM, iDD, iYYYY ) and Set( iMM, iDD, iYYYY ) methods.
6)   Updated various spleeing and grammatical issues in the documentation.
7)   Updated xbDbf::SetAutoCommit to validate input parms
8)   Updated to support newer Mingw usage
9)   Renamed class xbSsv to xbCore
10)  Updated error messages generated by locking methods.
11)  New error message XB_NOT_CLOSED, used by xbXBase::SetMultiUser()
12)  Added additional error checking logic in method xbXBase::SetMultiUser()
13)  Addressed memory leak in test program xb_test_xbase
14)  Simplified autolock/multi user settings.  Autolock has been completey replaced with multi-user settings.
     Multi-user can be set at the system level, and over-ridden at the table level if needed.
15)  Sunset two version of method xbXBase::OpenHighestVersion().  Replaced with xbXBase::Open() method.
16)  Addressed memory issue/error in xbXbase::CloseAllTables()
17)  Updated xb_test_ndx test program.  Added logic for additional INF file testing.
18)  Updated error handling logic in xbFile::xbFread().


4.1.10 - 08/20/24

1)   Updates for improved doxygen auto-documention usage.


4.1.9 - 06/20/24

1)   Creation of new class xbTime for supporting time fields.
2)   Bug fix to xbMdx::LoadTagTable(), field termination 0x00 placement on cTagName
3)   Refreshed the Mac Os compile
4)   Cleanup xbindex.h header files.  Finalize ReindexTag() placement.
5)   Updated utility program xb_dumprecs to accept -w command line option for where clause -w 'ZIPCODE=12345'
6)   Updated example program xb_ex_v4_upd to include memo field usage examples
7)   Created new html chapters for classes xbTime, xbLinkList, xbLinkListOrd
8)   Updated html appendix F, xbaf.html, added table documenting command line options for utility programs
9)   Updates to doxygen macros in xbDate.h, xbDate.cpp, xbString.cpp. xbString.h
10)  Migration of misc bit routines to new class xbBit
11)  Relabel of interale variables in method xbString::operator[]
12)  Migrated xbErrorMessages structure to xbretcod.h file && moved GetErrorMessage() and DisplayError() 
     from class xbSsv to class xbXBase.
13)  Migrated library default level set/get routines to xbXBase class from xbSsv class.
14)  Updates on doxygen documention for xbdate.h, xbfile.h, xbblkread.h file
15)  Updates to error logic in xbFile::xbFseek, xbFile::xbFwrite


4.1.8 - 05/09/24

1)   New index functionality introduced.

     XB_IX_DBASE_MODE  - DBase (TM) Compatibility mode for index files.
 
        - Unique indices - multiple records with same key have only one indexed record
          while multiple records for same key can exist in the DBF file
        - Deleted records are kept in the index file

     XB_IX_XBASE_MODE

        - Unique indices - only one record allowed per unique key
        - Deleted records are removed from the index
        - For MDX files, empty pages are recycled / reused.

     New methods:
       xbSsv::SetIxDefaultTagMode()
       xbSsv::GetIxDefaultTagMode()
       xbIx::SetIxTagMode()
       xbIx::GetIxTagMode()


4.1.7 - 01/20/24

1)   Fix segfault error in program xb_dbfutil when exiting with open tables.
2)   Updated xb_dbfutil program menu option 8.7 CreateIndexTag() 
     - Rebuild index after defining it
     - Associate it in INF file if XB_INF_SUPPORT enabled
3)   Updated xb_dbfutil type errors regarding menu =11
4)   Updated xb_dbfutil - added Dup Key display value setting to menu 2.1
5)   Updated xb_dbfutil - added menu option 2.13, toggle index unique key processing option
6)   Updated xb_dbfutil - updated option 3.2, added #3 option for users home folder
7)   Updates to xbNdx::CheckTagIntegrity() - updated logic to better support unique indices with multple recs having the same key
     With unique indices, DBase (TM) allows multiple DBF records to have the same key value, only the first rec is indexed
8)   pdated xb_test_ndx, additional testing scenarios for duplicate keys with unique indices, improved log messages
9)   Updates to COPYING file.
10)  Updates to xbMdx::CheckTagIntegrity() - updated logic to better support unique indices with multple recs having the same key
     With unique indices, DBase (TM) allows multiple DBF records to have the same key value, only the first rec is indexed
11)  Updates to xb_dbfutil.  Updated reindex menu option to allaw choice between current tag and all tags.
12)  Updates to Chapter 5 (xbc5.html) - notes on how indices handle duplicate keys and deleted keys.
13)  Updates to xb_dbfutil program, menu option 8.7 to populate new index tag when created


4.1.6 - 11/27/23

1)   Updated test program xb_test_relate2 for additional test scenarios.
2)   Updated error logging in xbFilter class.
3)   Updates to xbRelate class to support filters on the relations.
4)   Updates to xbFilter class to better support xbRelate class.
5)   Created new utility program xb_reindex.
6)   Refreshed man pages.
7)   Updated utility program xb_dumprecs to include table name in output.
8)   Updates to documentation for xbFilter and xbRelation classes.


4.1.5 - 11/09/23

1)  Implemented bug fix identified by Brent Sanders 
    src/include/xbstring.h 
    XBDLLEXPORT friend std::ostream& operator<<(std::ostream& os, const xbString& s);
2)  Misc updates to library build test programs - xb_test_log, xb_test_xbase
3)  Updates to xb_import program.
4)  Updates to xb_dumprecs program.
5)  Updates to documentation, added html chapter 13 - xbString.
6)  New error message -123, XB_ALREDY_DEFINED
7)  Alpha release of relation logic



4.1.4 - 06/01/23

1)  Created html chapter for log routines.
2)  Created sample log program.
3)  Added logic to enable/disable block processing for xbDbf::Reindex method.
4)  Updated usage of xbDbf::GetRecordCnt() to support error capture logic.
5)  Updated message handling logic in the SQL processor routines (beta).
6)  New utility program called xb_import, used to import records from a flat file into a DBF file/table.
7)  Updates to the xbDate class for handling null date values.  Upgrade notes - xbDate values now default
    to a null date on initialization, previous versions defaults to current date.
8)  Added method xbDbf::GetNullSts() - used to determine if a field is considered null.
9)  Reolved memory leak in expression parser when error condition encountered.
10) Updates to Reindex routine, memory leak fix when error condition encountered
11) Reindex, delete tag if reindex failure, updates to test programs to verify



4.1.3 - 04/14/23

1)  Changed xbDbf::ReadHeader() to be a protected method, was private
2)  Added new config option for temp directory for temp file processing
3)  Added support for termporary indices (.TDX)
4)  New method xbFile::CreateFqn()
5)  Updated methods and shared static variables for Data, Log and Temp folders
    Also moved Set and Get methods for log file to xbSsv class.
6)  Updated method xbFile::CreateUniqueFileName() to check for path separator at the 
    end of the supplied path, if not there, add it.
7)  Fix to xbDbf::DeleteTag() logic for setting cur tag to null when no tags exist.



4.1.2 - 04/05/23

1)  New method created - xbSsv::GetPathSeparator()
2)  Updates to lock testing program.
3)  Updates for doxygen auto documentation.
4)  Documentation updates, added html chapter 19.
5)  Updates to CMakeLists.txt config file



4.1.1 - 03/28/23

1)  Updates to AUTHORS file
2)  Port for mingw
    -  New mingw build folder
    -  Updates to CMakeLists.txt
3)  Documentation updates
4)  Added support for getenv_s for Visual Studio compiles
5)  Updates to Drop Table routine
6)  Updates to Create Table routine
7)  Updates to xb_lock_test and xb_lock_test2 library testing programs



4.1.0 - 03/02/23

1)  Created block read functionality, class xbBlockRead
2)  SQL Updates - Started development of structures needed to support basic 
       SQL SELECT statement - SELECT f FROM t WHERE x=z ORDER BY o
       Caveat:  ****  SQL support is still in development phase  ******
3)  Updates to class xbTblMgr functionality
4)  New method xbString::Pos( char c, xbUInt32 ulStartPos )
5)  Updated xb_cfg_check program
6)  Added method xbDbf::GetHeaderLen()
7)  Documentation updates
8)  Updates to SQL Create Table logic
9)  Updates to MDX create tag key length calculation
10) Updated default log file folder to $HOME/xbase64/logs
11) Updated default data file folder to $HOME/xbase64/data
12) Created initial round of man pages for utility programs
13) Created Debian specific build folder



4.0.3 - 12/26/22

1)  Additional documentation updates
2)  Updates to the rename methods
3)  Added SQL command - "ALTER TABLE tablename.DBF RENAME TO newname.DBF"
4)  Added SQL command - "DELETE FROM tablename.DBF [WHERE expression]"
5)  Update to xbDbf::DumpRecs method to support deleted records
6)  Update to xbDbf::GetLongField - bug fix
7)  Misc updates to xb_dbfutil program
8)  Added reindex logic to xb_pack utility program
9)  Created method xbString::Replace(s1,s2)
10) Updates to test program xb_ndx_test



4.0.2 - 12/15/22  Documentation cleanup and updates.



4.0.1 - 11/22/22  Rewrite of core library.
The library has been refreshed (Major rewrite) with release 4.0.1

1)  32/64 bit support.
2)  Big Endian or Little Endian support.
3)  Updates for error handling and exception processing.
4)  DBF III and DBF IV support.
5)  NDX, MDX index support.
6)  DBT Memo file support for both version III and version IV files.
7)  Updates and fixes to record and file locking.
8)  Support for logfile generation
9)  The beginnings of SQL support.
10) CDX and NTX index support which was available in earlier releases
    is still pending inclusion in the latest library rewrite.
11) Encapsulated library into a namespace called "xb".
12) Migrated from autoconf and automake to cmake.
13) Significant testing.
14) General library cleanup.
15) Updated license to be the latest GPL.
16) Updated xbString method names to be more consistant with the rest of the library.
17) String functions were updated from 0 based routines to 1 based routines.




Xbase64  (Sept 15, 2003)
------------------------

Xbase64 was branched off the xbase C++ class lib project and given a new name.

There are significant changes in this release.

1)  The original author (Gary Kunkel) has resumed working on the project.

2)  The project was branched and renamed to xbase64 with 64 bit file 
    processing capabilities.  The xbase name is being used by other projects,
    so I thought it was time for a new name.

3)  Modified the license from LGPL to GPL as recommended by the GNU web site.
    Files that I have not been able to get permission from the original 
    author for GPL terms have beed deleted from the library.

4)  Trimmed the tree: Dropped support for the xbHtml class, the turbo vision 
    interface, and the ybase directory.  These are either unused, not working,
    undocumented, not maintained, or I didn't have authority to change the 
    license from LGPL to GPL. 

5)  Didn't move make files forward that were not documented or working.
    These need to be reviewed and brought forward.

6)  Worked on the locking logic. 

7)  Added support for Borland C++ 5.x compiler.

8)  Created a new data type of XB_BOOL.  Current bool data type was causing
    issues in certain environments.

9)  Dropped support for XB_CASTELLANO dates.  Changed the logic to use
    system locale settings, this supports descriptive dates in different
    languages.

10) Cleaned up memory leaks.

11) Updates to the documentation.

12) Enhancements to the expression logic

13) Fixed the broken index logic - the ndx and ntx indices are working 
    again.  

-----------------------------------------------------------------------
For a the historical NEWS file history (pre 9/15/03), review the older 
xbase library.
