DataReel 7.0 Beta Release Notes
Requirements
Removed, and what to use instead
Rewritten classes
Namespace
Bug and security fixes
Porting from 6.x
Guides for ai coding assistants
How the release was tested
Supported platforms
DataReel 7.0 is a beta release. DataReel 6.2 remains the stable release for production use until 7.0 is final; please report problems through https://datareel.com/contact.php.
DataReel 7.0 is a modernization release. The library now requires C++17, uses the C++ standard library for strings, containers, threads, files and time, and keeps the parts the standard library does not have: the object database, TLS networking and the portable file formats. Every network protocol except telnet and ping uses TLS.
Database, index, InfoHog and gxRDBMS files are unchanged. The same programs built against 6.2 and 7.0 write byte-for-byte identical files, and 7.0 reads files written by 6.2.
The library version is 7.0 (version.txt, DATAREEL_VERSION_STRING in gxdlcode.h, libdatareel.so.7.0). The database file format version (gxDatabaseVersionNumber 4630) is unchanged.
Requirements
- A C++17 compiler: GCC 8 or later (RHEL 8, 9, 10) or Visual Studio 2022 or 2026.
- CMake 3.16 or later (the Linux makefile in build/ is still there).
- TLS library: OpenSSL 1.1.1 or later on Linux; Windows Schannel (the default) or OpenSSL 3.x on Windows.
Removed, and what to use instead
UString, gxString, gxStringw std::string, std::wstring, and the
helpers in strutil.h
strutil C string functions strutil.h std::string helpers
MemoryBuffer, MemoryBlock std::vector<unsigned char>
gxList, gxListB, gxBStree std::list, std::vector, std::set,
std::map
DiskFileB, futils std::fstream, std::filesystem
SysTime systime.h functions, std::chrono
gxThread, gxThreadAPIWrapper, std::thread or std::jthread
thread helpers, gThreadT
gxMutex, gxCondition, std::mutex, std::condition_variable,
gxSemaphore std::counting_semaphore (C++20)
thrPool datareel::ThreadPool (thrpool.h)
gxDeviceCache, device buckets (no replacement; the B-tree and
database caches remain)
FString char arrays or std::array
gxIP32, gxMAC48 gxsAddress, std::string
gxDatagram gxSocket::OpenDatagram()/SendTo()
gxsHTML, gxsXML, gxsRSS parsers a dedicated parser (pugixml,
libxml2)
HyperText, PostScriptDrv, std::format/std::ostream
asprint report writers
Terminal (curses/ANSI.SYS) ncurses directly
Ehandler, ostrbase exceptions, std::ostream
leaktest (MSVC CRT) AddressSanitizer, valgrind
gxsSocketUtils (gxsutils.h) (moved into gxsPing)
wserror (Winsock messages) gxSocket::SocketExceptionMessage()
gxrdbsql.h (empty placeholder) SQLite if you need SQL
stdafx.h, gxdlincs.h, wxincs.h, (not needed)
wx2incs.h
hexdump, ffind, txfilter utils xxd, find, sed, PowerShell
MSVC nmake, Borland, MinGW and CMake
Intel makefiles; dll/, winslib/
Rewritten classes
Networking
- gxSocket supports IPv4 and IPv6. Connect(host, port, timeout) tries every address a name resolves to; Listen(port) listens on one dual-stack socket; Accept() returns the client as a new gxSocket (the old remote_socket/RemoteRecv/RemoteSend server model is gone). Windows builds use Winsock 2.
- gxSSL requires TLS 1.2 or later. gxSSLMethod is now gxSSL_TLS, gxSSL_TLSv1_2, gxSSL_TLSv1_3 or gxSSL_DTLS. The system certificate store is loaded, VerifyCert() checks subject alternative names and IP addresses, and clients verify certificates by default. MakeDHParms(), LoadDHParms(), MakeRSAEphKey() and gxRandom were removed; MakeRSAPrivateKey() makes 3072-bit keys by default.
- New gxsTLSConnection and gxsTLSServer (gxstls.h) are the connections every protocol uses.
- gxsHTTPClient is HTTPS only (gxsHTTPSClient was merged into it), with a gxsHTTPMessage request/response type that also serves HTTPS servers.
- gxsSMTPClient, gxsPOP3Client and gxsFTPClient only connect with TLS: implicit TLS or STARTTLS/STLS/AUTH TLS. A server that does not offer TLS is refused. FTPS data connections use PROT P and reuse the control connection's TLS session.
- gxStream runs over a gxsTLSConnection; the block format is the same. Block lengths from the network are limited (SetMaxBlockSize()).
- gxsPing supports IPv6, needs no root on Linux when unprivileged ICMP sockets are enabled, and uses IcmpSendEcho on Windows.
- gxsTelnetClient is unchanged apart from the new gxSocket. It is the one plain text protocol left.
General
- gxConfig, LogFile (now thread safe), CDate, the base 64 functions and the URL parser use std::string. strutil.h, systime.h, logfile.h, gxconfig.h and thrpool.h are in the datareel namespace.
Database
- gxRDBMS, InfoHog, gxDatabaseDebugManager and gxDatabaseCache use std::string and std::vector internally. gxRDBMS::Search() and SortOrderList() fill a std::set<gxrdDatabaseRecord>.
Namespace
Every class, type, constant and function is declared in namespace datareel. gxdlcode.h, which every DataReel header includes, adds "using namespace datareel;" so 6.x code that uses unqualified names still compiles. Define DATAREEL_NO_GLOBAL_NAMES before including any DataReel header to keep the names out of the global namespace and qualify them (datareel::gxDatabase).
Bug and security fixes
- BtreeBucket::ReadNode() (the cached B-tree) trusted the key count in the index file; a damaged or crafted file overflowed the heap. This is the cached version of the gxBtree::ReadNode() fix in 6.1.
- The cached B-tree walks stop after gxBtreeMaxNodeReads node reads, like the uncached walks in 6.2.
- InfoHog::Read() and gxPersistent::ReadString() checked lengths read from the file through a signed cast, so very large lengths passed the check. gxDatabase::CalcChecksum() could allocate a huge buffer from a damaged block header. All now return an error.
- gxrdDatabaseRecord::Compare() did not match a search string without a null against a stored string with its null, so gxRDBMS searches on CHAR fields found nothing.
- gxDatabase::FindNextObject() and FindNextBlock() skipped a block when given an object address and returned the last block again at the end of the file, so a walk never ended. The next and previous navigation functions were rewritten: the offset is an object or block address, each returns 0 at the end, and FindPrevBlock() no longer skips deleted blocks (FindPrevObject() does).
- The B-tree cache did not work on index files opened read only.
- gxTelnetClient's terminal type, long database file names and the serial block server could overflow buffers or allocate without limit.
- Table header padding bytes are zeroed instead of left over memory.
- The SMTP Date header is RFC 5322 (numeric time zone).
- The old OpenSSL PRNG seeding from gxRandom tables was removed; the operating system seeds OpenSSL.
Porting from 6.x
1. Build with CMake (or the new build/makefile) and C++17. 2. Replace gxString/UString with std::string. Most member calls have a
strutil.h function: TrimLeadingSpaces() -> trim_left_in_place(s), DeleteBeforeIncluding(x) -> delete_before_including(s, x), Atoi() -> to_int(s), IFind() -> ifind(s, p), ToUpper() -> s = to_upper(s), FilterChar(c) -> erase_char(s, c), and "s << a << 42" -> str_append(s, a, 42). Find() returns std::string::npos instead of -1.
3. Replace MemoryBuffer with std::vector<unsigned char> (m_buf() ->
data(), length() -> size(), Load(p, n) -> assign(p, p + n)).
4. Replace the thread classes with std::thread, std::mutex and
std::condition_variable, and thrPool with datareel::ThreadPool.
5. Network code: open TLS connections with gxsTLSConnection or the
protocol clients. Servers use gxsTLSServer with a certificate and key. Test servers with self-signed certificates need SetCAFile() on the client (or SetVerifyPeer(false) for tests only).
6. gxConfig::Load() and the Write functions return bool (true on
success); GetStrValue() returns const char* or null.
7. LogFile no longer derives from DiskFileB; use Open(), WriteLine(),
Write() and operator<<.
8. CDate::c_str() is now str() and returns std::string. 9. Keep DATAREEL_64BIT_DATABASE and DATAREEL_NATIVE_TYPES the same as
your 6.x build so your files keep their layout.
Guides for ai coding assistants
AGENTS.md, llms.txt, llms-full.txt and docs/ai describe how to use DataReel for TLS communications and object databases, with complete sample programs (docs/ai/samples) that tests/run_tests.sh builds and runs. docs/bin/make_ai_docs.py copies the samples into the guides and rebuilds llms.txt and llms-full.txt.
How the release was tested
- tests/run_tests.sh on RHEL 10: 42 checks covering every database example, InfoHog, gxRDBMS, TLS echo over IPv4 and IPv6, certificate rejection, HTTPS (including path traversal and http:// refusal), gxStream, SMTP (implicit TLS, STARTTLS, refusing a server without STARTTLS), POP3 (implicit TLS and STLS) and FTPS (explicit and implicit, upload, list, download) and the AI guide samples, in 32-bit and 64-bit engine, native and portable type, and static and shared library builds.
- tests/damaged_files read thousands of randomly damaged database, index and InfoHog files without a crash or endless loop, and ran clean under valgrind.
- The database examples, InfoHog and gxRDBMS programs were run with 6.2 and 7.0 and wrote identical files; 7.0 opened the 6.2 files.
- Windows 11 with Visual Studio 2026, with both Schannel and OpenSSL 3.5: every example and test passed, including HTTPS to a public site through the Windows certificate store, the mail and FTPS clients against the Linux mock servers, and a Linux OpenSSL client with a Windows Schannel server.
Supported platforms
- Linux: Red Hat Enterprise Linux 10 (the default build platform), 9 and 8, with the system OpenSSL.
- Windows: Windows 11 and Windows Server 2022 and 2025, 64-bit, with Visual Studio 2022 or 2026, using Schannel or OpenSSL 3.5.x LTS.