We are happy to announce v5.07.00 of our popular middleware for Delphi and C++Builder.

If you like kbmMW, please let others know! Share the word!

We strive hard to ensure kbmMW continues to set the bar for what an n-tier product must be capable of in the real world!

Notice that kbmMemTable v. 7.81.00 or newer is a prerequisite to this update.

This release contains major new features and loads of other updates including:

  • Added support for RAD Studio 10.3 Rio
  • Added new ImportDBSchema feature to import schema info from databases, generating Delphi units that directly can be used for fast ORM access.
  • Added support for CPU hardware based true random numbers via the new unit kbmMWCPUTRNG (Enterprise Edition)
  • New Split LINQ command for splitting data into batches/groups
  • New cool features in the Scheduler like InAMoment for very easy start of asynchronous code affecting the GUI.
  • Added support for UPSERT SQL statement in SQL rewriters, ORM etc.
  • New VERY fast VERY scale-able request/response type server side transport TkbmMWTCPServerTransport.

Please check the end of this post for a detailed change list.

Professional and Enterprise Edition is available for all with a current active SAU. If your SAU has run out, please visit our shop to extend it with another 12 months.

CodeGear Edition may be available for free, but only supports a specific Delphi/Win32 SKU, contains a limited feature set and do not include source.

Please visit https://portal.components4developers.com to download.


kbmMW is the premiere n-tier product for Delphi, C++Builder and FPC on .Net, Win32, Win64, Linux, Java, PHP, Android, IOS, embedded devices, websites, mainframes and more.

Please visit http://www.components4developers.com for more information about kbmMW.


Components4Developers is a company established in 1999 with the purpose of providing high quality development tools for developers and enterprises. The primary focus is on SOA, EAI and systems integration via our flagship product kbmMW.

kbmMW is a portable, highly scalable, high end application server and enterprise architecture integration (EAI) development framework for Win32, ..Net and Linux with clients residing on Win32, .Net, Linux, Unix, Mainframes, Minis, Embedded and many other places. It is currently used as the backbone in hundreds of central systems, in
hospitals, courts, private, industries, offshore industry, finance, telecom, governements, schools, laboratories, rentals, culture institutions, FDA approved medical devices, military and more.

5.07.00 Dec 9 2018

5.07.00 Dec 9 2018

        Important notes (changes that may break existing code)

        * Renamed misspelled TkbmMWInfTNRG64 to TkbmMWInfTRNG64 and ditto for 32 bit.

        New stuff

        - Added support for 10.3 Rio.
        - Added properties AutoConvertString:boolean and PrefixedZeroesIsString:boolean to
          TkbmMWONFormat. AutoConvertString controls if the streamer/conversion should
          attempt conversion of string values to native values (default true).
          PrefixedZeroesIsString determines if an all numeric string value with
          prefixed zeroes (eg. 0001 or 00.001) should be considered a string or a
          numeric value (default) upon auto conversion of string values.
        - Added AssignTo to TkbmMWONFormat.
        - Added ClearDateTimeFormatStrings method to TkbmMWONFormat as an easy way
          to clear out already defined date/time format strings.
        - Added DateTime function to TkbmMWONFormat. Returns TDateTime of a TkbmMWDateTime value,
          honoring the settings of property DateTimeStyle. Hence returns UTC or Local date/time
          according to setting.
        - Added HintedValueType to TkbmMWONCustomObject. Is used specially by ON native descendants
          to prefer a specific type upon auto conversion. When setting a value specifically
          using AsInt32 f.ex. the hinted type will also be set to int 32.
        - Added FindParent and FindParentObject to TkbmMWONCustomObject.
        - Added properties IsNumeric, IsString, IsDateTime, IsBoolean to TkbmMWONNative.
        - Added TryAsFmtInt32, TryAsFmtInt64, TryAsFmtVariant, GetAsFmtVariant, SetAsFmtVariant,
          methods to TkbmMWONNative, TkbmMWONObject and TkbmMWONArray. They will use the
          given TkbmMWONFormat instance settings for formatting/parsing the prvided data.
          Basically the Object Notration framework is now very aware about custom formatting if needed.
        - Added SaveToStream and LoadFromStream to TkbmMWBSONMarshal, TkbmMWJSONMarshal, TkbmMWYAMLMarshal.
        - Added SaveToUTF16Stream and LoadFromUTF16Stream to TkbmMWJSONMarshal and TkbmMWYAMLMarshal.
        - Added unit kbmMWConfigONStreamer. Its classes descends from YAML classes and its purpose is
          to allow for configuration interception in various Settings attributes (attributes that takes
          a string containing the settings in a simplified YAML/JSON format). That includes
          kbmMW_Rest, kbmMW_Auth and many others.
        - Added additional hardware based random generator support in unit kbmMWCPUTRNG.
          It contains TkbmMWCPURand32, TkbmMWCPURand64 which both use the CPU's pseudo random generator
          if it exists, and TkbmMWCPUTRNG32 and TkbmMWCPUTRNG64 which both use the CPU's true random noise
          generator if the CPU supports it (Intel/AMD only).
        - Significantly updated TkbmMWCustomMetaData to support a large number of formatter and extractor methods.
        - Updated TkbmMWCustomSQLRewriter to support RewriteUpsert.
        - Added DefaultMetadata property to TkbmMWCustomSQLRewriter. It returns the metadata component that will
          be used if no other metadata instance has been defined for it.
        - Added SchemaName to TkbmMWCustomPooledDataset and TkbmMWCustomResolverTable, and SchemaNameQuote, SchemaNameCase,
          SchemaNameBrackets, QuoteSchemaName to TkbmMWCustomSQLMetaData and in general
          significantly improved support for parsing schema named prefixed values.
        - Improved support for charset in HTTP smart services. By defining
        - Added TkbmMWDateTimeParseOptions to TkbmMWDateTime. The options are used with Parse... and Try...
          methods to instruct how the parsing of date and time strings should be.
          If mwdtpoAllowSimple is not specified ISO8601 times must contain all parts.
          If mwdtpoAllowPartial is not specified ISO8601 and RFC1123 will not allow
            additional information after the date time value.
          if mwdtpoToLocalTZ is specified, it will automatically convert the date/time timezone
            to local timezone. Else the specific timezone given will be used.
        - Added support for %D1 (1 or 2 digit day), %H1 (1 or 2 digit hour), %Z1 (1, 2 or 3 digit
          msecs) which affects value to string conversion.
        - Added TkbmMWPlatformMarshal.Bytes2Stream and TkbmMWDigest128 to kbmMWGlobal.
        - Added kbmMWConditionallyQuoteString, kbmMWSafeIdentifier, kbmMWOccurrences functions
          to kbmMWGlobal.
        - Added support for HTTPSys transports returning RemoteLocation property.
        - Significantly updated HTTP key/value/options handlers in kbmMWHTTPUtils.
        - Added NullOnEmptyString:boolean, Indent:integer, Pretty:boolean to TkbmMWJSONStreamer
          to allow streaming in pretty format.
        - Added OnParseError event to TkbmMWJSONStreamer which is triggered upon a parse error.
        - Added Split(const ACount:integer) Linq method to kbmMWLinq.
        - Added SetFormat to TkbmMWLinq to control format settings for conversion scenarios.
        - Added VALUES syntax to TkbmMWMemSQL. Syntax:
          SELECT * FROM VALUES(xxxx)
          where xxxx is a CSV formatted string, with fields comma separated (,) and
          records semicolon separated (;). kbmMW will autodetect field types based on
          the data.
        - Added a number of SQL functions to TkbmMWMemSQL which can be used in the SQL statement:
          LOCALDATETIMETOISO8601(datetime), ISO8601ToLocalDateTime(string),
          UTCDateTimeToISO8601(datetime), ISO8601ToUTCDateTime(string),
          FormatUTCDateTime([fmt,]datetime), ParseUTCDateTime([fmt,]string)
          FormatLocalDateTime([fmt,]datetime), ParseLocalDateTime([fmt,],string)
          The optional fmt value is a string following the TkbmMWDateTime format strings.
          Eg. '%Y3-%M-%D %H:%N:%S'
        - Added support for marshalling and demarshalling  TTypeKind.tkInt64 and TTypeKind.tkWChar
          in kbmMWObjectMarshal.
        - Added TkbmMemtableWithDefinition which directly descends from TkbmMemTable, but has the
          [kbmMW_Dataset([mwdsfIncludeDefinitions])] to easily force marshalling and demarshalling
          to include dataset definitions (fielddefs etc). Found in kbmMWONMarshal.pas.
        - Added support for automatic marshalling/demarshalling of TkbmMemTable.
        - Added multiple additional query operators to ORM:
          TkbmMWORMQueryOperator = (mwoqoNone,mwoqoIsNull,mwoqoIsNotNull,
            mwoqoGTEQorNull,mwoqoNEQorNull,mwoqoLIKEorNull );
        - Added new source code generator functions to ORM:
          function GenerateDelphiClass(const AValue:TClass;..):string
          function GenerateDelphiClass(const ATable:TkbmMWORMTable;...):string;
          procedure GenerateDelphiClass(const AValue:TClass; var...)
          procedure GenerateDelphiClass(const ATable:TkbmMWORMTable; var...)
          They can be used for generating a Delphi class source for a database table.
          The generated class can be compiled into programs for nromal ORM access.
          Typically used in combination with SurfaceDynamicTable that describes a non ORM
          table for the ORM.
        - Added ImportDBSchema application which can connect to any FireDAC enabled database
          and import a complete schema for the database or specific tables in it and
          generate matching ORM classes.
        - Added support for UPSERT SQL statement which works like an UPDATE or INSERT
          combined statement. If the UPDATE succeeds, no INSERT is made otherwis
          records are INSERTed.
        - Added options to TkbmMWORM.RewriteStatement which controls if the given statement
          should be rewritten to native SQL or to kbmMW SQL.
        - Added support for CRON (Unix type scheduling) strings in kbmMWScheduler.
          kbmMW supports an extra enhanced mode where seconds and years also can
          be specified.
        - Added GroupedAs and Group to IkbmMWScheduledEvent which makes it possible to group
          various events under same name, making it easier to enable or disable
          specific groups of events.
        - Added WithInternalTag and InternalTag to IkbmMWScheduledEvent which allows
          setting a type of tag value within for example arrays of events to
          be fullfilled to forward a value from one event to the next in a chain of events.
        - Added UnScheduleGroup, DeactivateGroup, ActivateGroup methods to TkbmMWScheduler.
        - Added InAMoment methods to TkbmMWScheduler which are perfect for running
          GUI related code asynchronously.
        - Added support for default value in kbmMW_Arg attribute.
          If a smart method is called and the argument is missing, the default value will be used.
        - Added support for ftLargeInt in kbmMWSQLite adapter.
        - Officially announcing new TkbmMWTCPServerTransport which is a very high performance
          transport supporting a very high number of concurrent connections.
          It has been tested primarely on Windows but may support other platforms which it
          will be tested for at a later stage.

       	Changes/minor additions

        - Updated AMQP client connection to make ChannelMax and FrameMax properties
        - Changed AMQP LastHeartBeat and similar from using ticks to TkbmMWTiming (usecs).
        - Updated several DB adapters that contains a specialized metadata component
          to publish several already existing properties.
        - Updated all Object Notation based streamer classes (JSON,BSON,MessageClass,YAML) to
          support overriding produced ON array, ON object and ON native instances with
          specialized ones, by descending and overriding:
           class function GetNativeClass:TkbmMWONNativeClass;
           class function GetObjectClass:TkbmMWONObjectClass;
           class function GetArrayClass:TkbmMWONArrayClass;
        - Changed FireDAC adapter to not use FireDAC's features for API_MetaList, and instead
          use kbmMW's default rewriter features. Reason is that kbmMW provides more details.
        - Further enhanced TkbmMWRTTI.pas
        - Enhanced TkbmMWSmartClientORM.Persist<T> to allow for additional arguments.
        - Improved null handling in TkbmMWSQLJSONData (kbmMWSQLJSONAPI).
        - Improved SQL datatype detection.
        - Improved disconnection handling in TkbmMWTCPIPIndyClientMessagingTransport.
        - Enhanced DOM XML to and from Object Notation conversion with features for flattening
          arrays only containing one element, and if to treat values with prefixed zeroes
          as a number or as a string.
        - Updated kbmMW socket library.

        - Fixed bug in TkbmMWClientTransactionResolver.Resolve.
        - Fixed bugs in kbmMWConfiguration.
        - Fixed bug in TkbmMWCSVStreamer affecting last value upon load.
        - Fixed TkbmMWCustomMessagingClientTransport to forward provided Params to message stream instance.
        - Fixed TkbmMWCustomMessagingClientTransport in relation to improved disconnection/connection pattern.
        - Fixed several bugs in TkbmMWDateTime.
        - Renamed misspelled TkbmMWInfTNRG64 to TkbmMWInfTRNG64 and ditto for 32 bit.
        - Fixed bugs in kbmMW ORM.
        - Fixed potential leak in TkbmMWCustomPasswordGen32.
        - Fixed 64 bit compilation bug in kbmMWProcess.
        - Fixed clipboard compilation bugs (clipboard not supported) in NextGen for RemoteDesktop.
        - Fixed potential leaks or incorrectly cleared values in Use.AsResult and Use.AsVariant.


4 thoughts on “ANN: kbmMW Professional and Enterprise Edition v. 5.07.00 released!”
  1. Nice Christmas Gift!!
    But I read this:
    – Added support for UPSERT SQL statement which works like an UPDATE or INSERT
    combined statement. If the UPDATE succeeds, no INSERT is made otherwis
    records are INSERTed.
    Isnt The other way? “If the INSERT succeeds, no UPDATE is made otherwise
    records are UPDATED”
    This is recalling MySQL ‘Insert ….. On Duplicate Key Update….’

    1. Hi, yes and no. It depends on the database what happens. Using pure ANSI92, it will rewrite to a special INSERT combined with a SELECT followed by UPDATE. On Oracle it will either use UPDATE followed by conditional INSERT, or MERGE. On MSSQL it will convert to MERGE. In SQLite it will do an UPDATE that may fail silently followed by a special INSERT/SELECT combo.
      Basically there are no one perfect way to do an UPSERT. Each database has its “best practice” regarding that.

    1. No, currently MySQL will be rewritten to ANSI SQL compliant code for UPSERT that will work with older versions of ANSI SQL.

      upsert table1 (fld1,fld2) VALUES (10,20) WHERE fld3>10

      MySQL, Interbase and PostgreSQL:
      INSERT INTO table1 ( fld1,fld2 ) SELECT 10,20 FROM (SELECT 0 as i) AS mutex LEFT JOIN table1 ON (fld3 > 10) WHERE i=0 AND fld3 IS NULL;
      UPDATE table1 SET fld1=10,fld2=20 WHERE (fld3 > 10)

      MERGE INTO ‘table1’ USING ( SELECT 10,20 FROM DUAL) ON (fld3 > 10) WHEN MATCHED THEN UPDATE SET fld1=10,fld2=20 WHEN NOT MATCHED THEN INSERT ( fld1,fld2 ) VALUES ( 10,20 );

      MERGE INTO table1 USING ( SELECT 10,20 ) AS __src(_fld1,_fld2) ON (fld3 > 10) WHEN MATCHED THEN UPDATE SET fld1=10,fld2=20 WHEN NOT MATCHED THEN INSERT ( fld1,fld2 ) VALUES ( 10,20 );

      UPDATE table1 SET fld1=10,fld2=20 WHERE (fld3 > 10);
      INSERT INTO table1 ( fld1,fld2 ) SELECT 10,20 WHERE (SELECT Changes()=0);

      You can try the ORM sample “Standalone” and type in various statements and have them rewritten.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.