We are happy to announce v5.09.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.82.00 or newer is a prerequisite to this update.
This is a major release containing major new features, updates to existing features and bugfixes.
The release includes:
- NEW! SmartBinding support for kbmMW Enterprise Edition (BETA!)
- NEW! XML-RPC support for kbmMW Enterprise Edition
- NEW! JSON-RPC support for kbmMW Enterprise Edition
- NEW! Automatically analyse JSON, YAML or XML data and have kbmMW generate Delphi marshalling classes
- Significant improvements in
- SmartServices
- RTTI
- Scheduler
- LINQ
- Object Notation
- XML and JSON marshalling
- ORM
- Important fixes.
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, governments, schools, laboratories, rentals, culture institutions, FDA approved medical devices, military and more.
5.09.00 May 11 2019
New stuff ========= - Added kbmMWSmartBind.pas unit with optional kbmMWSmartBindVCL.pas and kbmMWSmartBindFMX.pas Provides new easy to use multiway databinding between data, controls and objects. - Added support for XML-RPC and JSON-RPC. Include kbmMWJSONRPCTransStream and/or kbmMWXMLRPCTransStream units and select JSONRPC or XMLRPC as transport stream format in request/response transports. - Updated TkbmMWONArray, added: procedure MoveAppend(const AValue:TkbmMWONArray); procedure MoveInsert(const AIndex:TkbmNativeInt; const AValue:TkbmMWONArray); procedure CopyAppend(const AValue:TkbmMWONArray); procedure CopyInsert(const AIndex:TkbmNativeInt; const AValue:TkbmMWONArray); procedure Insert(const AIndex:TkbmNativeInt; const AValues:array of variant); overload; - Updated TkbmMWONObject, added: property PropertyValueAsVariant[const AIndex:TkbmNativeInt]:variant read GetPropertyValueAsVariant write SetPropertyValueAsVariant; - Added function IkbmMWScheduledEvent.SyncQueued:IkbmMWScheduledEvent which works similar to Synchronized except it will queue the operation and not block to prevent certain deadlock scenarios. - Added IkbmMWScheduledEvent.AfterEnd and IkbmMWScheduledEvent.SynchronizedAfterEnd optional handlers which will be called when the event has run and it is never to be run again (it is truely ending). - Added IkbmMWScheduledEvent.Executed:boolean property that returns true if the event has been executed at least once. - Added properties OnAnonymousAfterEndProcedure:TkbmMWOnAnonymousScheduledProcedure and OnSimpleAnonymousAfterEndProcedure:TkbmMWOnSimpleAnonymousScheduledProcedure to IkbmMWScheduledEvent. See AfterEnd explanation. - Added property IkbmMWScheduledEvent.IsSynchronized which indicates if an event is running synchronized (or syncqueued). - Added new methods to TkbmMWRTTI: class function IskbmMWONCustomObject(const AVariant:variant):boolean; class function GetkbmMWONCustomObject(const AVariant:variant; var ACustomObject:TkbmMWONCustomObject):boolean; class function CompareValue(const AValue1,AValue2:TValue):integer; class function GetIsInteger(const AValue:TValue):boolean; class function GetIsInt64(const AValue:TValue):boolean; class function GetIsBoolean(const AValue:TValue):boolean; class function IsDesigntime:boolean; - Added TkbmMWThreadList<T>.Count property in kbmMWGlobal.pas - Added TkbmMWThreadDictionary<TKey,TValue> and TkbmMWThreadObjectDictionary<TKey,TValue> class in kbmMWGlobal.pas - Added function kbmMWSafeDelphiIdentifier(AIdentifier:string):string; to kbmMWGlobal.pas - Added new functions to TkbmMWJSONMarshal: class function GenerateDelphiClassFromUTF8File(const AFileName:string; const AUnitName:string; const AMainClassName:string):string; class function GenerateDelphiClassFromUTF16File(const AFileName:string; const AUnitName:string; const AMainClassName:string):string; class function GenerateDelphiClassFromUTF8Stream(const AStream:TStream; const AUnitName:string; const AMainClassName:string):string; class function GenerateDelphiClassFromUTF16Stream(const AStream:TStream; const AUnitName:string; const AMainClassName:string):string; They generate Delphi source code that is able to marshal/demarshal provided JSON data. - Added new functions to Use (kbmMWSmartUtils.pas): class function IsObject(const AVariant:Variant):boolean class function IsObject<T>(const AVariant:Variant):boolean class function IsDateTime(const AVariant:Variant) class function IsString(const AVariant:Variant):boolean class function IsDouble(const AVariant:Variant):boolean class function IsInteger(const AVariant:Variant):boolean class function IsInt64(const AVariant:Variant):boolean - Added new functions to TkbmMWYAMLMarshal: class function GenerateDelphiClassFromUTF8File(const AFileName:string; const AUnitName:string; const AMainClassName:string):string; class function GenerateDelphiClassFromUTF16File(const AFileName:string; const AUnitName:string; const AMainClassName:string):string; class function GenerateDelphiClassFromUTF8Stream(const AStream:TStream; const AUnitName:string; const AMainClassName:string):string; class function GenerateDelphiClassFromUTF16Stream(const AStream:TStream; const AUnitName:string; const AMainClassName:string):string; They generate Delphi source code that is able to marshal/demarshal provided YAML data. - Added TkbmMWLockFreeCountLock to kbmMWLockFree.pas Provides a simple way to count interests in a resource. - Added class function TkbmMWONCustomMarshal.GenerateDelphiClass(const AUnitName:string; const AMainClassName:string; const AON:TkbmMWONCustomObject):string; - Added support for ORM to detect primary key field changes and automaticaly update datastorage accordingly. - Added support for marshalling/demarshalling data of type variant. - Added new function to kbmMWHTTPUtils.pas function kbmMWIsMimetypeTextual(const AMimeType:string):boolean; - Added support for rewriting ALTER TABLE PRIMARY KEY SQL - Added new functions to TkbmMWXMLMarshal: class function FromFile<T>(const AFileName:string):T; overload; class function FromFile(const AFileName:string; AResultClass:TClass):TObject; overload; Provides easy access to marshalling and demarshalling in one line. class procedure SaveToFile(const AFileName:string; const AValue:TValue); overload; class function GenerateDelphiClassFromFile(const AFileName:string; const AUnitName:string; const AMainClassName:string):string; class function GenerateDelphiClassFromStream(const AStream:TStream; const AUnitName:string; const AMainClassName:string):string; They generate Delphi source code that is able to marshal/demarshal provided YAML data. Changes/minor additions ======================= - Improved TkbmMWONNative.SetAsFmtString to correctly use AFormat.FormatSettings when handling decimal comma. - Improved TkbmMWONArray.GetAsVariant and TkbmMWONObject.GetAsVariant to allow for returning embededded kbmMW supported object/record as variant when needed for kbmMW SKUs supporting SmartService. - Improved TkbmMWONArray.GetAsValue and TkbmMWONObject.GetAsVariant to allow for returning embededded kbmMW supported object/record as TValue when needed for kbmMW SKUs supporting SmartService. - Improved TkbmMWONArray.SetAsVariant and TkbmMWONObject.SetAsVariant to handle variant embededded kbmMW supported object/record when needed for kbmMW SKUs supporting SmartService. - Improved TkbmMWONArray.SetAsValue and TkbmMWONObject.SetAsValue to handle TValue embededded kbmMW supported object/record when needed for kbmMW SKUs supporting SmartService. - Improved TkbmMWONArray.Add(const AValues:array of variant) to handle variant embededded kbmMW supported object/record when needed for kbmMW SKUs supporting SmartService. - Updated class function TkbmMWProcess.ExecuteProcess to support optional TEncoding argument. - Improved TkbmMWJSONStreamer to differenciate between number and integer, although JSON standard only knows about number. It is of interest when converting object notation to other formats. - Added optional argument const ABestMatch:boolean = false to TkbmMWRTTIKnownTypes.Get and GetClass functions. If true and no known exact type is found, it will attempt to find usable parent type. - Added optional const AWait:boolean = true argument to several TkbmMWScheduler.Unschedule and Clear methods. - Updated kbmSQLite.pas adapter to respect default Journal mode and default page size. - Improved updating SQLite journal mode and page size. - Improved TkbmMWLinqStage.AsStrings to attempt better formatting of data. - Improved REST transport stream format. - Improved kbmMWCustomServerMessagingTransport.pas to allow encrypted subscription and unsubscription message to be proxied without knowing key. - Improved TkbmMWNullableReplacementVisualizer. - Updated TkbmMWRESTAttribute, added Required property default false. Indicates if an argument is required or not. - Improved TkbmMWRTTI.GetQualifiedName to attempt to generate qualified names for non registered types too. Fixes ===== - Fixed TkbmMWProcess.ExecuteProcess to terminate job on function end, if AJob handled given in arguments. - Fixed various bugs and some leaks in kbmMW Scheduler. - Fixed bugs in TkbmMWRTTI methods. - Fixed TkbmMWRemoteDesktopClient.Connect to unsubscribe from previous subscription if any. - Fixed bugs in TkbmMWOracleMetaData. - Fixed bugs in kbmMWGlobal.pas. - Fixed bugs and leaks in kbmMWORM.pas. - Fixed typo bug in TkbmMWORM.GenerateDelphiClass. - Fixed access violation when reregistering kbmMW in Delphi due to internal Delphi RTTI bug. - Fixed AutoCommit issue in UniDAC database adapter. - Fixed bugs in kbmMWCustomServerMessagingTransport.pas.