As you can see, if we step into the implementation details, there is a huge list of enhancements and new features.

Let's face each unit modification list:


  • unit now tested with Delphi XE2 (32 Bit)
  • TSynLog now writes the elapsed time (in us) for Enter/Leave events, and will flush the log content to disk on any exception (for safety)
  • new sllTrace and sllWarning levels for TSynLog class
  • new TSynLog.DefaultExtension property (set to '.log' by default)
  • new TSynLogFile.LogProc[] property for customer-side method profiling, with LogProcSort method available for sorting the resulting array, and LogProcMerged property to merge the location name timing
  • new TSynMapFile.FindLocation method for high-level .map symbol access
  • TSynMapFile now handles huge .map file (bigger default in-memory buffer)
  • fix potential GPF issue in code using ConvertHexToBin[]
  • new TSynLog.EventCount method
  • new TMemoryMapText.LineContains method for fast case-insensitive search
  • TSynTests now writes the elapsed time in each test in the final report
  • faster late binding process for our variants custom types (i.e. TSynTableVariantType and TSQLDBRowVariantType): you can call SynRegisterCustomVariantType() function to register any other custom variant type, and enhance GetProperty/SetProperty process speed
  • includes our optimized RecordCopy procedure in replacement to the slower default System.@CopyRecord internal RTL function
  • our optimized Move() and FillChar() will replac the default System RTL function, for Delphi versions prior to 2007 (which didn't contain those)
  • new AnsiCharToUTF8(), StringToWinAnsi(), WideStringToWinAnsi(), WideStringToUTF8(), CSVOfValue(), IdemPCharArray(), FindUnicode(), UpperCaseUnicode(), LowerCaseUnicode() and Split() functions
  • faster GetInt64() function
  • Iso8601ToSecondsPUTF8Char() now returns 0 in case of unexpected format
  • fixed issue in StrCurr64() low-level conversion routine
  • fixed issue in Utf8DecodeToRawUnicodeUI() function
  • new TSynTableFieldProperties.OrderedIndexRefresh method, to allow access on OrderedIndex[] even if the index needs to be refreshed
  • new TDynArrayHashed.AddAndMakeUniqueName() method and Hash[] property
  • new TRawByteStringStream class (a TStream using a RawByteString as internal storage), especially useful since Delphi 2009
  • new TSynNameValue object, to efficiently handle Name/Value RawUTF8 pairs
  • TTextWriter.CreateOwnedStream now create an internal TRawByteStringStream instance for faster process and direct retrieval in the Text method
  • JSONEncode*() global functions will use an internal TRawByteStringStream instead of a supplied TMemoryStream
  • new FormatUTF8() overloaded function, handling both '%' and '?' parameters (inserting '?' as inlined :(...): parameters, with proper string quote) - with associated regression tests


  • unit now tested with Delphi XE2 (32 Bit)
  • new sftModTime / TModTime published field type in TSQLRecord, which will be set to the current server time stamp before update/adding
  • new sftCreateTime / TCreateTime published field type in TSQLRecord, which will be set to the current server time stamp at record creation
  • new TSQLRest.ServerTimeStamp property, which will return the current server time as TTimeLog/Int64 value (will use the new /TimeStamp RESTful service to retrieve the exact server time)
  • TSQLRestServerStaticInMemory uses a per-Table Critical Section to have its EngineList, EngineRetrieve, EngineAdd, EngineUpdate, EngineDelete, EngineRetrieveBlob, EngineUpdateBlob methods begin thread-safe
  • enhanced TSQLRestServer.URI thread-safety (e.g. Sessions access)
  • TSQLTable.InitFieldTypes will now also use column type retrieved during JSON parsing
  • new TSQLTable.GetCSVValues method
  • GetJSONValues() is now using an internal TRawByteStringStream when the expected result is a RawUTF8 (avoid copying content twice, and is perfectly thread-safe)
  • the shared fTempMemoryStream is not available any more (not thread-safe)
  • new TSQLRest.AcquireWrite/ReleaseWrite protected methods, used by TSQLRestServer.URI to safely write to the DB (e.g. for POST/PUT/DELETE...) with TSQLRest.AcquireWriteTimeOut, both thread-safe and transaction-safe
  • TSQLRest.TransactionBegin / Commit / RollBack methods now expect a SessionID parameter in order to allow safe concurent access: writing to the database is queued within a single client session
  • CreateSQLMultiIndex and CreateSQLIndex methods now working on external DB virtual tables (using SynDB.TSQLDBConnectionProperties.SQLAddIndex)
  • new TSQLRecordProperties.ExternalTableName and ExternalDatabase fields used by SQLite3DB to handle external SynDB-based database access
  • code refactoring to make TSQLRestServerStatic more generic (for SQLite3DB)
  • TSQLRestServer.UpdateField now accepts to search by ID or by value (used e.g. by rewritten TSQLRestServer.AfterDeleteForceCoherency method)
  • introducing TSQLRecordExternal kind of record, able to use any SynDB external database engine (e.g. OleDB/MSSQL/Oracle/SQLite3)
  • new ExtractInlineParameters procedure to handle :(1234): SQL statements
  • new MakePrivateCopy property in TSQLTableJSON.Create, which will avoid creating a private copy of the JSON (used e.g. in SynDBExplorer to handle very large result sets, with half the memory)
  • new TSQLRecordProperties.SQLUpdateSet, SQLInsertSet and AppendFieldName properties/method (used for external DB handling)
  • new TSQLRecord.Create, TSQLRecord.FillPrepare, TSQLRecord.CreateAndFillPrepare, TSQLRest.OneFieldValue, TSQLRest.MultiFieldValues, TSQLRestClient.EngineExecuteFmt and TSQLRestClient.ListFmt overloaded methods, accepting both '%' and '?' characters in the SQL WHERE format text, inlining '?' parameters with :(...): and auto-quoting strings
  • new UnicodeComparison parameter in TSQLTable.SearchValue to handle property non WinAnsi (code page 1252) characters
  • fixed issue in TPropInfo.GetBinary method with dynamic arrays (used e.g. by TSQLRestServerStaticInMemory.SaveToBinary)
  • fixed issue with TAuthSession.IDCardinal=0 after 76 connections
  • fixed issue in SetInt64Prop() with a setter method
  • fixed potential issue in TSQLTable.SearchValue in case of invalid Client supplied parameter (now checks TSQLRest class type)


  • updated SQLite3 engine to version 3.7.8
  • unit now tested with Delphi XE2 (32 Bit)
  • transactions now following a safe concurent access (both thread-safe and client/connection-safe) - but authentication should be enabled
  • the SQLite3 wrapper is now located in a separate SynSQLite3 unit: this will allow to use it as a separate database engine, e.g. using SynDB classes without the overhead/features of our mORMot framework
  • statement cache is now shared with SynDBSQLite3, via the new TSQLStatementCached object as defined in SynSQLite3.pas
  • now TSQLRestServerDB will unregister any TSQLVirtualTableModuleServerDB to avoid random GPF in TSQLVirtualTable.Destroy
  • TSQLRestClientDB and TSQLRestServerDB constructors now accept an optional Password parameter, associated to the supplied file name, in order to use database encryption


  • first public release, corresponding to mORMot Framework 1.15
  • new unit extracting the SQLite3 wrapper from the previous SQLite3 unit: this unit can therefore be used with our SynDB classes (via SynDBSQLite3), without SQLite3Commons overhead (and features)
  • added TSQLRequest.BindNull method and associated sqlite3_bind_null function
  • fixed issue with TSQLDataBase with UseCache=false
  • new TSQLStatementCached object, for caching of prepared SQLite3 statements
  • TSQLDatabase constructors now accepts an optional Password parameter, associated to the supplied file name, in order to use database encryption (not finished nor fully tested feature)


  • unit now tested with Delphi XE2 (32 Bit)


  • unit now tested with Delphi XE2 (32 Bit)
  • handle TIFF saving with diverse compression methods


  • unit now tested with Delphi XE2 (32 Bit)


  • unit now tested with Delphi XE2 (32 Bit)


  • unit now tested with Delphi XE2 (32 Bit)


  • unit now tested with Delphi XE2 (32 Bit)
  • fixed issue in HTTP_RESPONSE.SetHeaders


  • first public release, corresponding to mORMot Framework 1.15
  • new unit handling Virtual tables for DB direct access classes for the mORMot framework


  • SynDB unit extracted from previous SynOleDB.pas
  • TQueryValue.As* methods now handle NULL column as 0 or ''
  • added new TSQLDBRowVariantType custom variant type, allowing late binding access to row columns (not for Delphi 5) - see RowData method
  • fixed transaction handling in a safe abstract manner
  • TSQLDBStatement class now expects a prepared statement behavior, therefore TSQLDBStatementPrepared class has been merged into its parent class, and inherited classes have been renamed TSQLDBStatementWithParams[AndColumns]
  • new TSQLDBStatement.FetchAllAsJSON method for JSON retrieval as RawUTF8
  • exposed FetchAllAsJSON method for ISQLDBRows interface
  • made the code compatible with Delphi 5
  • new TSQLDBConnectionProperties.SQLIso8601ToDate virtual method
  • code refactoring for better metadata (database and table schemas) handling, including GetTableNames, GetFields, GetFieldDefinitions and GetForeignKey methods - will work with OleDB metadata and direct Oracle sys.all_* tables
  • new TSQLDBConnectionProperties.SQLCreate/SQLAddColumn/SQLAddIndex virtual methods (SQLCreate and SQLAddColumn will use the new protected SQLFieldCreate virtual method to retrieve the SQL field definition from protected fSQLCreateField[Max] properties) - as a result, SQL statement generation as requested for mORMot is now much more generic than previously
  • new overloaded TSQLDBStatement.Execute() method, able to mix % and ? parameters in the SQL statement
  • new TSQLDBStatement.BindNull() method
  • new TSQLDBConnectionProperties.NewThreadSafeStatementPrepared and TSQLDBConnection.NewStatementPrepared methods, able to be overriden to implement a SQL statement caching (used e.g. for SynDBSQLite3)
  • new TSQLDBConnection.ServerTimeStamp property, which will return the external database Server current date and time as TTimeLog/Int64 value (current implementation handle Oracle, MSSQL and MySQL database engines - with SQLite3, this will be the local PC time, just as for other DB engines)
  • new overloaded TSQLDBStatement.Bind() method, which can bind an array of const (i.e. an open list of Delphi arguments) to a statement
  • new overloaded TSQLDBStatement.Bind() and ColumnToVarData() methods, able to bind or retrieve values from a TVarData/TVarDataDynArray (used e.g. for direct access to/from SQLite3 virtual table in the SQLite3DB unit)
  • new ColumnTimeStamp method for TSQLDBStatement/ISQLDBRows, returning a TTimeLog/Int64 value for a date/time column


  • SynDB unit extracted from previous SynOleDB.pas
  • several fixes and speed enhancements
  • made the code compatible with Delphi 5
  • TOleDBStatement class now follows the prepared statement pattern introduced with its parent TSQLDBStatement
  • now able to retrieve table names and column information from OleDB metadata including GetTableNames, GetFields, GetFieldDefinitions and GetForeignKey methods - able to use faster direct SQL retrieval (e.g. for Oracle / MS SQL)


  • first public release, corresponding to mORMot Framework 1.15
  • new unit implementing fast Oracle DB direct access classes (via OCI)


  • first public release, corresponding to mORMot Framework 1.15
  • new unit implementing SQLite3 direct access classes to be used with our SynDB architecture
  • use the SQLite3 engine, as wrapped via the new separated SynSQLite3 unit

To get it, go to this download page, or use the source...

Feedback and questions are welcome in our forum, just as usual.