kbmMW history of changes: ========================= Notice that not all changes may apply to the specific SKU/Edition you are licensed for. 5.23.00 Jan 14 2024 New stuff ========= - Added support for Delphi 12. - Added object notation support for JSON5. - Added support for HTTP BearerAuthorization in kbmMWHTTPSysServerTransport, kbmMWISAPIRESTServerTransport, kbmMWJSONRPCTransStream, kbmMWXMLRPCTransStream, AJAX transport streamformat and REST transport streamformat. - Added ListTableNames function to TkbmMWORM. It will return the tablenames based on the provided TkbmMWORMTableSelections options mwtsKnown,mwtsSurfaced,mwtsVirtual, mwtsBackend - Added TkbmMWTime32 class and kbmMWTime32StartTime global variable to kbmMWGlobal.pas. It will handle relative 32 bit date/time values. Used for low memory footprint fast date/time calculation/registration. - Added support for preserving knowledge about Object Notation native value format bin/oct/hex or none to be able to regenerate it in same format on streaming. Changes/minor additions ======================= - Updated Remote Desktop Proxy demo. - Updated Remote Desktop Server demo. - Updated ObjectNotation demo. - Updated kbmMWYAML.pas with different way to keep track of NUMBER fields as bit, oct or hex types. - Added kbmMWHashFNV1A32 and kbmMWHashFNV1A64 operating on memory by pointer. - Added IntToHex and HexToInt SQL function as alias for ToHex and FromHex functions. - Improved ToHex SQL function to not require digit count. - Improved kbmMWDependency.pas to provide better debug log and handle error cases during shutdown. - Updated native TCP transports to better handle disconnection, improve performance, giving access to current connections and listeners, and fixed KQueue variant to work correctly with Android target. - Improved connection loss detection in messaging transports. - Updated TkbmMWCircularBuffer with new overloaded Read and Write methods. - Updated kbmMWOpenSSL.pas to use static SSL library when compiling for IOS, and added support for OpenSSL SSLv3 and TLSv3. - Added HexToInt and IntToHex SQLite custom functions. - Improved parsing returned string field data from SQLite depending on if Ansi or Unicode encoded. - Added mwsloEmptyTextIsNullOnConversion to SQLite options. If empty string is returned will be handled as NULL if set. Default not set. - Added debug log in FindServiceDefinition (kbmMWServer.pas) when service definition found based on a service path (REST). Similarly added warn log in same function when No definitions found. - Added StrictSyntaxOptions:TkbmMWXMLStrictSyntaxOptions to TkbmMWCustomSAXParser and TkbmMWDOMXML. It controls how strict the XML parser must be. Can contain flags: mwxml_ssoAllowRestrictedCharactersInAttributeValue,mwxml_ssoAllowDuplicateAttributeName, mwxml_ssoAllowDuplicateIDs. - Added new overloaded function IsAuthorized to TkbmMWAuthorizationManager. - Added new TkbmMWORMQueryOption mwqoNoTransaction to ORM. If used will force query not to run in a transaction. - Added new function LoginWithCreateActor to TkbmMWAuthorizationManager which makes it easy to login with an unknown actor and have it autocreated if not existing. - Updated default random generators kbmMWRandom32 (TkbmMWRandomPCGUInt32) and kbmMWRandom64 (TkbmMWRandomXoroshiro1024) to be initialized as threadsafe. - Changed PreComment and PostComment to be TStrings based in TkbmMWONCustomObject. - Added GetPreComment, GetPostComment, SetPreComment, SetPostComment, AddPreComment, AddPostComment methods as shortcut access to comments. - Added ToNative, ToObject and ToArray properties to TkbmMWONCustomObject which will attempt to return the instance as one of the specific types. If not compatible nil is returned. - Added overloaded Byte2Hex, Hex2Byte to TkbmMWPlatformMarshal in kbmMWGlobal.pas. - Added overloaded kbmMWBitStringToInt64, kbmMWInt64ToBitString, kbmMWOctalStringToInt64, kbmMWInt64ToOctalString, kbmMWHexStringToInt64, kbmMWIntegerToHexString, kbmMWInt64ToHexString to kbmMWGlobal.pas. Fixes ===== - Fixed CompileTool when auto compiling prerequisite kbmMemTable. - Fixed XML default configuration file settings to AutoIndent and AutoLineFeed. - Updated JSON streaming to do proper formating when Pretty=true. - Fixed TkbmMWORM InternalUpgradeTable to create new sequencers and counters. - Fixed problem compiling for IOSSIMULATOR. - Fixed TkbmMWSortedList.AppendKey returning invalid value. - Improved TkbmMWCustomThread.Stop. - Fixed class function TkbmMWTimeNS.NowUTC:int64; on IOS crashing. - Fixed TkbmMWCustomLockFreeHashArray.TryGetValue(const AKey:K; var AValue:T):boolean to prevent invalid value return. 5.22.10 Jun 26 2023 Changes/minor additions ======================= - Improved adding info about KBMMW_SUPPORT_KBMFMX in generated kbmMWConfig.inc. Fixes ===== - Fixed path bug to kbmMW.inc in FMX.kbmMWDIB.pas preventing compilation. - Fixed compilation in XE5 due to newer Delphi syntax. 5.22.00 Jun 11 2023 New stuff ========= - Added ShowHostMouseActions:boolean (default false) to kbmMWRemoteDesktopClient.pas. If set to true, it will live track the hosts mouse position and show its position on the remote client. - Added TrackHostMouseEvents:boolean (default false) and TrackHostKeyboardEvents:boolean (default false) to kbmMWRemoteDesktopServer.pas If set to true, system wide mouse and/or system wide keyboard events will be tracked and reported to remote clients. The features can be completely turned off by defining KBMMW_REMOTEDESKTOP_NO_SYSTEM_HOOKS before compiling applications using kbmMWRemoteDesktopServer.pas. - Added kbmMWCreateTimestampedFile function to kbmMWGlobal.pas. - Added function kbmMWXMLContainsInvalidCharacter to kbmMWXML.pas Will check if string contains invalid XML character. - Added StrictSyntax:boolean property to TkbmMWCustomSAXXMLParser class (default false) Will check if tag or attribute contains invalid characters and throw KBMMW_ERR_TRANSPORT_XML_INVALIDCHARACTER if so. Will also check if attribute names are duplicated and throw KBMMW_ERR_TRANSPORT_XML_DUPLICATEATTRIBUTE if so. - Added MaxOutstandingSends:integer (default 0) and Options:TkbmMWSocketOptions (default [mwsoSkipOnMaxOutstandingSend]) to TkbmMWCustomTCPMessagingClientTransport and TkbmMWCustomTCPMessagingServerTransport. Governs how many non acknowledged outstanding sends can be queued up before new sends are either dropped or a disconnection is happening. Default there are no limit (except for OS restrictions). - Added property AdditionalBindings to TkbmMWCustomTCPMessagingServerTransport. It allows for adding additional ports and/or network cards to listen and accept connections from. - Added AddSampleLanguage method to TkbmMWI18N. Adds an "empty" language with the given name and description. That way it is possible to learn from scratch. A new instance of TkbmMWI18N will always contain a single sample langauge called 'Default'. - Added BatchSize:integer (default 0) to TkbmMWCustomResolver. If set to >0, the resolver will resolve in batches. Notice that in that case AllOrNothing will only have effect on the last handled batch. - Added property XRequestedWith:string to TkbmMWHTTPTransportStreamHelper. - Added property IsXMLHttpRequest to TkbmMWHTTPTransportStreamHelper. It will specifically be used for checking if the optional (but defacto standard) XRequestedWith indicates that the request was made by a JSON XMLRequest call (REST). If so, and the request could not be authorized, it will not require the client browser to popup a username/password dialog. - Added TryGetValue to TkbmMWCustomLockFreeHashArray and TkbmMWCustomLockFreeHashArray2 (kbmMWLockFree.pas). - Updated kbmMWSQLite.pas to support SQLite custom functions. - Added new UCUpper and UCLower SQLite custom functions to do proper unicode upper and lower case if mwsloAddCustomFunctions is set in SQLiteOptions. - Added OnOpenedDBConnection to TkbmMWSQLiteConnectionPool. - Added LogException:boolean property to TkbmMWCustomMessageProcessor. If true, it will log whatever exception has happened while executing the message processor. Else it will ignore it. - Added option to define section name for TkbmMWBinaryParser. Allows for having multiple separate configurations in the same storage. - Added class function TkbmMWBPParser.CreateFromString - Added mwlbpmRawFile as a new "pretty mode" option to kbmMWLog. If used, it will output data in binary raw form in a separate file. Copies/backups are governed by MaxRawFileCount:integer; - Added class function IskbmMWDateTime(const ATypeInfo:PTypeInfo):boolean; to TkbmMWRTTI. - Added class function IskbmMWNullable(const ATypeInfo:PTypeInfo):boolean; to TkbmMWRTTI. - Added class function GetValueFromPath(const APath:string; const AInstance:TValue):TValue to TkbmMWRTTI. - Added class function GetValuesFromPath(const APaths:array of string; const AInstance:TValue):TArray; to TkbmMWRTTI. - Added protected function GetConfigName(const ADefaultExtension:string):string; to TkbmMWConfiguration. It will be called to figure out what the name of the configuration should be. Default it is the same as the executables name + _config, but now all applications automatically supports /config (Windows) or -config (others) command line parameter, which should be followed by the name or full path and name of the configuration file to use. Changes/minor additions ======================= - Added SaveToAnsixxx and LoadFromAnsixxx to TkbmMWYAMLStreamer (kbmMWYAML.pas) where xxx is String, Stream and File. - Added LoadFromxxx variants to TkbmMWYAMLStreamer (kbmMWYAML.pas) where xxx is String, Stream and File, that accepts a default encoding. - Added support for decoding \uNNNN and \UNNNNNNNN syntax in TkbmMWYAMLStreamer. - Added property &Variant:variant to kbmMWNullable. allows getting or setting basic nullable datatypes as a variant. - Improved garbage collection of sent async requests in kbmMWCustomClientMessagingTransport.pas Now will also detect (and GC) orphaned reponses for requests that has already timed out. - Added Tag optional argument to TkbmMWLog and many log methods and to TkbmMWRemoteLog. - Changed use of specific thread code in kbmMWCustomTransport.pas to instead use the Scheduler. That results in the removal of: TkbmMWTransportIdleThread and TkbmMWTransportHeartbeatThread classes. - Added Scheduler:TkbmMWScheduler property to TkbmMWCustomTransport. Default it retrieves the kbmMW system scheduler, but it is possible to instantiate a separate scheduler and use that instead. - Improved TkbmMWCustomThread.WorkDone. - Changed TkbmMWCustomConnectionPool to not use its own thread for garbage collection. Instead it will use a recurring scheduled event. - Added property Scheduler:TkbmMWScheduler that default returns the system scheduler. It allows setting to a different instantiated scheduler if needed. - Removed class TkbmMWPooledGarbageThread. - Added optional Replace:boolean argument to TkbmMWI18N.Load method. If set to true, the loaded language will completely replace already existing languages in TkbmMWI18N. If not it will append extra language(s). - Updated the native socket code. - Added Data property to TkbmMWDIB class. - Updated TkbmMWCustomGroupedMultithreadMessageQueueProcessor (kbmMWCustomMessagingTransport.pas) to use a scheduled event instead of its own thread for GC. - Removed TkbmMWMessageGroupsGarbageThread class from kbmMWCustomMessagingTransport.pas. Fixes ===== - Fixed \xNN decoding in TkbmMWYAMLStreamer. - Fixed decoding exponential numbers in TkbmMWYAMLStreamer. - Fixed decoding exponential numbers in TkbmMWJSONStreamer. - Fixed incorrect conditional compiling in TkbmMWYAMLStreamer.LoadFromStream when KBMMW_SUPPORTSENCODING not defined. - Fixed TkbmMWMSSQLRewriter methods: ExistsTable, RewriteExistsIndex, RewriteListIndexes, RewriteDescribeIndex - Fixed detecting system wide kbmMW shutdown in kbmMWSmartEvent.pas. - Fixed setting smartevent as done (when it has been run), even if OnDone is not used. - Fixed FMX compilation of kbmMWRemoteDesktopClient.pas - Fixed shutdown scenarios in TkbmMWInnerThread. - Fixed TkbmMWThreadEntry.Destroy. - Fixed TkbmMWCustomThreadPool.Reserve not attempting to reuse thread which has been marked for shutdown. - Fixed TkbmMWDOMXMLNode.GetData function so it will decode data before returning it. - Fixed TkbmMWCustomSQLParamsResolver.BuildSQLStatements that used wrong tablename. - Fixed socket close on TkbmMWCustomTCPMessagingClientTransport. - Improved kbmMWORM. - Fixed kbmMWDIB.pas. - Improved shutdown detection in TkbmMWCustomMessageQueueProcessorThread.Execute. - Improved shutdown detection in TkbmMWMessageQueueProcessorThread.ProcessAll, ProcessBlockAll, ProcessOne, ProcessBlockOne. - Fixed parsing data starvation issue in TkbmMWBinaryParser. - Fixed trailing spaces being removed when getting string data from an XML based configuration. 5.21.00 Nov 30 2022 Important notes (changes that may break existing code) ====================================================== * Updated code to match kbmMemTable v. 7.97.xx (it is a requirement for this release) New stuff ========= - Improved TkbmMWDebugMemory to support tracking interface reference counting. - Added TkbmMWDebugMemory.Silent boolean class variable that is default false. Set to true if you do not want the messagebox popping up with leak information upon application shutdown when TkbmMWDebugMemory.ReportLeaksOnShutdown is true. - Updated code to match kbmMemTable v. 7.97.xx (it is a requirement for this release) Changes/minor additions ======================= - Added kbmMWGetImplementingObject (Win32 and Win64) to kbmMWGlobal.pas. It is a fast way to return the implementing object from an interface pointer without risking additional reference counting arithmetics. - Improved TkbmMWDebugMemory output to be prettier and include statistics. - Improved TkbmMWDebugMemory output to separate statistics for various memory allocation types. - Changed TkbmMWAuthorizations.Get to have an additional argument AExact:boolean default false. Get will normally try to return a relevant authorization rather than the exact one. A relevant authorization is one where the resource use will be authorized based on lesser specific authorizations where for example the role is unknown/undefined, the actor unknown/undefined or both unknown/undefined. If you need the very specific one, where actor and role both must be an exact match, set AExact argument to true. - Added TkbmMWAuthorizationManager.IsAuthorized overloaded variant, that returns access permissions along with access state. Fixes ===== - Fixed pesky leak in native transports. - Fixed warnings in kbmMWLockFree.pas - Fixed FMX variant of kbmMWFindComponentByName in kbmMWGlobal.pas to enable search thru TGridPanelLayout owned child controls. - Fixed warnings when compiling for Win64 in kbmMWDebugStackTrace.pas. - Fixed TkbmMWBindings.AutoBind for FMX to now also scan child controls in TGridPanelLayout. - Fixed TkbmMWAuthorizationManager.InternalIsAuthorized to handle denials correctly. I.e. when a resource specifically has been denied access for specific roles/actors/conditions. 5.20.01 Nov 8 2022 New stuff ========= - Added global function: kbmMWShutdown() which when called indicates to long running parts of kbmMW that kbmMW is about to shut down. It affects kbmMW threads, waitloops, SmartBind, SmartEvent, Scheduler, client messaging request/response, which will cease running as soon as possible. Global variable: kbmMWShuttingDown:boolean can be probed to test for if a shutdown is imminent. - Added new decorator functionality to I18n so specific texts can be given an option to be not translated and/or not learned. Eg. Label1.Caption:=i18n.DontLearn('Setting caption without learning'); Eg. Label1.Caption:=i18n.DontTranslate('Setting caption without translating nor learning'); Eg. Label1.Caption:=i18n._X('Setting caption without translating nor learning'); Notice that if you need to use decorated strings in non i18n scenarios, you will need to undecorate them before use. eg. sUndecoratedString:=i18n.Undecorate(somedecoratedstring); It is usually safe to call this for regular non decorated strings that will be returned as is. - Added several GetDefAttribByNamexxxx methods to TkbmMWDOMXMLNode. Will return user defined default value if named attribute is not found on node. Changes/minor additions ======================= - Improved OnLogout2 event in TkbmMWAuthorizationManager so it will not only receive a context but also have populated the context with login information in addition to the token. Fixes ===== - Fixed one more type issue in kbmMWCipherHash.pas. - Fixed disconnection detection in TkbmMWTCPClientMessagingTransport and TkbmMWTCPClientTransport. - Fixed leak of state object upon server disconnecting in TkbmMWTCPClientMessagingTransport and TkbmMWTCPClientTransport. - Improved I18n deregistration and reregistration of components to ensure that original value is correctly detected and that original value for deregistered components and children are removed. - Fixed unused variable warnings. - Fixed bogus PixelPerInch property in kbmMWServer.dfm file. 5.20.00 Oct 27 2022 Important notes (changes that may break existing code) ====================================================== * Changed default value for delay on congestion on queue to 0 (none) instead of 500ms. * Removed call to OnLoginSuccess when login attempt on already logged in user in TkbmMWAuthorizationManager. * Changed TkbmMWHTTPTransportStreamHelper to support HTTP headers of default max. KBMMWHTTPDEFAULTMAXHEADERSIZE (8192) bytes instead of 1024 bytes. New stuff ========= - Added kbmMWTCPMessagingServerTransport native TCP WIB transport with TLS/SSL support. - Added kbmMWTCPMessagingClientTransport native TCP WIB transport with TLS/SSL support. - Added kbmMWTCPServerTransport native TCP request/response transport with TLS/SSL support. - Added kbmMWTCPClientTransport native TCP request/response transport with TLS/SSL support. - Added kbmMWTCPWebSocketServerTransport native Websocket compliant server transport with TLS/SSL support. - Added support for OpenSSL v3 and TLS 1.3. include {$DEFINE KBMMW_NATIVETRANSPORT_SUPPORT_OPENSSL_V3} to support OpenSSL v3 Require DLL's: libcrypto-3.dll and libssl-3.dll in relevant bitness. If not defined, falls back to support OpenSSL v1. Require DLL's: libeay32.dll and ssleay32.dll (0.9x) - Added support for aggregates in SmartBinding. It will aggregate over a navigable source using COUNT, SUM, AVG, STDDEV, MIN, MAX Example: {bind:@test2.Val3, to:statictext2.caption, aggregate:SUM} Will sum all values of property Val3 of navigable source test2 (placeholder in this example) and output sum to statictext2.caption. SmartBinding will maintain a cache of already aggregated data, and only reaggregate when nequired. - Added Swap64, Int1621Memory, UInt162Memory, Int322Memory, UInt322Memory, Int642Memory, Single2Memory, Double2Memory to TkbmMWPlatformMarshal. - Added Replace, ReplaceAll, TryReplace, TryReplaceAll to TkbmMWRegExp. - Added global function kbmMWCmdLineParamValue and kbmMWCmdLineContainsParam to kbmMWGlobal.pas - Added TkbmMWHashMetro64 and TkbmMWHashMetro128 hash classes. - Added simple support for accepting selfsigned certificates and expired certificates in all native SSL/TLS transports. - Added support for blocking specific SSL/TLS protocols (SSLv3, TLSv1, TLSv1.2, TLSv1.3). Default for all transports is blocking for SSLv3, TLSv1 and TLSv1.2. - Added support for protocol upgrade request in TkbmMWCustomHTTPService. - Added support for Firemonkey TCustomListBox and TCustomComboBox and descendants in SmartBinding. - Added support for logging complex values using kbmMWLog. - Added UpdateDebug property to TkbmMWBindings (Binding.Bindings.UpdateDebug). Can be set to mwbudIgnore, mwbudLogException or mwbudExcept. Default mwbudLogException. Controls what happens in case an update of a binding fails. - Added kbmMWDIB.pas unit. It is a high performance replacement for relevant functionality used by kbmMW RemoteDesktop, to avoid thread deadlock problems in TBitmap.Canvas. Changes/minor additions ======================= - Added Delete(aobject) and Remove alias methods to TkbmMWONArray. - Added Delete(aobject) and Remove alias methods to TkbmMWONObject. - Added Delete method to TkbmMWConfiguration. Provides a mean to remove a configuration setting. - Added DeleteByValue to TkbmMWHTTPCustomValues. - Added ContainsValueFieldsValue[..] to TkbmMWHTTPMimeHeaderValues. - Added kbmMWWSKeyToAccept function to kbmMWHTTPUtils.pas Converts a Websocket secret key to an accept key. - Added CongestionDelayThreshold and CongestionDelayThresholdLow properties to TkbmMWCustomMessageQueue. Controls when to delay push of messages to queue for regular and low prioritized new messages, when queue is congested. * Changed default value for delay on congestion to 0 (none) instead of 500ms. * Removed call to OnLoginSuccess when login attempt on already logged in user in TkbmMWAuthorizationManager. * Changed TkbmMWHTTPTransportStreamHelper to support HTTP headers of default max. KBMMWHTTPDEFAULTMAXHEADERSIZE (8192) bytes instead of 1024 bytes. The value can always be overridden by setting the header size parameter before use: transport.Params.Values[KBMMW_HTTP_PARAM_HEADER_SIZE]='16384'; - Updated kbmMW Remote Desktop server classes to use TkbmMWDIB instead of TBitmap. - Updated Remote Desktop server demo to use new native kbmMW TCP messaging transport. Fixes ===== - Fixed TkbmMWEvent signal detection bug. - Fixed kbmMWGetCurrentThreadID returning incorrect type. - Fixed performance issue in TkbmMWNullable<>, TkbmMWAutoValue debug visualizers. - Fixed parsing bugs in kbmMWYAML.pas. - Fixed 64 bit compilation issues with kbmMW's bundled cipher hashes. - Fixed errorhandling in ServeStream and ServeRequest in TkbmMWServer. - Fixed occatiional A/V in kbmMWORM.pas upon reraising exception from underlying database. - Fixed % at end bug in I18n translation support. - Fixed potential leaks in TkbmMWCustomLockFreeHashArray for user allocated items. - Fixed several issues in kbmMWSmartBinding. - Fixed kbmMW Remote Desktop screen diffing algorithm. 5.19.00 Mar 29 2022 Important notes (changes that may break existing code) ====================================================== * Require kbmMemTable v. 7.96 or newer! New stuff ========= - Added several new methods to TkbmMWRTTI class. - Added support for translating VCL listview in kbmMWI18N. - Added Subscribe and Unsubscribe methods to log manager. Adds ability to add other parties interested in log data, including events and procedures on an arbitrary log manager. - Updated SmartBind to also support I18N on bindings with the option set to i18n. - Updated TkbmMWDateTimeCompiledFormat to support optional date/time parts. Parts can be followed by ? (optional. If data not provided, use now value) ?0 (optional. If data not provided use lowest possible value) ?9 (optional. If data not provided, use highest possible value) Great for quick user input of start/end values for date/times ranges. - Added DontParseHeader property to TkbmMWHTTPTransportStreamHelper. Allows for only partial parsing of HTTP headers to improve performance. Code requring fully parsed headers, needs to handle the parsing itself. - Added TkbmMWCustomLockFreeHashArray dictionary type class. - Added TkbmMWDynamicLockFreeHashArray - Added support for decomposition of text before translation in I18N. - Added unit conversion in I18N - Added support for inline SVG and file based flags in I18N. - Added optional (default enabled) simple _ method for I18N translation. - Added support for keyboard regions in I18N. Works in tandem with kbmFMX virtual keyboard. Changes/minor additions ======================= - Performance optimized native transport. - Improved SmartEvent shutdown. - Performance optimized kbmMW native JSON parser. - Added LateTyping to TkbmMWJSONStreamer (default false). If set to true, it will read all numeric properties as strings, allowing late conversion to something else via the As.... methods. - Updated all kbmMW SQL function enhancements to support kbmMemTable v. 7.96 - Improved Delphi code generation in marshaller. - Moved many kbmMWDebugxxx methods and global variables to kbmMWLog unit. - Added Options property to TkbmMWYAMLStreamer. Currently supports mwyoStrictComment. If not set (default), allows a comment to start right after the # character. However to follow YAML syntax precisely, # should be followed by a space for the rest to be considered a comment. - Performance optimized TkbmMWStringBuilder. - Updated SQLite adapter to support SQLite versions not supporting sqlite3_column_table_name method. Fixes ===== - Fixed heartbeat continuing to run when transport disconnected. - Fixed bugs in native transport. - Fixed JPEG compression library with regards to FMX. - Fixed ORM with regards to class defined read only properties. - Fixed SaveToxxxx in CSV, JSON, YAML, TXT streamers when data is 0 length. - Fixed incorrect default mimetype in JSONRPC streamformat. - Fixed AJAX transport stream format. - Fixed TkbmMWRTTI class. - Fixed YAML parsing bugs. - Fixed bugs in SmartBind. - Fixed XML streamformat. - Fixed TkbmMWSQLiteSQLRewriter.RewriteDescribeTable. - Reverted to not attempting to marshal local properties on non object types. 5.18.00 Sep 12 2021 Important notes (changes that may break existing code) ====================================================== * Officially dropped support for pre XE7. XE8 and up is recommended. New stuff ========= - Added support for Delphi 11 - Added new SQL user functions to kbmMWMemSQL: CREATEGUID() - Returns a full size unique GUID including braces. CREATESHORTGUID() - Returns a compact unique GUID (no braces or dashes). GETUSERNAME() - Returns username of currently logged in user. GETCOMPUTERNAME() - Returns name of computer. QUOTE(string[,quotechar[,endquotechar]]) - Quote a string. Default quotechar/endquotechar is " UNQUOTE(string[,quotechar[,endquotechar]]) - Unquote a string. Default quotechar/endquotechar is " - Added NAV(property/fieldname) function to SmartBind expressions. Provides access to other values of the current position of a navigable bound object. - Added HasPassedTimeMS, PassedTimeMS, PassedTimeDiffMS and DiffMS (millisec) functions to TkbmMWTiming (kbmMWGlobal.pas) in addition to the US (microsec) variants. - Added overridable AllocElements, FreeElements, ZeroElements, ClearElements methods to TkbmMWLockFreeHashArray and TkbmMWLockFreeHashArray2, to allow for alternative storage, like storing the array in a memory mapped file. Changes/minor additions ======================= - Officially dropped support for pre XE7. XE8 and up is recommended. - Added logging of exceptions as error, if SmartBind expression excepts. - Improved kbmMWYAML to allow for cardinal hex or octal values. Fixes ===== - Fixed potential null A/V when rebinding datasources/dataset in SmartBind. - Fixed TkbmMWONFormat.DateTimeAsString in kbmMWObjectNotation to fall back to detecting a date/time format index if no specific date nor time format is found. 5.17.00 Aug 28 2021 Important notes (changes that may break existing code) ====================================================== * Require kbmMemTable v. 7.94 or newer! * Changed SmartBind to only set destination if the new value is different from what is already in the destination. Old behaviour can be forced by setting property yourbinding.AlwaysSet:=true or via 'alwaysSet:true' in expression based binding. * Changed SpokeID from integer to Cardinal in kbmMWServerMessagingTransport.pas New stuff ========= - Added field mapping support in LINQ via new AsMyDataset which returns a new developer owned instance of a dataset. - Added new date/time format specifiers to TkbmMWDateTimeCompiledFormat: %M3 = 2 digit month %D2 = 2 digit day %H2 = 2 digit hour - Added kbmMWTXT.pas containing TkbmMWTXTStreamer. It will parse and generate fixed format record/field based text files accoding to a specific JSON or YAML described format. Example: [ { "name": "name", "ofs": 15, "len": 80 }, { "name": "address", "ofs": 95, "len": 40 }, { "name": "zipcode", "ofs": 135, "len": 8 }, { "name": "city", "ofs": 143, "len": 32 }, { "name": "active", "ofs": 194, "type": "boolean", "len": 1, "true":" ", "false":["S","I"], "trim":"false" }, { "name": "phone", "ofs": 195, "len": 15 }, { "name": "fax", "ofs": 210, "len": 15 }, { "name": "value", "ofs": 522, "type": "integer", "len": 4 }, { "name": "date", "ofs": 538, "type": "date", "dateTimeFormat": "%Y2%M3%D2", "len": 6 }, { "name": "number", "ofs": 564, "type": "float", "decimalCount": 2, "padChar": "0", "len": 7 }, { "name": "email", "ofs": 600, "len": 0 } ] Check ObjectNotation demo and LINQ demo for sample data. - Added many new methods to kbmMWLINQ: AsMyDataset which will return a developer owned dataset. AsMyDataset with various mapping arguments, which will allow for returning only specified fields under specified names. Syntax: OldFieldName=NewFieldName;.... AsOn with various mapping arguments for field names. See above. UsingTXT which will take a TXT JSON definition in the AFields argument. It will parse fixed format text fields using some default settings. If more detailed settings are needed, use UsingON and provide the result from a TkbmMWTXTStreamer. - Updated TkbmMWONFormat in kbmMWObjectNotation.pas to support multiple (max 10) variations of text representing boolean false/true, Null, INF+ and INF- - Improved TkbmMWStringBuilder with many variations of two new functions: Overwrite, Insert, which allows updating existing content, and auto size the buffer if the overwrite or insert is outside existing buffer size. Changes/minor additions ======================= - Improved datasource binding to fall back to binding to the datasource instance itself rather than its records, when the binding member is not a field name. - Added OnAttemptAutoBind event to TkbmMWBindings instance. Can be used for ignoring specific properties or instances while attempting to autobind. - Added anonymous function argument to AutoBind which will allow filtering which instances and properties should be autobound. - Added overloaded PeerSubscribingFor method to be used instead of providing -1 as SpokeID in original PeerSubscribingFor, which now only takes a cardinal. - Added overloaded AllSubscriptionsFor method to be used instead of providing -1 as SpokeID in original AllSubscriptionsFor, which now only takes a cardinal. - Added Trunc to TkbmMWDateTime which returns an integer Delphi style datetime value. - Added mwsloExceptOnValueError option to kbmMWSQLite connection pool. If specified, value conversion errors will not be silently ignored. - Improved Use.AsType to support T being an interface as well as an object/class. Fixes ===== - Changed SpokeID from integer to Cardinal in kbmMWServerMessagingTransport.pas - Introduced some FPC compiler support changes. It still do not support FPC. - Fixed bug premature freeing data in a LinqStage which was marked as shared or not owned. 5.16.00 Jul 17 2021 Important notes (changes that may break existing code) ====================================================== * Updated messaging subject header to v5 to support packet size. Notice newer servers will adjust to old clients, but newer clients will not be able to communicate with older servers, unless you specifically downgrade the header version (client side), or update the server. Downgrade the header version by setting the transport.Params propety like this: yourtransport.Params.Values[KBMMW_TRANSPORT_PARAM_SUBJECTHEADERVERSION]:='4'; * Updated TkbmMWORM's LINQ to support Delete and Update. May require minor changes to existing code to compile. New stuff ========= - Added kbmMWI18N.pas, kbmMWI18NVCL.pas and kbmMWI18NFMX.pas to Enterprise Edition. It is a complete context sensitive translation framework. - Added kbmMWSs4TLSTransportPlugin for StreamSec v4 TLS support. - Updated TkbmMWORM's LINQ to support Delete and Update. May require minor changes to existing code to compile. - Added Value2String class method to TkbmMWRTTI. - Added VarRec2String class method to TkbmMWRTTI. - Added VarRec2Variant class method to TkbmMWRTTI. - Added ConvertToBoolean, ConvertToInt, ConvertToString, ConvertToInt64, ConvertToFloat, ConvertToDateTime, Convert class functions to TkbmMWRTTI. - Added AsString to TkbmMWNullable. Useful for debugging/logging purposes. - Added AsString to TkbmMWDateTime. Useful for debugging/logging purposes. - Added AsFieldValueArray to TkbmMWORMFieldList. - Added two variations of DatasetFieldValueArray to DatasetFieldValueArray. Returns an array of field values. - Added global kbmMWDebugEncoding:TEncoding which defines how to encode debug messages. Default encodes as ASCII. - Added kbmMW SQL functions: NumberToFixed(double)->string, FixedToNumber(string)->double, ToHex(int)->string or ToHex(digits,int)->string, FromHex(string)->int - Added IsLogLevel(const ALevel:TkbmMWLogLevel):boolean to TkbmMWLog. - Added PrepareMessagePackStorage to TkbmMWConfiguration. Changes/minor additions ======================= - Cleaned up and improved data conversion in SmartBind. - Improved SmartBind rebinding to a TDataSet/TDataSource. - Improved shutdown detection in SmartBind. - Improved shutdown detection in SmartEvent. - Improved TkbmMWThreadObjectDictionary to optionally support an ordered list, which can be fetched using BeginReadOrdered and EndReadOrdered functions. Specify which to support ordering at construction time. - Changed TkbmMWGenericMagneticStripeReaderHID.DecodeInputReport and TkbmMWMagTekMSRHID.DecodeInputReport to set status to an empty string if decoded ok. - Improved TkbmMWYAMLStreamer to read and write comments. It will attempt to preserve comments when possible. Further it supports inserting comments before and/or after a node. - Improved YAML character support during parsing. - Added PreComment and PostComment properties to TkbmMWONCustomObject. - Optimized all value setters of TkbmMWONCustomObject and TkbmMWONObject. - Added general new MOBILE definition support for mobile non NEXTGEN. - Improved TkbmMWLinqStage.AsON to accept optional extra parameter to return a plain object notation object (native or object) that is not embedded in an array (default). Fixes ===== - Fixed kbmMWGetFileSize platform bug. - Fixed TkbmMWTiming.GetTimeUS platform bug. - Fixed MacOS compilation bugs. - Fixed bug in TkbmMWHID, detecting HID candidates. - Fixed bug in gzip detection in kbmMWCustomHTTPService.pas - Changed misspelled 'tagString' to 'tagStrings' in SmartBind TkbmMWBindingComboBoxFMXProxy.UpdateMemberInfo - Fixed bug when no rows in TkbmMWBindingStringGridControlFMXProxy.FillGridColumn. 5.15.10 Mar 29 2021 Fixes ===== - Fixed compilation for Android target. - Fixed SmartBind delayed bind interface destruction provoked by bind(...); clear; bind(...) in same scope. 5.15.00 Mar 28 2021 Important notes (changes that may break existing code) ====================================================== * Require kbmMemTable v. 7.92.00! Changes/minor additions ======================= - Improvements and fixes in SmartBind, including FMX listview and performance improvements. - Improved ORM, including new AsInserted and Batched to IkbmMWORMQueryStage. AsInserted will return a dataset with each record marked as newly inserted, which when resolved will insert the data into the datastorage of choise. - Changed ORM SurfaceDynamicTable to accept an AOptions argument. If mwqoFetchOnDemand is in options, AsDataset will attempt getting first batch of 200 records and for each call to AsDataset another batch will be returned until no more records, in which case the returned dataset is nil. - Added support for VAX timestamp (VAXLocalTimestamp and VAXUTCTimestamp properties) in kbmMWDateTime. - Added support for multiple kbmMW_Event attributes on each method for various subscriptions. - Added more functions to TkbmMWPlatformMarshal for converting memory data. Fixes ===== - Fixed missing deregistration of memtable SQL API's - Fixed and improved Interbase/Firebird SQL rewriter resulting in ability to correctly describe and create tables, including decoding default field values when they are constants. 5.14.00 Feb 21 2021 Important notes (changes that may break existing code) ====================================================== * Changed default SQLite memo field type to CLOB. If preprocessor conditional KBMMW_FIX_SQLITE_MEMO_BUG is defined, then CreateOrUpgrade will automatically attempt modifying existing tables old MEMO status to CLOB. Prevents unintentional interpretation of numeric look a like values as numerics. New stuff ========= - Added support for status methods in kbmMWCustomSmartService and kbmMWCustomHTTPSmartService. Status methods are smart methods that are only triggered when an error or warning status is happening. They take both kbmMW native status codes and HTTP status codes. Updated RESTFishFact demo to show examples of how to use. - Added QueuedAfterRun and QueuedAfterEnd methods to kbmMWScheduler. - Added ConcatBytes and BytesZ2String to TkbmMWPlatformMarshal. - Added global kbmMWCoalesce and kbmMWIsSameVariants global functions in kbmMWGlobal.pas. - Added internal thread locking to TkbmMWMemoryStream. - Added DeleteByName, IndexOfvalue, ContainsValue to TkbmMWHTTPCustomValues. - Added new TkbmMWMimeTypes class to kbmMWHTTPUtils.pas. Supports specifying if a mimetype is compressible. - Updated compiletool to optionally allow creation of project files for non installed compilers. - Improved HID support with TkbmMWGenericMagneticStripeReaderHID, TkbmMWGenericBarcodeReaderHID and added various more methods like Manufacturers, Products and ManufactorersAndProducts to extract basic data. - Added support for pivot based counters in the ORM and connection pool. - Added support for transport native file sending for HTTP.Sys transport. Will automatically trigger when using HTTPResponseFromFile. - Added support for automatic GZIP compression of responses from HTTP Smart services, provided client announce support of it in call. Fixes ===== - Fixed kbmMWDebugMemory compilation. - Fixed precise scheduled event shutdown bug. - Fixed SQL rewriting of ALTER TABLE ALTER/MODIFY COLUMN for ANSI92 and subsequently for IB, MYSQL and ORACLE. - Fixed exception in kbmMWCustomDataset.pas when attempting to run nil cursor thru a piped kbmSQL statement. - Improved SmartBinding, fixed bugs and stability. - Fixed SmartBinding bugs for Android. - Fixed bugs in kbmMWDateTime related to local date conversion. - Fixed bug in TkbmMWTCPIPIndyMessagingClientTransport which would cause package data corruption upon IsConnected checking from a different thread. Changes/minor additions ======================= - Refactored and introduced kbmMWCore.pas kbmMWCore.pas amongst others contains TkbmMWInterlocked. - Added a number of KBMMW_TRANSPORTSTREAM_PARAM_xxxx constants for setting up transport stream parameter options. - Changed SynchronizedAfterRun and SynchronizedAfterEnd back to not queueing. - Changed default SQLite memo field type to CLOB. If preprocessor conditional KBMMW_FIX_SQLITE_MEMO_BUG is defined, then CreateOrUpgrade will automatically attempt modifying existing tables old MEMO status to CLOB. Prevents unintentional interpretation of numeric look a like values as numerics. - Improved TkbmMWPathMatcher to handle escaped characters. Will allow for $ and ^ in URL paths for example. Escape by backslash. - Improved support for IInterface in kbmMWRTTI.pas 5.13.10 Nov 15 2020 New stuff ========= - Added SendTimeout to TkbmMWCustomTCPIPIndyMessagingServerTransport Fixes ===== - Fixed XE5 compilation - Fixed warnings and hints. - Fixed compilation when directive FMX is defined. 5.13.00 Nov 4 2020 New stuff ========= - Added support for rewriting SQL containing joins. Currently ANSI SQL 92 joins are understood. - Added support for auto unscheduling scheduled event upon exception. It is set via the property UnscheduleException on the scheduled event instance (kbmMWScheduler.pas) - Added support for nullable lookup (outer lookup) in ORM. Returns NULL values when a referenced lookup is not found. If the field is defined as not null, then an inner join will be used, else an outer join will be used. - Added TkbmMWThreadObjectList class (kbmMWGlobal.pas) - Added TkbmMWAuthorizationLogins.Get which takes an actor instance and returns list of matching logins. - Added TkbmMWAuthorizationManager.Logout(const AActor:TkbmMWAuthorizationActor) It will log out all registered logins for the specific actor. - Added TkbmMWRTTI.IskbmMWDateTime(const AValue:TValue):boolean - Added TkbmMWRTTI.IskbmMWNullable(const AValue:TValue):boolean - Added TkbmMWRTTI.GetkbmMWDateTime(const AValue:TValue; var ADateTime:TkbmMWDateTime):boolean - Added TkbmMWRTTI.GetkbmMWNullable(const AValue:TValue; var AIsNull:boolean; var AResultValue:TValue):boolean - Updated kbmWMXML to handle mixed data. See blogpost. - Added CollapseNil and AutoIndentCount properties affecting generation of XML from XML DOM. - Added new TkbmMWXMLReformatter class which can reformat an invalid XML document according to certain rules, and in addition it collects names and ids. Quite useful for visual XML editors. - Added more overloaded methods variations to TkbmMWORM. - Added new kbmMWHID.pas unit which provides support for Windows USB/HID features including MagTek magnetic card readers. Define KBMMW_SUPPORT_HID in kbmMWConfig.inc to use. - Added support for binding to image controls in FMX SmartBind. Changes/minor additions ======================= - Changed string list log manager to use Queue rather than Synchronize. (kbmMWLog.pas) - Added LogSubscriptions to TkbmMWEvents (SmartEvents). Will dump all current notification subscriptions in the log. - Improved TkbmMWRTTI.CompareValue to be able to compare interface instances. - Updated kbmMWSQLite.pas SQL adapter to make SQLite create_function available. - Added missing code for TkbmMWCustomBlockCipher128.DecryptECB(const Indata; var Outdata; Size: longword) - Updated object marshalling to allow for marshalling properties on list types. - Made numerous improvements in both performance, stability and functionality in SmartBind. Including a new callable (from within a binding expression) function called 'data'. It can be given without arguments, in which case it returns the data directly, or it can be called with one argument which is a property or a property path (property.property....) to the specific subproperty of the source value, one wants data from. - Improved LINQ AsStrings variants to allow for optional strings instance which is populated and returned instead of a newly generated one. - Updated TkbmMWCustomResolver with GetIsNullByFieldName, GetIsNullByField and GetIsNullByIndex functions. - Improved TkbmMWStringBuilder.ToString to allow optional offset and length indication. Fixes ===== - Improved SmartEvent stability. - Fixed minor bugs, warnings and hints. - Fixed kbmMWBackupFile when ADestPath is an empty string. - Fixed TkbmMWJPEG.CompressBitmapToStream and TkbmMWJPEG.DecompressStreamToBitmap to work correctly in a threaded environment. - Fixed Scheduler interval issue when running in second intervals. - Fixed TkbmMWAuthorizationManager.DeleteActor so it will autologout the actor to delete. - Fixed TkbmMWRTTI.ConvertValue2Variant to return null value is a null kbmMWNullable type. - Fixed several minor bugs and made improvements to ORM. - Fixed loadbalancing service time stamping. - Fixed bugs in TkbmMWSQLJSONAPI related to subset extraction. 5.12.10 Jun 6 2020 Changes/minor additions ======================= - Improved CompileTool. Fixes ===== - Fixed Pro Edition compilation. - Fixed several warnings and hints. 5.12.00 May 31 2020 New stuff ========= - Added RAD Studio/Delphi/C++Builder 10.4 support. - Added new TkbmMWUpdateClient and TkbmMWPooledUpdateClient components which communicates with a file service (default named KBMMW_UPDATE) to handle automatic update of Win32/Win64 software. - Added OnBeforeConnect event to TkbmMWCustomTCPIPIndyClientTransport and descendants. Useful for setting up SSL connection. - Added new SSL client and server demo. - Added kbmMW ORM function QueryDataset(const ATable:TkbmMWORMTable; const AQueryString:string; const AParams:TParams; const ATransaction:TkbmMWTransaction = nil; const AOptions:TkbmMWORMQueryOptions = []):TDataset - Added elevation features to TkbmMWProcess for Windows. - Added HopCountHandleResponse property to kbmMWCustomClientMessagingTransport. It is default 1 It can be used to define how many hops are allowed in the hop trace for a return response in a messaging setup before it is no longer handled as a response for the local client. Usually the hopcount will be 1 when forwardrequest and forwardresponse methods are used. However if simple message forwarding is used, the hopcount will continue to increase, and may thus be 2 or 3 or similar when the response arrives at the originating request client. - Added kbmMWGenerateUniqueTempDirectory to kbmMWGlobal.pas - Added overloaded kbmMWImplode to kbmMWGlobal.pas - Added IgnoreException to IkbmMWScheduledEvent. If set exceptions will allow RunDone methods to run, else RunDone methods will be skipped on exception. Changes/minor additions ======================= - Refactored TkbmMWFileClient and TkbmMWPooledFileClient. - Added OnSubscribedMessage and OnUnsubscribedMessage to TkbmMWCustomSAFServerTransport. Useful for detecting/debugging/logging if the node is subscribing for an incomming message or not. - Updated FileService to be able to desribe blockSize, rootPath and maxFileSize in Smart service format. - Changed function kbmMWUnsignedDigitCount to support cardinal and uint64. - Changed function kbmMWSignedDigitCount to support integer and int64. - Changed TkbmMWSQLXMLData.GetFieldValue to return nil on unknown field reference rather than except. - Changed kbmMW_Arg attribute to use 'name' rather than 'index' for its naming. Fixes ===== - Fixed WaitRun executed in main thread, to correctly continue after scheduled event has excepted due to user code. - Fixed WaitRun executed in main thread, to correctly continuedespite one of the Synchronized forms are used and thus may happen "later" to avoid thread stalling conflicts between main thread and synchronized thread. - Fixed Params not provided for all relevant calls internally in kbmMW ORM. - Fixed Pro compilation errors. - Fixed bug not setting size on autodetected fields containing only NULL values in kbmMWSQLJSONAPI. - Fixed incorrect free's in AMQP client. - Fixed SmartBind to datasources to detect dataset structure changes. - Fixed SmartBind dateTimeStyle variations bug. 5.11.00 May 1 2020 New stuff ========= - Added fluent syntax support to TkbmMWORM via the new Using methods. - Added LINQ support to TkbmMWORM via the new fluent support. - Added UTCEpoch and LocalEpoch conversion methods to TkbmMWDateTime. - Improved custom datetime format conversion in TkbmMWDateTime. - Added DATETIMETOFIXED, FIXEDTODATETIME, LOCALDATETIMETOFIXED, FIXEDTOLOCALDATETIME, UTCDATETIMETOFIXED and FIXEDTOUTCDATETIME SQL functions to TkbmMWMemSQL. - Added support in SmartBind to binding with TkbmMWDateTime values - Added support for sub property binding in SmartBind. Eg. Font.Color - Added support for binding with TStrings in SmartBind. - Added support for binding with Objects list on ListBoxes and ComboBoxes in SmartBind. - Added statesupport in SmartBind, used for example to determine Date/Time validation. Public methods exist: GetState, ClearState, SetState, ResetStates. - Added generic versions of DefineData to SmartBind. - Added support for reference to record binding in SmartBind. - Added new features to kbmMWRTTI.pas - Added new beta CompileTool for easier compilation and installation in Embarcadero environments. Changes/minor additions ======================= - Made SQL rewriter components available as components for all target platforms - Improved SmartEvent shutdown detection. Fixes ===== - Fixed various hints and warnings - Fixed TkbmMWSmartServiceSupport.CallMethod owner ship issue. - Fixed Interbase SQL rewriter with regards to describe table and describe index. - Fixed kbmMWSmartStubGenerator.pas methods to work in C++Builder only installations. - Fixed compilation issues from XE5 and up. - Fixed FileClient and FileService huge file support. - Dropped using inline on pre XE7 compilers since inlining of generics were faulty. - Added support for Epoch and DateTimeFormat conversion on ORM fields. - Fixed not attempting to define indexes which have been defined on calculated fields only in ORM Delphi class generator. - Fixed illegal characters in field names in ORM Delphi class generator. - Fixed UIB adapter compilation. 5.10.20 Dec 25 2019 New stuff ========= * kbmMW Community Edition (CE) made available. CE contains most Enterprise Edition features and is FREE to use under certain circumstances. The application produced with CE may not directly or indirectly have a revenue of more than US$5000 per year (12 months). The company that are responsible or creating the applications produced with CE, may not have a yearly turnaround of more than US$50000. There are technical limitations built in CE compared to kbmMW Professional or Enterprise Edition, some artificial constraints and some related to feature set. CE can be used as a trial for 60 days. Read the full license in license.txt (point 3). - Added support for kbmMW_DatasetRowId attribute on TkbmMemTable properties that are to be marshalled in object notation format. Controls the RowId property of TkbmMWMarshalONStreamFormat. - Added SQLiteDateTimeStyle and SQLiteDateTimeFormat to TkbmMWSQLiteConnectionPool to control how strings should be converted to and from datetime values. Default use ISO8601 format. - Added block cipher ECB support. - Added Shutdown method to TkbmMWBindings. Call Binding.Shutdown when shutting down application to ensure nice exit. - Added Shutdown method to TkbmMWEvents. Call Events.Shutdown when shutting down application to ensure nice exit. - Added GetDefAsValue to TkbmMWONObject. - Adding auto padding and unpadding support to ciphers. Following methods exist: mwpmDefault,mwpm00,mwpmFF,mwpmSpace,mwpmRandom, mwpmISOIEC7816_4,mwpmPKCS_7,mwpmANSIX9_23_00,mwpmANSIX9_23_Random It defaults to how it operated in previous versions. - Added Start, Stop and Shutdown method to TkbmMWScheduler Call Shutdown on app shutdown, to make clean and nice shutdown of application. Changes/minor additions ======================= - Changed TkbmMWCustomThread.Stop to behave the same in NextGen as in non NextGen. - Changed TkbmMWCustomThreadPool.Clear to use DisposeOf instead of Free. - Enhanced TkbmMWMarshalledVariantType.Clear. - Increased debug levels for debug logs in binary parser. - Improved UniDAC with suggestions from users. Fixes ===== - Fixed issue with hopcount in TkbmMWCustomSAFClientTransport.DoOnResponse. - Fixed TkbmMWMarshalledVariantType.Copy to ensure clear of destination to prevent memory leak. - Fixed and improved CDATA and comment parsing in kbmMWXML. - Fixed VCL SmartBinding flickering bug. - Fixed TkbmMWCircularBuffer off by one bug. - Fixed ANSI92 and Oracle SQLRewriter quoting of fieldnames for RewriteExistsTable. - Fixed TkbmMWRTTI.SetValue for setting value on a record. - Fixed kbmMWNullable.GetSafeValue:T on empty/null instance. - Several SmartBind improvements. - Several SmartEvent improvements. - Several fixes and minor improvements to the ORM. 5.10.10 Nov 25 2019 New stuff ========= - Added OnException event property to TkbmMWScheduler. Will be called if some scheduled event internally excepts and the exception is not caught by the user code. - Added Read and Write functions to TkbmMWLock. Calling Read/Write will impose a read or write lock until the end of code block scope. (experimental) - Added more functions to TkbmMWRTTI class. - Added Insert, Append and Delete methods to SmartBind navigator. They support generic list and dataset navigators. - Added Refresh method to SmartBind navigator. Will force a structural refresh of bindings refering to the same navigator. - Added Value[const AName:string]:TValue property to SmartBind navigator. Provides and sets the named current record/item value property. Fixes ===== - Fixed TkbmMWThreadAutoValue.ToString to compile with KBMMW_SUPPORT_FASTMRWSLOCK is not defined. - Fixed TkbmMWFireDACResolver missing from non Win32 platforms. - Fixed TkbmMWBoyerMoore. - Fixed and improved TkbmMWSmartEvent. - Fixed compilation of kbmMWDebugStackTrace. - Fixed Windowed ListView SmartBind for VCL and FMX. - Fixed and improved SmartBind. - Fixed various range errors. 5.10.01 Nov 11 2019 Fixes ===== - Fixed Enterprise Edition installer. - Fixed GetUnitName compilation on Android. 5.10.00 Nov 10 2019 New stuff ========= - Huge amount of improvements to kbmMW SmartBind including See features explained in blog posts at components4developers.blog Data generators Listview VCL and FMX support Binding used string based settings. AutoBind which locates properties or methods which has the attribute kbmMW_AutoBind. The attribute can be either a string based binding or refer to a method which will be called during autobinding to setup all the required bindings for that particular instance. Binding to data proxies for clear model/view separation. Binding images/graphics Break values (grouping header) support (currently ListView) Binding kbmMWDateTime and kbmMWNullable Saving and loading binding definitions to/from object notation formats like XML, YAML, JSON etc. Horizontalscroll, verticalscroll and cell based grid binding. - Added kbmMWSmartEvent.pas. kbmMW SmartEvent is an advanced pub/sub based event mechanism to replace regular Onxxxx event handlers, making it much easier to separate concerns in an application. See videos and blogposts. - Added new TkbmMWConcatStream in kbmMWGlobal.pas. It allows multiple streams to seem as one when reading, without reallocating memory. - Added TkbmMWBoyerMoore class, containing multiple ways to search for sub data in data very quickly to kbmMWGlobal. - Added kbmMWSockClient.pas for a skeleton for an easy to use async client request/response setup. Currently in experimental phase. - Added support for REST to native TCP Transport. Changes/minor additions ======================= - Updated look of wizards. - Added support in kbmMWScheduler for scheduled events indicating ownership to other scheduled events. Purpose is establishing termination ownership and more in nested scheduled events. - Improved TkbmMWScheduledEvent.WaitRuns to allow for external anonymous function to determine is wait is to be extended. - Updated kbmMW LINQ to support using TStrings instances for input and output with optional autoconversion of numeric data. - Updated streamformat controllers with new GetTotalSize class function. - Updated TkbmMWSortedList to support Unique constraint. - Updated TkbmMWThreadList, TkbmMWThreadDictionary and TkbmMWThreadObjectDictionary to support providing a comparer. - Added IkbmMWThreadAutoValue and TkbmMWThreadAutoValue for scope based reference oounted thread safe value variables. - Added CardinalToText, CardinalToHexText, HexTextToCardinal, AddChars to TkbmMWTextPChar. - Added CardinalToText, CardinalToHexText, HexTextToCardinal, AddBytes, ExpectOneOfBytes to TkbmMWTextPByte. - Improved TkbmMWPrettyBinary to include pretty versions of relevant 8 bit characters. - Moved TkbmMWSubscriptionHash to kbmMWGlobal.pas - Added global functions kbmMWVariantToByteArray and kbmMWByteArrayToVariant to kbmMWGlobal.pas. - Added PrettyOptions:TkbmMWPrettyHexOptions and UseStackMap:boolean to IkbmMWLogFormatter in kbmMWLog.pas. Controls how pretty data and stackdumps are produced when logging. - Made minor improvements to kbmMWNullable - Updated kbmMWWinsock.pas - Added ASkipCache:boolean option to TkbmMWCustomPooledDataSet.PopulateData - Added InheritsFromTControl, InheritsFromTComponent, GetInstanceUnit, GetMethods to TkbmMWRTTI - Added String2DateTimeStyle and DateTimeStyle2String to TkbmMWDateTime. - Updated kbmMWObjectNotation with various minor features. Fixes ===== - Fixes and minor improvements to kbmMW ORM - Fixed minor issues in kbmMWDebugStackTrace - Fixed format issues with TkbmMWScheduledEvent.Cron - Fixed bugs in TkbmMWSceduler - Fixed various bugs in kbmMWGlobal.pas - Fixed kbmMWFindReplace in kbmMWHTTLUtils.pas - Fixed bugs in TkbmMWPooledDatasetRefreshSchedulerThread.RefreshDataset - Fixed TkbmMWCustomPooledDataSet.MasterChanged issues. - Fixed TkbmMWRTTI.CompareValue - Minor fixes and improvements in kbmMWYAML, kbmMWSQLite, kbmMWBinaryParser, kbmMWSecurity - Fixed timezone parsing in TkbmMWDateTime.ParseRFC1123DateTime - Fixed bug in TkbmMWInterbaseSQLRewriter.RewriteDescribeTable - Fixed procedure TkbmMWLockFreeHashArray.GC 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.Count property in kbmMWGlobal.pas - Added TkbmMWThreadDictionary and TkbmMWThreadObjectDictionary 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(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(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. 5.08.10 Jan 23 2019 New stuff ========= - Added multiple overloaded variants of kbmMWBackupFile method in kbmMWGlobal.pas to allow for more features. - Added boolean properties Modified and Normalized to TkbmMWDuration to make it easy to figure out if a duration normalization needs to be done. - Added support for MaxBackupCount in TkbmMWLocalFileLogManager. Changes/minor additions ======================= - Changed TkbmMWScheduledEvent.GetIntervalMSecs's algorithm in calculating minimum required probe (sampling) interval. - Added class function GetIsManaged(const AValue:TValue):boolean; class function GetIsInterface(const AValue:TValue):boolean; class function GetIsProbablyRefCountedObject(const AObject:TObject):boolean; to TkbmMWRTTI (kbmMWRTTI.pas). - Changed TkbmMWLocalFileLogManager backup handling to use kbmMWBackupFile instead of its own scheme. That includes adding features to specify max number of log backups via the property MaxBackupCount. Default there is no limit. - Added NormalizedInterval to TkbmMWScheduledEvent which returns a normalized interval (TkbmMWDuration). - Added ProbeIntervalMSecs to TkbmMWScheduledEvent which returns the minimum needed probe (sampling) interval (in msecs) to live up to the scheduled events interval settings. Fixes ===== - Fixed TkbmMWScheduler.WaitRuns not waiting at least one run. Amongst others, affected SameFile in TkbmMWFileClient. - Fixed compilation in older SKU's. Tested with XE5. - Fixed compilation for Android. - Fixed some SmartService leak scenarios. - Fixed rounding problem in TkbmMWDuration.Normalize method resulting in slightly off normalized msecs value. - Fixed TkbmMWScheduledEvent.IsTimeToExecute issue resulting in sometimes wandering outside scheduled second intervals due to interval creep. - Fixed some demos. 5.08.00 Jan 20 2019 Important notes (changes that may break existing code) ====================================================== * Updated transport stream version to 508 to support transporting other TValue based data than interface, object and native values (typical records). Newer servers will detect and support older clients. Newer clients can be forced to older version to support older servers by setting transport.Params[KBMMW_STREAM_FORMATTER_PARAM_STREAMVERSION]:='506' etc. New stuff ========= - Added kbmMWSmartStubGenerator.pas and kbmMWOpenAPIMarshal.pas units (Ent only). Provides easy access to produce OpenAPI (Swagger) REST interface descriptions and Delphi client side stubs for regular kbmMW smart methods. - Added demo projects for OpenAPI and Delphi client stub generator. - Updates to marshal classes to support providing not only instances but also types for OpenAPI support and marshalling record types. - Added kbmMWStrToInt, kbmMWStrToInt64, kbmMWTryStrToInt, kbmMWTryStrToInt64 to kbmMWGlobal.pas. They do specifically not convert hexadecimal values. - Added pure Pascal version of TkbmMWPlatformMarshal.BitCount. - Added kbmMWGCD to calculate greatest common denominator to kbmMWGlobal.pas. - Added ExecuteProcess to TkbmMWProcess in kbmMWProcess.pas. Provides access to realtime process output. - Added support in CallMethod for record type arguments. - Added TkbmMWDateTime.MSecOfSecond methods handling millisecond part. - Added ParseHexadecimal property to TkbmMWONFormat. If true, will support understanding values starting with $ or 0x as numeric hexadecimal values instead of strings. - Added FindProperty functions to TkbmMWONCustomObject. Will search the object notation tree from self, until a property is found with the given name and return the hosting TkbmMWONObject. - Updated TkbmMWScheduler adding additional Cron parse mode: mwscmExtendedMsecAndYear If selected, Cron accepts 8 part Cron value (msecs, secs, min, hour, day, month, weekday, year). - Added several Queryxxxx methods to kbmMWORM for access via TkbmMWORMTable instances. - Added property JournalMode and PageSize to TkbmMWSQLiteConnectionPool. If set will automatically change the database settings, even on existing database. - Added function VerifyIntegrity which when called, will check if a SQLite database is ok or not. - Added backup features to TkbmMWSQLiteConnectionPool. Call the function Backup. - Added validation that SQLite dll is supporting multithreading. - Updated transport stream version to 508 to support transporting other TValue based data than interface, object and native values (typical records). Newer servers will detect and support older clients. Newer clients can be forced to older version to support older servers by setting transport.Params[KBMMW_STREAM_FORMATTER_PARAM_STREAMVERSION]:='506' etc. - Updated TkbmMWRTTI with several new methods. - Updated Use in kbmMWSmartUtils.pas with several new methods to easily convert TArray and other values. Changes/minor additions ======================= - Additional error handling in various places. - Improved TkbmMWAutoValue for non object types. - Changed TkbmMW_ArgAttribute to descend from TkbmMW_CustomSettingsAttribute making it able to receive a settings string, and thus also be supported by configuration syntax. - Updated kbmMWSmartClient to fix serious leak bug in Delphi. - Improved stall detection in TkbmMWScheduler to now also detect stall on timeslot missed by more than 1/16th interval. - Improved error handling during peer disconnection in TkbmMWAMQPClientConnection. Fixes ===== - Minor fixes finalizing and zeroing some interfaces and values. - Compile fixes to kbmMW TCP socket library. - Fixed producing incorrect CORS headers in kbmMWCustomHTTPService.pas - Fixed DBISAM v4 adapter compilation. - Fixed TkbmMWCustomThread.FinalizeThread compile error for some SKU's. - Fixed LINUX compilation. - Fixed bugs in CallMethod in kbmMWSmartServiceUtils resulting in incorrect authorization matching for methods. - Fixed TkbmMWTCPServerTransport to handle large packets. - Fixed dependency leak caused by kbmMWDebugStackTrace not correctly being registered in the dependency framework. - Fixed leaks in kbmMWJSON when parsing invalid JSON. - Fixed ClearDontCheckpointFlag in kbmMWCustomConnectionPool.pas to skip previously deleted records. - Fixed bug parsing # and $ as first character in YAML. 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, mwoqoEQ,mwoqoLT,mwoqoGT,mwoqoLTEQ,mwoqoGTEQ,mwoqoNEQ,mwoqoLIKE, mwoqoEQorNull,mwoqoLTorNull,mwoqoGTorNull,mwoqoLTEQorNull, 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 writable. - 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 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. Fixes ===== - 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. 5.06.20 July 11 2018 Important notes (changes that may break existing code) ====================================================== * Remote Desktop require Seattle or newer to compile. New stuff ========= - Added TkbmMWONObject.AssignObject which assigns another ON object values to the current one, clearing the original values. - Added TkbmMWONObject.MergeObject which merges another ON object values into the current one, potentially preserving the original values. - Added function kbmMWWildcard2RegEx(const AWildCard:string):string; in kbmMWGlobal.pas. It converts a file wildcard string to a valid regular expression string. It supports * and ?. - Added boolean triggerModified option to kbmMW_Field attribute. It controls if changes to that particular ORM field in the class should indicate that the data has been modified and thus resolves. Default true. - Added mwoctfNonDestructive to TkbmMWORMCompatibleTableFlag. Can be used in CompatibleTable, UpgradeTable and CreateOrUpgradeTable to control if only non destructive changes should be made to make an existing table compatible. If set, fields will not be removed, renamed, its field type changed or made smaller in size or precision. Indexes, primary or unique constraints will also not be changed. - Added SkipNoNameColumns property to TkbmMWCSVStreamer. Default false. If false and property Header is true, columns with an empty name will be given a name using DefaultNamePrefix and a column number. If true and property Header is true, columns with an empty name will be skipped. - Added property AutoActivate:boolean to TkbmMWCustomConnectionPool. Default true. If true and a connection is attempted to be obtained the connection pool is automatically set to active, else an exception is thrown. - Added TkbmMWMultithreadMessageActionProcessor which works similar to TkbmMWMessageActionProcessor except all messages are executed completely asynchronously. Be aware that execution order may be different than message post order. - Added new kbmMWProcess unit containing process related classes. (currently only for Windows). - Added function Split(const AGroupFields:string; const AHaving:string=''):IkbmMWLinqStages; to IkbmMWORMStage. It will split data in the stage into multiple stages according to Group By and Having like rules. Eg. stages:=Linq.Using(..).Split('fld1,fld2','fld2>2'); - Added OnLogin2, OnLoginSuccess2,OnLoginFail2,OnLogout2,OnAuthorize2,OnTrace2 events to TkbmMWAuthorizationManager. They are alternatives to existing events and are called after the "old" events. The events take a context instance which contains all information known during the autorization operation. The data in the context can be modified on the fly to override default behaviour. - Added unit kbmMWInfTRNG (Enterprise Edition) which provides support for hardware based true random noise generators for generating random numbers. This is usually considered the cryptographically most secure random generator. Default it supports https://13-37.org/en/infinite-noise-trng but others can be used aswell as long as they can generate random data into a file. TkbmMWInfTRNG32 and TkbmMWInfTRNG64 are surfaced as default random number generator classes. Changes/minor additions ======================= - Updated unittests. - Added (const AWaitUntilStopped:boolean=true) argument to Stop method in TkbmMWCustomMessageProcessor. - Added property TopIfExists:TkbmMWDOMXMLNode to TkbmMWDOMXML. Returns top (non declarative) node if it exists, else nil. - Updated TkbmMWORM.ModifiedValuesToDataset to attempt to leave record position the same. - Updated kbmMWFastCGI unit to use kbmMWProcess unit. - Added function DiffMinutes(const AValue:TkbmMWDateTime):integer; to TkbmMWDateTime. - Added optional ATopName:string to PrepareXMLStorage in TkbmMWConfiguration. Default 'config'. - Remote Desktop require Seattle or newer to compile. Fixes ===== - Fixed TkbmMWDateTime.DiffDays, DiffHours and added DiffMinutes. - Fixed TkbmMWConfiguration bug introduced in 5.06.10 by the case insensitive object notation changes. - Fixed TkbmMWONCustomObject.Path issue when instantiating final ON custom object. - Fixed nasty string sharing bug in TkbmMWStringBuilder when isntance was reused with preceded by Clear. - Fixed A/V in TkbmMWYAMLStreamer.LoadFromUTF16String when not able to parse due to empty or syntax error. - Fixed incorrect calculation in kbmMWMimeDecodedSize which cound result in buffer overruns. - Fixed A/V in TkbmMWBPParser.Create and TkbmMWBPParser.CreateFromString when syntax error or empty definition. - Fixed TkbmMWCustomConnectionPool to ensure all properties are read during component load, before it is set to active. - Improved AMQP client disconnect handling and fixed channel leak. - Fixed IkbmMWLinqStage.GroupBy to require , between field names. - Fixed incorrect TkbmMWDateTime DiffHours and DiffDays. - Fixed bugs in TkbmMWConfiguration. 5.06.10 Beta June 8 2018 New stuff ========= - Added mwrdsum_None to TkbmMWRemoteDesktopScreenUpdateMode. If set it will disable server screengrabbing until set to another value. - Added support for case insensitive TkbmMWONObject property names. Default false. Children nodes inherits setting of their parent upon creation. - Added mwsonoCaseInsensitive to TkbmMWXMLObjectNotationOption to force converstion from XML to Objectnotation to use case insensitive property names. - Added CaseSensitive property to TkbmMWONFormat. Default true. Is used by several ON streamers to determine if object property names are handled case sensitive or not. - Added mwqoONCaseSensitive to TkbmMWORMQueryOption to force returning case sensitive object notation trees from ORM methods. - Added AllowSkipping:boolean (default false) argument to ParseISO8601Time and ParseISO8601Date. Earlier TkbmMWDateTime incorrectly parsed dates/times with prefixed garbage characters. - Added support for rewriting SQL CASE, sub selects and a select set of functions: LENGTH, TRIM, TRIMLEFT, TRIMRIGHT, MID, LEFT, RIGHT, REPLACE, UPPER, LOWER, NOW, DATE, TIME, POS, COALESCE, NULLIF, CASTTOSTRING, CASTTOFLOAT, CASTTOINT, CASTTODATETIME, LASTINSERTID Changes/minor additions ======================= - Cleaned up kbmMWRTTI.pas, kbmMWORM.pas and kbmMWObjectMarshal.pas with regards to getting type name of a PTypeInfo. - Changed TkbmMWSQLJSONData.GetFieldValue to return NULL instead of excepting when a property name is not found. Fixes ===== - Fixed to only capture selected screens in Remote Desktop server. - Fixed TkbmMWDateTimeCompiledFormat.Compile to correctly escape equal sign. - Fixed TkbmMWDateTime.SetISO8601Time to never accept a starting T - Fixed kbmMWCSV.pas missing initialization and finalization sections. - Fixed bufferoverrun bug introduced in 5.06.00 in kbmMWDecodeEscapes. - Removed unused local variable from methods in kbmMWCipherHash.pas. 5.06.01 Beta June 3 2018 Fixes ===== - Fixed missing files in Enterprise Edition installer: kbmMWWinsock.inc, kbmMWPosix.inc, kbmMWSocketTransport.pas, kbmMWTCPServerTransport.pas,kbmMWTCPClientTransport.pas - Fixed ElevateDB adapter compile error. - Fixed incorrectly excluding kbmMWHTTPFileCategoryNames and kbmMWHTTPFunctionNames from compilation when KBMMW_FASTCGI_SUPPORT was not defined. 5.06.00 Beta June 2 2018 NOTICE! Require kbmMemTable v. 7.79.00 Important notes (changes that may break existing code) ====================================================== * BETA BETA BETA BETA * Compiled with XE5 and up. * Officially pre XE5 is no longer supported starting with this release of kbmMW. Project files for XE2, XE3 and XE4 will continue to be included for a while in case someone finds ways to compile and run on those SKU versions stabily. Reason is that generics and anonymous methods will throw compiler errors due to bugs in the compiler. Code that compile with those unsupported SKUs, may fail at runtime due to compiler bugs. We recommend XE7 and up. * Remote Desktop not supported pre XE7 due to missing Windows definitions * Renamed TkbmMWMetaDataDateTimeStyle to TkbmMWDateTimeStyle and moved it to kbmMWDateTime.pas * Changed name of kbmMW auto generated indexes from I_.... to I_KBMMW_.... by using new KBMMW_DB_AUTO_INDEX_PREFIX constant. * Changed all ORM methods previously taking dynamic const arrays, to take dynamic array of TValue. It may require you to change code to TValue.From(..). New stuff ========= - Added new native Socket library which C4D have perpetually licensed for use under the kbmMW license terms from WiNDDRiVER(soulawing@gmail.com) This library provides the fastest most scalable and most efficient socket communication across all platforms. We have included Alpha versions of new TkbmMWTCPServer and TkbmMWTCPClient transports which we expect to work more on in the future kbmMW releases, and which we expect will be our default transport classes some time out in the future. Please notice that our bundled version of the perpetually licensed socket library is fully copyright Components4Developers, and adheres in full to the kbmMW license. - Added new advanced CSV object notation streamer with support for custom date/time, optional type detection, header/noheader, skip/limit and much more in kbmMWCSV.pas - Added support for messagepack timestamp extended type. - Added new TkbmMWONFormat class for object notation formatting. - Added ClientInterface property to IkbmMWServerTransportInfo and IkbmMWClientTransportInfo. - Added 'strict' flag to kbmMW_ServiceAttribute. Eg. kbmMW_Service('name:biolife, flags:[strict]')] It is currently only used by services descending from TkbmMWCustomHTTPSmartService. If set, the service will not attempt to call back to parent versions of a service, in case there is no match for the function being called by the client. Instead it will except. - Added support for Accept HTTP header type in TkbmMWHTTPTransportStreamHelper. - Significantly improved ORM index structure detection and create/upgrade support, including detection of system indexes (indexes created by the DB to support a constraint). - Further improved SQL rewriter and metadata handling, including support for detecting reserved keywords, improved field and table name quoting and more. - Updated LINQ support. Added ID property to LINQ stage which purpose is to be able to identify data for a stage. Default value 'data'. Added new Query method to LINQ stage. It takes a complete SQL statement. Use the LINQ stage ID as tablename. Default 'data'. Added AsON method to LINQ stage which converts data in current LINQ stage to an object notation object. Added UsingCSV methods to LINQ, which supports loading CSV data. Added UsingON method to LINQ which takes an object notation object. - Added kbmMWSize2PrettySize to kbmMWGlobal.pas and updated many methods/functions for performance and features. - Improved kbmMWScheduler.pas: Added TkbmMWScheduleCronMode to kbmMWScheduler.pas. Is used with Cron method to determine exactly which Cron format to support. mwscmStandard,mwscmExtendedYear,mwscmExtendedSecond,mwscmExtendedSecondAndYear Added method WithOwnedObject which can be used to bundle an object with an event and ensure that the object is automatically freed on event destruction. Added EndingAfterRuns method which can be used for ending and deactivating an event after x number of successful runs. Added EndingAfterStalls method which can be used for ending and deactivating an event after x number of stalls. Added UnscheduleAtEnd method which controls if an event that is ending will be automatically unscheduled and thus freed. Default false. Added OwnedObject, MaxRuns, MaxStalls, Unschedule properties. - Improved ORM in definition of when generators fire (insert/update/delete) (default only insert) and if they fire if the field already have a value (default no). Use with kbmMW_Field: generatorMode:allways generatorMode:"when null" generatorMode:null (alternative to when null) generatorStates: [insert, update, delete] - Added ORM auto fetch joined objects. Will automatically attempt to join related data when defined in kbmMW_Field attribute. The joined data may be another object, a list of objects or a simple field. Check blogpost and demo for more details. source:xxxx, value:xxxx, sourceKeyFields or sourceKey:xxx or [xxx,..xxx] keyFields or key:xxx or [xxx,..xxx] Value can contain an expression referincing other fields in the class. - Added support for adding dynamically created TkbmMWORMTable which are not related to a specific class or record. Its useful for some advanced dynamic table handling situations, where you want to specifically define fields/indexes and let the ORM handle creating/upgrading a datastorage to match. - Added support for auto detection of XML and JSON bodies sent to a REST server. All other mimetypes are still provided as an array of bytes. Hence an argument to a method, now take a TkbmMWONCustomObject in case JSON or XML is sent in the body along with a correct mimetype. - Added SurfaceDynamicTable to TkbmMWORM. It will take a tablename of any table accessible in the datastorage, and attempt to surface it as a TkbmMWORMTable (with relevant fields and indexes). It makes it possible to access data in datastorage without compiletime binding to a class/record. - Added new overloaded methods to TkbmMWORM to be able to operate on dynamic TkbmMWORMTable instances. - Added Execute overloaded methods to TkbmMWORM to allow executing DDL SQL. - Added QueryON methods to TkbmMWORM to return result as TkbmMWONCustomObject in object notation format. - Added QueryDataset methods to TkbmMWORM to return result directly as a TDataset. - Added TkbmMWDateTimeCompiledFormat to kbmMWDateTime.pas. It supports parsing and producing strings according to a specific format. Syntax: %Y = 4 digit year ([12]\d{3}) %Y1 = 2 digit year 19xx (\d{2}) %Y2 = 2 digit year 20xx (\d{2}) %Y3 = 2 digit year >=50=19xx, <50=20xx (\d{2}) %M = 1 or 2 digit month (0[1-9]|1[0-2]|[1-9]) %M1 = 3+ char US month name ... %M2 = 3+ char locale month name ... %D = 1 or 2 digit day (0[1-9]|[12]\d|3[01]|[1-9]) %H = 1 or 2 digit hour ([0-1]\d|[2][0-3]) %N = 1 or 2 digit minute ([0-5]\d)) %S = 1 or 2 digit second ([0-5]\d)) %Z = 1,2 or 3 digit millisecond (\d{1,3})) %T = Timezone ([\+\-]\d{1,2}\:\d{2})|((([a-zA-Z][a-zA-Z0-9_]*)(\/[a-zA-Z][a-zA-Z0-9_-]*)*)([\+\-]\d{1,2}\:\d{2})?) %P = A/P/AM/PM (AM|PM|A|P) %i = Ignore one character . %Ix = Ignore all characters until x [^\x]* %% = % Eg. %Y-%M-%D %H:%M:%S // Automatically generate matching regexp %D.%M.%Y %H:%M:%S // Automatically generate matching regexp %D.%M.%Y=(\d{2}).(\d{2}).(\d{4}) // Use provided regexp when parsing. Parses and outputs: 20.05.2018 Dato\=%D.%M.%Y='Dato='(\d{2}).(\d{2}).(\d{4}) // Use provided regexp when parsing. Parses and outputs: Dato=20.05.2018 - Added UTCAsFormat, LocalAsFormat, UTCDate, UTCTime properties to TkbmMWDateTime. - Added TrySetAsLocalFormat, TrySetAsUTCFormat methods to TkbmMWDateTime. - Added TkbmMWGregorianCalender to TkbmMWDateTime. Currently it can calculate western and eastern Easter start/end dates for any year. - Updated remote desktop client/server code: Added support for attaching one TkbmMWRemoteDesktopClient to another to make them share a connection. One could for eaxmple show a readonly live iconic view. When clicked on, a larger form could be shown with another non readonly TkbmMWRemoteDesktopClient attached to the iconic one. Attach/unattach using the Attach method. Added Reboot method that client can call server to request a reboot. Added OnTransferFile event in client. Called when a file transfer is in progress. Added hugely improved clipboard transfer. Now files can be cut/copied/pasted between client and server. - Updated TkbmMWBinaryParser to support debugging/stepping. - Added new TkbmMWBPVisualizer control which can visualize the binary parser protocol and parsed data and allows for debugging/stepping. - Added support for honoring Accepts header field in smart HTTP service. - Added support for basic authorization in kbmMWHTTPSysServerTransport.pas - Added kbmMWSmartLocalClient.pas which contains a smart client which can be used directly within the same application that hosts the TkbmMWServer instance. Use TkbmMWSmartLocalClientFactory.GetClient to instantiate a client to use. Fixes ===== - Fixed assigning transport parameters to constructed messages in WIB transports. - Fixed returning RowsAffected upon Resolve. - Fixed compilation of kbmMW UIB adapter. - Fixed several issues and made improvements to TkbmMWHTTPTransportStreamHelper. - Fixed issues in TkbmMWMarshalledVariantType when using interface type variants. - Fixed bug not escaping \ correctly in some scenarios in kbmMWJSON.pas. - Fixed name clashing in kbmMWScheduler.pas when compiling under some C++ versions. - Fixed some initialization bugs in TkbmMWDateTime. - Fixed TCPIP and UDP Synapse transport compile error. - Fixed bugs in kbmMWHTTPSysServerTransport.pas. Changes/minor additions ======================= - Updated transport stream format to 506 to support messagepack temporenc date/time streaming instead of ISO8601. - Improved handling and differentiating between Date/Time, Date and Time in Object notation SQL API. - Renamed TkbmMWMetaDataDateTimeStyle to TkbmMWDateTimeStyle and moved it to kbmMWDateTime.pas - Changed name of kbmMW auto generated indexes from I_.... to I_KBMMW_.... by using new KBMMW_DB_AUTO_INDEX_PREFIX constant. - Added global variable: kbmMWOSVersion which directly informs about current OS version. - Improved comment handling in XML, including preserving them as nodes, which can be restreamed and/or converted to object notation. - Changed so AddXMLDeclaration always inserts the declaration in root of XML. - Added optional default/defaultValue to kbmMW_Rest attribute. Can be used for providing a default value for an argument in a method definition. - Improved kbmMWRTTI.pas with more features and enhancements including faster generic list support. - Changed all ORM methods previously taking dynamic const arrays, to take dynamic array of TValue. It may require you to change code to TValue.From(..). - Updated TkbmMWONNative with many more methods to ease access and support of default values. - Updated TkbmMWONArray to support enumeration and added many more methods to ease access. - Updated TkbmMWONObject with many more methods to ease access. - Improved TkbmMWHTTPCustomValues and parsing/generation of HTTP header fields and options. - Added 'scenario:xxxx' to kbmMW_Ignore attribute. It makes it possible to ignore marshalling of a particular field/property in specific scenarios. A scenario is a string. The marshalling classes supports a Scenario property which can be set before marshalling/unmarshalling to enable a specific scenario. - Updated kbmMWDecodeEscapes in kbmMWHTTPUtils.pas to properly handle Unicode. 5.05.10 Feb 17 2018 NOTICE! Require kbmMemTable v. 7.78.10 New stuff ========= - Added new TkbmMWISAPIRESTServerTransport REST capable ISAPI server side transport. Fixes ===== - Fixed ORM kbmMW_Field ignores name. - Improved ORM MSSQL support - Fixed kbmMWNullable scope related issues in a loop - Fixed ORM SQL92 bugs - FireDAC adapter improvement. Added UseOpenOrExecuteOnExecute. Default false. - ORM field datatype detection and field metadata changed improvement. Now assumes unique and required with field is primary. - Fixed 64 bit HTTPsys transport bug - Fixed special case YAML leak 5.05.00 Feb 11 2018 New stuff ========= - Added support for tracking dependency deregistration leaks. It is enabled if KBMMW_DEBUG_DEPENDENCY is defined in kbmMWDependency.pas - Added Declared property to TkbmMWXMLMarshal. If true will declare namespaces in the XML. - Added function IfNotRunning:IkbmMWScheduledEvent flow method to TkbmMWScheduler. It can be used with Run to ensure that there is not scheduled two of the same event at the same time. If Name is given, that is used for unique validation, else event method/anonymousfunction/anymousprocedure is used. If an existing Run is already scheduled the new attempt to schedule one, is ignored. - Added QueueLength to TkbmMWHTTPSysServerTransport. Default 1000. Defines max number of outstanding request. - Added defaultDeleteMethod to TkbmMWTableAttribute. It determine what to do in a table when an object is to be deleted. It can be set to: - default or delete which is the normal way. The record is deleted. - mark Marks a record as deleted, but do not actually remove it. Queries via the ORM will respect the marking and default only return non deleted records. Mark should be used in combination with the new deleteMarkProperty and deleteMarkValue settings. deleteMarkProperty defines which property name (field) to put the mark in (default 'delete') deleteMarkValue defines which value to put into the property (field) when the record is marked as deleted. Default true. - move Moves a record to another table. Should be used in combination with deleteMoveToTable which must contain the object name of the table that is to receive the record. - Added display setting to TkbmMW_FieldAttribute. Eg. display: { name: 'abc', width:20, visible:false } It defines default presentation values for a field. - Added oldNames setting to TkbmMW_FieldAttribute. Eg. oldNames: [ "field1","field2" ] If a property is renamed, adding all the old names for which this property is known, in this list, will make the ORM able to automatically upgrade tables with renamed fields. Notice that no new field name may exist that collides with an old field name in this list! - Added function RewriteStatement(const AStatement:string; const AQueryMode:TkbmMWORMQueryMode=mwoqmMW; const AOptions:TkbmMWORMQueryOptions=[]):string; to TkbmMWORM easily allowing rewriting of kbmMW SQL statements to the ORM connected database format. - Added additional overloaded Persist generic methods to TkbmMWORM. - Added optional TkbmMWORMQueryOptions to may TkbmMWORM methods, to allow retrieving records otherwised marked as deleted by providing [mwqoIgnoreDeleteModification]. - Added RandomDouble and RandomFraction functions to TkbmMWCustomRandom in kbmMWRandom.pas. Makes it easy to return random values within a specific range. - Added several Make class methods to TkbmMWCustomRandom to allow easy creation of a random number without needing to manually instantiating an instance of the random number generator. - Added support in REST transport stream format to generate request streams, and thus make it possible to use a TkbmMWSimpleClient as a REST client. - Added support in REST transport stream format to responding in XML or JSON depending on set contentType in the response stream format. - Added Make class functions to all password generators in kbmMWPassword.pas making it easy to create a secure random password. - Added optional path argument to PreparexxxStorage methods in TkbmMWConfiguration. Makes it possible to specify exactly where the configuration should be retrieved from /stored to. - Added Reset method to TkbmMWConfiguration which resets the configuration to default. - Added optional default setting to TkbmMW_ConfigAttribute, which is used to set the default value of the configurated item. - Added support for marshalling dynamic arrays in kbmMWObjectMarshal. - Added support for mwefInline in TkbmMW_ElementAttribute. Will instruct marshaller to attempt to inline the element without the subelements root. Elements marshalled like this can not be automatically unmarshalled again. - Added TkbmMWPrettyBinary class to kbmMWGlobal.pas. Supports formatting binary data as a pretty hex dump. - Added function kbmMWGetDocumentsDirectory:string and function kbmMWGetSharedDocumentsDirectory:string to kbmMWGlobal.pas for cross platform access to valid storage paths. - Updated transport stream format to 505 to support optional future use Duration response value. - Added properties ComparativeMSecs:double, ComparativeSecs:double, ComparativeMinutes:double and ComparativeHours:double properties to TkbmMWDuration. Returns values that can be compared. - Added Normalize method to TkbmMWDuration which will normalize a duration value. Eg. 36 hours will be 1 day and 12 hours. - Added OnAfterLog event to TkbmMWCustomLogManager. - Added support for LogYAML, DebugYAML and LogStream methods to TkbmMWCustomLogManager and TkbmMWLog. - Added support for specifying pretty mode when logging binary mode in TkbmMWLog. - Added RemoveLogManager method and ForwardFilterSettings boolean property to TkbmMWTeeLogManager. The later decides if settings on the Tee log manager is also set on its registered log managers. - Added TkbmMWVirtualLogManager and IkbmMWVirtualLogManager which will call an anonymous function each time the logmanager is to log something. Can for example be used for storing elect logs in a database. - Added support for ALTER TABLE RENAME COLUMN type operations in kbmMWSQLRewriter. - Added support for table based metadata as supported in SQLite v 3.16.x+ in kbmMWSQLRewriter. kbmMW will automatically detect version and use appropriate. It is recommended to use latest SQLite version since it provides better access to index definitions and default values of fields. - Added support for declared and typed booleans settings in kbmMW_RestAttribute. If declared is true, XML will contain full ?xml and namespace declarations. If typed is true, XML will contain typed nodes. - Added EkbmMWHTTPException exception and kbmMWRaiseHTTPError function to allow raising specific HTTP errors. Eg. kbmMWRaiseHTTPError(407,'.....'); - Added TkbmMWRTTIAliasAttribute which makes it possible to define attributes for types otherwise not actually declared in code, by defining a dummy class as alias to a known, but not declared type. - Added new kbmMWLinq.pas unit providing a global Linq variable which can be used to make LINQ like operations on data. Only supported in Enterprise Edition and only from XE5 and up. Fixes ===== - Fixed TkbmMWXMLMarshal marshalling. - Fixed YAML parsing bugs. - Fixed TkbmMWAuthorizationManager to easily support dirived authorizations. - Fixed bugs in TkbmMWConfiguration. - Fixed bugs in TkbmMWONStats. - Fixed occational A/V caused by TkbmMWCustomValueReplacementVisualizer at designtime. Changes/minor additions ======================= - Improved TkbmMWXMLMarshal mashalling. - Improved TkbmMWSQLXMLData. - Fixed and improved TkbmMWHTTPSysServerTransport. - Updated TkbmMW_VirtualTableAttribute and to easily support visibility (private/protected/public/published) settings. It makes it easy to automatically consider for example all published properties to be stored and retrieved from the table. - Significantly updated TkbmMWBinaryParser. Please notice that definition format has changed. See samples. - Updated TkbmMWCustomSQLMetaData to use SQL rewriter when applicable (and supported). - Updated TkbmMWCustomSQLMetaData to attempt detection of more blob types. - Implemented fixes to make most code compilable in pure C++Builder environments. 5.04.40 Dec 12 2017 New stuff ========= - Updated kbmMWLog.Output... methods to allow more detailed configuration. - Added support for DEFAULT in SQL ADD COLUMN and MODIFY COLUMN in kbmMWSQLRewriter. - Improved kbmMWSmartServiceUtils to auto convert body to string argument (UTF8 assumed), alternatively TArray argument. - Added support for Exists in TkbmMWFileClient and similar on FileService. Fixes ===== - Fixed kbmMWHTTPSysTransport to correctly handle in memory body. - Fixed KeepPartialFileOnException not removing failed file bug in TkbmMWFileClient. - Fixed TkbmMWHTTPSmartService not handling autorization attributes correctly. - Fixed YAML not respecting quoted : - Fixed compilation for XE5/XE6 - Fixed kbmMWHexStringToInteger when starting with 0x or $ - Fixed incorrect stopping transport heartbeat when a client disconnects. - Updated UNIDAC adapter (thanks to Tom Yu). Changes/minor additions ======================= - Improved performance of TkbmMWScheduler. - Various other debug features like optional stack trace on TkbmMWLock timeout and such. 5.04.32 Nov 20 2017 Fixes ===== - Changed TkbmMWCustomSimpleClient.OnException to return boolean value. Return true if the exception should be reraised, else false. - Fixes exception handling in TkbmMWCustomSimpleClient. 5.04.31 Nov 20 2017 Fixes ===== - Fixed compilation errors on NextGen compilers. 5.04.30 Nov 19 2017 Important notes (changes that may break existing code) ====================================================== * Renamed elements of TkbmMWSQLResolverNameCase to (mwncUnaltered,mwncUpper,mwncLower). This is a breaking change that require you to open/save all forms/datamodules on which metadata components are placed to avoid property name error issues at runtime. New stuff ========= - Added unittest project in Enterprise Edition, testing kbmMWORM, kbmMWDateTime, kbmMWNullable and kbmMWConfiguration. It require DUnitX. - Added Default column value support to ORM, kbmMW_Field attribute and metadata/rewriters. A Default value is required if the field is declared not null and kbmMW shall upgrade the table storage automatically. Syntax example: [kbmMW_Field('name:fld4, unique:true, default:0',ftFloat)] [kbmMW_NotNull] - Added public List property to TkbmMWServers. - Added OnServiceDefinition to TkbmMWServer which is called whenever a service definition is created due to registration of a service using AutoRegisterServices. - Added protected ProcessCustomAttributes to TkbmMWCustomServiceDefinition. It allows custom service definitions to process attributes upon AutoRegisterServices. - Added Multiply operator overload to TkbmMWDateTime. - Added ExceptOnPersistError boolean to TkbmMWORM. If true, it will throw exceptions if any persist/insert/delete/modify fails. Else persist errors are silent. - Added overloaded Insert, Delete, Modify and Persist methods to TkbmMWORM that takes additional anonymous AFunction that will be called if persistence fails. - Changed ValuesByField procedure on TkbmMWCustomResolver to take additional const AWhat:TkbmMWResolverSetValues which controls which version of the record should have its value set. - Changed GetDefAsArray and GetDefAsObject of TkbmMWONObject to take additional argument: const AAutoCreate:boolean = true. If false nil is returned if no array or object is found for the property. - Added support for using simplified inline YAML syntax for RTTI settings attributes. - Added new kbmMW_HTTP attribute for TkbmMWCustomHTTPSmartService. Syntax: [kbmMW_HTTP('accept:[f,...], root:[c:path,...], template:[c,...], mimeTypes:["BIN=application/octet-stream",...], charSets:["DOC=utf-16",...])] where f can be unknown,get,put,head,post,delete,trace,connect,options,patch c can be html,css,script,media,other each followed by a path accept controls which types of operations should be accepted by the service. root controls which directory to look for the given resource type. template controls if a resource type should be considered a template and thus subject to macro replacement. mimeTypes add/overwrites to the existing known mimetypes. charSets add/overwrites to the existing charset types. Example: [kbmMW_HTTP('accept:[get], root:[media:"c:\someimages", html:"c:\somehtml"]')] TMyHTMLService = class(TkbmMWCustomHTTPSmartService) - Added properties EnabledFileCategories and EnabledFunctions to TkbmMWHTTPServiceDefinition. Controls which functions and file categories the service will handle. - Added SimplifiedInline:boolean (default false) property to TkbmMWYAMLStreamer. It allows for syntax like this: [ a:b, c:d ] which is not accepted standard YAML syntax. Standard YAML would write [ a:{b}, c:{b} ]. Hence simplifiedinline should be used with care if at all, since it is not standard YAML syntax and can have sideeffects. But it is good for kbmMW's settings attributes syntax. - Added ADenyWrite:boolean property to TkbmMWFilePool.Access method to allow better control over share rights to file handles. - Added overloaded HTTPResponseFromFile methods to TkbmMWCustomHTTPService. Allows for easily naming file for receiving browser and for deciding if to map file path or not. - Added SetResponseFileName to TkbmMWCustomHTTPService to define content-disposition, filename header field. - Added public property OnException to TkbmMWCustomClient. If an event handler is provided, any exceptions within the request operation of a TkbmMWCustomClient will be catched and forwarded to the eventhandler, else the exception will be thrown as usual. Fixes ===== - Fixed TDateTime vs TkbmMWDateTime issues in TkbmMWServer. - Fixed kbmMW Database adapter wizard adding missing AOwner argument to API methods. - Fixed invalid properties in TkbmMWCustomHTTPService.dfm - Fixed warnings in kbmMWPassword, kbmMWHashSHA512, kbmMWHashFNV1A and kbmMWRandom. - Fixed MetaExists declaration in DBISAM3 and DBISAM4 adapters. - Removed explicit operator overload from TkbmMWDateTime. - Fixed ORM UpdateGeneratorFields issue when it was overwriting preassigned value of a field with generator attribute, if any other fields needed auto generator assistance. - Fixed UpdateGeneratorFields to handle update statements where original field with generator attribute is null. - Fixed WaitRuns bug in TkbmMWScheduler. - Fixed too early clearing ChildEvents in TkbmMWScheduler. - Fixed a couple of YAML parsing bugs. - Fixed raising exception if TkbmMWCustomFileClient errors and no OnAccessException is defined. Changes/minor additions ======================= - Changed so kbmMWGetFileSize do not require file to be exclusively available. - Renamed elements of TkbmMWSQLResolverNameCase to (mwncUnaltered,mwncUpper,mwncLower). This is a breaking change that require you to open/save all forms/datamodules on which metadata components are placed to avoid property name error issues at runtime. 5.04.20 Nov 12 2017 New stuff ========= - Added ability to Schedule batches of tasks as one job, similarly as Run. Using Schedule, it can be recurrent. Fixes ===== - Updated several database adapters with various fixes. - Fixed error popping up in TkbmMWCustomHashItem when range check is enabled in compiler. - Fixed bugs in kbmMWScheduler. - Fixed leaks in kbmMWScheduler related to scheduling of batches of tasks. - Fixed TkbmMWLockFreeHashArray2.Enum not returning AKey2 value. This shows up if one enable the nice debug flag KBMMW_MREW_NOTIFY_LONG_LOCKS_DEBUG (generally not to be used in production). It ensures that deadlocks due to locking will show up in the Windows monitor with exact info about which thread(s) held the lock and the type of lock. - Fixed off by one in counting when to GC a service instance resulting in leaving one too little left when minimum of instances has been defined. - Fixed service GC issue when a service has a very long running operation that times out and thus should be removed, resulting in less than defined minimum number of instances. - Fixed kbmMWMT database adapter's resolver to not require a table name. - Fixed TkbmMWConfiguration. Changes/minor additions ======================= - Updated MT demo to match current kbmMW version. - Significantly improved XML SaveToObjectNotation and LoadFromObjectNotation. Amongst other s added the following options: mwxonoAutoIdentifyArrayElement - Set to include i=IndexNumber of array attribute. mwxonoReservedNameAsElement - Set to not interpret id and type names but instead treat them as elements. mwxonoAutoNumberUnnamedArrays - Set to add array level to unnamed arrays. If not set, sub array will have same name as parent. - Added BSON as storage format for TkbmMWConfiguration. - Added Prepare...Storage utility methods to TkbmMWConfiguration to easily setup specific storage type. - Added kbmMWConfiguration sample. - Added SetDateTimeTimeZone to TkbmMWDateTime, which specifically sets a datetime with a specific timezone. 5.04.10 Nov 3 2017 Fixes ===== - Fixed bugs and improved XML<>ON conversion. - Fixed bugs in TkbmMWConfiguration. Changes/minor additions ======================= - Added KeepAliveTimeout and KeepAliveInterval to Indy TCP server transports 5.04.00 Nov 2 2017 New stuff ========= - Added OnAccessException event to TkbmMWCustomFileClient. - Added Checksum, ChecksumEx, SameFile, SameFileEx, LocalChecksum to TkbmMWCustomFileClient Checksum(Ex) and LocalChecksum use SHA256 to calculate checksum. SameFile(Ex) calculates checksum on both local and remote file and compares those. On platforms supporting TkbmMWScheduler, the calculations are run in parallel. - Added WithObject and WithInterface to TkbmMWScheduledEvent to allow piggybacking additional data to events. - Added additional overloaded SynchronizedAfterRun and AfterRun for anonymous procedures to TkbmMWScheduledEvent. - Added WhenException methods to TkbmMWScheduledEvent to allow handling exceptions. - Added WaitRun(s) to TkbmMWScheduledEvent to allow pausing a thread until an event has finished running. - Added additional Run/RunNow methods to TkbmMWScheduler to allow for scheduling multiple parallel jobs that will be run under control of one scheduled event. Only when all jobs has run, the scheduled event is considered to have run. - Added mwxonoPreferAttributes and mwxonoAutoIdentifyArrayElement to TkbmMWXMLObjectNotationOption. mwxonoPreferAttributes controls if conversion from object notation should prefer defining XML node values as attributes or as elements. mwxonoAutoIdentifyArrayElement controls if conversion from object notation should include index (i) attribute to precisely identify a row in an array. - Updated many database adapters to prevent certain leaks on exceptions. - Added MaxFileSize to TkbmMWFileServiceDefinition to define maximum size of file that is allowed to be received by the server. Default no limit. - Added TkbmMWVirtualConfigurationStorage to kbmMWConfiguration unit. It allows for getting and storing configuration from any type of medias. - Added TkbmMWMarshal.Bytes2Memory function in kbmMWGlobal. - Added ToString to IkbmMWAutoValue. - Added kbmMWExplode function to kbmMWGlobal. It allows for exploding strings with start and end tags as delimiters. - Added PrettyChar2String function to IkbmMWLogFormatter. - Made Char2PrettyChar function in IkbmMWLogFormatter implementers public. - Added support for detecting version of databases for some databases in TkbmMWCustomConnectionPool. - Added TkbmMWThreadONObject and TkbmMWThreadONArray to kbmMWObjectNotation. They allows for multithreaded access to the same base object notation object or array. - Added additional support for CoInitialize and CoUnInitialize for UNIDac adapter. - Added BasicProperties property to IkbmMWAMQPChannel. - Updated database adapter wizard to generate up to date code. - Improved stability of TkbmMWFileService, TkbmMWFileClient and TkbmMWFilePool. - Improved error handling in kbmMWORM. Fixes ===== - Fixed bugs in TkbmMWScheduler. - Fixed compilation errors in AMQP on some IDE SKU versions. - Fixed header properties not available under some circumstances in AMQP. - Fixed bugs in TkbmMWAuthorizationManager. - Fixed bugs in kbmMWConfiguration. - Fixed bugs in kbmMWHTTPUtils resulting in stack overflow. - Fixed some null handling issues in TkbmMWObjectNotation. - Removed leftover debug code from TkbmMWBPStringMaskPart. - Fixed bugs in TkbmMWAMQPChannel. - Fixed NULL marshalling issue in TkbmMWONNullableMarshal. - Fixed kbmMWServer not instantiating minimum number of services at startup. - Fixed IDE Debug visualizers. Changes/minor additions ======================= - Improved GetStreamEx and PutStreamEx to allow for retry on failure in TkbmMWCustomFileClient. - Generally improved exception and error handling in TkbmMWCustomFileClient. - Improved PutStreamEx to include offset and total file size in server call. - Improved TkbmMWSQLiteMetaData to support obtaining version meta data and index info from older SQLite versions (pre 3.8.3) 5.03.00 Sep 16 2017 Important notes (changes that may break existing code) ====================================================== * Fixed Delphi C++ HPP generator errors related to kbmMWNullable.pas and kbmMWDateTime.pas The changes needed to fix it for kbmMWNullable.pas unfortunately require us to default unsupporting assigning of a variant directly to a kbmMWNullable. However if you are using Delphi ONLY and will never use the C++Builder header files you can add {$DEFINE KBMMW_DELPHI_ONLY} in kbmMWConfig.inc. Then you can still assign a variant directly to a kbmMWNullable in Delphi. The changes in kbmMWDateTime is using overloaded versions of methods instead of using default value Math.NaN which is translated incorrectly by the HPP emitter. * Removed PrependTableName from all metadata classes and thus it may error with missing property on opening forms/datamodules containing metadata components. Ignore that specific property missing error and save. New stuff ========= - Added support for defining root type for marshalled objects. Array or Object. - Added support for using nth next best marshalling type if primary is not registered in known types. - Added log to AutoRegisterServices in kbmMWServer.pas - Added support for bit values in YAML. A bit value starts with b or B and contains only 0 or 1's - Added support for default metadata class for database adapters. It will be used when no explicit metadata component has been linked to the connection pool. - Added OnLoginSuccess and OnLoginFail events to TkbmMWAuthorizationManager. - Added support for understanding bit values in TkbmMWObjectNotation. - Added Path method to TkbmMWONCustomObject which will take a delimited path and traverse the tree optionally adding needed objects on the way. - Added support for custom properties and basic properties in AMQP. - Added support for Default date/time in TkbmMWDateTime. - Added Reset method to TkbmMWDateTime, completely clearing its value. - Added additional constructors to TkbmMWDateTime allowing direct timezone information. - Added Memory2Binary and a number of BitCount methods to TkbmMWPlatformMarshal. - Added support for reference counted data in TkbmMWAutoValue. - Added kbmMWGetApplicationVersionInfoAsString and kbmMWBackupFile global methods to kbmMWGlobal.pas. - Added support for specifying quote in kbmMWQuoteString and kbmMWUnquoteString. - Added support for different start and endquote in kbmMWImplode. - Added kbmMWDigitCount2Multiplier, kbmMWUnsignedDigitCount, kbmMWSignedDigitCount and kbmMWExplodeFloat to kbmMWGlobal.pas, which determines metadata of a float value. - Added kbmMWBitStringToInteger and kbmMWIntegerToBitString to kbmMWGlobal.pas - Added overloaded Get method to TkbmMWSmartClientORM requesting dataset from server, returned as an object/list, and providing custom arguments. - Added overloaded RunSQL methods to TkbmMWMemSQL allowing executing SQL directly on one or more provided TDataset sources. - Added support for multistatement execution in TkbmMWMemSQL. Statements are separated by semicolon. - Added support for salting initial string or byte keys in kbmMWCipherHash.pas. - Added Clone method to TkbmMWCustomDef in kbmMWConnectionPool.pas - Added support for detecting deleted fields in TkbmMWFieldDefs. - Added MetaGetDef and MetaRename functions to TkbmMWCustomMetaData. - Added significant changes to TkbmMWCustomSQLRewriter, including datatype mapping and rewriting of numerous statement types. - Added DefaultMetaData and CurrentMetaData properties to TkbmMWCustomConnectionPool to allow for using kbmMW specified default metadata, alternative specific assigned on. - Added support for piping outcome of query thru internal SQL statement as postprocessing in TkbmMWCustomPooledDataset. Syntax: somequery somepipestatement somequery is the query sent to the backend database. The resultset from that is the piped thri the kbmMW SQL type somepipestatement. Use constant KBMMW_QUERYPIPE to add pipe statement. - Added support for mwfdctStrictPrecision and mwfdctStrictSize in TkbmMWFieldDefs.ChangedFields. Strict indicates values must match exactly. - Added DeletedFields, DeleteByFieldName and GetByFieldName to TkbmMWFieldDefs. - Added additional overloaded Rewrite methods to TkbmMWCustomSQLRewriter. - Added Terminate to TkbmMWScheduledEvent to prematurely terminate ongoing execution. - Added Delay method to IkbmMWScheduledEvent which can be called at any time including during execution of the said event to add additional delay to the coming run's of the event. - Added support for multistatements in kbmMWSQLite.pas - Vastly expanded TkbmMWCustomSQLMetaData. - Added support for readonly and virtual field attribute in TkbmMW_FieldAttribute (kbmMW_Field) - Added new TkbmMW_VirtualFieldAttribute (kbmMW_VirtualField) to indicate field which will show up in resultset but do not exist in datastore. - Added CreateDBDataset to TkbmMWORM which will generate a TDataset matching the referenced TkbmMWORMTable. - Added CompatibleTable, GetUpgradeTableStatements, UpgradeTable to TkbmMWORM which are used for checking if a class is compatible with the underlying datastore, and which can either directly upgrade the underlying datastore or suggest statements to make the upgrade happen. Use with caution on production systems! - Vastly expanded kbmSQLRewriter.pas to support metadata, indexes, new statements etc. - Added Reset method to kbmMWNullable to reset its contents. - Added PrettyChar to TkbmMWCustomLogFormatter to be able to selectively choose what each byte value should display in the log. - Added additional Warning, Error and Fatal overloaded methods to TkbmMWLog. - Added support for property AutoSplitLines in TkbmMWStringsLogManager. - Added support for providing HTTP related values (mwatURL, mwatHost, mwatUserAgent, mwatHeader (named item), mwatCookie (named item) as argument in smart services. - Added support for new kbmMWConfiguration unit which provides access to automatically load and optionally save configurations to various storages. Either use Config.As.... methods directly, or specify attribute [kbmMW_Config('path:a.b.c.value, direction:rw')] on any property or field in a class. If the class descends from TkbmMWConfigurableObject, the field/property will automatically receive the value as defined in the Config object, when the class is instantiated, and similarly store the value back to the Config object when the class instance is destroyed. Classes not descending from TkbmMWConfigurableObject can also take advantage of the attribute. Just make sure to call Config.ReadConfig(TValue.From(self)); or Config.WriteConfig(TValue.From(self)); for example in AfterContruction and BeforeDestruction methods of your class. Also register your class as a kbmMW known class. - Added support for using kbmMW_Config attribute for arguments in smart services. - Added new unit kbmMWBinaryParser which can be used for parsing binary data according to a custom template. Check the blogs on www.components4developers.com for info. - Added new debug visualizers for kbmMWDateTime, kbmMWNullable, kbmMWDuration and TkbmMWAutoValue values during debug. - Added Object Notation based stats (kbmMWONStats) unit for registering statistics in object notation format, which hence can be saved and loaded as any of the object notation streaming formats. Fixes ===== - Fixed scheduler so exceptions will not stop execution threads. - Fixed incorrect Args[0] in REST transport stream. Now correctly contains called URL. - Fixed detection of added and changed fields in TkbmMWFieldsList, and added detailed info about differences. - Fixed XML namespace crash issue. - Fixed REST streamformat incorrectly double translating UTF8 - Fixed deletemessage and rejectmessage when provinding a message already tentatively popped resulted in message not being deleted/rejected, but instead leaked. - Fixed TkbmMWDynamicLockFreeHashArray and siblings related to deadlock (due to using locking without escalation support for performance reasons) and due to incorrect management of capacity of GC generations. - Fixed potential leaks happening on exceptions in certain places in kbmMWORM. - Fixed occational A/V due to reporting triggering memory logging. - Fixed REST handling of returned objects (bug introduced in 5.0.2) - Fixed DOA adapter related to LOB - Fixed TkbmMWStringBuilder.GetLastChar which amongst others affected YAML parsing. - Fixed scheduler clean shutdown of defined events when removing them. - Fixed initialdelay not respected in Scheduler. - Fixed destruction shutdown bugs in Scheduler. - Fixed YAML null parsing bug (hazeltine). - Fixed various parsing bugs in YAML. - Fixed time to execute calculation in kbmMWScheduler.pas. - Fixed string offset issues for Linux. - Fixed IOS TkbmMWTiming timebase issues. - Fixed A/V bug in TkbmMWDOMXMLNameSpaceList during destruction, due to non owned namespaces. - Fixed IBO adapter compile errors. - Fixed Delphi C++ HPP generator errors related to kbmMWNullable.pas and kbmMWDateTime.pas The changes needed to fix it for kbmMWNullable.pas unfortunately require us to default unsupporting assigning of a variant directly to a kbmMWNullable. However if you are using Delphi ONLY and will never use the C++Builder header files you can add {$DEFINE KBMMW_DELPHI_ONLY} in kbmMWConfig.inc. Then you can still assign a variant directly to a kbmMWNullable in Delphi. The changes in kbmMWDateTime is using overloaded versions of methods instead of using default value Math.NaN which is translated incorrectly by the HPP emitter. - Removed PrependTableName from all metadata classes and thus it may error with missing property on opening forms/datamodules containing metadata components. Ignore that specific property missing error and save. - Fixed some TkbmMWORM.ExistsTable overloads incorrectly calling CreateTable. - Fixed TkbmMWORM.ListFromDataset returning undefined value upon error. - Added UTCAsVariant, LocalAsVariant, LocalDateAsVariant and LocalTimeAsVariant properties to TkbmMWDateTime. - Fixed warning at installation of designtime package related to smart service setup. Changes/minor additions ======================= - Improved shutdown of transport, and scheduled events. - Checked encryption and updated SQLite Server/Client demoes to support compression. - Updated AMQPClient demo with sending with properties sample. - Set AnonymousResult to default true for REST attributes. - Improved kbmMWGetFileVersionInfoAsString to also support Android. - Improved server side ForwardMessage, ForwardRequest, ForwardResponse when original message comes from client messaging transport. - Improved client transport disconnect. - Updated Metaxxxx methods on database adapters to take AOwner argument. Typically it will be empty, but with index relations, it will hold table name. - Improved support for providing NodeID in server side messaging transport, even though contents is encrypted. - Cleaned up kbmMWGlobal.pas by grouping all kbmMWTextxxxx methods as class methods in TkbmMWTextPChar, and added similar set handling bytes as class methods in TkbmMWTextPByte. - Improved kbmMWGetComputerName and kbmMWGetComputerModel to support additional platforms. - Changed Save and Load methods of TkbmMWCustomStat to not take any field names. Specialized versions of TkbmMWCustomStat will handle that. - Improved REST streamformat marshalling. - Improved TkbmMWClientTransactionResolver. - Renamed TkbmMWCustomRewriter to TkbmMWCustomSQLRewriter. - Improved stability of event execution in kbmMWScheduler.pas during exceptions. - Optimized TkbmMWLockFreeHashArray to use generational garbage collection for higher performance and concurrency. - Starting to converting some utility threads (garbage collection and such) to use be kbmMWScheduledEvent instead. - Improved object marshalling. - Changed default log level filter in TkbmMWCustomLogManager to [mwllBasic,mwllNormal]. - Changed default flush value in TkbmMWStreamLogManager to 0 (force each write to disk) - Improvements added to kbmMWRTTI.pas - Improved kbmMWDebugMemory.pas to detect when reporting is happening to avoid deadlocks. - Enhanced TkbmMW_ArgAttribute (kbmMW_Arg) to allow for referencing specific argument index alternatively specific named argument. 5.02.10 May 29 2017 New stuff ========= - Added Enabled property to TkbmMWCustomCrypt. Fixes ===== - Fixed Resolve with transaction bug. - Modified kbmMWNullable initialization. - Fixed kbmMWSmartClient bugs. 5.02.00 May 27 2017 Important notes (changes that may break existing code) ====================================================== * Changed Use class in kbmMWSmartUtils.pas. Now it will use TkbmMWAutoValue internally to store data. Since data stored in TkbmMWAutoValue is reference counted and scoped, access to the data is slightly different. Use AsObject to return a reference to the object. Ownership of the object belongs to the TkbmMWAutoValue container. Use AsMyObject to return a reference to the object and mark it as your object. You will be responsible for freeing it. New stuff ========= - Added IkbmMWAutoValue and TkbmMWAutoValue to kbmMWGlobal.pas. They handle scope based object life time handling. - Changed smart object's (TkbmMWMarshalledVariantData) to use TkbmMWAutoValue. - Updated DumpVariant in kbmMWGlobal.pas to dump smart object's too. - Added support for TkbmMWTiming on IOS. - Added support for REST tags anonymousRoot=true/false and pretty=true/false which can be used to control if resulting objects should be anonymous or contained in a parent object, and if the result should be prettyformatted or not (default). Prettyformatting is not implemented on JSON at the time. - Updated AMQP protocol to default not write shortstrings, unsigned 8bit, unsigned16 bit unsigned32 bit and unsigned 64 bit. Reason is that although AMQP v. 0.9.1 should support them, industry dont, why most AMQP implementations will not understand those types. It is possible to uncommnet a number of defines in top of kbmMWAMQP.pas to selectively enable these types. If they are commented, kbmMW auto propogates the value to the next sensible type. - Updated kbmMWAMQP.pas to support copying field tables instead of assigning them. - Added Safe property to TkbmMWMixerPasswordGen. If set to true, it will not use digits and characters that can be visually misread (0 vs O etc). - Added OnMessageProcessingFailed event to TkbmMWCustomSAFClientTransport and TkbmMWCUstomSAFServerTransport and published in descending classes. It will be called when message processing failed, for example if kbmMW is unable to decrypt a message. - Added support for dynamic arrays in object marshalling. - Added support for Notify in TkbmMWDateTime and kbmMWNullable. If set (in an ORM scenario) the client will be notified about the value in that particular field. - Modified and fixed timezone initialization in kbmMWDateTime.pas. - Added OutputToDefaultAndFile and OutputToDefaultAndStringsAndFile to TkbmMWLog for easy setup of outputs. - Enhanced TkbmMWCustomCrypt to support PassPhraseBytes (which if set, takes precedence over PassPhrase (string). - Added OnEncryptKeys, OnDecryptKeys, OnDecryptStatus events to TkbmMWCustomCrypt to allow for attempting various keys before finally either succeeding or giving up. This can be valuable in supporting client unique encryption/decryption. - Added a number of GetDefAs.... methods to TkbmMWONArray and TkbmMWONObject which returns a default value if the property/index is missing instead of raising an exception. - Added GlobalIndexNames property to TkbmMWCustomSQLMetaData. If set kbmMW's SQL rewriter knows that index names must be database scope unique, instead of only table scope unique. - Added Init function that accepts a string as salt to TkbmMWCustomHash. - Added GetDigest to TkbmMWCustomHash, which returns a byte array with the digested hash. Its an alternative to using Final. - Added OnDisconnected and OnException events to TkbmMWAMQPClientConnection. - Added OnConnect, OnDisconnect, OnDisconnected and OnException events to TkbmMWAMQPClient. - Added mwsloDateTimeIsUTC to TkbmMWSQLiteOption. Determines how to interpret date time values, as local time or as UTC time. - Added support for boolean parameter values in TkbmMWSQLite. - Improved marshalling of kbmMWNullable types. - Added kbmMWSubjectGetType, kbmMWSubjectExtractNodeID and kbmMWGenerateMessageSubscriptionSubject to kbmMWSubjectUtils.pas - Added mwrieNotify to TkbmMWRecordInfoEvent in kbmMWCustomDataset.pas - Added support for TIMESTAMP datatype in SQL datatype deduction. - Added support for returning an interfaced object from smart services. - Added field change detection to TkbmMWFieldDefs. - Improved TkbmMWRTTI.InstantiateValue in kbmMWRTTI.pas. - Improved kbmMWNullable. - Changed Use class in kbmMWSmartUtils.pas. Now it will use TkbmMWAutoValue internally to store data. Since data stored in TkbmMWAutoValue is reference counted and scoped, access to the data is slightly different. Use AsObject to return a reference to the object. Ownership of the object belongs to the TkbmMWAutoValue container. Use AsMyObject to return a reference to the object and mark it as your object. You will be responsible for freeing it. - Added methods ToDataset, FromDataset, ListFromDataset to TkbmMWSmartClientORM. Provides an easy way to convert arguments and results to and from datasets. - Added Cron fluent method to IkbmMWScheduledEvent. It accepts a 5 or 6 part Unix cron value which defines the interval. - Added AtYears, AtMonths, AtDays, AtHours, AtMinutes, AtSeconds methods to IkbmMWScheduledEvent to give an alternative way to provide cron like schedules. - Added SynchronizedAfterRun and AfterRun methods to IkbmMWScheduledEvent to provide an anonymous function to be called after the schedule has run. It is particular valuable on scheduling asynchronous operations via RunNow, followed up with updating something with the result of the function. - Added TkbmMWONSchedulerStorage for storing/retrieving schedules in any object notation format. - Added support for subscribing for raw messages using anonymous function in WIB. - Added Delete to TkbmMWORM taking primary key values alternative specific field values. - Added support for many more date formats for ORM data generators. In addition to LOCAL, UTC and ISO8601, also RFC1123, NCSA, LOCALSINCEEPOCHMS, UTCSINCEEPOCHMS, LOCALSINCEEPOCH and UTCSINCEEPOCH is supported. - Generally many additional improvements on ORM. Fixes ===== - Fixed default true/false values for TkbmMWSQLiteMetaData. - Fixed HTTP/REST/AJAX additional incorrect CRLF in output. - Fixed serious bug in 32 bit random generators (kbmMWRandom.pas). - Fixed NextGen issues in some parsing routines in kbmMWDateTime.pas. - Fixed bugs in Query service wizard. - Fixed some SQL rewriting bugs including adding support for DESCENDING order by. 5.01.00 Apr 23 2017 Important notes (changes that may break existing code) ====================================================== * Officially now only supporting XE2 and forward. Support for pre XE2 may not be complete. New stuff ========= - Added support for RAD Studio 10.2 Tokyo, including Linux support (currently in beta) Include new sample simpleinvocation LinuxServer demo. - Officially now only supporting XE2 and forward. Support for pre XE2 may not be complete. - Added RemoteLocationsPrimaryPart to TkbmMWAuthorizationTransportConstraint (default false). If set to true, will only compare primary part of clientidentity.remotelocation. Primary part is defined by everything up til the last ':'. In most cases that will mean the IP address without the port number. - Added IkbmMWLogFormatter interface to kbmMWLog. - Added TkbmMWStandardLogFormatter to kbmMWLog. It contains vastly improved features for controlling the look and layout of the log output. Its the default used log formatter. - Added TkbmMWSimpleLogFormatter to kbmMWLog. It outputs a log with only datetime, type (info/warning/error/fatal etc) and log string. - Added LogFormatter property to IkbmMWLogManager. It can be set to a custom log formatter. - Added mwldtRaw log data type and methods LogRaw to IkbmMWLog. It allows for logging bytes or strings without interpretation/reformatting. - Added global SystemLog instance which will always output to system log outputs. It is used as a fallback in case the regular log system excepts. - Added support for marshalling/unmarshalling named enum values via the new kbmMW_Enum attribute. Its useful when an enum value cant be used as an identifier or its value should be different from its presented name. - Added ExceptOnUnknownType to TkbmMWCustomRTTIMarshal. It controls if to throw an exception if an unknown type is accessed or not (default true). - Added support for marshalling/unmarshalling TDictionary types. - Added support for correctly instantiating classes in unmarshalling that contains a capacity constructor argument. - Added Run methods to TkbmMWScheduler. It allows for one time run and forget scheduled async code. They are used in the same way as the Schedule methods, but sets Occurs to mwsoRun. The job will be automatically unscheduled after the run. - Added overloaded DelayInitial(const AInitialDelaySecs:double) to IkbmMWScheduledEvent. It allows for directly giving an initial delay in seconds. It supports fractional second values. - Added Clear to TkbmMWScheduledEvents (scheduler.Events) to allow for clearing all scheduled events. Running events will be allowed to finish. - Added GetNameSpaceByURI, DefaultNameSpace, DefaultNameSpaceURI to TkbmMWDOMXMLNameSpaceList. - Added SearchRelNodeByID, SearchNodeByID, SearchRelNodeByGivenName, SearchNodeByGivenName to IkbmMWDOMXMLParser. - Added ExpandNameSpace, GivenName, ChildrenByGivenName, ChildByGivenName, CheckChildByGivenName to TkbmMWDOMXMLNode. - Added CheckNodeByGivenName, NodeByGivenName to TkbmMWXMLNodeList. - Added missing ADSDBF support to kbmMWReg. - Added mwrtoOptionalInsert,mwrtoKeyNotNullInsert,mwrtoOptionalModify,mwrtoKeyNotNullModify, mwrtoOptionalDelete,mwrtoKeyNotNullDelete and table modifier flags OIM/OMI (optional insert/modify), OID/ODI (optional insert/delete), OMD/ODM (optional modify/delete), OI (optional insert), OD (optional delete), OM (optional modify), KIM/KMI (insert/modify on key not null), KID/KDI (insert/delete on key not null), KMD/KDM (modify(delete on key not null), KI (insert on key not null), KM (modify on key not null), KD (delete on key no null) to TkbmMWResolverTableOption They allow for more finegrained definition on when insert/update/delete should happen. If one of the optional (OIM,OMD,OID,OI,OD,OM) is given, no exception will be raised for the table when an operation did not succeed, and resolving will continue. If one of the key (KIM,KMD,KID,KI,KM,KD) is given, record resolve operation will be skipped for the specific record if key is null. - Added ReadBOM overloaded methods with default TEncoding option to TkbmMWPlatformMarshal. - Added overloaded kbmMWTextToString, kbmMWExpectText, kbmMWStringRightPad, kbmMWStringLeftPad, kbmMWGetComputerName functions to kbmMWGlobal.pas. - Added optional ACallback anonymous function to SendAsyncRequest and SendAsyncRequestEx in kbmMWClient.pas (WIB only). It allows for providing an anonymous function that should be called when an async response is returned. The function must follow this type: function(Sender:TObject; TransportStream:IkbmMWCustomTransportStream):boolean; - Added LOB blob/clob support (user fix) to DOA adapter. - Vastly improved XSD importer. - Added generic Object Notation framework for building virtual object trees consisting of TkbmMWONNative, TkbmMWONArray and TkbmMWONObject which all are based on TkbmMWONCustomObject. - Added YAML parser/generator based on object notation framework. - Added Messagepack parser/generator based on object notation framework. - Added BSON parser/generator based on object notation framework. - Added support for converting XML to and from object notation format via LoadFromObjectNotation and SaveToObjectNotation functions. - Added new TkbmMWCustomSmartService and TkbmMWCustomHTTPSmartService services, which can be selected in the service wizard to create smart services. Smart services supports tagging any function to be exported to a smart client or a REST client (TkbmMWCustomHTTPSmartService required). - Updated transports to support marshalling objects via the transport. - Added several near lock free features to kbmMWGlobal, including TkbmMWLockFreeStack, more interlocked functions, lock free array GC fixes, optional TkbmMWREWLock statistics, support for TkbmMWMREWLock can switch to TMonitor for reader/writer fair support. - Optimized many algorithms like TkbmMWStringBuilder, TkbmMWGenerateGUID, TkbmMWGenerateShortGUID and many more to improve performance overall. - Added many new general purpose functions to kbmMWGlobal. - Added direct support for salt in hash functions deriving from TkbmMWCustomHash. - Added support for anonymous functions in async kbmMWClient requests (WIB) - Added new kbmMWRTTI unit with loads of RTTI functionality. - Added YAML stream format for kbmMemTable and descendants. - Added Messagepack stream format for kbmMemTable and descendants. - Added BSON stream format for kbmMemTable and descendants. - Added object marshalling to and from YAML. - Added object marshalling to and from Messagepack. - Added object marshalling to and from BSON. - Added ServicePath property to TkbmMWClientIdentity. - Added MaxLogins to TkbmMWAuthorizationManager which is default 100 to prevent potential login spam. - Added support for HTTPSys based transport for Windows. Its specially useful for high performance RESTful applications. - Added AutoRegisterServices method to TkbmMWServer which can be used for automatically locating and registering any service that has the kbmMW_Service attribute defined. It makes use of the old RegisterService and RegisterServiceByName optional. - Added LocalSinceEpochMS, UTCSinceEpochMS, Temporenc to TkbmMWDateTime. Temporenc is a very compact binary encoding of a datetime value. - Added FastSetUTC method to TkbmMWDateTime to threadsafely very fast setting the UTC value of an already defined TkbmMWDateTime record. The record MUST be initialized before using FastSetUTC, for example by dt:=TkbmMWDateTime.Now; - Added ValueToStream, ValueFromStream, ValueToBytes and ValueFromBytes in TkbmMWCustomRTTIMarshal. Allows for easy marshalling objects to and from bytes and streams. - Added ExceptOnUnknownType boolean property to TkbmMWCustomRTTIMarshal. Controls if an exception should be thrown in case a type cant be marshalled or unmarshalled, or it should be silently skipped. - Added Devart MyDAC support (DMYDAC). - Added CORS support (Cross Origin-Resource Sharing) in TkbmMWCustomHTTPService and descendants. (OnCORS event). - Added PerformOPTIONS and PerformPATCH support to TkbmMWCestomHTTPService. (OnOptions and OnPatch in TkbmMWEventHTTPService). - Added REST transport stream format which must be used if non HTTPSys transport is used for smart services. - Added TkbmMWSmartClient which allows simple and easy access to server side smart functions. Check simpleinvocation sample. - Added high quality random functions in new kbmMWRandom unit. TkbmMWRandomDelphi (32 bit non high quality ramdom!), TkbmMWRandomSplitMix (64 bit) TkbmMWRandomXoroshiro128Plus (64 bit), TkbmMWRandomXoroshiro1024 (64 bit), TkbmMWRandomPCGUInt32 (32 bit), TkbmMWRandomMersenneTwisterUInt32 (32 bit), TkbmMWRandomMersenneTwisterUInt64 (64 bit) - Added high quality pronouncable password generators in new unit kbmMWPassword. TkbmMWMixerPasswordGen, TkbmMWKoremutakePasswordGen - Added support for ExchangeType in TkbmMWAMQPClient. - Added new GC and CloseAndGC methods in TkbmMWAMQPChannel to force getting rid of defunct/cached but unused AMQP channels. - Added IPVersion property to TkbmMWCustomTCPIPIndyClientTransport. - Split out all lockfree algorithms from kbmMWGlobal to kbmMWLockFree unit to make kbmMWGlobal smaller, partly due to internal compiler errors. - Fixed to default not inlining kbmMWMREWLock methods on 32 bit CPUs due to unstable compiler which can result in F2084/C2491 error combinations. - Moved all lockfree code to new kbmMWLockFree.pas unit. - Added TkbmMWLockfreeStack. - Changed so XE6/XE7 SKU's do not compile in new kbmMWLockFree contents due to compiler errors. - Added kbmMW ORM OPF (Object Relational Modelling Object Persistence Framework) in unit kbmMWORM.pas. Compiles with XE5 and higher. Check new ORM demos. Currently in beta. - Added TkbmMWBinaryPasswordGen to kbmMWPassword.pas. Generates random binary keys of any length, suitable for cryptographic use. - Added functions Year(ADateTime:TDateTime=Math.NaN):word; function Month(ADateTime:TDateTime=Math.NaN):byte; function DayOfMonth(ADateTime:TDateTime=Math.NaN):byte; function HourOfDay(ADateTime:TDateTime=Math.NaN):byte; function MinuteOfHour(ADateTime:TDateTime=Math.NaN):byte; function SecondOfMinute(ADateTime:TDateTime=Math.NaN):byte; to TkbmMWDateTime. - Improved Null handling in kbmMWNullable and TkbmMWDateTime. - Improved Modified support in kbmMWNullable and TkbmMWDateTime. - Added functions function OutputToFile(const AFileName:string=''):IkbmMWLocalFileLogManager; procedure OutputToDefault; function OutputToStrings(const AStrings:TStrings; const ASynchronized:boolean = true):IkbmMWStringsLogManager; function OutputToStringsAndFile(const AStrings:TStrings; const ASynchronized:boolean = true; const AFileName:string=''):IkbmMWTeeLogManager; function OutputToTee:IkbmMWTeeLogManager; procedure OutputToNull; to IkbmMWLog to make it easier to redirect output to some standard destinations. - Added mwddLog to kbmMWGlobal, as a new output destination for kbmMW lowlevel debugging. Will output to the default logger. - Fixed and improved TkbmMWCircularBuffer. - Added kbmMWSmartUtils.pas containing Use class with easy to use methods to convert arguments and results. Changes/minor additions ======================= - Removed (mwloProcessThreadInfo,mwloThreadName from TkbmMWLogOption since its now controlled by the log formatter. - Changed Activate method of IkbmMWScheduledEvent to have true as default argument AValue. - Changed SetAsDuration and GetAsDuration to use TkbmMWDuration instead of TkbmMWDateTime. - Added support for checking if path is accessible in TkbmMWBufferedFileStream.Create. - Changed JSON parser/generator to be based on the object notation framework. - Improved scalability of FastCGI services to better spread load accross multiple instances. Fixes ===== - Fixed A/V when attempting to use audit file. - Fixed missing clearing of TkbmMWDuration when parsing duration strings, resulting in an incorrect duration value (instead of null) on invalid duration strings. - Fixed TDuration.Passed(const ADuration:TkbmMWDuration) which didnt return correct value. - Fixed deactivating precise scheduled events. - Fixed events scheduled to start on day, month, week or year boundaries. - Fixed issues to initial delay in scheduled events. - Fixed parsing tags crossing line boundaries in XML parser. - Fixed various namespace issues in XML parser. - Fixed WIB compilation issue for XE. - Fixed TkbmMWStreamStore offset bug when writing first segment. - Fixed potential shutdown issue in Indy10 transports due to Indy10 bug. - Fixed kbmMWDependency non accumulating memory leaks. - Fixed NexusDB transport compilation. - Fixed Autoinc field detection in EDB (ElevateDB) adapter. 4.93.10 May 4 2016 Important notes (changes that may break existing code) ====================================================== * Fixed compilation for D2009. Notice that some features are no longer available like RemoteDesktopServer component, Fast MREW lock, log timing and memory debugging. This is due to use of generics, which were very unstable until XE2. We strongly suggest upgrading to at least XE2. Changes/minor additions ======================= - Changed Load/Save methods of TkbmMWXMLAuthorizationStorage to include optional boolean for if to save/load configuration (Actors, Roles, Resources). Default true. notice that this will break existing code where logins where saved/loaded. To fix, insert new extra argument (true). Fixes ===== - Fixed compilation for D2009. Notice that some features are no longer available like RemoteDesktopServer component, Fast MREW lock, log timing and memory debugging. This is due to use of generics, which were very unstable until XE2. We strongly suggest upgrading to at least XE2. - Fixed TkbmMWDateTime.SystemLocalTimeOffsetSecs Nextgen issue. - Fixed initial flush of log entry in kbmMWLog. - Fixed SDAC3 query parameters bug. - Fixed ODAC4 query parameters bug. 4.93.00 April 26 2016 Important notes (changes that may break existing code) ====================================================== * Updated transport stream format to include support for streaming cardinal values. * Updated XML streamformats to use camelcase and fixed bugs. * Removed DeleteOldLog and DeleteOldAudit properties from file log manager. New stuff ========= - Added FileOptions to TkbmMWLocalFileLogManager. (mwlfoDeleteOldLog,mwlfoDeleteOldAudit,mwlfoBackup,mwlfoTimestampBackup,mblfoBackupIfEmpty) - Added support for multiple timestamped backups of file based logs. - Added MaxLogFileAge and MaxAuditFileAge to file log manager. Set to provoke a file change after a specific duration. Change happens at next log event. - Added BackupPath and BackupExt to file log manager. - Added Passed functions to TkbmMWDateTime. Returns true if a specific time has passed. - Added Lock property to TkbmMWCustomThread. - Added Lock property to TkbmMWCustomMessageProcessor. - Added support for RAD Studio 10.1 Berlin. Changes/minor additions ======================= - Improved Remote Desktop switch user support. - Updated transport stream format to include support for streaming cardinal values. - Updated XML streamformats to use camelcase and fixed bugs. - Removed DeleteOldLog and DeleteOldAudit properties from file log manager. - Changed kbmMWString2Var to convert cardinals correctly. Fixes ===== - Fixed server transport shutdown issue on regular (non WIB) transport due to TerminateYarn bug in Indy 10. - Fixed issues in TkbmMWCustomThread. - Fixed leak and bug in LZ4 compression. 4.92.00 April 2 2016 Important notes (changes that may break existing code) ====================================================== * Changed TkbmMWAfterMessageProcessedEvent by adding argument var AAction:TkbmMWMessageProcessingSuccessAction New stuff ========= - Added AWaitUntilConnected (default false) and AWaitUntilDisconnected (default false) to TkbmMWAMQPClient Connect/ and Disconnect methods. - Generally slightly improved C++ support. - Added new TkbmMWDependency class for guaranteeing initialization and finalization order of units. Units depended on are initialized first and finalized later. Modified all kbmMW code to use dependency class. - Added new TkbmMWDebugMemory class for keeping track of memory allocations and leak detection. Enterprise Edition only. Include kbmMWDebugMemory as early as possible in your uses clause (but after FastMM if you are specifying that). See demo project (debugmemory) for usage. - Added compact stack version of TkbmMDebugStackTrace not requiring addition memory allocations while running. - Added support for global function in TkbmMWScheduler.Schedule. - Added PrevRunStamp in TkbmMWScheduledEvent. - Added TkbmMWInterlocked.Increment/Decrement for uint64. - Added TkbmMWLockFreeHashArray where a custom value type can be used. key is still cardinal/uint64. - Added TkbmMWLockFreeHashArray64 (64 bit data value). - Added ResetEnum, Enum, Capacity, Count, AssignValue to all TkbmMWLockFreeHashArray implementations. - Added optional argument ACount:integer=0 to TkbmMWCustomThreadPool.PreAllocate. Can ask for preallocation of ACount instances (will be limited by max count defined for thread pool). - Added new TkbmMWLog data type: mwldtAllocation. It will be used by memory leak detection for reporting allocation leaks. - Added mwldtAllocation to TkbmMWLogDataType. Its used for filtering out memory allocation logs. - Added support for specifying max file size (in kB) for log and audit files in IkbmMWLocalFileLogManager. Default 1024 for log files and no max for audit. If file size is exceeded current file is renamed to .bak and a new file created. Only one backup file can currently exist. - Added support in IkbmMWTeeLogManager for AddLogManager and RemoveLogManagers. Allows for dynamically add and remove logmanagers to the tee log manager. Currently max 10 concurrent logmanagers are supported to be referenced by a tee log manager. Added overloaded constructors for referencing 0 to 4 exisitng log manager instances when creating a tee logmanager instance. - Added Tag:integer and Data:variant properties to IkbmMWScheduledEvent. Allows for tagging custom data to a scheduled event. Matching methods WithTag(..) and WithData(..) added for fluently typing. - Added PrevRunStamp:int64 property to IkbmMWScheduledEvent for obtaining info for when last run happened. - Added Schedule(AGlobalFunction:TkbmMWOnScheduledFunction) to TkbmMWScheduler. - Added ASpaceAsPlus:boolean (default true) to kbmMWEncodeEscapes method in kbmMWHTMLUtils.pas. If set to false, will not replace space with +. - Added delayed commit to TkbmMWCustomSAFServerTransport. This is to fix that message pops should not be committed until message has truely been processed. This especially relates to request that are looped thru the TkbmMWServer application server functionality. Earlier it was possible that messages were put into a holding pattern in the TkbmMWServer (while waiting to be processed) but thus have been popped off the inbound queue and committed and thus removed from it, before the application server actually had processed or failed processing the message. - Added server queue congestrion support on TkbmMWCustomSAFServerTransport. This ensures that request/service call messages will not overwhelm the server queue. Default is mwmqoFailOnCongestion,mwmqoDeleteInvalidMessage and max CPUCount*10 messages in queue. Default component name for the server queue is transport name+'_'+KBMMW_DEFAULT_SERVER_QUEUE. If congestion happens, the push on the server queue fails and message will automatically be rolledback on the source queue (typically the inbound queue) to ensure no messages are lost. - Added TkbmMWDebugStack.StackTraceAsString function to easily convert collected stack to printable string. - Added more features for obtaining a stacktrace. - Added TkbmMWInterlocked.Increment2,Decrement2,Exchange2, Add2,CompareAndExchange2 supporting TkbmNativeUInt. - Added TkbmMWInterlocked.Increment,Decrement supporting uint64. - Added TkbmMWLockFreeHashArray2 to kbmMWGlobal, which takes 2 TkbmNativeUInt keys to reference data of type . - Added TkbmMWDynamicLockFreeHashArray descending from TkbmMWLockFreeHashArray. It auto resizes to 150% when its getting to more than 60% of capacity. - Added TkbmMWLockFreeHashArrayNative descending from TkbmMWLockFreeHashArray2 referencing TkbmNativeUInt. - Performance optimized kbmMWGetCurrentThreadID for x86 and x64. - Added procedures LockedFreeNotification(AComponent: TComponent) and procedure LockedRemoveFreeNotification(AComponent: TComponent) to TkbmMWCustomConnectionPool. Use these instead of FreeNotification and RemoveFreeNotification to ensure threadsafety. - Added AddBatchedMessage method to IkbmMWCustomTransportStream. - Added DelayedCommitOwner property to IkbmMWCustomTransportStream. This can be used to identify the original source (holding) queue for the message. - Added mwmqoFailOnCongestion to TkbmMWMessageQueueOption. If a queue is getting congested this will lead to push returning false, and message not being pushed on queue. - Added IkbmMWMessageQueueCustomAction and descendants IkbmMWMessageQueuePushAction, IkbmMWMessageQueueTentativelyPopAction, IkbmMWMessageQueueCommitAction, IkbmMWMessageQueueRollbackAction, IkbmMWMessageQueueDeleteAction, IkbmMWMessageQueueRejectAction, IkbmMWMessageQueueStalledAction, IkbmMWMessageQueueCongestionAction, IkbmMWMessageQueueClearAction, IkbmMWMessageQueueTentativelyPushAction, IkbmMWMessageQueueCommitPushAction, IkbmMWMessageQueueRollbackPushAction Allows for any class to subscribe for various events on a message queue. - Added events OnPush,OnTentativelyPop,OnCommit,OnRollback,OnDelete, OnReject,OnStalled,OnCongestion,OnClear,OnTentativelyPush, OnCommitPush,OnRollbackPush to TkbmMWCustomMessageQueueAction. - Added mwpsaRetry to TkbmMWMessageProcessingSuccessAction. Controls if a failed message processing operation should be retried. Changes/minor additions ======================= - Changed TkbmMWScheduler to preallocate at least 1 relaxed thread if any relaxed events have been defined, even if they are not to run yet. Purpose is to play nice with memory leak detection. - Changed TkbmMWLockFreeHashArray to inherit from generic version, and be named TkbmMWLockFreeHashArray32. - Changed TkbmMWCustomTransportStream to allow for BatchedMessages=nil to improve performance and memory usage. - Added check for out of memory conditions in TkbmMWBufferPages. - Added missing Occurs(const AOccurance:TkbmMWScheduleOccurance) method to IkbmMWScheduledEvent to be able to type fluently. - Changed KBMMW_THREAD_TIMEOUT_GRANULARITY to 50ms instead of 2000ms to ensure more smooth shutdown of threads. - Changed so TkbmMWThreadEntry.Create do not autostart inner thread. - Changed TkbmMWCustomThreadPool.Create to allow for specifying if to autostart threads created via pool. - Changed TkbmMWCustomThreadPool.PreAllocate to take optional arguments setting pool size and autostart option. - Improved early error detection in ReadSubjectHeader. - Changed TkbmMWAfterMessageProcessedEvent by adding argument var AAction:TkbmMWMessageProcessingSuccessAction - Changed TkbmMWCustomGroupedMultithreadMessageQueueProcessor by adding setters to numerous properties. - Changed TkbmMWMemoryQueue options to default not batch any messages. - Changed TkbmMWGroupedMessageQueueProcessorThread to default congest at 10 messages for normal priority messages. The default congestion treshold will be overwritten with QueueSize setting when the processor is started. - Improved Firemonkey support for TkbmMWJPEG. Fixes ===== - Fixed problems with TkbmMWDateTime due to threadsafety issues in Embarcadero's TTimeZone.Local implementation, which could lead to various exceptions on some OS versions. - Fixed issue with SendPing resulting in index out of range due to missing unstreaming of request values. - Fixed multithreaded race condition on unhooking components from connectionpool. - Fixed bug where not all properties of a scheduled event was considered. - Fixed bug in TkbmMWScheduledEvents where precise event thread was not guaranteed started immediately. - Fixed shutdown problem in Indy 10 due to TerminateYarn bug. - Fixed potential race condition bug in TkbmMWFilePool. - Fixed bug in TkbmMWMREWLock and performance optimized it. Added a number of introspecting functions: ReadLockedBy, WriteLockedBy, LockedByAsString, WriteLockRecursiveCount ReaderLockCount which can be used to query current status of a lock. Now kbmMW default uses TkbmMWMREWLock for all locking. This can be disabled by commenting {$IFDEF KBMMW_SUPPORT_FASTMRWSLOCK} in kbmMWConfig.inc. - Fixed memory leak in TkbmMWHashBuckets. - Fixed TkbmMWMemoryStream.Read when attempting to read 0 bytes. - Fixed bugs in TkbmMWCustomThread.Stop. - Fixed TkbmMWCipherCustomDES, TkbmMWCipherRijndael (AES) and TkbmMWCipherIDEA on 64 bit platforms. - Fixed TkbmMWCustomClient.SendPing without arguments not correctly sending NULL. - Fixed ftDateTime bug in UniDAC adapter. 4.91.00 November 13 2015 (CG release only for DX10 Seattle) New stuff ========= - Added new TkbmMWDebugMemory class for keeping track of memory allocations and leak detection. Enterprise Edition only. Include kbmMWDebugMemory as early as possible in your uses clause (but after FastMM if you are specifying that). See demo project (debugmemory) for usage. - Added compact stack version of TkbmMDebugStackTrace not requiring addition memory allocations while running. - Added support for global function in TkbmMWScheduler.Schedule. - Added PrevRunStamp in TkbmMWScheduledEvent. - Changed TkbmMWScheduler to preallocate at least 1 relaxed thread if any relaxed events have been defined, even if they are not to run yet. Purpose is to play nice with memory leak detection. - Added TkbmMWInterlocked.Increment/Decrement for uint64. - Added TkbmMWLockFreeHashArray where a custom value type can be used. key is still cardinal/uint64. - Changed TkbmMWLockFreeHashArray to inherit from generic version, and be named TkbmMWLockFreeHashArray32. - Added TkbmmWLockFreeHashArray64 (64 bit data value). - Added ResetEnum, Enum, Capacity, Count, AssignValue to all TkbmMWLockFreeHashArray implementations. - Added optional argument ACount:integer=0 to TkbmMWCustomThreadPool.PreAllocate. Can ask for preallocation of ACount instances (will be limited by max count defined for thread pool). - Added new TkbmMWLog data type: mwldtAllocation. It will be used by memory leak detection for reporting allocation leaks. 4.90.04 November 10 2015 Fixes ===== - Better fix to UniDAC Options property issues. 4.90.03 November 9 2015 Fixes ===== - Fixed UniDAC Options property issues. - Fixed installer not showing Delphi 10 Seattle as an install option. 4.90.02 November 8 2015 Fixes ===== - Fixed D2009, DXE2 compilation. Notice that TkbmMWSceduler, confirmed delivery and remote desktop clipboard integration only is supported on XE2 and up. 4.90.01 November 8 2015 Changes/minor additions ======================= - Upped binary transport stream version to 490. When stream version is 490 and StringConversion is set to mwscFixed TkbmMWDateTimes are streamed as UTC values, else local time values. Fixes ===== - Fixed loss of timezone when streaming in localtime format. - Fixed UniDAC compilation. 4.90.00 November 7 2015 Important notes (changes that may break existing code) ====================================================== - Updated TkbmMWOnMessageToSpoke, TkbmMWOnMessageToSpokeDeliveryFailed, TkbmMWOnMessageToSpokeDeliverySuccess events to include the queue. New stuff ========= - Added TkbmMWScheduler in new unit kbmMWSceduler.pas (Ent) for precise and relaxed event scheduling. System scheduler are available via Scheduler instance. Check demo for examples of use. - Added TkbmMWMemSQL which is an extension to the TkbmMemSQL class (Ent). It adds syntax for: - Defining fieldtypes: SELECT field1 as 'field1->INT'... The field types can be INT,VARCHAR2(n),VARCHAR(n),CHAR(n),BOOL,AUTOINC,FLOAT,NUMERIC,REAL,DATETIME, DATE,TIME,LARGEINT,INT64,BLOB,GRAPHIC,CLOB,TEXT(n),CURRENCY,WORD,MEMO,WIDEMEMO,GUID - Operating on XML and JSON data registered with SQL component: SELECT owner AS 'someowner->TEXT(3)',bid,quantity AS 'dato->DATE' FROM auctions SUBSET '/alliance/auctions/.*' ORDER BY bid,owner SELECT XMLAttr(value,'//datas','name') AS 'name->TEXT(20)', value FROM data TEXT(XML,'1020>/datas>') SUBSET '^/datas/data/$' - Operating on inline XML: SELECT value FROM data TEXT(XML,'1020') SUBSET '/data/value' ORDER BY value - Operating on inline JSON: SELECT value FROM data TEXT(JSON,'{"data":[{"value":10},{"value":20}]}') SUBSET '/data/.*' ORDER BY value - Loading data from external CSV (SF_CSV) or binary (SF_BIN) files: SELECT [species no], common_name FROM biolife FILE(SF_CSV,'.\biolife.csv') ORDER BY common_name - Loading data from external XML and JSON files: SELECT owner,bid,quantity FROM auctionsfile FILE(JSON,'.\auctions.json') SUBSET '/alliance/auctions/.*' ORDER BY bid,owner - Outputting results as binary (SF_BIN), CSV (SF_CSV), XML (SF_XML) and JSON (SF_JSON) files: SELECT fld2 AS Field2, fld3, sum(fld5) AS fld5, Sum(fld2) AS SomeField1, Sum(fld3) AS SomeField2 FROM table1 GROUP BY Field2, fld3 OUTPUT FILE(SF_JSON,'.\output.json','nodef') - Outputting results as CSV, XML and JSON text string: SELECT fld2 AS Field2, fld3, sum(fld5) AS fld5, Sum(fld2) AS SomeField1, Sum(fld3) AS SomeField2 FROM table1 GROUP BY Field2, fld3 OUTPUT TEXT(SF_XML,'nodef') Output formats supports various options: - SF_CSV supports: nodef, quote=X, fielddelimiter=X, recorddelimiter=X, truestring=xxx, falsestring=xxx, noheader, onlyquotestrings, usedisplayname - SF_JSON supports: nodef, rowid, datanode, memoasstring, nonull, bmp, png (not MacOS), jpeg (not MacOS), rowidname=xxx, dataname=xxx, definitionname=xxx - SF_XML supports: nodef, rowid, datanode, datasetname=xxx, rowidname=xxx, fieldname=xxx, dataname=xxx, definitionname=xxx - SF_BIN supports: nodef Check demo for examples of use. - Added kbmMWSQLXMLAPI.pas, kbmMWSQLJSONAPI.pas units (Ent) to support above. - Added XmlNode and XmlAttr in kbmMWSQLXMLFunc.pas for XML specific functions useful when running SQL on XML documents. - Added new QoS flag to WIB messages: KBMMW_TRANSPORT_QOS_CONFIRMED_DELIVERY If set on a message, the message will need to be acknowledged by receiver before its committed in senders queue. In practice receiver bulk acknowledges received messages at an interval and/or message count. - Upped subject header version to 4. Define KBMMW_SUBJECTHEADER_V3_COMPAT to generate messages compatible with v3. Notice that QoS must handshake flag require v4. - Added AOptions:TkbmMWMessageOptions to all message creating methods/functions when WIB is enabled. Provides access to defining QoS flags for a message. - Added InboundRetransmitTotal, OutboundRetransmitTotal, AutoSetupHandshakeSubscription, SendEvent, SendPrioritizedEvent, InboundAckHandler, OutboundAckHandler to client and server messaging transports. - Added Flush method to TkbmMWFileStoreMessageQueue to force write of cached data to file. - Added TkbmMWWeekDay type to kbmMWDateTime.pas unit. - Added global function kbmMWXMLDataType2VariantType to kbmMWXML.pas. Returns variant datatype based on XML datatype. - Updated Load/Save functions in kbmMWXML to configure to stream/not stream BOM markers. - Changed AttribByNameAsDuration in kbmMWXML to return TkbmMWDuration value instead of TkbmMWDateTime. - Added kbmMWAddHop, kbmMWExtractLastHop, kbmMWHopCount, kbmMWPeerID, kbmMWExtractPeerID, kbmMWGenerateHandshakeSubscriptionSubject, kbmMWGenerateHandshakeSubject methods to kbmMWSubjectUtils. - Added CreateResponseMessage, CreateRequestMessage, CreateServiceCallMessage methods to WIB. - Added optional ASilent:boolean=false argument to CommitMessagePop, RollbackMessagePop, RejectMessage If true, will not raise exception if message do not exist. Also now returns true or false depending on if operation suceeded. - Added OnStats event to TkbmMWServer. Is called whenever there is a statistics update. - Added Load/Save methods for file and stream based storage in TkbmMWXMLAuthorizationStorage. - Added mwldtWeb to TkbmMWLogDataType. - Added Enabled:boolean property to IkbmMWLogManager and implementing classes. - Added LogWeb method to IkbmMWLog interface and implementing classes. Logs data in an Apache compatible way. - Added function FormatWebLogRecord to IkbmMWLog and implementing classes. It returns an Apacke compatible log string to be used with LogWeb. - Extensively updated TkbmMWInterval in kbmMWDateTime.pas unit to be nullable, compile numeric value that can be compared with another interval instance's numeric value to test for which interval is longer, multiple overloaded constructors, millisecond support, Compare function. Supports fractional and overrun values for years, months, days, hours, minutes, seconds milliseconds and weeks. - Added TkbmMWInterval as alias to TkbmMWDuration. - Added Compare and Clear methods to TkbmMWDateTime. - Added Incxxx methods to TkbmMWDateTime taking fractional and overrun values. - Added Null class function to TkbmMWDateTime returning a null TkbmMWDateTime. - Added NCSATimeZone and NCSADateTime properties to TkbmMWDateTime allow for setting and getting Common Log Format (NSCA) formatted timezone and datetime values. - Added Clone function to TkbmMWJSONCustomObject. - Added AddArray and AddObject functions to TkbmMWJSONArray. Newly created empty object or array will be added to array and returned for developer to populate. - Added InsertArray and InsertObject to TkbmMWJSONArray. - Added AAutoCreateChildren:boolean (default true) argument to constructor of TkbmMWJSONObject. Controls what happens when accessing properties AsArray or AsObject when no array or object is available under the given name. If AutoCreateChildren is false, nil will be returned or an exception raised, else new objects/arrays are created automatically. - Added option to stream BOM in TkbmMWJSONStreamer. - Added Load/Save UTF8 file and stream access methods to TkbmMWJSONStreamer. - Added FileStoreOptions property to TkbmMWFileStoreMessageQueue which controls what happens when queue is closed. Can be mwfsoDeleteOnClose, mwfsoDeleteOnCloseWh or nothing. - Added TkbmMWCustomThreadHashList, TkbmMWHashStringInterfaceList and TkbmMWThreadHashStringInterfaceList to kbmMWGlobal.pas. - Added UTF8Decode methods returning boolean if UTF8 string was invalid to TkbmMWPlatformMarshal. - Added WriteBOM and ReadBOM to TkbmMWPlatformMarshal. - Added kbmMWTextToFloat, kbmMWFloatToText, kbmMWStringToText, kbmMWSearchNonDecimalDigit, kbmMWSafePath to kbmMWGlobal.pas. - Added OnHandshake event to client and server messaging transports. Changes/minor additions ======================= - Added APostSubject:string='' argument to all message producing methods/functions to allow postfixing additional data to the standard subjects like REQ/RES etc. to allow for easier custom receiving end filtering based on custom data. - Added AClosing:boolean = true argument to Flush method of TkbmMWBufferedFileStream. If true (default) flush is expected to optionally (on Windows) truncate file to the actual size it has, not the sector based size. Call with closing false to just flush the cache to the file. - Added GetMimeTypeExt(const AExt:string):string and GetCharSetExt(const AExt:string):string to kbmMWCustomHTTPService.pas. Allows for providing a file extension (including dot) instead of a file path. - Improved FastCGI communication with FastCGI server to more reliably detect environment header. - Changed so SubjectHeader.Hops always initially includes sender. - Changed TkbmMWAuthorizationUTCTimeConstraint to use TkbmMWWeekDay for week day constraints. - Updated timezone list in kbmMWDateTime. - Updated TkbmMWOnMessageToSpoke, TkbmMWOnMessageToSpokeDeliveryFailed, TkbmMWOnMessageToSpokeDeliverySuccess events to include the queue. Fixes ===== - Fixed leak of TkbmMWInnerThread on shutdown. - Fixed thread pool bugs. - Fixed Remote Desktop compilation issues in pre XE6. - Fixed FIB compilation issues. - Fixed UniDAC compilation issues and missing Options property. - Fixed so a response message has same QoS as the request message. - Fixed TkbmMWAuthorizationLogin.Touch to touch using UTC, not local time, which would result in actor being timed incorrectly out. - Fixed leak of TFileStream/TkbmMWBufferedFileStream in kbmMWDebugTdsFile.pas and kbmMWDebugMapFile.pas when loading of TDS/MAP file excepted (for example by being in use by the Delphi debugger when running app in debug mode). - Fixed StreamSec TLS plugin compilation. - Fixed bugs in TkbmMWHTTPTransportStreamHelper.HTTPBuildCustomResponseHeader. - Fixed bugs in SQLite adapter. 4.84.00 September 6 2015 Important notes (changes that may break existing code) ====================================================== * Removed kbmMWMurmurHash3 from kbmMWGlobal.pas. New stuff ========= - Added support for RAD Studio 10 Seattle and Delphi 10 Seattle. - Added LZ4 compression support. - Added JPEG compression support via TurboJPEG via the new units kbmMWJPEG and kbmMWJPEGDefs. Installer includes optimized precompiled Win32, Win64 and Android libJpeg DLL/.so libraries. - Added support for DirectX11 for Remote Desktop Server. - Added multimonitor support (max 8 monitors) in Remote Desktop. - Added clipboard sharing in Remote Desktop. - Added 4 bit and 8 bit grayscale view modes to Remote Desktop. - Added auto detect compression modes in Remote Desktop. Some of them are called "xxxFullScreen" and will attempt non tiled compression, which may be preferable if running for example video in full screen for best non tearing appearance. - Performance optimized Remote Desktop including tile based texture detection compression, better thread handling and more. - Added FireMonkey Remote Desktop client component and limited demo app which runs on NextGen. - Added PassedTimeDiffUS to TkbmMWTiming. Works as PassedTimeUS except it returns passed time in uS. - Added kbmMWHashMurmur3.pas, kbmMWHashFNV1A.pas and kbmMWHashXX.pas units for 3 different high performance hash algorithms. - Enabled ZIPPED stream support for NextGen. - Added mwmqoPurgeOnCongestion to TkbmMWMessageQueueOption which will clear messages below a certain priority from the messagequeue when congestion is detected. - Added mwmqoPurgeAllPrioritiesOnCongestion to TkbmMWMessageQueueOption which will clear messages of all priorities from the messagequeue when congestion is detected. - Added Purge method to TkbmMWCustomMessageQueue and all descendants (memory and file). Removes messages from the queue optionally based on priority leaving only N messages. Changes/minor additions ======================= - Dropped PNG compression mode in Remote Desktop. - Dropped Huffman compression mode in Remote Desktop. - Removed kbmMWMurmurHash3 from kbmMWGlobal.pas. - Deprecated kbmMWHashString32 and kbmMWHashString64. Instead use kbmMWHashFMV1A32 or kbmMWHashFMV1A64. - Added Options:TUniDataSetOptions to UniDAC adapter. - Modified UniDAC adapter to convert field types: ftOraBlob->ftBlob, ftOraclob->ftWideMemo, ftDateTime->ftDate. - Improved performance in HTTPGetContents in TkbmMWHTTPTransportStreamHelper. - Dropped DirectX9 screen capture support in Remote Desktop. - Updated .Net kbmMWSpider with user suggestions. Fixes ===== - Fixed compilation/runtime issues for IOS64. - Fixed kbmMWString2Variant to return local time in variant if a datetime value was given, instead of UTC time. - Fixed potential TkbmMWMemoryStream issues in mobile and 64 bit code. - Fixed Unicode memo issues in UniDAC adapter. - Fixed Android compilation issues. - Fixed issue when dynamically modifying path in OnFileAccess in file service. - Fixed object marshalling for NextGen. - Fixed resetting timezone when setting TkbmMWDateTime.ISO8601DateTime given only a date. - Fixed initializing timezone offset to 0 when creating empty TkbmMWDateTime. - Fixed FIB adapter when moving blob/memo data. 4.83.00 June 21 2015 Important notes (changes that may break existing code) ====================================================== * Added OwnerName string argument to TkbmMWOnAuthenticateMetaData, TkbmMWOnApproveMetaDataResult and TkbmMWOnGetMetaData to allow client to provide additional information fwhen obtaining metadata (table name etc). New stuff ========= - Added support for &#xhhhh; and &#dddd; character encoding/decoding in XML. - Added missing properties (LogTypeFilter, LogDataTypeFilter, LogLevelFilter) and related getters/setters to IkbmMWLogManager interface. - Added Log.LogMemory methods for logging pointer based memory areas. - Added support for reading external Tds files in addition to external Map files for debugging. - Added selective option for using either frame based stack tracing, OS based stack tracing or raw stack tracing via the Log.StackTraceMethod property (default frame based). Setting it to raw may provide more detailed tracing, but also risks showing incorrect entries. - Added LogManager.IgnoreException, IgnoreExceptions, ClearIgnoreExceptions and IsExceptionIgnored. They can be used to register specific exception classes that you do not want kbmMW to log. - Enhanced exception logging by forcing a stack trace if none is provided with the exception object. - Added ISO8601UTCDateTime property to TkbmMWDateTime which always returns a UTC formatted date/time string. - Added RFC1123UTCDateTime property to TkbmMWDateTime which always returns a UTC formatted date/time string. - Added TkbmMWPlatformMarshal.Memory2Bytes function. - Updated AnyDAC adapter with suggested changes by Francisco Armando Dueñas Rodríguez. - Updated SQLite adapter to support MacOS. - Added more debugging functions to TkbmMWLog including logging JSON and easier access to debug of memory,stack,bytes,xml,json etc. Changes/minor additions ======================= - Added OwnerName string argument to TkbmMWOnAuthenticateMetaData, TkbmMWOnApproveMetaDataResult and TkbmMWOnGetMetaData to allow client to provide additional information fwhen obtaining metadata (table name etc). - Added OwnerName to overloaded GetMetaData method in TkbmMWClientQuery and TkbmMWClientStoredProc. - Changed all RequestID references from longint to integer. - Changed some longint to integer or TkbmNativeInt. Fixes ===== - Fixed HTTP cookie expiration which did not work on Chrome due to Chrome not supporting timezones. - Fixed HTTP and AJAX transport stream format to not except when connection is lost to ensure nice close down. - Fixed MacOS compilation. - Fixed integer overflow issue in kbmMWMurmurHash3 and changed to use uint64 instead of int64. - Fixed IOS compilation errors due to ambigous Seek method. - Fixed Android compilation errors in TkbmMWCustomThread.CurrentProcessID. - Fixed IOS lockid 64 bit issues in TkbmMWLock (fast lock implementation). - Fixed WIB message actions not receiving arguments due to message not unstreamed. - Fixed unmarshalling root custom type in kbmMWObjectMarshal.pas. - Added LowestUnstreamState to TkbmMWCustomTransportStream. Its used internally with batched messages for example to ensure not unstreaming from oridinal data (and thus avoid multiple decompression/decrypting on alread decompressed/decrypted data). - Fixed various message batching/unbatching bugs. - Fixed JSON bug resulting in A/V. - Fixed multilevel list unmarshalling bug. - Fixed XML bug related to node attributes named 'type'. 4.82.00 May 30 2015 Important notes (changes that may break existing code) ====================================================== * Removed kbmMWDateTimeToString, kbmMWStringToDateTime, kbmMWDayOfWeek, kbmMWGetUTCOffset. Use TkbmMWDateTime methods instead. * Removed kbmMWGetCurrentTimeNS from kbmMWGlobal.pas. Use TkbmMWTimeNS.NowUTC. * Removed standard specific options settings on UniDAC database. Notice you must set these manually on the database template when relevant. Previous settings which were automatically set were: InterBase.BooleanDomainFields=False InterBase.DescribeParams=True New stuff ========= - Added new major feature in the form of a new logging/auditing/timing/exception handling system: Added TkbmMWLog and TkbmMWCustomLogManager descendant classes with loads of different logging, assertion, exception handling, timing and auditing mechanisms. (kbmMWLog.pas, kbmMWDebugMapFile.pas and kbmMWDebugStackTrace.pas). It supports optionally dumping stacktrace on Win32/Win64 bit systems. Notice to have the assert based logging enabled you must define in kbmMWConfig.inc: {$DEFINE KBMMW_INSTALL_ASSERT_HANDLER} Alternatively manually call kbmMWLog_InstallAssertionHandler and kbmMWLog_UnInstallAssertionHandler. Notice to have the new exception log handling mechanism enabled you must define in kbmMWConfig.inc: {$DEFINE KBMMW_INSTALL_EXCEPTION_HANDLER} Alternatively manually call kbmMWLog_InstallExceptionHandler and kbmMWLog_UnInstallExceptionHandler. Check new sample "SimpleLogging" for examples of use of logging system. - Added new remote logging features (TkbmMWClientLogManager/TkbmMWServerLogManager) based on the new logging system. (Ent only). See "RemoteLogging" for examples of use. - Added multiple features to TkbmMWDateTime: - >=,<=,>,< comparison operators on TkbmMWDateTime and TkbmMWDuration - inc/dec operators on TkbmMWDateTime - properties FixedLocalDate, FixedLocalTime, FixedLocalDateTime, FixedUTCDate, FixedUTCTime and FixedUTCDateTime. Converts to/from fixed YYYYMMDD, HHNNSSmmm and YYYYMMDDHHNNSSmmm formatted strings and replaces kbmMWDateTimeToString/kbmMWStringToDateTime in kbmMWGlobal.pas - function DayOfWeek:Word; Returns 1 (sunday) to 7 (saturday). - function SystemLocalTimeOffsetSecs:integer; Returns UTC offset in seconds for system local time. - DecodeUTCDate, DecodeUTCTime, DecodeUTCDateTime, EncodeUTCDate, EncodeUTCTime, EncodeUTCDateTime, DecodeLocalDate, DecodeLocalTime, DecodeLocalDateTime, EncodeLocalDate, EncodeLocalTime, EncodeLocalDateTime. - functions DiffSecs, DiffHours and DiffDays which returns the difference between this and given TkbmMWDateTime. - function FromDayOfYear which creates a new TkbmMWDateTime based on a day of year and a year. - static class functions FixedLocal and FixedUTC which accepts a date/time or datetime fixed string and returns a TkbmMWDateTime. - Added new TkbmMWTimeNS with class methods: NowUTC, ToDateTime and ToNSTime to convert to handle nanosecs time stamp. Notice though that the resolution is not to the nsec level. An even more precise timing is in TkbmMWTiming. - Added support for interval based and forced flushing to TkbmMWBufferedStream and all users of it like TkbmMWFileStoreaMessageQueue, TkbmMWBufferedFileStream. - Added AnonymousRoot property to TkbmMWJSONMarshal (default false). If set to true, it will not put the marshalled object within another object to ensure that the object is named. Eg. AnonymousRoot=false -> { patient: {property1:10 }} Eg. AnonymousRoot=true -> { property1:10 } - Added OnEvent property to WIB transports. Can be used for hooking in when an event message (like progress or log) is received. Changes/minor additions ======================= - Removed kbmMWDateTimeToString, kbmMWStringToDateTime, kbmMWDayOfWeek, kbmMWGetUTCOffset. Use TkbmMWDateTime methods instead. - Removed kbmMWGetCurrentTimeNS from kbmMWGlobal.pas. Use TkbmMWTimeNS.NowUTC. - Added support for SpecificSettings on TkbmMWUniDACQuery, TkbmMWUniDACStoredProc and TkbmmWUniDACResolver. - Removed standard specific options settings on UniDAC database. Notice you must set these manually on the database template when relevant. Previous settings which were automatically set were: InterBase.BooleanDomainFields=False InterBase.DescribeParams=True - Updated FireMonkey sample. Fixes ===== - Fixed pesky thread shutdown issue. - Fixed XE4 compilation issues. - Fixed CompareAndExchange 64 bit version for pre XE2 compilers. - Fixed XML parser bugs in Typed:=true and FilterAllWhiteSpace:=true scenarios. - Fixed A/V due to lock not defined early enough in TkbmMWThreadedCircularBuffer. - Fixed JSON CR escaping bug. 4.81.00 May 9 2015 Important notes (changes that may break existing code) ====================================================== * Changed TkbmMWOnFileAccess event to allow rewriting Path. TkbmMWOnFileAccess = procedure (Sender:TObject; var Path:string; var AccessPermissions:TkbmMWFileAccessPermissions) of object; * Made many more things case sensitive in the XML parser and handlers to adhere correctly to XML standards. Thus the attribute ID is different from the attribute id now! New stuff ========= - Added JQueryEscaping:boolean property (default false) to TkbmMWJSONStreamer. It will double escape all backslashes (\) to adhere to jQuery non standards. Notice that double escaping is NOT JSON standards, but a defacto requirement when using jQuery as the recieving end. - Added optional AJQueryEscaping:boolean argument to kbmMWJSONQuoteString global function. - Added support for NaN and INF in kbmMWFloatToString, kbmMWStringToFloat and kbmMWTryStringToFloat. - Added new optional additional kbmMW_Element_Flags argument to kbmMW_Element attribute. Eg. TMyObject = class... [kbmMW_Element('somename',[mwefData])] MyField:integer; {kbmMW_Element('someothername')] MyOtherField:integer; end; This will marshal/unmarshal MyField as data of the TMyObject instead of a sub element called somename. Eg. 20 30 See the new sample: DynamicXMLMarshalling. - Added new optional additional TypeStoreName and TypeValue arguments to kbmMW_Root attribute which are to be used in combination with the new kbmMW_ConditionalType attribute. TypeStoreName refers to a local string field in the object which will hold/be set to the type of the object while marshalling/unmarshalling. TypeValue is the value that will be set in that field. The new kbmMW_ConditionalType attribute takes a condition and a string value indicating the name of the type of the object if the condition is evaluated to true. A condition can be a simple equal statement or be a complex condition with AND and OR and multiple statements. See the new sample: DynamicXMLMarshalling. Changes/minor additions ======================= - Changed TkbmMWOnFileAccess event to allow rewriting Path. TkbmMWOnFileAccess = procedure (Sender:TObject; var Path:string; var AccessPermissions:TkbmMWFileAccessPermissions) of object; Notice that if you do have code using this event, you should cut out the event code, save, then doubleclick the event handler again and paste in your old code. Also notice that the path is always relative to the defined RootPath of the service. The RootPath is defined in the TkbmMWFileServiceDefinition returned when registering the file service. - Changed TkbmMWCustomSAXXMLParser to inherit from TInterfacedObject and removed custom referencecounting. This also affects TkbmMWDOMXML which descends from TkbmMWCustomSAXXMLParser. - Made a number of properties available via the IkbmMWDOMXMLParser interface: Root, Top,,IgnoreDuplicateIDs, AutoIndent, PreserveWhiteSpace, AutoLineFeed, StreamBOM, AutoDetectEncoding. - Changed TkbmMWDOMXMLNode to allow access to ID and Ref properties as attributes (id, ref). Changing the attribute id or ref will thus also affect the properties id and ref. - Removed handling href attributes as ref attribute in TkbmMWDOMXMLNode. href is now an ordinary attribute, without special handling. - Made many more things case sensitive in the XML parser and handlers to adhere correctly to XML standards. Thus the attribute ID is different from the attribute id now! - Changed so XML GetAsInt, GetAsInt64, GetAsFloat, GetAsDuration, GetAsBoolean and GetAsDataTime automatically filter out all whitespace characters (including cr/lf) before attempting to interpret value. - Changed XML parsing so if PreserveWhiteSpace property is false, then only leading and trailing whitespace is filtered. Fixes ===== - Fixed leak of TkbmMWHTTPURLRewrites object instance in TkbmMWHTTPServiceDefinition. - Fixed JSON marshalling of collection objects. - Fixed IOS Macapi.Foundation compilation issue in kbmMWGlobal.pas. - Fixed bug in AttribByNameIsNil property in kbmMWXML.pas. 4.80.00 March 30 2015 Important notes (changes that may break existing code) ====================================================== * Changed messaging transport event OnServerRequestException to OnServerException. * Removed NeverTimeout property from TkbmMWActor. Replaced by MaxIdleTime. * Removed threaded distributed delivery from hub as it was defunct and needs to be created from new using the new processor classes. New stuff ========= - Added support for XE8. - Changed server messaging transport to use a queue and a processor for server request/service calls instead of the old custom way. - Added public property ServerQueue on server messaging transport to optionally allow for providing a custom queue (eg. memory or file based) instead of the default used TkbmMWMemoryMessageQueue for server request/service call messages. - Added public properties ServerQueueProcessor, InboundQueueProcessor, OutboundQueueProcessor on server messaging transport to optionally allow for other custom processors instead of the default defined by the transport (typical TkbmMWSAFServerInboundQueueProcessor, TkbmMWSAFHubOutboundQueueProcessor, TkbmMWCustomServerMessageQueueProcessor). Various options are available via the properties at runtime to setup forexample PoolSize and PoolQueueSize which defines number of threads and allowed outstanding number of requests on a thread). This replaces old server transport PoolSize property. Default is PoolSize=1 and PoolQueueSize=5. - Added mwsloPreferWideMemoOverMemo and mwsloPreferWideStringOverString options to kbmMWSQLite. Makes it optional to auto map string/memo field types to widestring/widememo field types. As string/memo is already unicode aware, its less reason for remapping to the wide versions automatically. - Added new Distribution property to SubjectHeader of messages. It will allow for indicating grouping and thus sequence of messages when being processed server side by group aware processors. In the future it will also allow for designating a named queue for a message or an exchange. Syntax: name - Push message on named queue Q:name - Push message on named queue E:name - Push message via given exhange G:name - Push message on default queue under group name and process message sequential via group. G:name/H(OLD) - Push message on default queue under group name and hold message in that group. G:name/C(OMMIT) - Push message on default queue under group name and commit all held messages in that group sequentially. G:name/R(OLLBACK) - Push message on default queue under group name and rollback (delete) this and all held messages in that group. Q:name:group - Push message on named queue under given group name and process message sequential via group. Q:name:group/H(OLD) - Push message on named queue under given group name. Hold message. Q:name:group/C(OMMIT) - Push message on named queue under given group name. Commit all held messages in that group in that queue sequentially. Q:name:group/R(OLLBACK) - Push message on named queue under given group name. Rollback (delete) this and all held messages in that group in that queue. E:name:group - Push message via given exchange under given group name and process message sequential via group. E:name:group/H(OLD) - Push message via given exchange under given group name. Hold message in receiving queues. E:name:group/C(OMMIT) - Push message via given exchange under given group name. Commit all held messages in that group in receiving queues sequentially. E:name:group/R(OLLBACK) - Push message via given exchange under given group name. Rollback (delete) this and all held messages in receiving queues. name and group are case insensitive. Holding messages means that they are pushed on a queue, but not made available for processors until commit. - Removed QUE. message type as named queues will be handled by the distribution subject header, in the future. - Added kbmMWGetUserLoginName, kbmMWGetUserFullName, kbmMWGetDomainServerName, kbmMWGetDomainUserFullName in kbmMWGlobal.pas (the later two only for Windows) - Added property MaxIdleTime on TkbmMWActor. Can be -1 to use default, 0 for never to time out, or another value to indicate timeout for that actor when logged in. - Added Distribution string property to TkbmMWCustomClient when WIB is licensed. - Reintroduced new fast TkbmMWEvent lockfree event. Thus 3 different event mechanisms can be used in kbmMW depending on settings in kbmMWConfig.inc. Define {$DEFINE KBMMW_SUPPORT_FASTEVENT} for using C4Ds fast lockfree event mechanism. Define {$DEFINE KBMMW_SUPPORT_LIGHTWEIGHTEVENT} for using Embarcadero's lightweight event mechanism. Define none of the above to fall back and use Embarcaderos TEvent. Notice it has been seen that Embarcaderos TLightWeightEvent is not stable in a production environment and may end up vast amounts of CPU cycles due to it entering some sort of deadlock situation. C4Ds own TkbmMWEvent is very fast and seems to be stable, but it shouldnt be enabled on a production environment before having tested the system under load for a period of time. Internal tests indicates it to be stable, however better be safe than sorry. TEvent is the old mutex based event mechanism which is very slow and results in large amounts of context switches when used often. Its stable but performs quite bad. - Added TkbmMWDuration record which holds a duration value to kbmMWDateTime.pas. It can be used by it self or in combination with TkbmMWDateTime which now fully supports duration values, including calculations. - Added a number of message and queue processor components: TkbmMWSyncMessageProcessor, TkbmMWAsyncMessageProcessor, TkbmMWSyncMessageQueueProcessor, TkbmMWAsyncMessageQueueProcessor, TkbmMWMultithreadMessageQueueProcessor, TkbmMWGroupedMultithreadMessageQueueProcessor - Added mwmqoDisableBatching message queue option to actively disable batching of messages that is requested to be batched and can be batched. - Added support for tentatively pushing messages on a queue by additional optional boolean argument to PushMessage. - Added CommitMessagePush and RollbackMessagePush. A tentatively pushed message is on the queue, but not visible to processors popping messages off the queue, until the message push is committed. - Added public property SubjectHeaderVersion on client and server messaging transports. If set to <>0, will force the outbound messages to be streamed with the given subject header version regardless of what the message itself is set to or what has been defined as default. Changes/minor additions ======================= - Published LargeAsNative in TkbmMWBinaryStreamFormat. - Modified kbmMWDebugDumpMemory to output 32 bytes per line nicely formatted instead of only 8 bytes. - Changed messaging transport event OnServerRequestException to OnServerException. - Removed NeverTimeout property from TkbmMWActor. Replaced by MaxIdleTime. - Removed threaded distributed delivery from hub as it was defunct and needs to be created from new using the new processor classes. - Improved messaging transports to be able to auto adapt to older subject header versions. - Improved precision on kbmMWGetCurrentTimeNS for Windows. Now its precise to approx 15ms. - Ensured that REQ/SRV messages are not committed on the inbound queue until they have been processed by the TkbmMWServer instance even though they are pushed on intermediate queues. - Added Count and Instance properties to TkbmMWServiceInstances to enable easier access from C++. Notice you should lock before and unlock after if you will attempt to loop through all instances as the number may change at any time if not locked. Fixes ===== - Fixed thread leak in TkbmMWCustomThread. - Fixed memory leak in TkbmMWJSONStreamFormat. - Fixed case issue with 'hidden' attribute in TkbmMWJSONStreamFormat. - Fixed SQLiteServer demo which was referencing unneeded AMF3 streamformat. - Fixed C++ XE2-XE5 unable to link with TPerlRegEx. - Fixed transaction sharing issue in FireDAC adapter which caused instability. - Fixed thread leak issue related to transport heartbeat thread. - Added ValueFromUTF16String and ValueToUTF16String methods to TkbmMWJSONMarshal. Exiksting ValueFromString and ValueToString encodes/decodes in UTF8 format. 4.70.00 Feb 12 2015 New stuff ========= - Added support for marshalling and demarshalling generic TDictionary descendants. - Added native LZH support including new TkbmMWLZHCompression component. Notice that LZH compression gives good compression, but at a cost of CPU cycles. Thus requests per second will be drastically limited. For this reason, its best to use the compression on a separate transport accessible only by devices that require compression, and leave other devices communicate via a server transport that is not compressed. As the LZH compression is in native Pascal code, it should compile for IOS/Android too. - Added support for tentatively pushing messages to a queue. The message is not available for pop, until the push has been committed. Alternatively the push can be rolledback. - Added support for streaming true native int64 in TkbmMWBinaryStreamFormat. Upped the stream version to 47000. Its still backwards compatible. - Added multilevel congestion support and filtering on message queues. CongestionPriority is used for determining which messages to drop (all from this priority and below) when CongestionThreshol has been reached. CongestionThreshold is now considered the last barrier of defence for filtering out both low and higher priority messages. CongestionPriorityLow and CongestionThresholdLow is a new congestion barrier added to filter out low priority messages. - Added TentativelyPushedMessages and renamed PoppedMessages to TentativelyPoppedMessages to message queues. Returns number of tentatively (and thus not visible) pushed messages, and already popped but not committed messages. - Added support for read/write float and double data, little endien and big endian in TkbmMWMemoryStream. - Added Swap16, Swap32, Flip16, Flip32, Flip8 to TkbmMWPlatformMarshal. - Added PassedTime to TkbmMWTiming. Same as HasPassedTime but returns new base time. - Added kbmMWHashString64 and kbmMWHashWideString64. Renamed old kbmMWHashString and kbmMWHashWideString to kbmMWHashString32 and kbmMWHashWideString32. Calculates 32 and 64 bit versions of FNV-1A hashes. - Added kbmMWSubjectStartsWith to kbmMWSubjectUtils.pas - Added support for using IOS/Android native logging when using kbmMWDebug features. Changes/minor additions ======================= - Updated SQLiteServer and Client samples to allow selection of compression. - Improved TCPIP Indy client messaging transport disconnection. - Changed statistics timestamps to (potential) ns precision. Fixes ===== - Fixed buffer overrun in TkbmMWStringList.SetTextStr. - Fixed bug related to XE7 and field lifecycle on error table. - Fixed CPU cores pegged at 99% by making use of TLightweightEvent optional on XE3 and up. Now default is disabled and TEvent is used instead. Reason is that it has shown to be unstable on loaded systems getting into endless spinwaits, hogging all CPU cores. - Fixed A/V when nodes are missing in streamed TkbmMWXMLAuthorizationStorage data upon load. - Fixed field ownership in TkbmMWXMLStreamFormat and TkbmMWJSONStreamFormat. - Fixed incorrect JSON escaping forward slash. - Fixed GetAsStream in TkbmMWJSONNative. - Fixed missing platform attributes. - Fixed kbmMWExplode for NextGen compilers. - Fixed kbmMWSafeString for NextGen compilers. - Fixed kbmMWExtractParameter for NextGen compilers. 4.60.00 Dec 26 2014 New stuff ========= - Added AMQP 0.91 client side gateway support and sample. Changes/minor additions ======================= - Updated StreamSec TLS transport plugin component (by StreamSec). - Improved performance on Indy TCP/IP Client messaging transport for large number of inbound messages. Fixes ===== - Fixed compilation for XE. - Fixed XE3 issues in TkbmMWMemoryStream. - Fixed potential deadlock issue during TkbmMWThread shutdown. - Fixed RemoteDesktop compilation and minor issues when client not requiring startup password. - Fixed IOS compilation bugs and thread shutdown issues. - Fixed issues in Indy TCP/IP Client messaging transport upon shutdown. - Fixed issue with master/detail upon initial open as reported and fix suggestion by "UrosF". - Fixed LocalStats Divide by Zero error on fast execution. 4.50.00 Sep 10 2014 New stuff ========= - Added XSD parser support and code generator. A demo is included, showing how the XSD parser is used in combination with the code generator, to generate Pascal objects that kbmMW can use for marshalling to and from objects. - Added CaptureMode to kbmMW RemoteDesktop client/server classes to allow for selecting between GDI and DirectX. Default is GDI. - Added new ViewMode types including mwrdvm_Device to kbmMW RemoteDesktop client/server classes to allow for using the best fitting view mode, compared to the current screen bitdepth on the server end. By using the best fitting view mode, the RemoteDesktop server part use less CPU. - Added support in kbmMW RemoteDesktop to detect if screen capture is to slow to be useful (typically on old graphic cards like Matrox G400 with Hardware accelleration enabled). - Added new kbmMWNullable generic. If you need to define a simple datatype that should be nullable, you can define it as var myInt:kbmMWNullable; for example. It can be used as any regular variable. Use myInt.IsNull to check if its null. If you have compile error due to conversion problems you can use myInt.Value to access the value directly. - Added new TkbmMWDateTime type to replace TDateTime. It works similar to TDateTime except it is timezone and null aware, and knows if its being used to store a time, a date or a date time value, and thus can provide correct matching string conversion automatically. It supports more than 760 different timezone abbrevations, and has full support for ISO8601 formats. Internally it always store time as UTC with a timezone difference, depending on the chosen timezone. On assigning a TDateTime value to it, it always assumes not timezone given (and thus its UTC). When assigning Now to it, you will want to use the LocalTime property to assign now. Eg. mytime:TkbmMWDateTime; mytime.LocalTime:=Now. By doing so, it will autodetect the appropriate local timezone. - Added new very fast TkbmMWLockFreeHashArray to kbmMWGlobal. Its as the names imply a lock free hash array which stores an integer value with a uint64 key. - Enhanced TkbmMWLock to automatically detect lock escalation, and allow finetuning of spin/sleep time. Tests show that TkbmMWLock is now the fastest implementation of a MREW with lock escalation handling for Delphi/C++Builder. In addition it allows for checking which threads holds which locks at any time, via the kbmMWConcurrentMREWReadLocks hash array. - Added to kbmMWGlobal.pas function kbmMWExpectChars(var APChar:PChar; const AChars:TSysCharSet):boolean; function kbmMWSearchChars(var APChar:PChar; const AChars:TSysCharSet):boolean; function kbmMWSearchDigit(var APChar:PChar):boolean; function kbmMWSearchNonDigit(var APChar:PChar):boolean; function kbmMWGetDateFromWeek(const AYear:integer; const AWeekNo:integer; const ADayInWeek:integer):TDateTime; function kbmMWGetDateFromDayOfYear(const AYear:integer; const ADayOfYear:integer):TDateTime; function kbmMWRoundToPowerOf2(const AValue:integer):integer; {$IFDEF KBMMW_SUPPORTINLINE}inline;{$ENDIF} function kbmMWMurmurHash3(const AValue:cardinal):cardinal; overload; {$IFDEF KBMMW_SUPPORTINLINE}inline;{$ENDIF} function kbmMWMurmurHash3(const AValue:int64):int64; overload; {$IFDEF KBMMW_SUPPORTINLINE}inline;{$ENDIF} function kbmMWDigestToString(const ADigest:TkbmMWDigest256):string; procedure TkbmMWStringBuilder.Append(const AStringBuilder:TkbmMWStringBuilder); - Added function TkbmMWRegisteredTransportStreamList.ControllerClassByID(AID:string):TkbmMWCustomTransportStreamControllerClass; - Added support for multiple statements in SQLite adapter function TkbmMWSQLiteConnection.Query(const AClass:TkbmCustomMemTableClass; const ASQL:string):TkbmCustomMemTable; Only last will however be returned. - Added to kbmMWXML.pas: TkbmMWXMLNativeDataType to handle true native XML datatype understanding. (TkbmMWDOMXMLNode) property ChildrenByName[AName:string]:TkbmMWDOMXMLNodeList read GetChildrenByName; (TkbmMWDOMXMLNode) property ChildrenByID[AName:string]:TkbmMWDOMXMLNodeList read GetChildrenByID; (TkbmMWDOMXMLNode) function GetNativeDataType(AType:string = ''):TkbmMWXMLNativeDataType; (TkbmMWDOMXMLNode) function GetDataTypeName(var ANameSpace:string; AType:string=''):string; (TkbmMWDOMXMLNode) property AttribByNameIsNil[const AName:string]:boolean read GetAttribByNameIsNil write SetAttribByNameIsNil; - Added support for ftShortint as parameter and field type. - Added support for int64/uint64 versions of CompareAndExchange for pre XE. - Added support for XE6. - Added support for XE7. - Added new HTTP FastCGI able custom service and demo application. - Added mwdtDBTimings,mwdtDBTransaction options to kbmMWDebugTypes. If mwdtDBTimings is enabled, ms accurate timings are output for DB operations. If mwdtDBTransaction is enabled, DB transaction start, commit and rollback are logged. - Added fast TkbmMWStringLookup. It is a fast hash based simple string list for unique strings, with indexed access to each string. - Added fast TkbmMWStringLookupList. Its a fast string key/value has based list for unique key names and values, with indexed access to each key string and value access via key string. - Added TkbmMWCustomMessagingServerTransport.CreateRequestMessage. - Added TkbmMWCustomMessagingServerTransport.CreateServiceCallMessage. - Added TkbmMWVirtualMessagingServerTransport component, which can be used for adding one or more local/internal only WIB segments within an application. - Addded more overloaded SendMessage and SendPrioritizedMessage methods to TkbmMWCustomMessagingClientTransport. - Added support for handing nil where TkbmMWClientIdentity is expected in CreateMessage SendMessage and SendPrioritizedMessage. - Added kbmMWObjectMarshalInitialize and kbmMWObjectMarshalFinalize which should be called at application start and end time in C++Builder applications to ensure timely correct initialization of object marshalling. In Delphi its not required to call them. - Updated Remote Desktop with encryption (SHA256), new chat features and improved login features. Changes/minor additions ======================= - Updated object marshaller (incl. JSON and XML) to support new kbmMWNullable and TkbmMWDateTime types. Internally there have been made many changes to also support objects defined by XSD import. - Dropped own implementation of TkbmMWEvent, and instead aliases TkbmMWEvent to fastest Delphi/C++Builder implementation for given Embarcadero version. - Removed from kbmMWGlobal.pas function kbmMWDateTimeToISO8601String(const AValue:TDateTime):string; function kbmMWISO8601StringToDateTime(const AString:string):TDateTime; function kbmMWDateToISO8601String(const AValue:TDateTime):string; function kbmMWISO8601StringToDate(const AString:string):TDateTime; function kbmMWTimeToISO8601String(const AValue:TDateTime):string; function kbmMWISO8601StringToTime(const AString:string):TDateTime; they have been replaced with TkbmMWDateTime. - Removed from kbmMWXML.pas: function kbmMWXMLTryStringToDateTime(AValue:string; var ADateTime:TDateTime):boolean; function kbmMWXMLDateTimeToString(AValue:TDateTime):string; function kbmMWXMLStringToDateTime(AString:string):TDateTime; function kbmMWXMLDateToString(AValue:TDateTime):string; function kbmMWXMLStringToDate(AString:string):TDateTime; function kbmMWXMLTimeToString(AValue:TDateTime):string; function kbmMWXMLStringToTime(AString:string):TDateTime; Instead use TkbmMWDateTime functionality. - Modified in kbmMWGlobal.pas class function TkbmMWPlatformMarshal.UTF8Decode(const ABytes:TkbmMWBytes; ACount:TkbmNativeInt = -1):string; Added optional ACount. - Made general use of TkbmMWLock and TkbmMWDateTime internally. - Performance optimized XML parser. Large XML files now parses 20-fold faster. (example 165 MB XML now parsed in 7.6 secs. Before parsed in 3.5 minutes) - Added optional KBMMW_COMPACT_XML definition which if defined, lowers memory use by XML parser significantly at a parsing performance penalty of 40%. - Updated AnyDAC adapter. - Updated FireDAC adapter. - Added distance delegate for generic TkbmMWSortedList constructor. - Added TkbmMWDigest512 to kbmMWGlobal.pas. - Updated JNI.pas and JNIUtils.pas to latest version and fixed bugs. - Optimized WIB message processing performance for server request/calls. Fixes ===== - Fixed bugs in kbmMWCipherHash.pas: procedure TkbmMWCustomHash.UpdateString(const Str:string); function TkbmMWCustomCipher.EncryptString(const Str:string):string; function TkbmMWCustomCipher.DecryptString(const Str:string):string; function TkbmMWCustomBlockCipher.EncryptString(const Str:string):string; function TkbmMWCustomBlockCipher.DecryptString(const Str:string):string; - Fixed bugs in kbmMWMime.pas: function kbmMWMimeEncodeString(const S:string):string; function kbmMWMimeEncodeStringNoCRLF(const S:string):string; function kbmMWMimeDecodeString(const S:string):string; function kbmMWMimeDecodeString2Bytes(const S:string): TkbmMWBytes; procedure kbmMWMimeEncode(const InputBuffer:TkbmMWBytes; var InputBufferOffset:cardinal; const InputByteCount: Cardinal; var OutputBuffer:TkbmMWBytes; var OutputBufferOffset:cardinal); function kbmMWMimeDecodedSize(const InputSize: Cardinal): Cardinal; - Fixed bug in SQLite adapter when query didnt result in fields. - Fixed function kbmMWEncodingToString(const AEncoding:TEncoding):string; to use correct lowercase encoding names. - Fixed bugs in kbmMWCustomClientMessagingTransport.pas - Fixed multi database operation on user transaction bug. - Fixed compilation for pre XE. - Fixed transport backwards compatibility support. - Fixed client app automatically linking in TkbmMWServer in kbmMW Ent Edition. - Fixed A/V for IOS apps, as atomic 64 bit operations do not work correctly on IOS. - Fixed authorization manager login bugs. - Fixed TkbmMWMemoryStream.CopyFrom when source is a TkbmMWMemoryStream. - Fixed Java service (Windows only support). - Fixed TkbmMWHTTPCustomValues where value name was wrongly uppercased. - Fixed TkbmMWFileClient file transfer issues and added new State property to know what operation is currently running. 4.40.10 Dec 27 2013 Fixes ===== - Removed left over references to old TkbmMWDCPCrypt2 crypt adapter. Instead use TkbmMWCrypt adapter. 4.40.00 Dec 22 2013 Important notes (changes that may break existing code) ====================================================== - Changed JSON object marshalling (TkbmMWJSONMarshal) to not add double child arrays in collections. Notice this makes JSON incompable with previous JSON streaming format. New stuff ========= - Added properties Cancel:boolean, UniqueID:string, UniqueCallID:string, RequesterNodeID:string and RequesterClusterID:string to TkbmMWCustomService. Enables features for cancelling ongoing request. - Added full XE5 Win32/Win64/OSX/Android and IOS support. Add kbmMW and kbmMemTable source directory to Library path when compiling for Android or IOS. - Added TkbmMWAuthorizationManager which can be used for keeping track of resources, actors, logins and authorizations and constraints. - Added AuthorizationManager property to TkbmMWServer. - Added OnPreServeRequest to TkbmMWServer. Provides access to a request before even authorization manager kicks in. - Added Cancel method to TkbmMWServer allowing for requesting cancelation of a specific request. - Added Enabled property to TkbmMWCustomServerTransport. - Modified OnAuthenticate event to include AMessage:string argument. - Added Transport:string to TkbmMWClientIdentity. Is set on server to let authentication know from which transport a request originates. - Added portable high performance TkbmMWLock (when KBMMW_SUPPORT_FASTMRWSLOCK is defined (default)) which is much faster than TEvent/TMutex and TMultiReadExclusiveWriteSynchronizer. - Added TkbmMWTiming which provides portable high resolution time functionality. - Added TkbmMWInterlocked which provides portable interlocking functions. - Added high performance TkbmMWEvent to replace slower TEvent. - Added ConfigureAffinity, Yield, Sleep, CurrentThreadID, CurrentThread, ThreadGroup and ThreadAffinityType to TkbmMWCustomThread. ThreadGroup allows selection of a thread group which share a common CPU core affinity. Max 256 threadgroups exists. Placement of the thread on a CPU core within the defined affinity is determined by the ThreadAffinityType setting. Allows for fine tuned thread optimization. Specify affinities in global variable: kbmMWThreadGroupAffinity. - Added TkbmMWPlatformMarshal for portable memory/bytes/utf8/string marshalling. - Changed kbmMWHashString from a simple xor hash to the better FNV-1A 32 bit hash. - Added portable kbmMWGetApplicationName:string returning the name (typically with path) of the current executable. - Added optional Mapping:string argument to LoadFromDataset. Specify sourcefield=destfield;... for custom mapping of fields. - Added new WIB message type mwmtEvent (EVT.). Its designed to be used for sending system/application events. For example used by the new progress management system, which allows for a client to subscribe for progress, and a server to push progress status, for example for long running synchrone or asynchrone requests (require WIB). - Added new transport heartbeat functionality via properties HeartbeatInterval and OnSendHeartbeat. OnSendHeartbeat is triggered every n seconds, and its the developers responsibility to then actually send a message/request to indicate a heartbeat from a client with help of the SendHeartbeat method on the client transport. - Added mwsloNullOnValueError as a new SQLite option. Instead of excepting the field is set to null. - Added Pause:boolean, PausePriority:byte to TkbmMWCustomQueue. If Pause=true will pause processing (sending if outbound queue) messages equal to or lower than PausePriority. - Added counters TotalPushCount, TotalTentativePopCount, TotalCommitCount, TotalRollbackCount, TotalRejectCount, TotalDeleteCount to TkbmMWCustomQueue. - Added support for multiple events for a single subscription via the Events property of TkbmMWSubscription. Now Subscribe adds an additional event if a subscription allready exists for a particular subscription subject. Use SubscribeReplace to replace all previously events for a subscription with another event. Unsubscribe method now overloaded with multiple methods, allowing to unsubscribe for a specific event for a subject. The "old" Unsubscribe unsubscribes all events for the given subject. - Added ThreadGroup and ThreadAffinityType to TkbmMWCustomAsyncMessageProcessor, TkbmMWCustomAsyncMessageQueueProcessor and TkbmMWCustomPooledMessageQueueProcessor. - Added new TkbmMWCustomEventMessage which is the basis for all WIB based messages that consitutes an event message. - Added new TkbmMWHeartbeatEventMessage. - Added properties AsEncodedString, UpperName to TkbmMWHTTPCustomValue. - Added Delete, Values, Names, ValueAsString, AsEncodedString to TkbmMWHTTPCustomValues. - Added TkbmMWHTTPMimeHeaderValueField, TkbmMWHTTPMimeHeaderValueFields, TkbmMWHTTPMimeHeaderValue, TkbmMWHTTPMimeHeaderValues, TkbmMWHTTPMultiPart, TkbmMWHTTPMultiParts in kbmMWHTTPUtils.pas. Thus now multipart HTTP messages can be parsed. - Added TkbmMWHTTPCustomAuthorization and TkbmMWHTTPBasicAuthorization along with new function kbmMWParseAuthorization(const AAuthorizationHeader:string):TkbmMWHTTPCustomAuthorization; for parsing authorization header. - Updated TkbmMWHTTPTransportStreamHelper to support new TkbmMWHTTPMimeHeaderValues, and added HTTPRealm:string property, and added Authorization:TkbmMWHTTPCustomAuthorization property. - Added function HTTPResponseFromStream(AStream:TkbmMWMemoryStream):variant; to TkbmMWCustomHTTPService. - Updated known mimetypes (Added SVG, JSON, TTF, OTF, WOFF, EOT, MP4, MPEG4) - Updated known charsets (added JSON = UTF8). - Added TkbmMWSAFSyncRequestResponseStatus set (mwbrsTimeout,mwbrsAbort,mwbrsOK) which allows for a sync/async request to determined if a request has timed out, been cancelled or proceeded ok. - Added OnProcessorException to TkbmMWCustomSAFClientTransport which is triggered if the internal inbound or outbound processor encounters an exception. - Added optional APriority argument to AnnounceSubscriptions method. - Added OnClientWaitingResponse event to TkbmMWCustomClient. Its triggered when a request is sent that is blocking (sync). - Added new TkbmMWProgressManager which can be used to send and receive progress information via the WIB. - Added new FireDAC adapter. - Added new ciphers and hashes. The closed DCPCrypt library (www.cityinthesky.co.uk/opensource/dcpcrypt) has been picked up by C4D and resurrected with support for all platforms. Thus now added TkbmMWHashHaval, TkbmMWHashMD4, TkbmMWHashMD5, TkbmMWHashRipeMD128, TkbmMWHashRipe160, TkbmMWHashSHA1, TkbmMWHashSHA256, TkbmMWHashSHA512, TkbmMWHashTiger hashes, and TkbmMWCipherBlowfish, TkbmMWCipherCast128, TkbmMWCipherCast256, TkbmMWCipherDes, TkbmMWCipher3Des, TkbmMWCipherIce, TkbmMWCipherThinIce, TkbmMWCipherIdea, TkbmMWCipherMars, TkbmMWCipherMisty1, TkbmMWCipherRC2, TkbmMWCipherRC4, TkbmMWCipherRC5, TkbmMWCipherRC6, TkbmMWCipherRijndael, TkbmMWCipherAES, TkbmMWCipherSerpent, TkbmMWCipherTea, TkbmMWCipherTwofish ciphers. - Added TkbmMWCrypt transport encryption plugin, which supports all above ciphers and hashes. - Added mwsloSharedCache, mwsloExceptOnLocked options to TkbmMWSQLiteOptions. - Added MaxLockedWait property to TkbmMWSQLiteConnectionPool. It controls how long time a statement will wait (msecs) for a blocking lock to be lifted, before excepting. - Added support for accessing native SQLite library on Android. Make sure NOT to use KBMMW_SQLITE_STATIC_LINKED. On IOS you MUST use KBMMW_SQLITE_STATIC_LINKED. - Added UTF8CEncode and String2CBytes to TkbmMWPlatformMarshal. They will add an ending zero byte to the resulting byte array. - Added TkbmMWCustomHashStream, and made TkbmMWMD5Stream descend from it. - Added kbmMWCopyDigest and kbmMWZeroDigest functions to kbmMWGlobal.pas - Added support for defining null value for boolean value via the kbmMW_Null attribute (object marshalling). - Added 4 new exception error codes related to encryption/descruption to kbmMWExceptions.pas. - Added DontExceptOnEmptyString boolean property to TkbmMWJSONStreamer. If true, parsing an empty string will not cause exception, but only return an empty TkbmMWJSONObject instance. Fixes ===== - Fixed compilation for D2009. - Fixed mime encoding/decoding in kbmMWMime.pas. - Fixed null validation/conversion for collection items (object marshalling). - Fixed storing/retrieving stream of size 0 in kbmMW Stream Store. - Fixed several other issues. Changes/minor additions ======================= - Removed old TkbmMWDCPCrypt transport encryption plugin. - Changed TkbmMWThreadList to be a generic class. - Changed kbmMWImplode to optionally accept AQuote argument (default none). - Changed TkbmMWAuthorizationActor so the actor name is stored and compared case insensitive (uppercase). - Changed JSON object marshalling (TkbmMWJSONMarshal) to not add double child arrays in collections. Notice this makes JSON incompable with previous JSON streaming format. 4.30.00 June 30 2013 New stuff ========= - Added support for Delphi XE4 Win32/Win64/OSX. - Added function AttributeValueByIndex(const AIndex:integer):string; and function IndexOfAttributeName(const AName:string):integer; to TkbmMWDOMXMLNode. - Added support for optionally throwing exception upon busy in SQLite database adapter. MaxBusyWait specifies how long time max to wait to get access to the database resource (default 10000 = 10secs). - Added JSON Object marshal features similar to the XML ones already avaialble in earlier release. TkbmMWJSONMarshal also supports streaming properties containing custom objects like kbmMemTable based datasets. - Added AsVariant property and GetAsVariantType function to TkbmMWJSONArray. - Added DontStreamNullProperties to TkbmMWJSONStreamer to control if null values are streamed or not. - Added support for (and requires) kbmMemTable v. 7.30 which introduced support of more than 255 fields. - Added generic TkbmMWSortedList for LEVEL16+ compilers. - Added status functions IsStarted and IsPaused to TkbmMWCustomThread. - Added procedure Add(const AList:TkbmMWVariantList to TkbmMWVariantList. - Made multiple improvements to TkbmMWCustomRTTIMarshal, including new property ForceBinaryDatasets:boolean which allows the developer to specify if a dataset should be streamed in native binary format and marshalled as a blob/stream, or if datasets should be marshalled normally as for example plain XML depending on the descendant of TkbmMWCustomRTTIMarshal (default). Fixes ===== - Fixed charset support in AJAX transport streamformat. - Fixed issues in UniDAC database adapter. - Fixed issues in IBDAC database adapter. - Fixed handling null in DateTime/Time/Date fields in SQLite. - Fixed TkbmMWHTTPCookie to automatically encode and decode cookie and query names. - Fixed important bug in kbmMWGetTempDirectory which would lead to spurious A/V other places if used. Changes/minor additions ======================= - Improved handling floating point values from SQLite. - Improved TkbmMWLookupStorage to allow for creating descendant classes with additional indexing variants. In addition added Repair, Verify and Clear methods. - Enhanced JSON dataset stream format with more dataset node naming features and additional stream flags. - Enhanced TkbmMWHTTPTransportStreamHelper to support jQuery's AJAX request with JSON object arguments format. - Enhanced TkbmMWSortedList in kbmMWGlobal.pas to support findtype. - Improved unicode support in kbmMWXMLDecode. - Improved unicode support in kbmMWEncodeEscapes and kbmMWDecodeEscapes. 4.21.00 Apr 11 2013 Fixes ===== - Fixed abstract bug in TkbmMWFileStoreMessageQueue introduced in 4.20.00. - Fixed RowsAffected to count total when a multistatement query execution is run. Earlier only the result from the last statement was returned. - Fixed compilation for D2007. Requires kbmMemTable v. 7.05.00. Remember to set {$DEFINE KBMMW_SUPPORT_MT_PRE725} in kbmMWConfig.inc. Also remember to set {$DEFINE KBMMW_SUPPORT_INDY_10_5_8} in kbmMWConfig.inc when using original Indy 10 installed with D2007. New stuff ========= - Added better HTTP charset support. A number of charset types have already been registered on the global variable kbmMWHTTPCharsets found in kbmMWHTTPUtils. - Added support for setting status code for non failure HTTP responses. Set it on the Helper property of the response transport stream. Eg. TkbmMWHTTPTransportStreamHelper(ResponseTransportStream.Helper).HTTPStatusCode:=206; Default value is 200. 4.20.10 Apr 11 2013 Fixes ===== - Fixed abstract bug in TkbmMWFileStoreMessageQueue introduced in 4.20.00. - Fixed RowsAffected to count total when a multistatement query execution is run. Earlier only the result from the last statement was returned. - Fixed compilation for D2007. Requires kbmMemTable v. 7.05.00. Remember to set {$DEFINE KBMMW_SUPPORT_MT_PRE725} in kbmMWConfig.inc. Also remember to set {$DEFINE KBMMW_SUPPORT_INDY_10_5_8} in kbmMWConfig.inc when using original Indy 10 installed with D2007. 4.20.00 Mar 28 2013 Important notes (changes that may break existing code) ====================================================== - kbmMemTable internal functions has been altered in v. 7.25.00. This version of kbmMW default supports these changes. If you still use an older version of kbmMemTable than 7.25.00, please define the following in kbmMWConfig.inc {$DEFINE KBMMW_SUPPORT_MT_PRE725} New stuff ========= - Added completely new RTTI based object marshalling for D2010 and up. Currently XML serialization is directly supported. Marshalling is controlled by attributes directly defined on the class to be marshalled: [kbmMW_Root(classtagname,[options])] | [kbmMW_Root([options])] [kbmMW_Element(tagname)] | [kbmMW_Element] [kbmMW_Attribute(attributename)] | [kbmMW_Attribute] [kbmMW_Array(tagname)] [kbmMW_Child(tagname)] [kbmMW_Null(nullvalue:string|double|integer|int64)] [kbmMW_NotNull] [kbmMW_Validate(expression)] [kbmMW_Dataset([options])] [kbmMW_DatasetRow(rowtagname)] [kbmMW_DatasetField(fieldtagname)] [kbmMW_DatasetVersion(versiontagname)] [kbmMW_DatasetDefinition(definitiontagname)] [kbmMW_DatasetData(datasettagname)] Please check XML marshalling demo for examples of how to use. - Added new functions to WIB hub: function AllSubscribingFor(const ASubject:string; const APeers:TStrings):integer; Returns a list of cluster dot node IDs for all peer nodes subscribing for a particular subject (wildcards allowed) function AllSubscriptionsFor(const ASpokeID:integer; const ASubject:string; const ASubscriptions:TStrings):integer; Returns a list of all subscriptions made for either a specific spoke id or all spoke ids (if ASpokeID = -1) where they subscribe for a partiluar subject (wildcards allowed) - Added support for int64 for XML and SOAP transport streams. - Added properties DatasetNodeName, RowNodeName, FieldNodeName, VersionNodeName, DefinitionNodeName, DataNodeName and sfXML streamformat flags to XML dataset stream formatter. Its by these properties possible to change the naming and way while streaming XML. sfXML can contain a mix of: sfXMLSaveRowID - Also streams the internal row id. sfXMLFieldNameAsTag - Use the field name as the XML tag instead of the value define by FieldNodeName sfXMLVersions - If not set, no tags are generated for record versions. sfXMLExplicitDataNode - If set a specific tag given by DataNodeName, will contain the data for the complete data table. sfXMLMemoAsString - If set memo fields are streamed as a string instead of as a stream. Remember the settings must be the same on load as they were while saving. - Added kbmMWUnquoteString and kbmMWTryStringToFloat functions to kbmMWGlobal.pas. - Added message congestion support to WIB queues. New event: OnCongestion which is called when congestion is happening. New property: CongestionTreshold which determines how many messages are allowed in a queue before congestion is triggered. CongestionDelay which controls how much a delay will happen on every push of a message to the queue, if a congestion situation is triggered, and the mwmqoDelayOnCongestion option has been set on the queue. New Options: mwmqoDelayOnCongestion (see above) mwmqoRejectOnCongestion (place newly pushed message immediately in reject queue) mwmqoDeleteOnCongestion (immediately delete newly pushed message) - Added support for JPG and PNG compressing images when Remote Desktop is compiled with XE and up. - Added TerminateServer method to TkbmMWRemoteDesktopClient. When called the Remote desktop server is notified about it should stop. It can choose to ignore this wish though. - Added mouse wheel support in Remote Desktop. - Added support for Huffman compressed difference images in Remote Desktop. It typically provides better performance than JPG, PNG or pure ZIP compression. - Modified timings in Remote Desktop screen updates to provide a more fluid experience. - Improved Remote Desktop UAC (elevation support) handling when running the Remote Desktop service helper. - Added support for video streaming in RTMP gateway and in general improved compliance. - Added ExecuteQuery function to all kbmMW query components. It allows for quick execution of a query with data for the first received row, returned in a variant. If only one field was selected the variant will directly contain the field result value. If multiple fields was selected, the variant will contain an array of variants which each contain the relevant field result. Changes/minor additions ======================= - Changed character encoding in XML transport stream not to mimeencode non ascii strings. - Modified kbmMWExtractParameter to accept a custom delimiter. - Improved AnyDAC adapter to correctly handle field origins. - Improved SQLite adapter: Added mwsloAnsiStrings option to handle string values as ansistring instead of UTF8 (default). Added SQLiteTimeout:integer property to set timeout (in ms) of statement execution. Fixed memory leak. Fixed resolving issues. Fixed prematurely unloading of DLL in special cases. Fixes ===== - Fixed ISAPI compilation for pre XE compilers. - Fixed memory leak in XML and SOAP transport streams. - Fixed AMF3 transport and improved compliance. - Fixed compilation in non Windows environments. - Fixed master/detail issues. - Fixed JSON GetAsStream and SetAsStream methods. - Fixed streaming of definitions in JSON dataset stream format. - Fixed MT adapter bug preventing access to the same table from multiple connections. 4.11.00 Oct 20 2012 New stuff ========= - Added RAD Studio/Delphi XE3 support. Changes/minor additions ======================= - Added support for close stream command in RTMP gateway. - Improved indicating AccessAudio/AccessVideo stream policy for RTMP client. - Improved multithread support in RTMP gateway. - Added support for CoInitialize in UniDAC when accessing MSSQL. - Added new kbmMWSQLite options: mwsloReadOnly, mwsloAutoCreateDB to support for opening SQLite databases readonly and for automatic creation of SQLite database if not existing. Fixes ===== - Added missing kbmMWPreConfig.inc file to installer. - Fixed issue with older compilers buggy implementation of nativeint datatype. 4.10.00 Beta 3 Sep 20 2012 Important notes (changes that may break existing code) ====================================================== * Added version stamp and generational feature to TkbmMWStreamStore which is can be used to figure out if the contents of the streamstore has been changed. This new version automatically updates older streamstores to newer version, which means that older software will not be able to read them. This also affects TkbmMWFileMessagingQueue. New stuff ========= - Added TkbmMWRTMPGateway server transport component. It allows making kbmMW a mediaserver and publish/subscribe support towards RTMP (AIR/Flash) capable devices. - Added version stamp and generational feature to TkbmMWStreamStore which is can be used to figure out if the contents of the streamstore has been changed. This new version automatically updates older streamstores to newer version, which means that older software will not be able to read them. This also affects TkbmMWFileMessagingQueue. New Checkpoint function allows for forcing a checkpoint returning the new generation of the streamstore. Fixes ===== - Fixed memory leaks with AJAX and XML transport stream formats. - Fixed AJAX streamformat random closing connection even though using HTTP version 1.1 - Fixed AJAX response from file UTF-8 bug. - Fixed ISAPI transport disconnect after first call. - Major updates and fixes for AMF3 objects in AMF3 transport stream format and support functions. 4.01.00 Beta 2 Jul 11 2012 Fixes ===== - Fixed IOS bugs. - Fixed JSON bugs with object/array naming and empty object/array bug. New stuff ========= - Added new QoS WIB message flags: KBMMW_TRANSPORT_QOS_REPLACE_BY_SUBJECT, and KBMMW_TRANSPORT_QOS_REPLACE_BY_PRIORITY. Changes/minor additions ======================= - Updated AnyDAC adapter with metadata support. 4.01.00 Beta 1, Jun 1 2012 Important notes (changes that may break existing code) ====================================================== * Updated transport stream format to 410, to support transfer of variant unicode strings as widestrings instead of converting to ansistring on environments not supporting string as unicode (but do support widestring). The transport is backwards compatible. Ie.. newer server supports older clients. If a newer client want to talk with an older server, it can force use of the older transport version by setting the transport parameter KBMMW_STREAM_FORMATTER_PARAM_STREAMVERSION to f.ex 320. New stuff ========= - Added support for IOS for majority of functionality in kbmMW, both as server and client. - Updated transport stream format to 410, to support transfer of variant unicode strings as widestrings instead of converting to ansistring on environments not supporting string as unicode (but do support widestring). The transport is backwards compatible. Ie.. newer server supports older clients. If a newer client want to talk with an older server, it can force use of the older transport version by setting the transport parameter KBMMW_STREAM_FORMATTER_PARAM_STREAMVERSION to f.ex 320. - Major changes in SQLite adapter to support both statically linked and dynamically linked SQLite libraries. - Added support for DATE/DATETIME/TIME type fields of type TEXT/REAL/INTEGER for SQLite adapter. - Added support for choosing if TEXT without length/type should be mapped to ftMemo or ftString/ftWideString with length. Check SQLiteOptions and SQLiteDefaultStringSize properties. - Ongoing work on new actor, resource, role based authorization features. - Updated JSON support with added AsVariant, JSONP support via SaveTo...P methods and bug fixes. - Added TkbmMWThreadStringList to kbmMWGlobal.pas. - Added kbmMWDateTimeToISO8601String, kbmMWISO8601StringToDateTime, kbmMWDateToISO8601String, kbmMWISO8601StringToDate, kbmMWTimeToISO8601String, kbmMWISO8601StringToTime to kbmMWGlobal.pas. - Added substring kbmMWLastPos to kbmMWGlobal.pas. - Added AnyoneSubscribingFor to TkbmMWCustomMessagingHub (par of WIB). - Added two more IsSubscribing overloads to TkbmMWSubscriptionList. Changes/minor additions ======================= - Updated XML stream format. Removed automatic base64 encoding on strings. - Updated XML. Removed automatic base64 encoding on strings. Fixes ===== - Added missing Java files for kbmMW Spider/Java. - Fixed missing lock bug when requesting stateful service. - Fixed so CreateMessage returns message with UnStreamStatus set to allproperties instead of unknown. - Fixed FIB adapter when AsBlob is bytes. - Fixed SOAP transport stream format. - Fixed Mime encoding on Unicode environmens. - Fixed request time out bug in Synapse TCPIP Messaging transport. - Fixed bug with stateful service instances that was not locked correctly. - Fixed ftMemo bug in UniDAC adapter. 4.00.03 Feb 12 2012 New stuff ========= - Implemented Charset support in transport streams. It will primarely be used in relation to HTML/AJAX response generation. Fixes ===== - Fixed ParamCheck setting order on several database adapters supporting ParamCheck. 4.00.02 Feb 4 2012 Fixes ===== - Fixed/changed HTTPResponseFromFile to return variant containing either string or byte array depending on detected mimetype. mwhfcHTML,mwhfcStyleSheet,mwhfcJavascript is returned as string, rest as byte array. - Changed AJAX transport stream to recognize byte array and handle that as a pure binary stream in response. 4.00.01 Jan 29 2012 Fixes ===== - Fixed compilation errors for Win64 and MacOS in Delphi XE2. 4.00.00 Jan 29 2012 Important notes (changes that may break existing code) ====================================================== * kbmMW Enterprise Edition Message Bundling require update of all nodes. New stuff ========= - Added message bundling in WIB. To enable, send message with SubjectJeader.QoS value KBMMW_TRANSPORT_QOS_BATCHABLE. To force a break between batchable messages, send a message with SubjectJeader.QoS KBMMW_TRANSPORT_QOS_PRIMARY_IF_BATCHED. PushMessage on queues now have optional argument AUnBatch:boolean=false which if set to true will automatically unbatch messages into singular messages on the queue. Only messages with equal priority, HopCount, Subject, Data property, MaxHopCount, Hops and Trace can be batched. By Setting MaxBatchedCount on SubjectHeader, you can determine how many messages of batchable type, can be batched into one. - Added Delphi XE2, C++Builder XE2 support. - Added support for Win32, Win64, MacOS. - Added Remote desktop components and samples for Win32 (not tested with Win64). - Added native full JSON support. Check new kbmMWJSON unit. - Added JSON dataset stream format. Check new kbmMWJSONStreamFormat unit. - Added Lazarus support. No wizard support at the moment. - Added RemapOptions and OnRemapFielddef event to metadata components. It can be used for specifying how field type remapping should happen. mwroStringAsUnicode - All normal string fields are treated as unicode string fields. It covers ftString, ftFixedChar that is mapped to ftWideString, and ftMemo that is mapped to ftWideMemo. mwroOracleAsRegular - ftOraBlob is mapped to ftBlob, and ftOraClob is mapped to ftMemo. mwroDateTimeAsDate - ftDateTime is mapped to ftDate. - Added ParamNameFix to metadata components to control if kbmMW should remove "illegal" characters from the parameter name. Default true. - Added functionality so macros on X connection pool is expanded after macros on chained connection pool. - Added support for CommandTimeOut property in ADOX adapter. - Added Cookies property to TkbmMWHTTPTransportStreamHelper. - Added NoCache property to TkbmMWHTTPTransportStreamHelper. - Added support for redirection/loadbalancing using HTTP protocol in TkbmMWHTTPTransportStreamHelper. - Added support for template parameters in TkbmMWxxxHTTPService and TkbmMWHTTPServiceDefinition via property Parameters. Control when parameters should be expanded via ParametersEnabledFor property. Control format of template parameter via ParameterType (mwtvtStandard: [!--PARNAME--!] / mwtvtHTML: ) PreserveParameterWhenUndefined:boolean controls if the parameter should be preserved if a parameter with that name cant be found and thus the parameter not be expanded. - Added function FileCategoryFromMimeType(const AMimeType:string):TkbmMWHTTPFileCategory to TkbmMWxxxHTTPService. - Added function Request(ARequestTransportStream:IkbmMWCustomRequestTransportStream; AResponseTransportStream:IkbmMWCustomResponseTransportStream; const AServiceName,AServiceVersion:string; var AStateID:integer; AClientID:TkbmMWClientIdentity; AInStream,AOutStream:TStream; const AFunc:string;const Args:array of variant):variant; function Request(const AServiceName,AServiceVersion:string; var AStateID:integer; AClientID:TkbmMWClientIdentity; AInStream, AOutStream:TStream; const AFunc:string; const Args:array of variant):variant; function Request(const AServiceName,AServiceVersion:string; AClientID:TkbmMWClientIdentity; AInStream, AOutStream:TStream; const AFunc:string; const Args:array of variant):variant; to TkbmMWServer to make it easy to make a server internal request to a service. - Added keep alive type Ping/Pong to TkbmMWServer. From a client call SendPing(value) where value is an optional value that will be send back to you. Result of the SendPing call is an array consisting of __PONG at index 0, provided argument (or null) at index 1, the servers UTC offset (in seconds) at index 2, and the servers UTC time at index 3. - Added advanced high performance paged stream buffering: TkbmMWBufferedStream. - Added TkbmMWFileStream that allows for providing more flags than regular TFileStream. - Added TkbmMWBufferedFileStream that combines the above to bypass Windows file caching and instead use internal caching mechanism that allows finetuning to a specific use pattern, thus signtificantly improving performance. Will internally access file on disk directly and read/write sectorbased. - Added PurgeAndDisconnect method to TkbmMWCustomSAFClientTransport. Can be called with parameter that defines which queues (inbound/outbound) that should be purged before the connection is closed and how. It can be set to process or flush Default is [mwpacProcessInbound,mwpacProcessOutbound]. - Added MoveToStart/MoveToEnd in TkbmMWDblLinkList. - Added LocateFirstPrioritized and LocateLastPrioritized to TkbmMWPriorityDblLinkList. - Added DeleteItem to TkbmMWCustomHashList. - Added LoadFromBytes to TkbmMWMemoryStream. - Added Append(const AChar:char) to TkbmMWStringBuilder. - Added global methods: function kbmMWUTCLocalOffset:integer; function kbmMWGetCurrentTimeNS:int64; function kbmMWInterlockedIncrement(var AValue:integer):integer; function kbmMWInterlockedDecrement(var AValue:integer):integer; function kbmMWInterlockedIncrement64(var AValue:int64):int64; function kbmMWGetFileSize(const AFilePath:string; var ASize:cardinal; AHandle:THandle = 0):boolean; function kbmMWGetFileInfo(const AFilePath:string; var ASize:Cardinal; var ACreateTime:TDateTime; var AModifyTime:TDateTime; var AAccessTime:TDateTime; var AAttribs:cardinal; AHandle:THandle = 0):boolean; - Added global kbmMWFormatSettings: TFormatSettings that is used when format settings are needed in kbmMW. - Optimized TkbmMWMemoryStream.CopyFrom when copying from other TkbmMWMemoryStream. - Added TkbmMWXMultiDBConnectionPool which is like a regular TkbmMWXConnectionPool, but supports handling multiple databases at the same time. - Improved TkbmMWCustomStreamStorage with regards to performance, verify and repair. - Added SampleSizes to TkbmMWCustomStreamStorage which scans a number of non deleted segments to determine max size of metadata header and content. Those values can be used as indicators when optimizing disk I/O when using a TkbmMWBufferedFileStream for the stream storage. - Added new methods to TkbmMWCustomMessageQueue: procedure DeleteMessages(const ASubjectMatch:string); procedure DeleteMessages(const APriority:byte; const AMatch:TkbmMWPriorityMatch = mwpmEqual); They will search and delete messages that have a certain subject (allows for subscription wildcards) or a certain priority level. - Changed TkbmMWFileStoreMessageQueue to use TkbmMWBufferedFileStream, for optimum performance. AutoTuneCache:boolean controls if the file queue should try to auto estimate cache for best performance. ScanPageSize:integer defines the page size of cached pages used while scanning a file. It should normally be around the expected size of the generally largest metadata header segments. PageSize:integer defines the page size of cached pages used while accessing the file in normal non scan mode. It should normally be around the expected size of the generally largest content size + metadata size. PagesInCache controls how many pages of above sizes that max can be cached in memory. Memory used for cache depends on the above numbers and sector size of file system that contains the queue, If PageSize, ScanPageSize and/or PagesInCache is 0, a regular TFileStream is used instead with Windows standard caching mechanism. Changes/minor additions ======================= - Deprecated mwucStringsIsUnicode in UnicodeOptions. Instead use mwroStringAsUnicode in RemapOptions. - Updated internal cache hit/miss counters to be int64 instead of longint. - Updated TkbmMWLocalStats to use Int64 for its internal counters. - Updated TkbmMWServer to use Int64 for its internal counters. - Improved HTTP response generation in TkbmMWHTTPTransportStreamHelper. - Added support for ICO as a graphics file in TkbmMWxxxHTTPService. - Added mwdtApplication as a debug type. It can be used for application specific debugging/logging. Fixes ===== - Fixed bug when requesting service from within same thread. - Fixed TkbmMWHTTPTransportStreamHelper to handle HTTP payloads correctly. 3.52.00 Mar 5 2011 Important notes (changes that may break existing code) ====================================================== * kbmMW CodeGear Edition no longer supports ADO Express and DB Express due to compatibility with Delphi Standard Edition. * Changed TkbmMWDOMXML.SaveToStream in such way that AStreamBOM now is negated!! New stuff ========= - Support for Delphi Standard Edition with kbmMW CodeGear Edition. It unfortunately means that kbmMW CodeGear Edition no longer supports ADO Express or DB Express, even for Delphi Professional and up. In case ADO Express or DB Express support is needed, its recommended to purchase kbmMW Professional Edition which contains full source and lots of database adapters. - Added new Call method to TkbmMWCustomClient and descendants for doing service calls towards a server. A service call is a request to a service on a server, where no response is expected. Its only available for WIB based transports (kbmMW Ent Edition only). - Added abstraction layer IkbmMWCustomIPMessagingClientTransportInfo and IkbmMWCustomMessagingServerTransportInfo and made changes several places to use them. (kbmMW Ent Edition only) - Added TkbmMWMessageActionDispatcher and TkbmMWDispatchedMessageAction components for enabling easy use of messages to do internal application eventing. Define a handler and subscribe for messages and anytime some thread within the application decides to post a message that match the subscription, the handler is notified immediately. See Dispatcher demo for example. (kbmMW Ent Edition only). - Added TkbmMWCircularBuffer to kbmMWDatastructures.pas. - Added TkbmMWBufferedStream to kbmMWDatastructures.pas. It enables high performance stream access which will improve performance significantly when dealing with for example file based streams. - Added ReadCacheSize,WriteCacheSize to TkbmMWFileStoreMessageQueue to improve file queue performance significantly.(kbmMW Ent Edition only) - Added Checksummed:boolean and OnCalcChecksum properties to TkbmMWFileStoreMessageQueue. If Checksummed is set to true, MD5 (default if OnCalcChecksum eventhandler is not provided) checksums are calculated for queue header and queue body and included in the queue for dataverification. Until 256 bytes hashes can be used for checksum. Notice that file queues created with this version cannot be read by older kbmMW versions! Its legal to have a mix of messages that are checksummed and not in the same queue. (kbmMW Ent Edition only) - Added Verify function returning true/false that verifies if a file queue is structurally sound. If checksumming has been enabled for the messages, their checksum (default MD5) is also verified. (kbmMW Ent Edition only) - Added Repair function that does the same as verify, except it also automatically repairs illegal messages/queue segments by deletion of them after doing an intelligent scan for next valid message/segment. (kbmMW Ent Edition only) - Added OnRepair event to TkbmMWFileStoreMessageQueue to allow for extraction of invalid queue data before deletion. (kbmMW Ent Edition only) - Updated kbmMWStreamStore with new checksum/verify/repair functionality. - Added support for determining if OS version is Win7 in kbmMWGetOSVersion in kbmMWGlobal.pas. - Added TkbmMWMD5Stream class to kbmMWGlobal.pas. It calculates MD5 on the fly by writing data to it like its a stream. - Added OnBeginUseConnectionPool and OnEndUseConnectionPool to TkbmMWQueryService. It allows for on the fly provision of a connection pool (for example from a pool of connection pools... for different databases for example) on queryservice operations. - Added property encoding support to TkbmMWDOMXML. - Added NameSpaceByID and NameSpaceByURI to kbmMWXML. - Added several overloaded Add variants to TkbmMWDOMXML for adding xml nodes. - Added CheckNodeByName and CheckNodeByID to TkbmMWDOMXML. Its the same as NodeByName and NodeByID, except a "nice" exception is thrown in case the node wasnt found, and thus the method eases accessing node contents. - Added AddXMLDeclaration to TkbmMWDOMXML. It will create the standard ?xml declaration including encoding matching set encoding. - Added AddStandardNamespaces to TkbmMWDOMXML. Changes/minor additions ======================= - Improved client connection/disconnection detection and handling. - Changed SaveToStream in such way that AStreamBOM now is negated!! - Changed TkbmMWCustomHashItem to operate on cardinal instead of longint. Fixes ===== - Fixed request thread pool cleanup upon shutdown. - Fixed blob support in kbmMWSQLite adapter. - Fixed bug in query service where permission for a clients provision of key fields, was wrongly determined based on AllowClientStatement and not on AllowClientKeyFields. 3.51.00 Oct 16 2010 New stuff ========= - Added sfDisplayWidth property to TkbmMWCustomBinaryStreamFormat. When set to sfLoadDetermineWidth, the formatter will automatically determine display widths of string/widestring fields during load. - Added new TkbmMWEventResolver that provides simple events for insert/update/delete operations. It can be used for resolving any dataset. - Added Query method in addition to Execute method on SQLite connection adapter. Changes/minor additions ======================= - Finalized partial dataset streaming. - Split up old TkbmMWCustomResolver into base TkbmMWCustomResolver and TkbmMWCustomTableFieldResolver which assumes table/field knowledge. - Changed so shutting down a server messaing transport will wait until inbound and outbound processor threads have stopped until shutdown continues. - Dropped redefining parameters based on result from SQLite statement. Fixes ===== - Fixed 4 digit truncation issue with D7 and streaming ftFmtBCD field types for stream versions 25100 and older. - Fixed various compilation errors and minor bugs. 3.50.01 Beta 2 Sep 5 2010 Important notes (changes that may break existing code) ====================================================== * Requires kbmMemTable v. 6.50.01! New stuff ========= - Added support for Delphi XE, C++Builder XE, RAD Studio XE. - Added new database adapters for Devart's UniDAC and IBDAC, and DAsoft's AnyDAC. Specify {$DEFINE KBMMW_ANYDAC_SUPPORT} {$DEFINE KBMMW_UNIDAC_SUPPORT} {$DEFINE KBMMW_IBDAC_SUPPORT} in kbmMWConfig.inc to include support for those adapters. - Added SendPartialResultDataset method to TkbmMWCustomQueryService. Can be used for sending incremental resultsets back to client that has used AsyncOpen to open a server side dataset. Require kbmMW Enterprise Edition. - Added Synchronize methods to all message processors to allow for easy synchronization with main VCL thread. - Added support for ftOraBlob,ftOraClob,ftParadoxOle,ftDBaseOle field types in TkbmMWCustomBinaryStreamFormat. - Added support for sfDisplayWidth to optionally auto size displaywidth for string/sidestring fields. - Added CreateResponseMessage method to TkbmMWCustomMessagingServerTransport. - Added CreateTransportStream method to TkbmMWCustomTransport. - Added function kbmMWGetTempDirectory:string; function kbmMWGenerateUniqueFileName(const APrefix:string; const AExtension:string):string; function kbmMWGenerateUniqueTempFileName(const APrefix:string; const AExtension:string):string; to kbmMWGlobal.pas. Changes/minor additions ======================= - Improved kbmMWSQLite adapter. - Modified SetQueryResult to provide information about the type of the partial resultset: Can return: mwdpsAll if it was a complete resultset (not a partial resultset). mwdpsInitial if it was the first part of a number of partial resultsets. mwdpsData if its an inbetween part of partial resultsets. mwdpsFinal if its the last part of a number of partial resultsets and thus the resultset for the async query now is complete. procedure TForm1.kbmMWTCPIPIndyMessagingClientTransport1AsyncResponse( Sender: TObject; const TransportStream: IkbmMWCustomResponseTransportStream; const RequestID: Integer; const Result: Variant; UserStream: TkbmMWMemoryStream); var resMsg:IkbmMWCustomResponseTransportStream; iCode:integer; begin if not Supports(TransportStream,IkbmMWCustomResponseTransportStream,resMsg) exit; iCode:=resMsg.StatusCode; if ((RequestID == OriginalClientDataset.ActiveClient.LastRequestID) and (iCode=0)) then if OriginalClientDataset.SetQueryResult(Result,UserStream) in [mwdpsAll,mwdpsFinal] then // Got a full resultset.. end; Fixes ===== - Fixed connection not released bug when RunInTransaction=false. - Fixed compilation bugs for D7 and D2007. 3.50.00 Beta 1 Aug 5 2010 Important notes (changes that may break existing code) ====================================================== * Made several internal modifications to provide even better support for AutoFieldDefsOnOpen setting mwafoWithData, now even for master/detail relations. Several protected methods had their interfaces slightly changed. Example is the added parameter: ACallerMustFree to PerformQuery methods. Its value is default true, and means that the caller of PerformQuery is responsible of freeing the returned dataset. * Updated GetBestConnection to include an optional owner reference object. It can be Nil. * Added extra argument to OnGetNamedQuery event to identify in which situation the event is called. * Upped KBMMW_THREAD_TIMEOUT_GRANULARITY to 1000 (one sec). It may cause shutdown of applications to take a short while longer, but reduces significantly context switching in high load situations. * Renamed TkbmMWOnQueryStatementPlace to TkbmMWQueryOperationType. New stuff ========= - Added new virtual database adapter MD (kbmMW Memory Dataset). Its providing an easier way to accessing a memory dataset that is defined either at designtime or at runtime. Its different to the MT adapter in the way that a TkbmMWMDQuery is not refering to a central memory table, but is instead used as is. Fields and or data can be predefined/put into the table before use for example at designtime or form create time, or can be defined on the fly at runtime via the events OnPerformFieldDefs and OnPerformQuery events. There is full support for parameters and query statement, that can be used by callers for custom use to indicate what information is requested. The connection pool will typically stay on the same service on which the TkbmMWMDQuery is placed, but can also be shared on a central datamodule/form. Sample code which use another query to provide field definitions and data. procedure TTestQuery.DYNAMICPerformFieldDefs(Sender: TObject; AParamsOnly: Boolean); begin ALL_EVENTS.FetchDefinitions; CopyFieldDefs(ALL_EVENTS.FieldDefs,DYNAMIC.FieldDefs); end; procedure TTestQuery.DYNAMICPerformQuery(Sender: TObject; var ACanCache, ACallerMustFree: Boolean; var ADataset: TDataSet); begin ALL_EVENTS.Close; ALL_EVENTS.Open; ADataset:=ALL_EVENTS; ACallerMustFree:=false; end; Its legal to populate the records manually and return nil for ADataset. Specify {$DEFINE KBMMW_MD_SUPPORT} in kbmMWConfig.inc to include. - Ent Edition only! Added AsyncOpen and SetQueryResult method to TkbmMWCustomClientCursor (and thus TkbmMWClientQuery and TkbmMWClientStoredProc). It can be used for requesting to open a server side dataset async instead of sync like a normal Open would do. When the resultset is ready, the OnAsyncResponse event of the client messaging transport will be called. To know that it was a response for a particular request, compare the request ids. When the correct dataset has been identified, use SetQueryResult to put result into the dataset. procedure TForm1.kbmMWTCPIPIndyMessagingClientTransport1AsyncResponse( Sender: TObject; const TransportStream: IkbmMWCustomResponseTransportStream; const RequestID: Integer; const Result: Variant; UserStream: TkbmMWMemoryStream); var resMsg:IkbmMWCustomResponseTransportStream; iCode:integer; begin if not Supports(TransportStream,IkbmMWCustomResponseTransportStream,resMsg) exit; iCode:=resMsg.StatusCode; if ((RequestID == OriginalClientDataset.ActiveClient.LastRequestID) and (iCode=0)) then OriginalClientDataset.SetQueryResult(Result,UserStream); end; - Added IsFieldNumeric method to TkbmMWCustomPooledDataset. Returns true if a TField is numeric, else false. - Added OnGetDefinitions, OnGetData, OnGetMoreData, OnExecute and OnGetMetaData events to the query service. It allows for easier access to providing access to runtime generated data. If the events return true, it is understood that the event has provided all data that needs to be returned to the client for that particular event. If the event returns false, standard processing will take place. - Added AsVariant property to TkbmMWVariantList. Returns/sets a variant array. - Added kbmMWFindFiles function to kbmMWGlobal.pas. Can search a specific directory recursively for files matching a specific search criteria. - Added PeerSubscribingFor method to server side messaging hub. It returns a list of spokes that subscribe for a specific subject. - Added TkbmMWLookupStreamStore for easy storing streams with a string key identifier in a streamstorage. Changes/minor additions ======================= - Made several internal modifications to provide even better support for AutoFieldDefsOnOpen setting mwafoWithData, now even for master/detail relations. Several protected methods had their interfaces slightly changed. Example is the added parameter: ACallerMustFree to PerformQuery methods. Its value is default true, and means that the caller of PerformQuery is responsible of freeing the returned dataset. - Updated GetBestConnection to include an optional owner reference object. It can be Nil. - Added extra argument to OnGetNamedQuery event to identify in which situation the event is called. - Upped KBMMW_THREAD_TIMEOUT_GRANULARITY to 1000 (one sec). It may cause shutdown of applications to take a short while longer, but reduces significantly context switching in high load situations. - Modified Disconnect method of TkbmMWCustomTCPIPIndyMessaging class to ensure disconnection. - Renamed TkbmMWOnQueryStatementPlace to TkbmMWQueryOperationType. Fixes ===== - Fixed compile bug in Apollo database adapter. - Fixed issue with TkbmMWClientTransactionResolver.Resolve not accepting open array of datasets. - Fixed bug where fielddefs were assigned but not copied to another dataset. Now using CopyFieldDefs global method defined in latest kbmMemTable. - Fixed issue when handling numeric data fields of non matching types. Ie. a resultset returns an ftFloat, but the resulting dataset had predefined a ftExtended field. This would under some circumstances previously fail. - Fixed TkbmMWCustomPooledMessageProcessor to correctly start n threads processing the messages. 3.40.01 June 19 2010 Important notes (changes that may break existing code) ====================================================== * Removed use of dynamic instead of virtual definition for C++Builder due to the dynamic method definition now seemingly broken in the compiler while the virtual method definition that was broken in BCB 6, now seemingly works. That change also effectively results in drop of support of BCB 6! Changes/minor additions ======================= - Removed use of dynamic instead of virtual definition for C++Builder due to the dynamic method definition now seemingly broken in the compiler while the virtual method definition that was broken in BCB 6, now seemingly works. That change also effectively results in drop of support of BCB 6! - Renamed IkbmMWObject and TkbmMWObject.GetClassName to __GetClassName. Fixes ===== - Fixed case spelling error in c++ query service wizard. - Fixed bug in kbmMWStartWith when string shorter than partial string. - Fixed compilation errors in D2007. - Fixed compilation errors in D7. 3.40.00 June 16 2010 New stuff ========= - Added support for C++Builder 2010. - Added native SQLite adapter (needs only sqlite.dll). Changes/minor additions ======================= - Updated AutoInc values to be int64 instead of longint. - Added ParamCheck support on several database adapters. Fixes ===== - Fixed mwfoWithData issues. - Fixed compile errors. - Fixed X adapter to respect AutoFieldDefsOnOpen and ParamCheck properties. - Fixed C++ code génerator in service wizard. 3.21.30 April 19 2010 Fixes ===== - Fixed loadbalancing problems. - Fixed SOAP/XML streaming problems. - Fixed dataset streaming in kbmMW Spider/.Net to match 3.10 streamformat. - Added kbmMWClientQuery component in kbmMW Spider/.Net - Officially removed CF Spider support as it has not been working in Spider v2 for quite some time and never will work. - Added precompiled .Net and Silverlight 3 assemblies. - Fixed editing datetime/date and time fields in kbmMW Spider/Flex, and background color for that field. - Added precompiled Flex 3 SWC. 3.21.20 Mar 30 2010 Fixes ===== - Fixed streaming issues with D2007 (which does not support ExtendedAsDouble, CurrencyAsDouble). - Fixed/Improved Indy 9/Indy 10 support. - Fixed StreamFormat designtime editor in D2010. - Fixed StreamSec TLS support. - Removed support for older than StreamSec v.1.7.95 in kbmMWSSCrypt.pas. - Fixed leak in dataset resolving (serverside) when resolver objects are being changed mid resolving. - Fixed custom object streaming. Object must descend from TInterfacedClass and implement IkbmMWObject (or descend from TkbmMWObject). - Fixed serious leak in client side request/response handling. - Fixed Zip transport stream format vs FastZip compatibility. - Fixed threadnaming support for D2009/D2010 in kbmMWGlobal.pas. New stuff ========= - Added support for calling BeforeRequest/AfterRequest service methods, in TkbmMWServer.Request method. - Made TkbmMWSubscriptionList threadsafe by adding and using Lock and Unlock methods. - Added overloaded IsSubscribing function to TkbmMWSubscriptionList to allow return of subscription object. - Added new argument of type TkbmMWRawMessageEvent to TkbmMWSubscriptionList.Subscribe method. It allows for passing a method that is to be called whenever that message subscription match. Hence its now possible to define per subjectsubscription methods. - Added ExecuteSubscriptionEvents method to TkbmMWSubscriptionList. It will execute all relevant subject methods for all matching subscriptions for given message. - Added new method CreateMessage to TkbmMWCustomMessagingClientTransport and TkbmMWCustomMessagingServerTransport. It allows for creating message transport streams quickly. A generated message created by CreateMessage can be directly pushed onto a queue. Changes/minor additions ======================= - Made Compare method in TkbmMWCustomRBTreeNodeKey public instead of protected. - Updated UIB adapter. 3.21.00 Dec 30 2009 Fixes ===== - Fixed problematic object transfer problem. - Fixed major accumulating memory leak in kbmMWClient. 3.20.40 Dec 7 2009 Fixes ===== - Fixed A/V during server shutdown with stateful service. - Fixed service allocation to avoid deadlock. - Updated kbmMWSsCrypt.pas and kbmMWSsTLSTransportPlugin.pas to support latest StreamSec (3rdparty vendor update) - Fixed minor non accumulating leak related to destruction of TkbmMWServiceInstances. 3.20.35 Nov 20 2009 Fixes ===== - Fixed Indy transport bug - Fixed StreamSec SSH plugin. 3.20.30 Nov 15 2009 Important notes (changes that may break existing code) ====================================================== * Transportstreamformat (STANDARD) has been upped to 320 to support more effecient streaming of integers of various types. Generally newer servers are detecting the version requested by a client and responds with the same version. Fixes ===== - Fixed Indy WIB issues. - Fixed threadnaming in D2010. - Fixed StreamFormat property editor in D2010. - Fixed a thread bug related to transport streams. - Fixed transportstream unstream/stream state bug related to threads. - Fixed Unicode issue in XML parser. Changes/minor additions ======================= - Modified kbmMWStripReservedSubjectChars to also strip spaces. New stuff ========= - Finished singlefile based, high performance TkbmMWFileStoreMessageQueue. - Finished kbmMWStreamStore.pas - Added new kbmMWDataStructures.pas unit. Contains support for binary search trees (TkbmMWCustomBinaryTree), and priority Red/Black trees (TkbmMWRBTree). - Changed TkbmMWMemoryStream to inherit directly from TStream instead of TCustomMemoryStream. Gives better performance and fixes some threading issues. Generally changed to use TkbmMWMemoryStream instead of TMemoryStream. - Added property AsArray to TkbmMWVariantList. - Improved result checking in kbmMWCustomTransport.pas for all I/O operations. 3.20.10 beta 2 Sept 10 2009 Important notes (changes that may break existing code) ====================================================== * Major changes in transports, transport streams and transport info classes to utilize interfaces for performance and leak avoidance reasons. This require changes to code where If you reference transportstreams in your code then you must updated the code to use the interface instead. Eg. IkbmMWCustomRequestTransportStream instead of TkbmMWCustomRequestTransportStream, IkbmMWCustomResponseTransportStream instead of TkbmMWCustomResponseTransportStream IkbmMWCustomTransportStream instead of TkbmMWCustomTransportStream Its very important that all relevant class references (T...) are replaced with interface references (I...) in all variable declarations and event handlers. If not, access violations will happen! * TkbmMWFileStoreMessageQueue is currently undergoing massive changes, and does not work in current release. Fixes ===== - Fixed NexusDB transport and ensured it supports NexusDB v3 along with v2. - Fixed OnDeliverySuccess event in WIB serverside transports to return correct number of successfully processed messages. - Fixed BeforeRead/AfterRead called out of true order for resultstreams. - Fixed OnDisconnect/OnConnect events on TkbmMWTCPIPIndyMessagingServerTransport. - Fixed kbmMW DOM XML unicode handling. - Partly rewrote TkbmMWCustomHashList to correctly distinguish between two hashed items that have same hashkey. - Fixed bug in TkbmMCustomSQLParamsResolver.DetermineParameterTypes which would set correct value if parameter had a datatype of ftBCD. Changes/minor additions ======================= - Changed to use Indy's TCPServer scheduling mechanism instead of own scheduling loop in TkbmMWTCPIPIndyMessagingServerTransport. - Optimized Indy WIB TCP server side performance. - Added support for varUString (unicode variant strings) in TkbmMWCustomActionScriptService. - Added KBMMW_THREAD_TIMEOUT_GRANULARITY constant to kbmMWGlobal.pas which is the default thread timeout granularity. - Added Granularity property to TkbmMWCustomThread to allow for controlling the granularity of the thread work scheduler. - Added Thread property to TkbmMWCustomThread to gain access to the TkbmMWInnerThread class owned by the kbmMW thread class. - Added support on TkbmMWCustomThread.WaitWork to wait on a (optionally shared) custom event instead of the internal work event. - Added several new exception values to kbmMWExceptions.pas. - Added debug display of field attributes in kbmMWDebugDefs method. New stuff ========= - Added D2010 support. - Added new kbmMWStreamStore.pas unit which contains foundation classes for storing streams of data along with optional metadata in a combined storage. Its possible to pull out, delete and add new streams to the storage. Ie. one file containing multiple streams. Its still undergoing testing and bughunting! - TkbmMWFileStoreMessageQueue is currently undergoing massive changes based on the new streamstore, and does not work in current release! - Major changes in transports, transport streams and transport info classes to utilize interfaces for performance and leak avoidance reasons. If you reference transportstreams and transport info classes in your code then you must updated the code to use the interface instead. Eg. IkbmMWCustomRequestTransportStream instead of TkbmMWCustomRequestTransportStream, IkbmMWCustomResponseTransportStream instead of TkbmMWCustomResponseTransportStream IkbmMWCustomTransportStream instead of TkbmMWCustomTransportStream - Added TkbmMWSortedList to kbmMWGlobal.pas. 3.20.00 beta July 28 2009 Skipped v 3.10 to align with required kbmMemTable v 6.20. Important notes (changes that may break existing code) ====================================================== * Major changes in transports and transport streams to utilize interfaces for performance and leak avoidance reasons. This require changes to code where If you reference transportstreams in your code then you must updated the code to use the interface instead. Eg. IkbmMWCustomRequestTransportStream instead of TkbmMWCustomRequestTransportStream, IkbmMWCustomResponseTransportStream instead of TkbmMWCustomResponseTransportStream IkbmMWCustomTransportStream instead of TkbmMWCustomTransportStream Its very important that all relevant class references (T...) are replaced with interface references (I...) in all variable declarations and event handlers. If not, access violations will happen. Fixes ===== - Updated service allocation algorithms to improve stability and performance. - Fixed kbmMWCustomHTTPHelper.pas with regards to sending a file as a result in D2009. - Fixed mime encoding bug in kbmMWMime.pas - Fixed Indy9 client side bug. - Updated UIB adapter to solve blob bug. - Fixed thread leak in TkbmMWCustomThread.Stop. - Updated ODAC adapter to fix ORACLOB and ORABLOB issues. New stuff ========= - Major changes in transports and transport streams to utilize interfaces for performance and leak avoidance reasons. If you reference transportstreams in your code then you must updated the code to use the interface instead. Eg. IkbmMWCustomRequestTransportStream instead of TkbmMWCustomRequestTransportStream, IkbmMWCustomResponseTransportStream instead of TkbmMWCustomResponseTransportStream IkbmMWCustomTransportStream instead of TkbmMWCustomTransportStream - Similarly the object transfer mechanism has been changed to use interfaces. Methods like kbmMWObject2Variant and kbmMWVariant2Object has been removed. Instead make sure your custom objects have a full interface implementation, and when sending them, simply provide the interface instance as the argument (cli.Request(...,["Arg1",2,"Arg3",YourInterfaceInstance...] The receiving side must use: var io:IYourObjectInterface; ... if Supports(Args[3],IYourObjectInterface,io) then GotYourInterfaceObject(io); Its very important that all relevant class references (T...) are replaced with interface references (I...) in all variable declarations and event handlers. If not, access violations will happen. - Added new AutoFieldDefsOnOpen setting: mwafWithData. If set, it will get the field definitions every time the query is run but only as part of the actual data transferred. Hence only one call is made to the database or app server. Notice that if the dataset is a detail table in a master/detail relationship, 2 calls will always be made (traditional style). - Added XML dataset stream formatter for kbmMemTable and kbmMW. - Added CurrencyAsDouble property to TkbmMWCustomStreamFormat and thus streamformatters as such. Controls if currency values are streamed as currency or as double (64 bit) values. - Added ExtendedAsDouble property to TkbmMWCustomStreamFormat. Controls if extended (80 bit) floating point values are streamed as extended or double (64 bit) values. - Updated binary dataset streamformat to 3.10. It now includes information about CurrencyAsDouble and ExtendedAsDouble settings. - Added GrowOnIndex:boolean property to TkbmMWVariantList. If set to true and a variant is set via indexed reference, the list is automatically grown to include the given index. All automatically added variants are null. - Added object boxing classes: TkbmMWvariantObject, TkbmMWStringObject, TkbmMWDoubleObject, TkbmMWDateTimeObject and TkbmMWIntegerObject to kbmMWGlobal.pas. - Added TkbmMWAS3Object/IkbmMWAS3Object, TkbmMWAS3Array/IkbmMWAS3Array in new unit kbmMWAS3Utils.pas. Purpose is to support ActionScript 3 objects and arrays (both dense indexed and associative) as arguments in calls to the app server from Flash/Flex/AIR clients. Supports true AMF3 format in addition to AMF0 in kbmMWAMF3TransStream.pas. If Flash/Flex/AIR client calls with format set to AMF0, a simple array of simple (non object) arguments can be provided and a simple (non object) response returned. If set to AMF3 (default and recommended), complex requests including AS3 objects and arrays can be sent and returned. - Several new native AS3 support functions and classes are available in kbmMWSpider including kbmMWConnection, kbmMWQuery, kbmMWRequest, kbmMWResponse which allows for easy Flash/Flex/AIR query requests and regular simple requests. - Updated TkbmMWDOMXMLNode to contain many more attribute and value type getters and setters. Added CopyTo method. - Added GetAsDOM and GetAsXMLString functions to retrieve the node and subnodes as a new XML tree. - Added SetAsDOM, SetAsXMLString and SetAsXML functions to set the node and subnodes based on a different XML document. - Added ChildByName, ChildByID to retrieve a childnode by name or ID. - Updated TkbmMWDOMXMLNodeList with more functions: - Added Add, Insert and CopyNodesTo methods to add new nodes to a list. - Added NodeByName and NodeByID to search for a specific node in the list based on name or ID. - Updated TkbmMWCustomDOMXMLParser/TkbmMWDOMXML: - Made it interface aware (IkbmMWCustomDOMXMLParser/IkbmMWDOMXML) - Added Typed property to control if streamed XML nodes have a type on them (xsi:string etc) or not. - Added SetNodeAsXML to copy in another node tree into this node. - Updated query service to support sending structure with data in one call. - Updated TkbmMWCustomServiceDefinition to refer to new TkbmMWServiceInstances class. 3.01.00 Mar. 26 2009 Fixes ===== - Fixed potential thread suspension bug when thread is about to terminate. - Fixed UDP (and other non hub/spoke based) messaging transports (abstract error upon runtime). - Fixed minor stateID client side bug. New stuff ========= - Added TkbmMWCustomActionScript service. It makes it possible to host ActionScript code serverside. The ActionScript 3 code must be compiled into a regular SWF, and referenced via the returned TkbmMWActionScriptServiceDefinition's SWFFile property. All functions that needs to be called from outside, must be exposed via the ExternalInterface callback mechanism in Adobe Flash/Flex. The TkbmMWCustomActionScript service also supports callbacks to other services on the app server, support streams (as base64 strings) support TkbmMWClientIdentity and more. Require Flash Player 10.0.36 or newer installed serverside. - Added WaitWorkDone to TkbmMWCustomThread which enables easy thread synchronization. - Added AutoReturnToThreadPool property to TkbmMWCustomThreadPool which controls if a thread automatically should be returned to the threadpool upon work done, or a manual ReturnToThreadPool call must be made. - Added a couple of global functions kbmMWGetCurrentThreadID and kbmMWGetCurrentThread. - Added support for client side fetch records on demand towards an application server. Notice that the accessed queryservice on the server must be declared stateful for fetch on demand to operate. If not an exception will be thrown. Notice that fetch on demand client resultsets will not be automatically cached client side. 3.00.04 beta Dec. 30 2008 Fixes ===== - Fixed SOAP bug. - Fixed Indy server transport not releasing thread. Serious accumulating bug also affecting shutdown of application server! Changes/minor additions ======================= - Updated JNI (for kbmMW Java service) to latest version. 3.00.03 beta Dec. 30 2008 Fixes ===== - Fixed cross compatibility with non unicode development clients/servers for the STANDARD transport stream format family. The client by default always controls what the format the server should use for responding. The format is controlled of transportstreamformat version and options. options includes information about if the strings in the stream are to be understood as unicode or ansi. If a client requests with an older format than the server default use, it will get an older format response back. If a client requests with a newer format than the server default use, the server will throw an exception and the client typically be disconnected. If a client requests with a non unicode request (its compiled in D2007 or older IDEs) the server will return non unicode responses. If a client requests with a unicode request (its compiled with D2009 or newer) and the server is compiled with D2007 (or older) IDE, the server will throw an exception and the client is typically disconnected. Its possible to force a client to use a specific transport stream format by setting the transport parameter given with the constant string name KBMMW_STREAM_FORMATTER_PARAM_STREAMVERSION to a value of 100 (kbmMW v0.93+), 101 (kbmMW v1.00 beta 2.2+), 102 (kbmMW v1.02+), 200 (kbmMW v2.00+), 203 (kbmMW v2.03+), 250 (kbmMW v2.50+), 290 (kbmMW v2.90+), 300 (kbmMW v3.00+) Similarly its possible to force a client compiled with unicode support, to avoid using unicode for regular string values, by setting the transport parameter given with the constant string name KBMMW_STREAM_FORMATTER_PARAM_NOUNICODESTRINGS If set to any other value than an empty string, the client will be forced to send strings as ansistrings to be compatible with older servers. 3.00.02 beta Dec. 29 2008 Fixes ===== - Fixed transport stream format issues introduced in 3.00.01. - Fixed UIB adapter. Requires UIB v. 2.1. 3.00.01 beta Dec. 28 2008 Important notes (changes that may break existing code) ====================================================== * kbmMW v. 3.00 require kbmMemTable v. 6.00. * Dropped support for Delphi.Net as its a dead end product now. * Dropped support for Delphi 5. New stuff ========= - Unicodified kbmMW to support Delphi 2009. Currently subjects (WIB) are still non unicode. - Dropped support for Delphi.Net as its a dead end product now. - Dropped support for Delphi 5. - Updated transport stream format to version 300 to support unicode. The server will detect clients using older stream format and adapt to it. Similarly its possible to force a client to use an older streamformat by setting the KBMMW_STREAM_FORMATTER_PARAM_STREAMVERSION transport parameter to the relevant version. Eg. 290 Changes/minor additions ======================= - Updated several methods in kbmMWGlobal.pas to handle TkbmMWBytes arrays in addition to regular buffer operations. - Added several Ansi specific methods: kbmMWAnsiTextToWord, kbmMWAnsiWordToText, kbmMWAnsiAddChar. - Updated kbmMWMime.pas to be unicode aware. - Added ReadAnsiString and WriteAnsiString functions to memorystreamformatters. Fixes ===== - Fixed lack of garbage collection of connections/cache data in connectionpools. - Fixed backwards compatibility with older kbmMW clients. 2.90.04 July 21 2008 Important notes (changes that may break existing code) ====================================================== * Changed to support (require) kbmMemTable v. 5.72. The change makes it alot easier to install kbmMW with kbmMemTable and kbmMemTable Pro Additions. New stuff ========= - Added ADS DBF database adapter. Use {$DEFINE KBMMW_ADSDBF_SUPPORT} in kbmMWConfig.inc Fixes ===== - Fixed 'unstream message' resulting in no response from server upon using early authentication. - Fixed cleanup of TkbmMWCustomServerRequestThread. Notice that FastMM can still claim bogus threads leaked. But careful inspection of the running threads during shutdown will show that the threads were actually stopped and disappeared from the threads window. - Fixed client side request/response messaging related single threaded apartment type applications. Changes/minor additions ======================= - Changed to support (require) kbmMemTable v. 5.72. The change makes it alot easier to install kbmMW with kbmMemTable and kbmMemTable Pro Additions. - Updated NDB database adapter. - Updated SDAC database adapter. 2.90.03 beta June 16 2008 Fixes ===== - Fixed some .Net warnings. - Fixed messaging thread leak. - Fixed obtaining cached resultset for a readonly dataset. - Fixed invalid parameternames in .Net. - Continued to improve TCPIP Indy client messaging transport stability. - Fixed HTTP stream helper to avoid overwriting parsed URL values. Resulted in AJAX tranport stream format not working since 2.90. - Fixed registering LastCommunication timestamp in transports. - Fixed shutdown of application server either slow or stalling. - Fixed issue with AMF3 transport stream format when combined multiple messages. Changes/minor additions ======================= - Added streaming of Data property in TkbmMWFileStoreMessageQueue. - Fixed potential race condition issue in TkbmMWFileStoreMessageQueue. - Added mwdlIntermediate debuglevel to TkbmMWDebugLevel. - Added new global function: kbmMWDebugDumpVariantToString in kbmMWGlobal.pas - Added portable kbmMWGetModuleHInstance global method to kbmMWGlobal.pas - Modified OnIdle internal interval handling slightly. New stuff ========= - Added 2 new cache flags: mwcfNoParamsInCacheID and mwcfIgnoreCachedParams. If mwcfNoParamsInCacheID is set, parameters wont be included in calculation of cache ID, which means that the metadata/resultsets for two different parameter values for the same query will be considered the same. mwcfIgnoreCachedParams is currently not in use. - Added BCDOptions to TkbmMWCustomMetaData and descending classes. mwbcdParamKeyAsFloat specifies that key parameters should be set as float values rather than BCD or FmtBCD. mwbcdParamDataAsFloat specifies that data parametes should be set as float values rather than BCD or FmtBCD. 2.90.02 beta May 5 2008 Fixes ===== - Fixed Delphi.Net support for Delphi 2007/.Net - Fixed OnIdle issues in TkbmMWCUstomTransport. - Fixed AMF3 reading double was reading twice. - Fixed endless recursion bug in TkbmMWHashBuckets.Delete (kbmMWGlobal.pas) Changes/minor additions ======================= - Added more exception codes to kbmMWExceptions.pas. (mainly InControl Repository related) 2.90.01 beta Apr 28 2008 Fixes ===== - Fixed bug in kbmMWClient.pas that ment that the server belived no message parts were sent in the request and thus ignored the request. - Fixed wrong EnsureMinimumConnections declaration in TkbmMWCustomConnectionPool. it should take no parameters. - Fixed exception handling issues due to changes in Indy 10. 2.90.00 beta Apr 24 2008 Important notes (changes that may break existing code) ====================================================== * Changed streamformats to provide version number as an integer instead of a string. * Streamversion upped to 290. The transport stream header identifier has been modified to now instead be $0AAFFBCC due to changes in the streams header properties. The older identifier is recognized and respected to be compatible with older clients. * Prepared support for named persistent queues. Affects some methods like kbmMWGenerateMessageSubject that now require one additional argument. More importantly it affects the subscription subject format, why nodes relying on subscription announcements should be recompiled. New stuff ========= - Added new designtime subscription list editor. - Prepared support for named persistent queues. Affects some methods like kbmMWGenerateMessageSubject that now require one additional argument. More importantly it affects the subscription subject format, why nodes relying on subscription announcements should be recompiled. - Added reference counting on transport streams. General rule is that when a transportstream is pushed on a queue, its out of user/developer scope. However if you need to use it after having it pushed on a queue, you can use the Use and DontUse methods of the transportstream/message to increment and decrement references to it. Use method FreeIfNotInUse to free the transportstream/message after use. Use IsInUse to detect if a message/transportstream is in use. - Added support for a request transportstream holding multiple subrequests and the response transportstream to hold multiple subresponses. Currently only used by AMF3 clients. - Added RollbackErrorCount:integer and Stalled:boolean properties to transportstreams. They are usually maintained by the queueing system to detect stalled messages. - Added OnIdle event, IdleInterval and LastCommunication properties to transports. They can be used to detect when a transport have been idle for a while, and then for example issue keep alive pings or the like. - Added MoveTo, IsName and ChangeNamespace methods to TkbmMWDOMXMLNode. - Added Container:TkbmMWDOMXMLNodeList property to TkbmMWDOMXMLNode. Container indicates which container this node is owned by. - Added ReleaseNodes, AddNode, InsertNode, DeleteNode, MoveNodesTo methods to TkbmMWDOMXMLNodeList. - Added SearchNode, SearchRelNode, MoveNodes, MoveNode, SaveToFile, LoadFromFile to TkbmMWCustomDOMXMLParser. - Added new AMF3 streamformat. Its purpose is to allow Adobe Flex clients to access a kbmMW based application server directly. Most features are supported. - Added OnBeforeResolve, OnAfterResolve, OnBeforeSubResolve, OnAfterSubResolve events to TkbmMWClientTransactionResolver. - Added new property RollbackErrorCount to messages stored in messaging queues. It is used for tracking when a message is determined as being stalled by the queue management. - Added message stall detection to file and memory based message queues. A message is stalled when it has been rolled back (because of error) x number of times. - Added support for idle notification in TkbmMWCustomClient. - Massive changes due to new features in all WIB (message based) transports. - Message processors (based on TkbmMWCustomMessageProcessor) - Message queue processors (based on TkbmMWCustomMessageQueueProcessor) Generic queue based message processing can be extended from this one. It supports processing one message blocking or non blocking, all existing messages blocking or non blocking and continously also new messages until the processor is stopped. - Threadpooled message queue processors (based on TkbmMWCustomPooledMessageQueueProcessor) This one supports processing messages using threads from a thread pool. - Multithreaded shared or copied message delivery to spokes using threadpool. All messaging transports have been vastly changed to use message and messagequeue processors for inbound and outbound message handling. - Added OnRelayMessage to server messaging transports. - Added DeliveryMethod:TkbmMWMessagingHubDeliveryMethod, DeliveryThreadPoolSize:integer and DeliveryBatchSize:integer properties to hub messaging transports. DeliveryMethod can be set to: mwmhdmSingleThreaded, mwmhdmMultiThreadedShared or mwmhdmMultiThreadedCopied. SingleThreaded is similar to the old WIB hub delivery method used before 2.90. Its the fastest in terms of CPU cycles, but do not scale across CPU's/cores and the last spoke may potentially wait along time for its messages to arrive. Multithreaded use a thread pool to share the delivery to the spokes which each of them have an internal message queue. The difference between Multithreaded shared and copied, is that with shared, threads all refer to the original message, while copied ensures that each spoke gets a unique copy of the message. The later f.ex. opens up for that the message can be encrypted differently for each spoke in case that is required. DeliveryBatchSize determines a max for the number of messages delivered by a thread to a spoke, before it yield to another spoke. The higher number, the higher apparent performance but it should be balanced with the number of spokes, and the number of threads in the threadpool. - Added OnSetupSpokeOutQueue event to hub messaging transports. Its called when a spoke's private queue is to be setup. The queue class type is the same as the outbound queue defined for the transport, but alternative property settings can(should) be specified in this event. - Added IgnoreSubscriptions property to messaging transports. Allow for bypassing testing subjects for special cases or super high performance. - Added queue operation action notifiers that can be defined based on TkbmMWCustomMessageQueueAction, This way custom functionality can be hooked into the queues when things are happening on them. - Added StalledQueue:TkbmMWCustomMessageQueue and StalledTreshold:integer properties to TkbmMWCustomMessageQueue. They are used for detecting when a message is stalled, and optionally automatically move that message to a stalled queue for seperate handling. - Added Options:TkbmMWMessageQueueOptions to TkbmMWCustomMessageQueue. It controls how invalid or stalled messages should be handled. - Added OnStalledMessage event to TkbmMWCustomMessageQueue. - Added several new exception codes in kbmMWExceptions.pas - Added Synapse based TCPIP Hub and Spoke transports. - Added TkbmMWLock class to kbmMWGlobal.pas. All kbmMW code now use TkbmMWLock instead of directly critical sections. TkbmMWLock optionally supports multireader exclusive writer type locking. - Added TkbmMWThreadList class to kbmMWGlobal.pas. - Added TkbmMWHashLongIntList, TkbmMWHashDoubleList, TkbmMWHashKeyValueList, TkbmMWHashWideKeyValueList hashlists in addition to TkbmMWHashStringList in kbmMWGlobal.pas. - Added TkbmMWCustomThread which is now used instead of TThread. It supports a much better threading scheme, scheduler and control, including participating in thread pools and thread naming. - Added TkbmMWSharedReadOnlyStream that provides multiple thread readonly access to a stream of data. - Added AssignVariant and IndexOf(AVariant) to TkbmMWVarlantList. - Added kbmMWDebugPrefix:string (global variable) in kbmMWGlobal. It can be set to prefix any debug text with an application specific text. - Added GetResponseSubscription to client messaging transports. - Added TkbmMWMessageQueueOptions AddOutstandingRequest and GetResponse to TkbmMWCustomSAFClientTransport. Changes/minor additions ======================= - Modified kbmMWPooledFileClient to operate similarly to other pooled clients. - Changed streamformats to provide version number as an integer instead of a string. - Streamversion upped to 290. The transport stream header identifier has been modified to now instead be $0AAFFBCC due to changes in the streams header properties. The older identifier is recognized and respected to be compatible with older clients. - Changed the transport stream streamstate and unstreamstate to assist in the new transport stream sharing options. - Published StalledQueue, OnPushMessage, OnTentativelyMessagePop, OnCommitMessagePop, OnRollbackMessagePop, OnRejectMessage, OnDeleteMessage, OnStalledMessage events on TkbmMWFileStoreMessageQueue. - Rewamped TkbmMWSubscriptionList. - Changed TkbmMWCustomServiceDefinition.ReserveServiceInstance to use a slightly different algorithm. - Changed Service garbage collection algorithm to improve stability. Fixes ===== - Fixed endless recursion issue in kbmMWDisposeVariantObject and kbmMWMarkVariantObjectForAutoDispose. - Fixed issues reg. ISAPI transport and VerifyTransfer. - Fixed naming of PGDAC database adapter. - Fixed TkbmMWCustomDOMXMLParser.SaveToStream (and thus other methods using it) to include node references too if specified. - Fixed HTTP response streamformat to respond using the same HTTP version as the request was given with. - Fixed TkbmMWCustomClient reconnect bug when OnException eventhandler not specified. - Fixed not assigning OnException event handler in TkbmMWCustomClient.Assign. - Fixed UpdateWhereAll bug in kbmMWMT adapter. - Fixed leak in TkbmMWFilePool when accessing nonexisting file. 2.80.01 Oct 1 2007 Fixes ===== - Fixed 3 bugs introduced in 2.80: Client A/V'ing instead of reconnecting after connectionloss. Compilation of DBISAM4 adapter in Delphi 5. Compilation of Synapse server side transport. 2.80.00 Sep 30 2007 Important notes (changes that may break existing code) ====================================================== * Added fine grained exception codes. Please notice that this _may_ require changes in code if you check statustext on the client side for specific values like (100000). Now (100000) will be (SERVER). New stuff ========= - Added fine grained exception codes. Please notice that this _may_ require changes in code if you check statustext on the client side for specific values like (100000). Now (100000) will be (SERVER). - Added support for providing UserAgent via: KBMMWHTTPUSERAGENT - Added support for getting statuscode from failed HTTP operation. - Added kbmMWDebugDumpStringData to kbmMWGlobal.pas - Added support for HTTP streamformat compliance with HTTP 1.0 and HTTP 1.1 (partial). Setable via the transport parameter: KBMMWHTTPVERSION=1.0/1.1 (default 1.0) - Added new event OnException on TkbmMWCustomSimpleClient and descendants. Will fire when an exception has occured server side or client side while processing a request. Changes/minor additions ======================= - Improved Indy client transport error recovery. - Improved transport state status (listening, connected etc.). - Updated kbmMWSsSSHMessagingClientTransport. - Improved general transport functionality to be able to request disconnect after transmission. - Added LockType to ADOX adapters datasets. - Added support for obtaining CursorLocation from database setting in ADOX adapter. - Changed errortables description field to be a memo field instead of string field to - allow for arbitrary large texts. Fixes ===== - Fixed issue in Execute and FetchFieldDefinitions that would hide a raised exception. 2.71.00 Aug 30 2007 Changes/minor additions ======================= - Removed most requirements for protected hacks (TkbmMWProtxxxx). Require kbmMemTable v. 5.60 or newer. - Added support for Indy 10.2.3 (Official Indy snapshot per Aug. 22 2007). Define both KBMMW_USING_INDY_10 and KBMMW_SUPPORT_INDY_10_2_3 in kbmMWConfig.inc. - Added kbmMWDisposeVariantObjects method to kbmMWObjectUtils.pas. - Validated support for D2007 (Highlander 2) Fixes ===== - Fixed using uninitialized string in TkbmMWTCPIndyTransport.pas (.Net) - Fixed Delphi 5 support. - Fixed AddToCache to correctly replace existing entry instead of adding a new. - Fixed leak when proxying objects in TkbmMWProxyService.pas. - Fixed several invalid casts from memorystream.memory to array of byte. Specially significant for SOAP, XML, AJAX and HTTP streamformats using latest Indy. 2.70.02 July 23 2007 Changes/minor additions ======================= - Added support for detecting Windows Vista in kbmMWGetOSVersion. Fixes ===== - Fixed .Net compilation - Fixed EDB adapter to support ElevateDB v1.04. - Fixed Synapse UDP WIB compilation. 2.70.01 July 13 2007 Changes/minor additions ======================= - Made major changes in the support classes for the web server service and HTTP support classes. Fixes ===== - Fixed Delphi 5/6 compilation. 2.70.00 June 23 2007 New stuff ========= - Added support for Delphi 2007/win32. - Added new unit kbmMWHTTPUtils containing lots of web related functions: Cookie support: TkbmMWHTTPCookie, TkbmMWHTTPCookies, procedure kbmMWParseCookies(const ACookieHeader:string; ACookieList:TkbmMWHTTPCookies) Query string support: TkbmMWQueryValues Template support: kbmMWProcessTemplate Additional utility functions: function kbmMWEncodeEscapes(const AString:string):string function kbmMWDecodeEscapes(const AString:string):string function kbmMWRemoveQuotes(const AString:string):string function kbmMWHTMLToASCII(const AInput: string): string function kbmMWASCIIToHTML(const AInput: string): string function kbmMWURLToHTML(const AInput: string): string function kbmMWValueToHTML(const AName:string; const AValue:integer):string function kbmMWValueToCSS(const AName:string; const AValue:integer):string function kbmMWFindReplace(const AString,AFind,AReplace:string):string function kbmMWColorToHTML(const AColor:TColor):string - Added AJAX transport stream allowing for a kbmMW TCP/IP based transport to support a HTTP protocol compatible with normal web browsers. The transportstream supports requests containing XML according to kbmMW's XML layout and standard HTTP requests. In case a request was made using the XML format, the response will be XML formatted. - Added debug support for query, queryresult, definitions on the server. Changed the debugtypes to: TkbmMWDebugType = (mwdtTransport,mwdtService,mwdtServer, mwdtDBDefs,mwdtDBMeta,mwdtDBResolve, mwdtDBQuery,mwdtDBQueryResult); Notice that the old mwdtDataset debugtype is removed. For same functionality use mwdtDBResolve. mwdtDBQuery dumps information about queries about to happen or being executed. mwdtQueryResult dumps information about the resultset from an opened query. mwdtDBDefs dumps information about field/parameter definition requests. - Added kbmMWDebugLock/kbmMWDebugUnlock functionality to ensure that debug calls are threadsafe. kbmMW's own debug functions use these lock/unlock methods now. - Added new TkbmMWStringBuilder class for effeciently appending data to a string. It is semantically compatible with .Net's StringBuilder class. - Added new functions to kbmMWGlobal: function kbmMWSafeString(AString:string):string Ensures that a string is 'safe' when used in a SQL statement. Its to be used to avoid SQL injection when an SQL string is build, including userinput. procedure kbmMWExplode(AString:string; ADelimiter:char; AList:TStrings; const AStrict:boolean = true) Explodes a string containing elements seperated by ADelimiter into a list. If AString is true, it will drop any ADelimiter chars preceding the elements. function kbmMWImplode(AList:TStrings; ADelimiter:string):string Implodes a number of strings into elements of a string each delimited by ADelimiter. - Added TkbmMWCustomHTTPService, TkbmMWEventHTTPService and TkbmMWHTTPServiceDefinition. Allows for building a service that makes the kbmMW application server act as a Web server. Multiple services can be added for each their own subdomain. Default functionality for TkbmMWCustomHTTPService is to provide files requested by GET as a regular webserver. TkbmMWEventHTTPService publishes events for GET, HEAD, POST, PUT, DELETE, TRACE and CONNECT web calls. Paths to relevant files can be specified in the returned TkbmMWHTTPServiceDefinition. The following file groups can currently have individual paths: mwhfcHTML,mwhfcStyleSheet,mwhfcJavascript,mwhfcImage,mwhfcOther A large number of file types are automatically identified with mimetypes. Additional mimetypes can be specified using the MimeTypes property at runtime. OnFileAccess and OnFileMapPath events can be used to control file access. Removed reference to Forms in kbmMWServer.pas for D7 and up compilers. - Added exception handling when closing listener threads down. - Added identification of transports (server or client). - Added support for opening a query in a specific transactions serverside: TkbmMWCustomPooledCursor.OpenInTransaction - Added TkbmMWCustomPooledCursor.IsDefaultTransaction property. Added several new dataset debug functions to kbmMWCustomDataset.pas: procedure kbmMWDebugDumpParams(ALevel:TkbmMWDebugLevel; AType:TkbmMWDebugType; AWhere:TkbmMWDebugDump; AMessage:string; AParams:TParams) procedure kbmMWDebugDumpQuery(ALevel:TkbmMWDebugLevel; AWhere:TkbmMWDebugDump; AMessage:string; ACursor:TkbmMWCustomPooledCursor) procedure kbmMWDebugDumpQueryResult(ALevel:TkbmMWDebugLevel; AWhere:TkbmMWDebugDump; AMessage:string; ACursor:TkbmMWCustomPooledCursor; AResult:TDataset) procedure kbmMWDebugDumpDefs(ALevel:TkbmMWDebugLevel; AWhere:TkbmMWDebugDump; AMessage:string; ACursor:TkbmMWCustomPooledCursor) procedure kbmMWDebugDumpResolveSQLOperation(ALevel:TkbmMWDebugLevel; AWhere:TkbmMWDebugDump; AMessage:string; AObject:TkbmMWCustomSQLResolverObject) - Added support for dumping arguments for call when enabling transport debug. - Added OnValidateSubscription event to hub messaging transports. Allows for ignoring a spokes wish to subscribe for specific subjects. - Expanded TkbmMWHTTPTransportStreamHelper with lots of new functionality, like: property Headers:TStringList property Operation:string property URL:string property Query:string property MimeType:string property ActiveMimeType:string property MaxHeaderSize:integer property ProxyUserName:string property ProxyPassword:string property HTTPVersion:string property HTTPHost:string property ContentLength:integer function HTTPStatusCodeFromServerStatusCode(const AServerStatusCode:integer):integer; function HTTPStatusTextFromCode(const ACode:integer):string; procedure HTTPGetContents; function HTTPBuildPostHeader(const AVerificationHeader:string):string; function HTTPBuildOKResponseHeader(const AVerificationHeader:string; ASize:integer = -1):string; function HTTPBuildCustomResponseHeader(const AVerificationHeader:string; const AContentLength:integer; const AHTTPStatusCode:integer; const AHTTPAdditionalMessage:string):string; function HTTPBuildErrorResponseHeaderFromStatusCode(const AVerificationHeader:string; const AStatusCode:integer; const AStatusText:string):string; procedure HTTPFetchContents; - Added support for ElevateDB v1. (EDB). - Added many new metadata types (supported by selected databases): mwmdtDomain, mwmdtField, mwmdtProcedure, mwmdtRole, mwmdtUDF, mwmdtException - Added Description to TkbmMWCustomDef. - Added FormatDatabaseName to TkbmMWCustomMetaData. - Changed SOAP format to match new kbmMW.wsdl file to support .Net v2. - Added 2 new properties to filepool: property GarbageCollectionLockTimeout:integer default 10; property AccessLockTimeout:integer default 10000; used for changing default timeouts. Specified in ms. - Added support for GetReceivedCount for Indy 9 and up (originally was only for Indy 9) in Indy server and client transports. Changes/minor additions ======================= - Removed requirement for Forms in kbmMWServer for Delphi 7 and up. - Changed TkbmMWVariantList to have property Variants as default property. - Published Transaction and IsDefaultTransaction properties on serverside query and storedproc. - Publish RunInTransaction on serverside storedproc (was missing). - Changed XML to reference xsd namespace instead of xsi for std. datatypes. - Extracted TkbmMWFilePool to own unit (kbmMWFilePool) and fixed .Net support. - Changed SOAP and ISAPI streamtransport formats to use the enhanced HTTP transportstreamhelper which ensures that HTTP, AJAX, SOAP, ISAPI all have same capabilities reg. header etc. Fixes ===== - Fixed SSH compilation. - Several other fixes as result of the above listed additions and changes. 2.62.00 Mar 15 2007 New stuff ========= - Adding support for CodeGear Edition. Cut down Pro version: * MT, ADOX, BDE, DBX and IBX adapters only * No cross adapter. * Max 5 db connections in db connectionpools. * Max 2 transport connections in client connectionpool. * Max 100 entries in resultset/metadata cache. * Max 5 running instances of a service. * No ZIP transports. * No transport plugin facility. * Only Indy transport. * No fileclient/service support. * No TLS/SSL support. * No DCPCrypt support. * No SSCrypt support. * No ReportBuilder DADE support. - Added GetNodeByReference method to TkbmMWCustomDOMParser in kbmMWXML.pas. - Published StatementPassthru property on datasets. - Added support for ftWideMemo in parameters based resolving. - Added support for limiting size of incoming transportstreams via the transport parameter: KBMMW_TRANSPORT_PARAM_MAXTRANSPORTSTREAMSIZE='MAXTRANSPORTSTREAMSIZE' - Added support for TkbmMWCustomTransportStreamHelper which can be attached to any transportstream class for interstreamtypes shared functionality. - Added support for arguments provided can be accessed via references in SOAP. - Added support for storing headers, operation and URL in HTTP streamformats and all that use the HTTP streamformat helper class. Changes/minor additions ======================= - Changed to allow GetAsVariant to return data as a string even if specified xsi:type is unsupported, instead of raising an exception. - Updated SOAP, HTTP streamformats, and ISAPI transports to use the new HTTP transport helpers, which mean that all now supports proxys etc. Fixes ===== - Fixed problem with arguments not always available in serverside OnMessage event. - Fixed kbmMWXML.pas not saving id attribute when streaming. - Fixed compile bug in Java service. - Fixed A/V when loading from nil userstream. - Fixed hints in UIB adapter. - Fixed .Net compilation and a indexing bug in kbmMWBinaryStreamFormat.pas - Fixed warnings in IBX5 adapter. - Fixed expanding client side dataset macros. - Fixed DB Adapter Delphi.Net support. - Fixed Servicewizard Delphi.Net support. - Fixed to support manually providing a connection to cross adapter components. - Fixed A/V in SOAP due to wrong buffer reference. 2.61.00 Dec. 29 2006. Important notes (changes that may break existing code) ====================================================== * Modified OnMessageDeliverySuccess to include count for how many spokes a message was delivered to. * Updated UIB adapter to support UIB v2 incl. stored procedures. * Added authentication validation to internal TkbmMWServer.Request call. If a service require authorization to run, it must provide permission mwapInternalExecute. * Modified TkbmMWServer.Request to support returning stateid in case one is returned. This may break existing code! New stuff ========= - Added new global function: kbmMWGenerateRequestSubscriptionSubject to kbmMWSubjectUtils. - Added support for message reference counting to allow for messages to be pushed onto multiple queues at the same time. - Added new method GetResponseSubscription:string to TkbmMWCustomMessagingClientTransport. - Added Locate, InternalObjectsEqual and InternalFreeObject to TkbmMWDblLinkList. - Added new method GetRequestSubscription:string to TkbmMWCustomMessagingServerTransport. - Added global method: kbmMWGenerateResponseTransportStream. - Added OnMessageToSpokeDeliverySuccess event to hub transports. - Added general support for datatype ftFixedWideChar and ftWideMemo. Requires use of kbmMemTable v. 5.51 or newer. - Added authentication validation to internal TkbmMWServer.Request call. If a service require authorization to run, it must provide permission mwapInternalExecute. - Added support in TkbmMWServer.Request to provide release function to release state from a stateful service. Use constant string KBMMW_RELEASESTATE_FUNCTION as the function name. - Added support for providing Host: value for ISAPI client. If the Params property of the transport contains a value for the name KBMMWHTTPHOST (use the string constant KBMMWHTTPHOST), a Host: ...value... is added to the client HTTP 1.0 request. Use is to allow access to virtual websites controlled by one physical webserver. Changes/minor additions ======================= - Modified TkbmMWCustomSDAC3Query.PerformRefreshDefinitions so that SDAC retrieves the local contraints data for fields i.e. The Required property of TField. - Changed request/response handling in kbmMW client to avoid leaks and ignore bogus responses for non issued requests. - Modified OnMessageDeliverySuccess to include count for how many spokes a message was delivered to. - Updated UIB adapter to support UIB v2 incl. stored procedures. - Published properties sfFiltered default [sfSaveFiltered], sfIgnoreRange default [sfSaveIgnoreRange] and sfIgnoreMasterDetail default [sfSaveIgnoreMasterDetail] on TkbmMWCustomStreamFormat. - Modified TkbmMWServer.Request to support returning stateid in case one is returned. This may break existing code! - Changed streaming of ftFMTBCD on PRE251 in kbmMWBinaryStreamFormat to use AsFloat instead of AsCurrency to avoid rounding to 4 digits. Fixes ===== - Fixed TkbmMWCustomPooledCursor.Populate to check for null Connection value, when exception occured and rollback was to be made. - Fixed A/V in TCPIP Synapse client and server transports when VerifyTransfer=true. - Fixed bug not sending userstream in SendPrioritizedMessage. - Fixed leak/bug in TkbmMWVariantList.Grow. - Fixed issues in procedure TkbmMWSAFServerMultipleEndpointsDeliveryThread.Deliver regarding skipping delivery to remaining spokes. - Fixed Stored procedure parameter fetching for IBX5 adapter. - Fixed missing assignment of OnSubInsert, OnSubDelete and OnSubModify events in TkbmMWCustomResolver.AssignEventsTo, thus making them work for the cross adapter. - Fixed bug in kbmMWXML.pas where CDATA elements couldnt be addressed via an XML path. - Fixed A/V on Execute when RunOnTransaction=false. - 'Unfixed' the service wizard regarding the VMT argument problem found in early releases of BDS2006. - Fixed NexusDB transport. - Fixed allowing multiple use of LogFieldValueChange on same field. - Fixed support for RequestTimeout on standard server and client side Synapse TCP transports instead of the default 45 sec timeout. - Fixed bug attempting commit on a transaction after a rollback on transaction resolver. - Fixed wrong rollback when LogFieldChange has been used in resolving. 2.60.00 Important notes =============== * Changed OnBeforeRequest, OnAfterRequest, OnServeRequest, OnServeResponse events on TkbmMWServer object to receive a TkbmmWVariantList instead of const array of variant. * Changed OnClientRequest and OnClientResponse events on TkbmMWCustomClient object to receive a TkbmmWVariantList instead of const array of variant. * Added Reference argument to OnMacro, ReplaceMacros, DoOnMacro events and methods. New stuff ========= - Added detection of invalid/non UTF8 strings when getting supposedly UTF8 data in TkbmMWCustomConnectionPool. - Added LoadFromStream and LoadFromString methods to TkbmMWCustomDOMXMLParser. - Added support for CDATA in both SAX and DOM XML parser. - Added support for getting SchemaName from client in query service. - Published AllowClientSchemaName property on Query Service. - Published EnableMacros on client datasets. - Added Assign, AssignConstArray and constructor taking a const array to TkbmMWVariantList. - Added copying of a couple missing events in AssignEventsTo method of TkbmMWCustomResolver - Added support for BDS2006 (C++ personality) TMetaData *vmt bug/feature. - Added general support for BDS2006 C++ personality. - Added support for registering hops on all transport streams for messaging use. - Added fully selfcontained state management on all transport streams. - Added Trace and SubjectData properties for all transport streams. - Added OnServeRequestException event to TkbmMWServer. - Added new messaging transport events: OnRequest, OnResponse, OnForwardResponse, OnForwardRequest, IsSubscribing, OnDeliveryFailed, OnDeliverySuccess - Published OnDeleteMessage on message queues. - Added better namespace support in XML. Changes/minor additions ======================= - Updated TkbmMWVariantList in kbmMWGlobal.pas. - Moved wizards to new category in BDS 2006. - Optimized requeststream and resultstream of the service instance. - Generally cleaned up logging of transport related information. Fixes ===== - Fixed BDS2006/C++ support in wizard registration. - Fixed A/V bug in FIB adapter when resolving. - Fixed bug in file service when root is set to empty string and client provides absolute file paths. - Fixed ReportBuilder DADE adapter. - Fixed blob update problem when destination blob parameter is ftVarBytes in ADOExpress adapter. - Fixed MetaList in kbmMWCustomSQLMetaData.pas to not raise exceptions when metadata not found. Returns true/false. - Fixed kbmMWInterbaseMetaData.pas to correctly create blob fields. - Fixed not copying username/password properties from template in IBO adapter. - Fixed cache cleaning algorithm in connection pools that resulted in leak. - Fixed DB adapter wizard Kylix 3 compilation. - Fixed .Net compilation - Generally checked and fixed some minor leaks - Fixed attribute name case problems in XML. - Fixed kbmMWGenerateUnsubscribeSubject method. 2.52.03 Fixes ===== - Fixed DBExpress and ADO Express compilation in D2006. 2.52.02 Changes/minor additions ======================= - Relaxed parameter type checking. Now parameter type ptUnknown is treated as an input type parameter when resolving. 2.52.01 Important notes =============== * Changed Replace parameter of AddToCache method. * Parameter types are now used by adapters when resolving. Only input or inputoutput type parameters are used when setting the parameter of a resolve statement. New stuff ========= - Added 3 new properties: ResolveResults, IsResolveError, IsResolveFieldValuesChanged on each dataset, which can be used to easier inspect the result of the resolve process. - Added 2 new cache options for datasets controling what to do with a cached item after a resolve. Default is to delete the cached item from the cache. If mwcfUpdateOnResolve is set, then the local updated copy of the dataset will be the new cached item. Else if mwcfLeaveOnResolve is set, then the old cached item will continue to exist. - Added TkbmMWClientTransaction class which allows for easy handling client side transactions on multiple client side datasets. Changes/minor additions ======================= - Added full support for respecting parameter type (input/output/inputoutput/result) when setting and getting parameter data in database adapters. Fixes ===== - Fixed TkbmMWClientTransactionResolver not to return false due to a fieldvaluechange. Now only returning false when the resolve truely have got a resolve error. - Fixed problem accessing metadata thru cross adapter saying MetaData not specified. - Fixed 'invalid handle' on close problem when freeing any connection pool. - Fixed bug not calling OnSubDelete event if no OnSubModified event defined. - Fixed bug when setting UpdateWhereAll when generated SQL clause wasnt correct. - Fixed some minor, non accumulating, memory leaks. - Fixed support for ftblob parameters in FIB adapter. - Fixed order of setting properties for UIB connections to solve amongst others, SQLDialect being overwritten. - Fixed UIB and FIB adapter transaction being closed on resolve finalization. - Fixed AfterOpen order. - Fixed potential deadlock on shutdown problem related to the delayed refresh scheduler. 2.52.00 Important notes =============== * Changed TkbmMWStringList.GetGroups to include argument AWithHeaders:boolean. * Fixed compilation problem in C++Builder 6 in kbmMWCustomDataset.pas. Please notice that this fix changes the Fields argument of OnResolveFieldValueChanged event. New stuff ========= - Added D2006 Win32 and .Net support for Standard/Pro/ProPlus/Enterprise editions. - Added OnBeforeObjectOperation, OnAfterObjectOperation, OnObjectOperationError events. - Added FallbackServers, AutoFallback, RedirectAlternatives to TkbmMWCustomClientTransport. Provides automated reconnect fallback and failover support. - Added TkbmMWStringList.FetchGroups, TkbmMWStringList.FetchGroup. Changes/minor additions ======================= - Updated ZEOS6 adapter to support Zeos6 v. 6.5.1. - Reverted ISAPI client transport to use HTTP/1.0 request types. Fixes ===== - Fixed not logging exceptions when resolve fails in transaction commit. - Fixed compile errors in ADS6, DBISAM3 and DBISAM4 adapters. - Fixed FIB adapter bug regarding setting Database to nil before closing cursor in cleanup. - Fixed CopyAndValidateFieldDefs to honor Attribute faHiddenCol. - Fixed cleanup code for dataset refresh scheduler. Should solve thread handle exception on close. 2.51.04 New stuff ========= - Added RequeryDetailsOptions and RequeryDetailsDelay which controls how soon after master record has changed, the detail data should be updated. 2.51.03 New stuff ========= - Added table options for TableName on resolvable datasets. The options include: O - Optional... failed operations on this table doesnt rollback AllOrNothing resolves, but lets the resolve continue on subsequent tables and records. K - Keyfields not null... Partial updates on tables where the keyfields are null will be skipped. Other remaining partial updates will be carried thru. These options are designed to make resolving results of outer joins easier. - Added resolver sub operation events. They allow for detailed control of the resolving operation for each resolver object participating in the resolve (usually one per table to resolve to). - Added OnApproveMetaDataResult event on Query Service to autorize and to allow for changes to results of metadata requests from clients. Changes/minor additions ======================= - Changed back to using HTTP/1.0 format default. Its possible to request another format by setting the KBMMWHTTPVERSION to 1.1 - Added support for NexusDB v2. Please add {$DEFINE KBMMW_USING_NEXUSDB2} to kbmMWConfig.h in addition to {$DEFINE KBMMW_NEXUSDB_SUPPORT}. - Updated Indy 10 support to default match latest Indy 10 snapshot. If previous (10.0.52) support is required, please add {$DEFINE KBMMW_SUPPORT_INDY_10_0_52} to kbmMWConfig.inc. - Added support for views in metadata components. - Added support for Windows 2003 Server in kbmMWGetOsVersion. - Added support for fmtBCD parameter types on client side. - Added support for retrieving metadata for tables and views in Zeos6 adapter. Fixes ===== - Fixed A/V bug in SOAP streamformat. - Fixed garbagecollection of connections. - Fixed thread problem with garbage collection thread when shutting down. - Fixed correctly dropping connections on garbage collect when connection has been forced marked for gc. - Updated so db adapter/database exceptions cannot prevent dropping the connection. - Fixed bug not assigning OnConnectionLost in client transport Assign - Fixed possible bug releasing wrong client states. - Fixed 'polymorphic constructor must be virtual' bug for .net - Removed local TkbmMWCustomClientCursor.FTableName variable as it already exists in base class. 2.51.00 Beta Important notes =============== * The TkbmMWBinaryTransportStream version has been upped to v.25100 due to changes in its format to handle TFMTBCD fields better. Because of that the server _must_ be recompiled. Older clients may optionally be recompiled. New stuff ========= - Added FinalizeObject and FinalizeObjects methods to TkbmMWCustomResolver. - Changed resolver operation to detect original NULL key field values. It will use the gained knowledge to generate new SQK statenents in the fly, when needed, with the relevant WHERE clause supporting updating WHERE somefield IS NULL... - Added AutoFieldOrigin property to all dataset components. - Added kbmMWStringToBCD and kbmMWBCDToString methods to kbmMWGlobal.pas. Fixes ===== - Fixed statemanagement for stateful services. - Fixed loadbalancer announcement Interval value and ServerProbeInterval value for Kylix. - Fixed garbagecollecting bad connections in the connection pool. - Updated TkbmMWBinaryStreamFormat and parameter handling mechanism of clientquery and customqueryservice to natively handle ftFMTBCD fields with full precision. Notice servers must be same version or newer than client). - Updated database wizard. 2.50.01 New stuff ========= - Added master/detail functionality to all adapter datasets, not only client dataset components. - Published OnSetupConnection event for TkbmMWClientConnectionPool. Fixes ===== - Fixed Synapse UDP messaging compile error. - Fixed TkbmMWPooledSimpleClient and descendants giving A/V when calling Connect. In reality Connect and disconnect should do nothing because the connections are obtained from a connection pool which itself manages the status of the connections. - Fixed FIB adapter compilation for Delphi 5 and added missing Unidirectional definition in PerformQuery. - Fixed missing buffer size specification on several transports. It, amonst other things, fixes the A/V in ReadSubject. - Fixed Kylix console mode compilation (hopefully ;)). - Fixed problem in SQL generation for resolving with WhereAll property set to true. - Fixed bug returning wrong fielddefinitions (ftString instead of ftWideString) for level4+ compilers. - Fixed SharedObjects property to require unique names. If a name given already exists, the old object is replaced. 2.50.00 Important notes =============== * Added automatic remote dataset update on server side resolve field value change. This may pose problems to clients older than the server. * Deprecated AddErrorRecord. Use instead LogError, LogErrorRecord and LogFieldValueChange methods. * Updated StreamSec TLS plugin to support StreamSec v2 (v1.16 no longer supported). New stuff ========= - 4 SKUs introduced: Standard, Pro, ProPlus and Enterprise. - D2005 Win32 support. - D2005 dotNet support. - Indy 10 support - SDAC 3 database adapter support. (Pro/Pro+/Ent) - Added Native DB adapter. (Pro/Pro+/Ent) - PostgreSQLDAC database adapter support. (Pro/Pro+/Ent) - Loadbalancer teaching/learning added. (Pro+/Ent) - Server announcement to loadbalancers added. (Pro+/Ent) - Added support for bracket handling of tablenames/fieldnames. (Pro/Pro+/Ent) - Removed old ConnectionString editor, and replaced with group and array capable stringlist editor. - Added support for statistics via Windows Performance Monitor (Ent) - Added TkbmMWLocalStats component for local statistics support (Pro/Pro+/Ent) - Added statistics support on transports and connection pools in addition to the server and service level stats. (Pro+/Ent) - Added OnMessageToSpoke event to have very fine runtime control of message distribution in hub/spoke transports. (Pro+/Ent) - Added OnMacro event to connection pools. Allow for adding macro (Pro/Pro+/Ent) functions and other automated - Added TkbmMWCustomServerThreadPoolTransport from which SAF (Pro+/Ent) transports inherits. - Added PoolSize property on messaging transports for control of how many threads are running to handle request/response scenarios. (Pro+/Ent) - Added internal transactional support on message queues. (Pro+/Ent) - Added optional rejection queues on message queues. - Added required registration of transport info classes. - Added streaming capabilities to transport info instances. - Added/updated TkbmMWFileStoreMessageQueue. (Ent) - Added support for ftLargeInt parameter types. - Added additional transport stream level security options. - Added doubly linked list class. - Added autoinc support for selected databases (DBISAM 3/4, MexusDB, DBExpress autoinc capable db's, SDAC3, SQLDirect, ADO Express, BDE). - Added LastAutoIncValueByIndex and LastAutoIncValueByTableName to TkbmMWCustomResolver. - Added automatic remote dataset update on server side resolve field value change. This may pose problems to clients older than the server. - Added OnResolveFieldValueChange event to all TkbmMWCustomPooledDatasets - Added TkbmMWMSSQLMetaData component. - Added ODAC v5 support (via the ODAC 4 adapter). - Added FieldByOrigin method for TkbmMWCustomPooledDataset and descendants. - Added StreamSec SSH messaging transport. (Ent) - Added global kbmMWDeleteDirTree procedure. - Added Func (function name to be called) to TkbmMWClientIdentity. - Added support for prioritized WIB messages. - Added support for disconnecting a spoke via new DisconnectSpoke method on Hub. - Added SharedObjects property to TkbmMWServer. It will hold managed and unmanaged objects which can be requested by for example services and other threads. Managed objects are automatically freed upon clearing SharedObjects. - Added TkbmMWThreadHashStringList to kbmMWGlobal.pas. - Added AddManagedObject to TkbmMWHashStringList. - Added TkbmMWPriorityDblLinkList to kbmMWGlobal.pas. Changes/minor additions ======================= - Updated transport streams, server and client to provide better check for stream version. - Transports split up in client part, server part and common part. - Enhanced TkbmMWStringList to support grouping of strings. - Updated client code to gracefully handle loadbalancing/failover while operating as a spoke. - Updated HTTP transport stream format to support HTTP v. 1.1 and support HTTP proxy basic authentication. - Updated DBISAM4 adapter to also compile with DBISAM v. 4.09 or newer. - Changed object streaming to not require definition of static or dynamic variant object type. - Published ConnectionPool property on all client datasets. - Deprecated AddErrorRecord. Use instead LogError, LogErrorRecord and LogFieldValueChange methods. - Updated metadata components to know about autoinc selection syntax/methods. - Published StringConversion on several transports. - Updated StreamSec TLS plugin to support StreamSec v2 (v1.16 no longer supported). - Fixed and optimized CopyRawRecords with custom descending fieldtypes. - Added virtual DoGarbageCollection method on TkbmMWCustomConnectionPool. - Added LookupFieldValueChange function to TkbmMWCustomPooledCursor. - Changed ISAPI transport to support HTTP/1.1 and thus provide higher performance. - Added protected DoGarbageCollection method to TkbmMWServer which is called when a regular service garbage collection is happening. - Made several methods on TkbmMWServer virtual/dynamic. - Made messaging thread properties public to allow for easier synchronzation with main vcl thread. - Changed not to call OnDisconnected on WIB transports unless a true disconenction has happened. Fixes ===== - Removed lots of hints and warnings. - Changed loadbalancer list locking while probing servers to be very shortlived. - Fixed OnResolve firing twice bug. - Fixed ADOX field origins bug. - Fixed OnGarbageCollect event bug. - Fixed NexusDB v2 NULL handling. - Fixed statehandling bug. - Fixed CreateParams. - Fixed threading bug in ISAPI server side transport. - Fixed Kylix3 support. - Fixed Synapse transport bugs related to not raising exceptions when occuring. - Changed SQL generation for resolvers to better cater for equally named fields in different tables when resolving multi table joins. - Fixed resolving bug related to cross adapter. - Fixed IBO adapter to set TimerInterval:=0 on IBO session components to ensure it behaves in a threaded environment. - Fixed Indy10 support for Win32. - Fixed loadbalancing bug. - Fixed RunInTransaction property on datasets. - Fixed double call to PrepareErrorTable. - Fixed PrivateDir handling in BDE adaptor to autocreate connection/specific subdir. - Fixed bad cast related to messaging transports. Could result in instability. - Removed not needed TQuery from kbmMWParamsEditor form. - Fixed invalid string reformat when string > 50 chars in SOAP streamformat. - Fixed not calling TkbmMWServer.Authenticate method in InternalServeStream. - Removed dependency on Windows for Linux installs in kbmMWTCPIPMessagingServerTransport.pas, kbmMWTCPIPMessagingClientTransport.pas and kbmMWCustomDataset.pas. - Fixed clearing current StateID when clearing all states in kbmMWClient.pas. - Fixed problem when resolving multiple datasets via cross adapter would use multiple transactions and connections instead of only one. - Fixed missing call to OnMacro if no static macros were defined. - Fixed TkbmMWIndyServerTransport to allow for reusing socket for Indy10. This list is not complete. Many more subtle changes and refactorings has happened internally. 2.03.04 Changes/minor additions ======================= - Updated client code to gracefully handle loadbalancing/failover while operating as a spoke. - Added OnMacro event to connection pools. Allow for adding macro functions and other automated functionality. - Updated transport streams, server and client to provide better check for stream version. If transport stream version is newer than the server/client itself, an exception will be raised. If equal or older it will gracefully be handled. - Added support for KBMMWPROXYUSERNAME and KBMMWPROXYPASSWORD HTTP transport stream format parameters. Can be set to get through an HTTP proxy which require Basic authentication. - Updated DBISAM4 adapter to compile with DBISAM v. 4.09. The adapter will still be compatible with DBISAM v.4.01+. Fixes ===== - Fixed compile errors when KBMMW_MESSAGING_SUPPORT is disabled. - Fixed statehandling which broke in 2.01 and later due to optimizations of service instance allocation. 2.03.03 New stuff ========= - Added support for KBMMW_CONSOLE_SUPPORT definition. Ensures that kbmMW runtime do not require any Forms/QForms packages, and thus allows for execution under Linux as a console app. Fixes ===== - Fixed Kylix3 installation. - Fixed A/V on Indy messaging transport destruction. - Published ClusterID on all messaging transports. - Fixed order of Subscriptions, NodeID, ClusterID properties. The previous order would overwrite any automatically generated res subscription. - Fixed connection pool via messaging transport destruction problem. - Fixed response subscripton creation. - Fixed closing messaging transport when inbound or outbound messagequeue is removed. 2.03 23. July 2004 Important notes =============== * Updated general transport stream to 203 to support new Sync value. Should be backwards compatible. * Standard message subject formats changed from REQ.> to REQ.ClusterID.> etc. * OnSubscription and OnUnsubscription events have been getting an extra ClusterID argument. * Added support for KBMMW_MESSAGING_SUPPORT definition. Existing customers should remember to define it in the kbmMWConfig.inc file to be able to use messaging capabilities. New stuff ========= - Added ClusterID to all transports. Its specially interesting on messaging where it allows to easily divide the WIB into several logical WIBS each running their own set of applications. Notice this has changed the standard message subject formats from REQ.> to REQ.ClusterID.> etc. - Added AsyncRequest, SendAsyncRequest and SendAsyncRequestEx to simpleclient. - Added OnAsyncResponse to client messaging transports. - Added DeleteServer, DeleteServerByID, SetServers methods to TkbmMWLoadBalancedServerList. - Added MaxConnectFailed property to loadbalancer components. It will together with new TkbmMWLoadBalancingNonConnectableOption value mwlbnoDiscardAtConnectFailLimit discard servers who have been failing too many times. - Added support for KBMMW_CONSOLE_SUPPORT for Kylix in kbmMWConfig.inc. If defined, kbmMW based applications will run fine without any X server installed. Notice that any debug dialogs will instead be routed to the syslog. Changes/minor additions ======================= - Modified REQ and RES subjects to add an extra part which can be SYNC or ASYNC. If the part is not specified, its considered SYNC. - Updated general transport stream to 203 to support new Sync value. Backwards compatible. - OnSubscription and OnUnsubscription events have been getting an extra ClusterID argument. - Made Servers property public on TkbmMWCustomLoadbalancer. - Changed to not use Suspend/Resume internally while threads are running in messaging transports. Instead relevant threads are created and destroyed when needed. Fixes ===== - Fixed Params in BCB6. - Fixed service wizard emitting GetServiceDefinition method for BCB even if relevant checkbox wasnt checked. - Fixed Indy TCPIP messaging spoke client workthread. 2.02 11. July 2004 Important notes =============== * The transport parameter setting KBMMWDISCONNECTAFTERRESPONSE has been discontinued. * Updated kbmMW.wsdl file. Stubs generated from old file needs to be regenerated. New stuff ========= - DOM based SOAP for requests/responses implemented. - Added Compression property to transports which can be used to add a custom compression to a transport. Notice that the streamformat may overrule the compression setting (eg. ZIPPED etc). - Added TkbmMWMemoryStream which is an optimized version of TMemoryStream. Its automatically used in many places in kbmMW if the line: {$DEFINE KBMMW_OPTIMIZED_MEMORYSTREAM} is defined in kbmMWConfig.inc. It will dramatically improve performance on moving large amounts of data within kbmMW. Changes/minor additions ======================= - Added TransportStateOptions to stateful non messaging transports like Indy TCPIP. mwtsoDisconnectAfterResponse instructs kbmMW to disconnect a client after it has been served its response. This option means that the previous transport parameter setting KBMMWDISCONNECTAFTERRESPONSE has been discontinued. mwtsoReadUntilDisconnect instructs kbmMW to not expect a request size header, but read until the client disconnects to gather a complete request. Rarely needed as its not possible to respond back to the client on the same socket. - Altered percentage calculation for GetStreamEx and PutStreamEx to handle super large files. - Updated kbmMW.wsdl file. - Published OnRelayMessage on Indy UDP server messaging transport. - Added support for copying RequestAttributes when using a simpleclient as a template. Fixes ===== - Fixed unlocking reference after freeing in file pool garbage collection. - Fixed detecting unused file references in file pool garbage collection. - Fixed messaging and encryption problem. - Fixed UIB adapter to compile under D5. - Fixed slow shutdown when min instances specified on services. - Fixed hanging messaging client if transport wasnt deactivated. - Fixed setting transports on cloned transportstreams before delivering from messaging system. - Fixed property warnings for D5/D6 on a couple of designtime forms. - Added RenameFile/RenameFileEx and SetFileStat/SetFileStatEx methods to file client and service. - Fixed SetFileStat in file client. 2.01a 13. June 2004 Changes/minor additions ======================= - Added new events to all TkbmMWCustomClient descendants: OnClientRequest - called before any request operation is happening. OnClientResponse - classed after the response for a request have been receive and parsed. OnClientTransmit - called after the request transport stream have been prepared. OnClientReceive - called before right after the client have reseived and parsed the response transport stream. Fixes ===== - Fixed Null handling in Absolute Database adapter. - Fixed operation of ZIPPED streamformat with messaging. 2.01 31. May 2004 New stuff ========= - Added Hub/Spoke messaging support. - Added support for single endpoint and multi endpoint message deliveries. - Added TCPIP Indy messaging. - Added Message action component. - Added automatic message relay options to all messaging transports. - Added automatic message gateway options to all messaging transports. - Added support for retrieving directory structure only in fileclient/service. Notice extra argument (DirsOnly:boolean) added to ListFiles/ListFilesEx method. - Added several new global functions: kbmMWCreateGUID, kbmMWGenerateUniqueNodeID, kbmMWGenerateResponseSubscriptionSubject, kbmMWExtractParameter, kbmMWQuoteString, - Added Apollo database adapter (VistaSoft). - Added Absolute Database Engine adapter (ComponentAce). - Added support for singleton message transports. Ie transports who are used directly and not replicated within the connection pool. - Added support for using blobs as parameters. - Added negated subscriptions. I.e. a particular subject you definitely dont want to receive. Start subscription with !. Remember that the order of subscriptions determine what override what. Changes/minor additions ======================= - Improved wizard looks in K3. - Changed wizard forms not to scale. - Improved simpleclient (and thus all descendends of it) with regards to automatic generation of node ID, activation, async request/response message handling. - Virtualized several setter methods on TkbmMWCustomTransport. Fixes ===== - Fixed DB wizard output. - Fixed IBX5 adapter with regards to limited transaction handling. - Fixed IBX5 adapter's description to behave nicely in service wizard. - Fixed compilation bugs in K3. - Fixed Null parameter bug in UIB. - Fixed problem requesting non existing service name. - Fixed resolving joins. - Fixed D5 compilation. - Fixed StrSecII byteswap problem. - Fixed having ; in parameter values. 2.01 beta 2 8. Mar. 2004 Important notes =============== * Fixed several severe bugs introduced in 2.01 beta 1. Upgrade highly recommended! Changes/minor additions ======================= - Optimized service instance and connection allocation algorithms to ensure more level distribution. - Added ConnectionList property to TkbmMWCustomConnectionPool to give access to allocated connections (and thus their statistics) in the connectionpool. - Optimized several internals. Fixes ===== - Fixed bug in loadbalancing service referencing wrong list. - Fixed FreeNotification leaks in all units. - Fixed several severe bugs introduced in 2.01 beta 1. Upgrade highly recommended! 2.01 beta 1 29. Feb. 2004 Important notes =============== * Added new StringConversion property to client and server transports. Default mwscFixed (breaks backwards compatibility with clients and servers!!!) When set to fixed all date/time and float to string conversion and back will be handled by kbmMW in a safe consistent format which is generally not influenced by locale settings. Its specially of interest for pre D7 developers. To keep backwards compatibility, please set the property to mwscLocale, or add the following string to kbmMWConfig.inc and recompile: {$DEFINE KBMMW_V200_COMPAT_STRINGCONVERSION} * Changed XML dateformat conversion to follow XML standard layout: YYYYMMDDTHHMMSS.NNN * GetBestConnection _automatically_ locks the connection. Thus dont lock it again, just unlockconnection after use. * Notice that SOAP DOM implementation in this release is still not complete. New stuff ========= - Added SOAP transport stream. For operates directly with ISAPI transport. To use it in combination with other transports, one must select if the streamformat operates via the HTTP protocol (default false). To specify that it is used over the HTTP protocol, add a transport parameter: KBMMWSOAPVIAHTTP=1 Like with the HTTP streamformat, the SOAP format via HTTP allow for using a proxy server by setting the KBMMWHTTPPOSTURL parameter. - Added new MimeType property for all transport streams. Default value is 'application/octet-stream'. For SOAP and XML transports its default 'text/xml'. - Added mimetype override parameter to SOAP and HTTP formats. Override by setting transport parameter KBMMWMIMETYPE=some_other_mimetype - Added general transport parameter: KBMMWDISCONNECTAFTERRESPONSEDELIVERY which can be set to 1 to force a close of the connection after response delivery. Specially interesting when a kbmMW app server should mimic a webservice/webserver. - Added new StringConversion property to client and server transports. Default mwscFixed (breaks backwards compatibility with clients and servers!!!) When set to fixed all date/time and float to string conversion and back will be handled by kbmMW in a safe consistent format which is generally not influenced by locale settings. Its specially of interest for pre D7 developers. To keep backwards compatibility, please set the property to mwscLocale, or add the following string to kbmMWConfig.inc and recompile: {$DEFINE KBMMW_V200_COMPAT_STRINGCONVERSION} Changes/minor additions ======================= - Performance optimized UIB adapter and fixed with regards to RowsAffected after execsql. Now UIB is seriously fast... much faster than IBO. - Performance optimized kbmMW's resolving process. Initial preparation for each resolve call now takes approx. 1/3 the time compared to 2.00. - Optimized not removing a cached entry after resolve, but only the dataset related to it. Its done like this to further optimize the resolve speed to avoid repeatedly fetching new field defs from the database. - Changed XML dateformat conversion to follow XML standard layout: YYYYMMDDTHHMMSS.NNN - Added support for automatic deletion of partially received files on server side at garbage collection by setting the TkbmMWFileServiceDefinition.KeepPartialFileOnFailure to true. - GetBestConnection _automatically_ locks the connection. Thus dont lock it again, just unlockconnection after use. Fixes ===== - Fixed compilation of ODAC4 and MyDAC adapters. - Fixed wrongfull commit of transaction in finalizeresolve method of the IBX5 resolver. - Fixed serious clienttransaction resolver bug which would result in wrongfully continuing resolving and commiting updates regardless of a dataset fails being resolved. - Fixed XML bug with symbols/tags longer than 255 bytes. - Fixed bug with stored procedures and parameters in the cross adapter. - Fixed A/V when shutting app server down due to stats garbagecollect. - Fixed bug not allowing for inserting values in keyfields if updatekeyfields was false. - Fixed bug not checking for nil in kbmMWBinaryStreamFormat. - Fixed missing check in fileservice PUT operation. 2.00 Final 12. Jan. 2004 New stuff ========= - Added OnRequestTimeout event to TkbmMWServer and TkbmMWCustomService. Its triggered during a garbage collection sweep if the service definition Timeout property is > 0 and the current request has been running for more than Timeout secs. First the service's own event is called (to allow it to clean up or potentially overrule automatic shutdown of the service instance). Then the servers event is called which may choose to override what the has been decided in the service. Changes/minor additions ======================= - Added support for ftFMTBCD fields in query service and binary dataset stream format. - Added full transaction support for InternalInitFieldDefs the same way as for populate and execute. Should solve IB transactions being left over at occations. Fixes ===== - Fixed range check error in subject helper functions in kbmMWGlobal.pas - Fixed TkbmMWFileClient when transferring files of zero size. - Fixed problem with not getting data when query statement empty (easily seen with MT adapter) - Fixed A/V due to client/server serving thread or delivery thread running while message queue is destroyed during app. close and deletion of a messagequeue while transport active. - Fixed timing problem with messaging transports being activated or deactivated while data in queues in both Indy and Synapse transports. - Fixed D5 Update 1 compatibility which caused variant conversion exception. - Fixed D5 compatibility in ConnectionString dialog. - Fixed bug missing setting of formatsettings when doing assign of transport. - Fixed bug when the parts of a subject was hashed into a word array. Should be a longint array. - Fixed repositioning to current record after resolving. - Fixed bug in TkbmMWClientTransactionResolver where the datasets streamformat was used instead of the transaction resolvers own while loading resolving errors. 2.00 Gold 4 6. Jan. 2004 Important notes =============== * Modified RES subject format. Changes/minor additions ======================= - Added global kbmMWUniqueIDString to kbmMWCustomTransport. It will contain a GUID uniquely identifying that particular application instance for for the duration of the application runtime. Fixes ===== - Fixed D5 compatibility. 2.00 Gold 3 5. Jan. 2004 Changes/minor additions ======================= - Added support for using FormatSettings of transport when moving parameters from clientquery/storedproc to queryservice. Require LEVEL7 compilers. - Added kbmMWVariant2String and kbmMWString2Variant conversion functions (LEVEL7 compilers only). - Removed unused BuildKeyFieldValueString method from clientquery. - Added ClientIdent property to TkbmMWCustomService. It is set to point to a TkbmMWClientIdentity object for the duration of the request and nilled after. Fixes ===== Fixed UIB and FIB adapters. 2.00 Gold 2 1. Jan. 2004 New stuff ========= - Added EarlyAuthentication on the TkbmMWServer component. If set to true (default false) will call OnAuthenticate event with TkbmMWServer as sender. If false will operate as usual doing authentication when the service require that. - Added ServiceName and ServiceVersion to TkbmMWClientIdentity. - Added UIB and FIB database adapters. Require UIB v 1.2 or newer from www.progdigy.com respectively FIB v. 5 or newer from www.devrace.com. Changes/minor additions ======================= - Slightly optimized binary transport stream format to store integer values little endian first for Win32 (INTEL 32 bit only CPU's). - Updated TkbmMWCustomServiceDefinition to contain service flags too. - Updated Inventory service and TkbmMWServer to utilize Flags in service definition. - Added OK and Cancel buttons to connectionstring editor. Fixes ===== - Fixed ADOX D5 compatibility. - Fixed bogus warning. 2.00 Gold 1 29. Dec. 2003 PLEASE NOTICE THAT v2 CONTAINS NUMEROUS INTERNAL CHANGES NOT MENTIONED HERE Important notes =============== * Transport stream format changed. New format clients wont work agains old format servers, however new format servers support old format clients. * Changed setting the StoredProcName only to fetch fielddefs at designtime. At runtime will require you to manually FetchDefinitions. * OnResolveError event parameters added. Will require updating your source. * Moved lots of properties from the resolver components to the new meta data components. Notice its important to add a matching metadata component to the form on which the connection pool is placed. Hook up the metadata component to the MetaData property of the connection pool. New stuff ========= - Severely reworked internal transport class structures. - Added TkbmMWCustomTransportController, TkbmMWCustomTransportStreamFormatter and inherited components matching existing transports. - Added advanced publish/subscribe messenging support via a completely new SAF (Store and Forward) buffered framework. - Added fragmented package messenging support. - Added TkbmMWPooledFileClient which operates through a client connectionpool. - Added TkbmMWPooledInventoryClient. - Added support for multiple statements in same query/stored procedure. To seperate a statement from the next, the line _must_ start with either ! or = = indicates that the statement is the statement that will return a resultset. Only one resultset statement is allowed in a multiple statement. All statements are automatically run in the same tranaaction. - Updated service wizard to handle service oriented wizard plugins. - Added unicode support in transports, datasets and more. - Added TkbmMWUnicodeOptions (mwucAutoUTF8,mwucStringsAsUnicode) to metadata components. mwucAutoUTF8 will if set ensure that all widestring fields are converted from/to UTF8 on storage/retrieval. mwucStringsAsUnicode will automatically make ftString and ftWideChar from backend storage to ftWidestring for all kbmMW related operations. mwucAutoParamUTF8 which will convert ftwidestring param datatype to ftString and automatically convert the unicode data to an UTF8 encoded string. - Added true request/response support through messaging. - Added subscription announcement features to client and server transports: procedure AnnounceSubscriptions; and event: OnSubscription and OnUnsubscription - Added preliminary support for Cache and Throttle messages. No logic yet, but the framework will accept them. - Added several global functions for generating subjects and extracting information from them. - Added superfast XML transport stream format. (Add kbmMWXMLTransStream to the uses clause). Define KBMMW_XML_TRANSPORTSTREAM_SUPPORT in kbmMWConfig.inc to enable XML support. - Added DBISAM4 support with support for remote procedures via the standard kbmMW stored procedure support. Define KBMMW_DBISAM4_SUPPORT in kbmMWConfig.inc for DBISAM 4.01+ support. - Added Synapse TCPIP transport. Download Synapse from http: www.ararat.cz/synapse/ - Added Synapse UDP messaging transport. - Added a couple of debug placement values: mwddOneTextFile and mwddOneRawFile. Dumps in same format as mwddTextFile and mwddRawFile, but always appends to the same file given via the global string variable kbmMWDebugFile. Default 'kbmMW_Debug.log'. - Added UndoByRecordID(ARecordID:integer):boolean function to TkbmMWCustomPooledDataset. Will allow undoing a change on a record based on the recordID. Thus the record do not need to be in the current index to be undone. - Added new Metadata components which should be placed centrally together with the connection pool. The metadata component now contain lots of the property settings earlier placed on the resolver, and contains functionality for manipulating tables, indexes and sequences. Currently the following metadata components are supported: TkbmMWNullMetaData, TkbmMWGenericSQLMetaData, TkbmMWOracleMetaData, TkbmMWInterbaseMetaData, TkbmMWDBISAM3MetaData, TkbmMWDBISAM4MetaData, TkbmMWNexusMetaData. - Added new sequence handling system on the server side. The sequence handling system is designed for obtaining unique numbers in a database independant way. If the database supports sequences or generators, those will be used. If not a special pivot table will automatically be created. A sequence is obtained by a sequence name which the developer choose. Multiple sequences can be handled simultaniously. Two sequence components are bundled: TkbmMWTemporarySequencer and TkbmMWDatastoreSequencer. Temporary sequencer operates in memory only (the internal pivot tables can be stored and reloaded if needed). Datastore sequencer operates directly against a datastore using the abilities of the datastore if possible, else automatically operating a pivot table. Changes/minor additions ======================= - Added proper support for AutoReleaseConnections in TkbmMWTransaction. - Added Subject property to TkbmMWCustomTransportStream. - Altered virtual to dynamic for C++Builder only for public developer access methods in kbmMWCustomDataset. - Altered property order for QueryService and QueryServiceVersion in TkbmMWClientQuery and TkbmMWClientStoredProc. - Modified strategy for resolver exception handling. If OnResolveError is specified, it will always be used and no exceptions are raised. If its not specified, an exception is raised on resolve error. - Updated all database adapters (except NexusDB, DBISAM3, X, MT and FF2) to allow for RowsAffected/RecordsAffected=-1 Usually it means that an exception has been thrown which is handled anyway by kbmMW. But in rare cases some databases can be set to not report back the number of rows affected even if an operation went well, and would then return -1. - Changed setting the StoredProcName only to fetch fielddefs at designtime. At runtime will require you to manually FetchDefinitions. - Changing to allow for raising exception after resolve only if OnResolveError is not set. - Improved M/D relation handling on client side to prevent refreshing detail unless master/detail keyfields has changed. - Generally improved M/D which fix some bugs and improves performance. - Published several properties on the TkbmMWClientBriefcaseStreamFormat component. - Added UpdateMacros method to TkbmMWCustomConnectionPool which is controlled by new property AutoUpdateMacros. If true, UpdateMacros is called automatically when the connectionpool is activated. Added OnUpdateMacros event which is called when UpdateMacros is called. - Added Target argument to SendMessage. If empty will broadcast, otherwise will target to the node specified in the target string which is formatted as a connectionstring. eg. for UDP messaging: IP=someip;PORT=someportno If parts of the target is missing, the default send values from the transport are used. - Made using a resolver during resolving threadsafe (protected by locking/unlocking). - Updated ZEOS6 adapter to support stored procedures and fix some bugs (Roger Nyberg). - Updated custom transports, client and server to handle stream envelopes. - Updated Populate to surround opening a cursor with transaction handling. - Updated StreamSec Plugin to match latest StreamSec release. - Updated NexusDB MetaData to use dblquotes instead of single. - Added RecordID and Current arguments to OnResolveError event. Current is true if the current record is the one pointed to by RecordID, else false. Fixes ===== - Fixed tedious bug with C++Builder which do not handle virtual definitions correctly. - Changed ThreadSessionName from being published to being public only. - Fixed 'Record not found' exception during ProcessErrorTable in certain circumstances. - Fixed checking for if ServerTransport given before use in TkbmMWLocalClientTransport. - Fixed copying Null parameter in CopyParamsValueAndType. - Fixed macros not being expanded around fetching definitions. - Generally improved/fixed bugs returning exceptions to client. - Fixed problem when ftTime/ftDate and ftDateTime values =0 would result in null value. - Added check for transport set on client connection pool to avoid AV. - Fixing handling of exceptions during definition fetching when opening a dataset to allow for more correct message to appear at caller. - Fixed specifying stored procedure names. - Fixed resetting IsDataChanged and checkpointing when no error. Solves problems when resolving twice. - Published SQL property in ZEOS6 adapter. - Fixed missing registration of DBISAM4 components. - Fixing D6 and D5 compatibility. - Fixed several minor errors found in v1. - Fixed Kylix3 and C++Builder 6 compatibility. 1.07e 13. Sep. 2003 Fixes/changes ============= - Fixed D6 and D7 runtime project files missing NexusDB transport and adapter references. - Fixed handling of ftGUID in params. - Fixed using AliasName from template in connection creation for NexusDB database adapter. - Fixed installer supporting ISAPI transport even though neither Indy nor DXSocks was selected. - Fixed compatibility with NexusDB v. 1 RC7 as a parameter has changed since RC3. - Added support for GetMetaData in NexusDB adapter. - Fixed problem with client providerflags not respected by resolve operation. 1.07d 11. Sep. 2003 Fixes/changes ============= - Fixed eventtrain when resolving master of a client side master/detail relation. 1.07c 10. Sep. 2003 Fixes/changes ============= - Fixed so Client property on client datasets and client transaction resolver are persistently stored on form. - Added ActiveClient readonly property which returns the client actually in use depending on the ClientAsTemplate settings. - Fixed D6 commercial project file. 1.07b 9. Sep. 2003 Fixes/changes ============= - Fixed C++ Builder compilation. 1.07 8. Sep. 2003 New stuff ========= - Added support for using NexusDB transport (TkbmMWNexusDBClientTransport and TkbmMWNexusDBServerPluginCommandHandler). - Added GetTransportInfo class functions to transport classes. - Added a few more properties on transport stream formats to cross reference request and response streams if needed. - Added support for timestamp parameters. - Added TransactionOperation property to all TkbmMWCustomPooledCursor descendants. Controls if the dataset will be resolved (default) or executed during a transactional resolve operation. Fixes/changes ============= - Fixed dataset caching problem. - Fixed another M/D problem. - Fixed HTTP stream format parsing bug for non WinProxy setups. - Changed to prepare in IBX after setting stored proc name, but before setting params to make sure they are fetched. - Improved TkbmMWClientTransactionResolver to post datasets in edit mode before resolving. Makes easier and more natural M/D resolving with M/D in grids. 1.06b 1. Sep. 2003 Fixes/changes ============= - Fixed client side Master/Detail. - Fixed stored procedures returning resultsets. - Fixed MYDAC database adapter compilation. - Fixed Zeos Oracle database adapter compilation. - Fixed client side transaction resolver checkpointing after resolve. 1.06 31. Aug 2003 New stuff ========= - Added GetStreamEx and PutStreamEx to TkbmMWFileClient. Altered GetFileEx and PutFileEx to use them. - Improved caching mechanism in connection pools to allow for caching metadata also. - Added mwcfDefsOnly to CacheFlags to signal only caching of metadata, not of resultsets for specific query/storedprocedure. Fixes/changes ============= - Fixed HTTP Proxy support for proxies not sending CONTENT: LFCRLFCR. - Fixed assigning params in TkbmMWCustomTransport.Assign. - Moved FetchDefinitions to TkbmMWCustomPooledCursor from TkbmMWCustomClientCursor. - Fixed handling of parameters in stored procedures generally and specifically for DBX adapter. - Fixed a couple of minor caching bugs. - Fixed StreamSec SSL kbmMW transport plugin. 1.05b 27. Aug 2003 Fixes/changes ============= - Fixed Kylix compile bugs. - Fixed comments in kbmMWBinaryStreamFormat.pas. - Updated installation to selectively support kbmMemTable Std 1.05 22. Aug 2003 Important notes =============== * Moved ErrorTable from resolver to TkbmMWCustomPooledCursor. * Removed keyfields from errortable. They are not needed to locate a record which didnt resolve. New stuff ========= - Added OnResolveError event to all database adapter cursorclasses. - Added SQLDirect database adapter. Fixes/changes ============= - Fixed D5 compability when kbmMemTable Pro version is used. - Fixed adding kbmList to kbmMWBinaryStreamFormat. - Removed public property OK from resolvers. - Moved ErrorTable from resolver to TkbmMWCustomPooledCursor. - Moved ProcessErrorTable to TkbmMWCustomPooledCursor from TkbmMWCustomClientCursor. - Added PrepareErrorTable to TkbmMWCustomPooledCursor. - Removed keyfields from errortable. They are not needed to locate a record which didnt resolve. - Fixed not overriding field origins on predefined fields if not empty. - Improved catching user thrown exceptions in OnDelete, OnInsert and OnModify event handlers of the resolvers. Now it automatically adds an error record in case of an exception in the events. - Fixed TCPIP Indy client side transport where ConnectTimeout which is given in secs was was not correctly recalculated to msecs. - Fixed ADOX resolver which was broken in 1.04. 1.04 14. Aug 2003 Important notes =============== * Added support for resolving multiple table joins. To support joined multitable resolves, the binary stream format used for streaming datasets unfortunately had to be changed in a non backward compatible way. If you do not need to resolve multiple joined tables automatically or use the Origin property of fields on the client side, you can retain backward compability by defining KBMMWBINARYSTREAMFORMAT_PRE104 in kbmMWBinaryStreamFormat.pas * Moved updating stats to UpdateGlobalStats and UpdateServiceStats. The change result in slightly different stats between service and global stats. Global stats still contain transport time, service stats do not. New stuff ========= - Added FillInsertObjectParams, FillModifyObjectParams and FillDeleteObjectParams to TkbmMWCustomSQLParamsResolver which handles filling TParams with correct values. - Optimized filling of values during resolving which should give a significantly performance improvement specially when resolving many altered/new/deleted records. - Now enforcing that parameter names must never contain 'illegal' characters. If they do, they are automatically converted to valid names. - Added ListAttributesOptional:boolean to TkbmMWFileServiceDefinition. Default false. If set to true, the files do not have to match the list attributes exactly to be included in a file list. - Added OnAccessFile and OnReleaseFile events to TkbmMWFilePool. Via the OnAccessFile its possible to f.ex. compress a file first for get and return a new temp filename for the compressed file. The OnReleaseFile is called when all references to a file has been released, and a cleanup can be made. - Added support for returning attributes as Result[4] in PerformSTATUS in TkbmMWFileService. - Added StatFile(ARemotePath:string):TkbmMWFileStatus and StatFileEx to TkbmMWFileClient. - Added public read only property InternalClient to TkbmMWCustomClientCursor and TkbmMWClientTransactionResolver. Returns the internal client instance. - Added public InternalClient property in client datasets to get access to the internally used client. - Added support for resolving multiple table joins. To support joined multitable resolves, the binary stream format used for streaming datasets unfortunately had to be changed in a non backward compatible way. If you do not need to resolve multiple joined tables automatically or use the Origin property of fields on the client side, you can retain backward compability by defining KBMMWBINARYSTREAMFORMAT_PRE104 in kbmMWBinaryStreamFormat.pas - Added support for SchemaName and PackageName for stored procedures, and SchemaName for queries. The changes are both in base classes and on the DBX and X adapter. - Added NexusDB v1 database adapter. Fixes/changes ============= - Changed TkbmMWServer.ProcessRequest from virtual abstract to virtual. Default it now raises an exception with function not known. - Fixed TkbmMWCustomTransportStream.ReadVariant not correctly reading null and empty values. - Reordered properties on all database adapters to make sure Params and ParamCheck comes _after_ any StoredProcName or SQL property to load in correct order. - Fixed setting CookedStoredProc in the setting of the stored proc name in TkbmMWCustomDataset. - Improved checking for empty streams in ZIP decompression. - Split TkbmMWServer.ServeRequest into InternalServeStream, ServeStream and ServeRequest. - Moved updating stats to UpdateGlobalStats and UpdateServiceStats. The change result in slightly different stats between service and global stats. Global stats still contain transport time, service stats do not. - Fixed version on Zipped and HTTP transport stream formats to allow for extended standard stream attributes. - Fixed bug returning nil instead of InternalClient in client property of TkbmMWCustomClientDataset and TkbmMWClietnTransactionResolve after setting the client property to nil. - Fixed A/V when deleting a client connected used by a client dataset. - Fixed HTTP streamformat that would result in never getting a response back from a request. - Fixed A/V in PerformDefinitions in DBX adapter. - Updated DB Adapter wizard to match new resolver layout. - Fixed bug in SQL generation which would result in an extra invalid delimiter in update or insert statements if prior field was partly excluded from either update or insert in OnExcludeFromUpdateInsert event. - Fixed Indy 8 compability problem in Indy transport. - Fixed D5 compability problem. - Fixed not checking for parameters when ParamCheck:=false even during designtime. 1.03 12. July 2003 Important notes =============== * Altered Java service to require the import of kbmmw.* (kbmmw.kbmMWRequest and kbmmw.kbmMWClientIdentity) classes. Now client identity is provided for the Java service call. Eg. Object ProcessRequest(String Func, kbmmw.kbmMWClientIdentity Ident, Object [] Args) * Added support for Java requesting a service on the kbmMW server. kbmmw.kbmMWRequest.kbmMWRequest(String ServiceName, String ServiceVersion, String AFunction, kbmmw.kbmMWClientIdentity Ident, Object [] Args) Several variants of the kbmMWRequest functions exist for easy access with simple arguments. New stuff ========= - Added BeforeResolve and AfterResolve events to all resolvable datasets. - Added kbmMWCreateCallbackFunction and kbmMWDisposeCallbackFunction in kbmMWGlobal.pas. These methods allow for making callback to a method in a class. - Altered Java service to require the import of kbmmw.* (kbmmw.kbmMWRequest and kbmmw.kbmMWClientIdentity) classes. Now client identity is provided for the Java service call. Eg. Object ProcessRequest(String Func, kbmmw.kbmMWClientIdentity Ident, Object [] Args) - Added support for Java requesting a service on the kbmMW server. kbmmw.kbmMWRequest.kbmMWRequest(String ServiceName, String ServiceVersion, String AFunction, kbmmw.kbmMWClientIdentity Ident, Object [] Args) Several variants of the kbmMWRequest functions exist for easy access with simple arguments. Fixes/changes ============= - Fixed bug in kbmMWStats.pas loading Min value instead of Max. - Fixed bug in kbmMWVariantToStream saving one byte to little. - Changed so AfterPost/AfterDelete event always happens _after_ any potential resolve due to ResolveOnChanged being true. - Updated dbadapter wizard. - Updated to respect Enabled property of the service definition. If service is disabled, no new requests to that service will be allowed. - Moved all array of variant handling to kbmMWGlobal.pas from kbmMWFileClient.pas. - Added support for controlling gathering of service statistics from the service definition. Now both the servicedefinition.GatherStatistics and the service property GatherStatistics must be true for service statistics to be gathered. GatherStatistics on the servicedefinition is default true. GatherStatistics on the service is default false. - Changed MaxConnections property to allow for -1 value for not limiting the number of connections (generally not recommended since it could be exploited by malicious clients to cause a 'meltdown' of the database by spamming it with requests opening new connections all the time. 0 means that no connections are available in the connectionpool, and all attempts to get them will fail. - Fixed so Shutdown respect calling DestroyLastService method right before last service is destroyed. 1.02 7. July 2003 New stuff ========= - Added ZEOS6 support. Define KBMMW_ZEOS6_SUPPORT in kbmMWConfig.inc to enable it. - Added OLEDBCompatible boolean property to TkbmMWDBXConnectionPool (WIndows only). Set it to TRUE if you are using any OLEDB drivers, like MSSQL etc. - Added public OK function to all resolvers. Return true if last resolving was successful (no records in ErrorTable). - Added protected virtual functions GetRequireTableName and GetRequireKeyFieldNames which both return boolean. Default returnvalue is true. - Updated TkbmMWCustomResolver to throw an exception if TableName not set and GetRequireTableName is true, or if KeyFieldNames is not set and GetRequireKeyFieldNames is true instead of failing silently. - Added public RequestAttributes and ResponseAttributes TStrings properties to TkbmMWCustomClient and published them on TkbmMWSimpleClient. They allow for sending and receiving additional information via the kbmMW request/response header without affecting the service call. - Added OnSend and OnReceive events to all transports. Fixes/changes ============= - Fixed compilation problem of BDE adapter in Delphi5. - Fixed D7 runtime project which accidentally included requirement of ReportBuilder. - Fixed DADO compilation problem. - Improved TkbmMWBinaryStreamFormat to be able to skip data for fields which are not existing in the receiving table. This is not 100% foolproof if the field to be skipped is a memo or blob. There is no way to make it foolproof without breaking backwards stream compability. - Modifed wizard registration to work better with CLX setups. - Fixed Indy8 compile problems with .Connect method. - Fixed calling OnServeResponse even when exceptions happen on the server. 1.01 3. July 2003 New stuff ========= - Published AutoAddIndexes on TkbmMWClientxxxx dataset components. - Added GetMetaData support on adapters and clientquery. - Added OnAuthenticateMetaData to TkbmMWQueryService and descendants. Return Permissions:=[mwapExecute] to allow a client to get metadata information. - Updated ADOX, ADS6, BDE, DAO, DBISAM3, DBX, DOA, IBO and IBX5 database adapters to support GetMetaData. Its not required for a database adapter to support it, but ReportBuilder will not be able to use a database for which the adapter do not support it. - Added ReportBuilder DADE support. - Added TdakbmMWDatabase component of which at least one must be placed on the client form on which ReportBuilder designing happens (end use report design). Its searched and used by the RB DADE to determine which databases are available. A database is a combination of the name of the TdakbmMWDatabase component and the names of the published queries on the given query service. This way its possible to have access to multiple, different databases from the RB client at the same time. - Updated database wizard to support GetMetaData. Fixes/changes ============= - Fixed compilation problem when installing in Indy v. 8.0.23. - Fixed compilation problem in ADO Express adapter. - Fixed compilation problem in DOA adapter. 1.00 1. July 2003 Important notes =============== * V. 1.00 require kbmMemTable v. 3.12. New stuff ========= - Added copying StateID when ClientAsTemplate:=true. - Added ConnectTimeout property to custom client transport. Added support for it in the Indy client transport. Default value is 60 (one minute). - Added support for kbmX database adapter. Its a cross database adapter where the database type can be changes by simply pointing the connectionpool property to another connectionpool. - Added EnableMacros and Macros properties on all real database adapters allowing to use macros in the form {%MACRONAME%} inside query statements. Set Macros to contain eg. MACRONAME=somevalue. - Updated database adapter wizard to handle new cross database setups. - Updated database adapters with new class functions, GetQueryClass, GetStoredProcClass and GetResolverClass for cross adapter compatibility. - Published AutoAddIndexes on all adapter datasets. - Added AssignTo and AssignEventsTo to TkbmMWCustomResolver and descendents. - Added public readonly ConnectionPool property to TkbmMWCustomConnection. - Virtualized EnsureMinConnections, GetBestConnection, TimeoutConnections, KillConnections, TimeOutConnection, KillConnection, IncCacheHits, IncCacheMisses. - Prepared code for Freeware edition. Fixes/changes ============= - Fixed wrong order of decompressing/decrypting on both server and client. - Fixed C6 installation problem. 1.00rc3c 15. June 2003 Fixes/changes ============= - Fixed important bug in TkbmMWFileClient where Getting a file would accidentally call a delete of a file on the server side due to naming conflict of SysUtils.DeleteFile and TkbmMWFileClient.DeleteFile. - Fixed important server problem with service version which were case sensitive. Now case insensitive. 1.00rc3b 13. June 2003 Important notes =============== * Added TkbmMWFileServiceDefinition to TkbmMWFileService. Removed several published properties from TkbmMWFileService module to include them in the file service definition instead. This require opening all file service modules and ignoring any property errors, then recompile. Also remember to set the correct settings on the servicedefinition returned by RegisterService. New stuff ========= - Added kbmMWDebugTypes global variable which can be set to a set of debug types that should be included in the debug output. Currently mwdtTransport,mwdtService,mwdtServer and mwdtDataset are defined. - Added support for KBMMW_NODEBUG compile flag which (if defined) will ensure that only empty debug functions are compiled in. - Added debug for generated SQL in SQL params resolver. Fixes/changes ============= - Fixed caching problem which resulted in empty recordset from cached item. - Fixed retaining current record after resolve. - Added TkbmMWFileServiceDefinition to TkbmMWFileService. Removed several published properties from TkbmMWFileService module to include them in the file service definition instead. - Modified JNI.pas to support Delphi 5. Removed need for JNI_MD.pas. Delphi 5 do not currently support TDateTime variants to Java conversion. 1.00rc3 7. June 2003 Important notes =============== * Added InsertKeyFields property to resolvers. This is default false. It controls if new records are allowed to provide values for the key fields. Notice that since UpdateKeyFields until now also was in control of insert situations, this will possibly require changes in property settings for all application servers. * Removed publising unused properties like DateLayout, TimeLayout, DateTimeLayout, TrueValue and FalseValue from all SQL params type resolvers. The properties may only be interesting with non params resolvers. Notice this change _require_ you to open _all_ datamodules containing resolver components, and ignore all property errors, save and recompile. * Modified OnExcludeFromUpdateInsert event to return a set of field provider flags instead of a boolean. * Split TkbmMWServiceDefinition into TkbmMWCustomServiceDefinition and TkbmMWServiceDefinition. RegisterService now returns a TkbmMWCustomServiceDefinition instead of a TkbmMWServiceDefinition. New stuff ========= - Added kbmMWDebugLevel and kbmMWDebugWhere global variables which controls how debug are made. If to a file, a temporary file is generated in the default temp directory. - Added kbmMWDebugDumpTransportStream global method. - Added ReceivedCount virtual function to TkbmMWCustomTransport. Should be overridden to return the number of bytes waiting to be handled in the transport. Returns default -1 which means that there are no knowledge about the number of waiting bytes. Updated TCPIP Indy transport to support ReceivedCount. Updated TCPIP Indy Client transport to allow for RequestTimeout (in secs), -1 is indefinitely. Added ReceivedCount to transport plugins too. - Added InsertKeyFields property to resolvers. This is default false. It controls if new records are allowed to provide values for the key fields. Notice that since UpdateKeyFields until now also was in control of insert situations, this will possibly require changes in property settings for all application servers. Updated all relevant resolvers to publish InsertKeyFields. Updated db adapterwizard to support it. - Added ConstructFirstService and DestroyLastService protected service methods which can be overriden. They are called on creation of first service instance in service pool, and destruction of last service instance in service pool. - Added protected BeforeRequest and AfterRequest methods to TkbmMWCustomService. They can be overridden, but remember to call inhertied. - Added TkbmMWCustomJavaService which makes integration with Java very easy. Requires LEVEL6+ compiler. Thus it will not compile under Delphi 5. The Java support uses Jedi's JNI support code modified slightly to enable dynamical loading of the Java library. The modified JNI.pas unit is included in the kbmMW distribution. - Added Attribs:TStringList property to TkbmMWCustomServiceDefinition. - Added additional field provider flag, mwpfInInsert. - Rewrote HTTP streamformat to interact correctly with proxy servers. Using HTTP streamformat now also automatically disconnects client after receiving each response. - Split TkbmMWServiceDefinition into TkbmMWCustomServiceDefinition and TkbmMWServiceDefinition. Fixes/changes ============= - Modified OnExcludeFromUpdateInsert event to return a set of field provider flags instead of a boolean. - Removed publising unused properties like DateLayout, TimeLayout, DateTimeLayout, TrueValue and FalseValue from all SQL params type resolvers. The properties may only be interesting with non params resolvers. Notice this change _require_ you to open _all_ datamodules containing resolver components, and ignore all property errors, save and recompile. - Updated db adapter wizard to only publish those properties on non params SQL resolver components. - Updated TkbmMWEventService with two new events, OnConstructFirstService and OnDestroyLastService. - Fixed Kylix compilation. - Fixed trying to reconnect if client fails receiving data on a request. - Improved transport stream handling of null and empty variants. 1.00rc2e 17. May 2003 Important notes =============== * Altered OnReconnect's Sender to be a client transport instead of a client component. New stuff ========= - Added OnConnected and OnDisconnected events to server and client transports. - Added OnConnectionLost event to client transports. Its called when all reconnection attempts has failed. - Added InStream and OutStream arguments to TkbmMWServer.Request function. If the streams are of TMemoryStream type, the streams are used directly. If not, the stream contents are copied as needed. Fixes/changes ============= - Fixed Div by zero bug in fileservice when file transferred is of zero size. - Fixed A/V when setting BoundTransport:=nil. - Altered reconnection algorithm for clients to allow for MaxRetries=0 and MaxRetriesAlternative>0 to allow connecting to alternative host immediately after connection failed. - Altered OnReconnect's Sender to be a client transport instead of a client component. 1.00 RC2d 10. May 2003 Fixes/changes ============= Includes missing ressource file. 1.00 RC2c 10. May 2003 Fixes/changes ============= Changed the AQuery parameter of OnGetNamedQuery on the query service to be of var type. Added a Request function to TkbmMWServer which makes calling a service much easier on server side. Fixed some A/V's possible when a service was not obtained. Fixed a few other minor things. Fixed DADO adapter which wouldnt compile due to a renamed object in CreateModifyObject. 1.00 RC2b Fixes/changes ============= Fixed ZIPPPED transport which was not updated correctly. 1.00 RC2 29. Apr 2003 New stuff ========= - Added OnResolveInitialization and OnResolveFinalization events to all resolvers. - Updated database adapter wizard accordingly. - Added OnGarbageCollectQuery event to TkbmMWServer which will be called for each service instance being evaluated for garbagecollection. This way garbage collection of a specific service can be forced or canceled at developers will. - Added Timeout property to service definition. Set > 0 (secs) to define a timeout for how long time a request may run in a service before the service instance gets terminated. - Added support for STATUS request in file service. Accepts one argument (filepath) and returns variant array (Size,creationtime,accesstime,modificationtime) or null if no file found. - Added support for sub format control of the standard transport format. Set an Params on transport to 'KBMMW_STANDARDTRANSPORTSTREAN_FORMAT' (const mwstsfAttrName) to 'RAW' or 'STANDARD' (default). Setting to RAW means floats and datetimes are transported in a raw binary format which may not be portable while all other variant types are transported as text. Setting to STANDARD or not setting it at all means that the standard transport format is used which transports floats, datetimes and all other variant types as text. - Added DoInitializeState/InitializeState and DoFinalizeState/FinalizeState methods which are called when a stateful service needs to be initialized for a client (default values set) and finalized when the state is released. - Updated service wizard to support the new methods. - Added support for FastZLib in ZIPPED transport stream format. Define KBMMW_ZIPPED_USE_FASTZLIB in kbmMWConfig.inc file to enable. Notice that the compression is not compatible with ZLib. Thus servers and clients must all use same library. - Added support for transport parameter KBMMW_ZIPPEDTRANSPORTSTREAM_COMPRESSION which should be set to a value (-1=default, 0=no compression, 1=fastests, 2=default, 3=max. (These values are not used by the standard ZLib library). - Added several new events to TkbmMWEventService: OnConstructService, OnDestroyService, OnInitializeService, OnFinalizeService, OnInitializeState, OnFinalizeState Fixes/changes ============= - Fixed bug in kbmMW ADS6 db adapter. - Changed OnGetNamedQuery from function to procedure to be compatible with C++Builder. - Updated IBO database adapter to include support for IBO_Session which should solve threading problems. - Took care of platform warnings and hints. - Fixed DOA db adapter compile bugs and problems due to inconsistency between DOA Delphi and BCB version. - Published Params property on TkbmMWTCPIPIndyServerTransport, TkbmMWTCPIPDXSockServerTransport, TkbmMWISAPIServerTransport and TkbmMWISAPIClientTransport. - Fixed not returning StateID from newly started stateful service. 1.00 RC1 18. Apr 2003 New stuff ========= - Added ID property to servicedefinition. Its used to assign a unique (for that specific pool) number to a service. - Added WriteFloat, WriteDateTime, WriteObject and ReadFloat, ReadDateTime and ReadObject to transport stream format. Allows for moving special objects and improved streaming customization for floating point and date time values. - Added IkbmMWObject interface which can be used to prepare a class of your own for automatic streaming via kbmMW. - Added TkbmMWObject class which can be used as base for custom streamable classes. - Added following functions for supporting new custom variant type for dealing with objects. (New variable variant type only for D6+) function kbmMWVarObjectCreate(AObject:TObject):Variant; function kbmMWVarObjectCreateAutoDispose(AObject:TObject):Variant; function kbmMWVarObject:TVarType; function kbmMWObjectFromVar(AVariant:variant):TObject; - Altered registration of custom objects. - Added/altered the following functions for registration purposes: procedure kbmMWRegisterStreamableObject(AObjectClass:TClass; AObjectReader:TkbmMWObjectReader; AObjectWriter:TkbmMWObjectWriter); overload; procedure kbmMWRegisterStreamableObject(AObjectClass:TClass); overload; function kbmMWGetStreamableObjectClass(AObjectClassName:string):TClass; Fixes/changes ============= - Fixed A/V if Database template not set on DB adapter. Now will throw an exception instead if trying to open a connection. - Fixed to raise an exception after rollback if resolving goes wrong in TkbmMWTransactionResolver. - Fixed bug in ADO Express adapter when fetching field origins. - Changed so Sender of OnAuthenticate event on TkbmMWServer is the requested service. - Fixed bug which could lead to IDE hanging on project close. - Fixed not checkpointing on all or nothing client resolving. 1.00 Beta 3.5 2. Apr 2003 Fixes/changes ============= - Fixed kbmMWWaitSemaphore which used ATimeout instead of t for Windows. - Fixed several hints about declared variables not being used in kbmMWClientDataset.pas. - Fixed IBX adapter to be able to compile under Delphi5. - Fixed Connection string editor uses clause to better cope with Kylix and Delphi5 at the same time. - Fixed Indy 8 compatibility issue in kbmMWTCPIPIndyTransport.pas. - Fixed FileVersion declared twice problem in kbmMWStreamFormat and kbmMWBinaryStreamFormat. - Added kbmMWStripQuotes function to kbmMWGlobal.pas. It takes a string and returns a string removing all " and ' from it. - Modified so all field origins are delivered without quotes. - Fixed BDE adapter to keep connection even when last query closed. - Fixed bug in client receiving errortable after resolve. 1.00 Beta 3.4 1. Apr 2003 New stuff ========= - Added TkbmMWClientTransactionResolver component. - Made several changes in transaction handling in the customqueryservice and queryservice to allow for client side multidataset resolving under transactional control. - Added OnGetNamedQuery event on TkbmMWQueryService and descendants. - Added support for OnGetNamedQuery event on all relevant places in the query service. - Added Active boolean property to TkbmMWCustomConnectionPool (and all descendants). If set false, connections cannot be obtained through the connection pool, and garbage collection is suspended. Thus remember to set to true (default) before opening any queries. - Added AdsCharType property to TkbmMWADS6Query and TkbmMWADS6StoredProc. - Published property SkipFieldsWithoutOrigin on all relevant resolvers. It controls if a field without any origin setting should be resolved or not. Default false. Updated db wizard to support it. - Added IgnoreRowsAffected property to DBExpress adapter. Default false. If set to true, the resolver will not test how many rows was affected during the update/insert/delete operation. This is due to DBX not fully supporting a correct RowsAffected value for several databases. Fixes/changes ============= - Fixed TkbmMWSessionPool.Shutdown which were missing a conversion to secs. - Fixed TCPIP Indy server transport to gracefully be able to bind to specific IP on a multiple IP server. - Fixed bug in file service and file client on transferring files which sizes matching a full multiplum of a blocksize. - Fixed A/V if requesting named query which do not exist. - Fixed client briefcase not storing deleted records. That would result in the records not being deleted on the backend db on a resolve. - Fixed idlecheck to make garbage collection of long running services work correctly. - Fixed handling of datetime and float values conversion for streaming in custom transport. Now will use new FormatSettings public property on custom transport (Delphi7+ only) or use the local locale settings for the client. Pre Delphi7 the local settings can be changed using the global format variables in Delphi/BCB (notice that this change the format globally for the complete application, thus the D7 FormatSettings is the better way to do it. - Fixed A/V when query/st.proc tries to obtain connection but cant. - Changed EnableVersioning on all TkbmMWCustomPooledDataset descendants to True. - Fixed compile bugs under Kylix3 for Delphi. - Fixed ADOExpress adapter to correctly handle calculated fields like Count(xx) etc. 1.00 Beta 3.3 11. Mar 2003 Fixes/changes ============= - Fixed designtime dialogs not working in D5. - Changed so loadbalancer not running probe during designtime. - Added OnProbeConnectFailed event to the loadbalancers. Its called when its not able to connect to a server. - Fixed invalid reference to FDeleteQuery in autogenerated adapters via the DB adapter wizard. - Fixed a few misspellings in helper texts here and there. - Fixed LoadBalancer property when loadbalancer being deleted. - Fixed Transport property on loadbalancer when transport being deleted. - Fixed fetching parameters for SP's/Queries having persisitent fields. - Changed PerformRefreshDefinitions to include a boolean parameter controling if definition update only is for parameters or also includes fields. - Altered DB adapter wizard to take PerformRefreshDefinitions change into account. - Altered way fielddefinitions are fetched in case persistent fields are already defined. Now allows for fetching parameters anyway. - Fixed not allowing blob fields to be part of the key in update and delete statements. - Altered DBISAM queries to be live instead of readonly of performance reasons. - Fixed loadbalancer transport exception when loading application where loadbalancer active. 1.00 Beta 3 24. Feb 2003 Important notes =============== * The dataset streaming format has changed. Thus all clients and servers using dataset streaming must be recompiled. * GetStateful method in services now removed in favor for flag in GetFlags. * Reversed order of encryption and compression in the server and client to improve performance. This change require clients and servers to be recompiled with latest release if they are using both encryption and compression. New stuff ========= - Added TkbmMWCustomPooledSimpleClient and TkbmMWPooledSimpleClient. They supports using a transport connection pool instead of a transport directly. - Added ClientAsTemplate boolean property to control if ClientQuery/ClientStoredProc property Client should be used as is or as a template (default). - Added ListenerThreadPriority, SpawnedThreadPriority, UseThreadPool ThreadCacheSize to DXSocks transport. Use according to DXSocks docs. - Added ConnectionString property to client transports. - Added virtual EncodeConnectionString and DecodeConnectionString methods which are called to encode and decode the connectionstring for the specific transport. - Added support for persistent services. A persistent service will never time out or be owned by any client like a stateful service. Thus the service can contain a global state, but not a client specific state. - Added PrivateDir and NetFileDir properties to TkbmMWBDEConnectionPool. - Added backward compability support for 0.93a-c on the binary streamformat. The server will automatically answer with the version of the streamformat used by the client. Current binary (default) stream format is 101. - Added new services: TkbmMWSimpleService and TkbmMWEventService. Simple service is the same as TkbmMWCustomService but publish a few events like OnBeforeRequest, OnAfterRequest and OnAuthenticate. Event service is the same as TkbmMWSimpleService except it publish a new event OnRequest which can be used to write the business code instead of overriding ProcessRequest. Changed bundled services to descent from TkbmMWSimpleService instead of TkbmMWCustomService. - AutoCreateDirectories property added to TkbmMWFilePool. If set to true, directories will automatically be created when files are uploaded to the server. - Added OnServeResponse event to kbmMW which is called right before the response is served back to the client. - Added support for Origin property on fields. Require kbmMemTable v. 3.08 or newer. - Added new functions CreateInsertObject, CreateModifyObject, CreateDeleteObject and FreeResolverObject to resolvers. Added AObject;TObject argument to DoInsertRecord, DoModifyRecord, DoDeleteRecord resolver functions. - Updated all datastore adapters to use the new object style resolvers. - Added optional PerformFieldOrigins method to TkbmMWCustomPooledDataset which may be overriden by database adapters to set correct origin of field in form Tablename.Fieldname based on an actual query. 1) Verified that the following adapters do not require change to give correct origin: IBX (IB Express), DBISAM3 2) Updated the following adapters to support returning the correct origin: ADOX (ADO Express) 3) The following datastores/API's do not allow for any reliable way to get correct origins automatically which means that the origin info must be set manually in multitable resolving: BDE, DBX (DB Express) 4) The following adapters do not support multitable updates at all, unless a customized resolver is created and used: MT (kbmMemTable), FF2 (FlashFiler 2) Other adapters not listed here has not been verified at this time with regards to correctness of origin handling and may fall into any of the 4 categories. The purpose of all the datastore adapter changes is to allow for complex transaction handling and automated multitable resolving in for example join situations etc. - Added support for pfInUpdate and pfInKey field provider flags on both server and client side. - Added kbmMWSetAffinityMas and kbmMWGetAffinityMask to kbmMWGlobal.pas. - Added experimental support for Kylix 3 for Delphi. - Added new TkbmMWCustomTransportPlugin class which can be subclassed to create advanced plugins that can be connected to the transport. - Added Plugin property to all transports. - Added DoConnected and DoDisconnected to TkbmMWCustomTransport which should be called whenever a client connect or disconnect. - Added Certificate and Attributes to TkbmMWCustomTransportInfo. - Added TkbmMWClientTransportInfo. - Added StreamSecII transport plugin for SSL/TLS support. Require StreamSecII v. 1.6.87 or newer. Uncomment KBMMW_TRANSPORTPLUGIN_SS2_TLS in the configuration file to include its support. - Added StreamSecII crypt component. Uncomment KBMMW_CRYPT_SS2 in the configuration file to include its support. - Added support for DiamondAccess. Uncomment KBMMW_DOA_SUPPORT in the configuration file to include its support. - Added CreationTime:TDateTime, StartServingTIme:TDateTime, StopServingTIme:TDateTime, LastRequestTime:TDateTime, AccRequestTime:TDateTime and AccRequestCount:longint to TkbmMWServer. The properties gives timing and count information. - Added UniqueIdentifier to TkbmMWServer which contains a server generated string which should be worldwide unique. - Added BoundTransport to TkbmMWCustomService. Optionally set it to the server transport component which this service is only allowed to be run via. - Added MinCount to TkbmMWServiceDefinition which defines how many instances as minimum there must be running of a service at any time. MinCount should be less or equal to MaxCount. Setting MinCount>MaxCount automatically bumps up MaxCount. -1 means no MinCount set. - Added class function GetMinInstances:integer to TkbmMWCustomService. Override this in a service to let the service define how many instances should always run of it. - Added class function GetMaxInstances:integer to TkbmMWCustomService. Override this in a service to let the service define the max number of instances to run. - Added Loadbalancing service (TkbmMWCustomLoadBalancing) and loadbalancer components (TkbmMWRoundRobinLoadBalancer, TkbmMWRandomLoadBalancer, TkbmMWBestFitLoadBalancer) based on TkbmMWCustomLoadBalancer. The loadbalancing service is used by other servers to obtain availability and performance information from the server. The information is used to deterimine which server to loadbalance to. Updated TkbmMWCustomClient components to handle loadbalancing replys from servers. Fixes/changes ============= - Fixed db adapter wizard code generation. - Fixed bug in query ExecSQL/Execute on client which resulted in variant exception. - Fixed serious bug in connection pooling mechanism which resulted in allocation of too many connections despite maxconnections set in some situations. - Fixed bug in ADOExpress adapter which resulted in lost db connections. - Fixed garbagecollection timeout comparison on service garbagecollection. - Fixed so FinalizeService is guaranteed to be called when current request has finished using the service. - Added a little more exception handling in DXSocks transport to guarantee release of some temporary allocated memory. - Altered the way the HTTP header is removed in ISAPI transport. - Moved Stateful from being a seperate function (GetStateful) to being a serviceflag (mwsfStateful) in GetFlags. Updated wizard accordingly. - Changed use of affinitymask in kbmMWServer.pas to use newly added functions. Will make a kbmMW based server run on Win95 provided WinSock2 is installed. - Made several small changes and fixes here and there to allow for Kylix 3 support. - Fixed bug setting Inventory value which would A/V the IDE. - Rearranged TkbmMWCustomTransportInfo and TkbmMWServerTransportInfo to make it the responsibility of the transport to create an instance when a client connects and destroy it when the client disconnects. - Fixed a few bugs in transport handling. - Reversed order of encryption and compression in the server and client to improve performance. This change require clients and servers to be recompiled with latest release if they are using both encryption and compression. - Fixed client datasets FetchDefinitions to fetch definitions regardless of AutoFieldDefsOnOpen. - Fixed Params property (missing setter method) on TkbmMWCustomTransport. - Published properties DetailFields, MasterSource and MasterFields on database adapters. Updated wizard to include them on new adapters. 1.00 Beta 2 10. Nov 2002 Important notes =============== * The transport format has changed. Thus all clients and servers must be recompiled. * RegisterService calls have changed. Instead of the many arguments to them, set the properties of the returned TkbmMWServiceDefinition object. New stuff ========= - Added testing for Windows ME in kbmMWGetOSVersion. - Added CacheFlags to all database adapters and client datasets. Setting mwcfDontAge to true doesnt remove a cached entry even if its too old. it will however be removed if the number of cached entries are bigger than the MaxCacheEntries allowed. This can be prevented by setting mwcfDontGarbageCollect. - Published AutoFieldDefsOnOpen on all database adapters. - Added support for defining stateful services. This breaks transport compability with v. 1.00beta1 app servers or clients. - Added GetStateful method to service. Return true if a service should be stateful. Default false. - Added StateID property to client which is -1 if client doesnt hold a stateid from server. - Changed RegisterService and RegisterServiceByName to functions returning a TkbmMWServiceDefinition. Removed several arguments from Register.... Instead set options on the returned service definition. - Added MaxIdleStatefulTime property to TkbmMWServiceDefinition. Stateful services are garbage collected according to this value instead of the MaxIdleTime value. - Added property StateIDs to TkbmMWCustomClient which contains information about all stateful services the client has running on the server. - Added ReleaseAllStates, ReleaseState and ReleaseStateID methods to TkbmMWCustomClient to gracefully release all, current or specific state on server. - Added ClearAllStates to clear states info on client without gracefully releasing them on the server. - Added support for special function named '__RELEASESTATE' in all services. Its purpose is to allow a client to release the state of a stateful service owned by the client. - Added support for transport stream format attributes which can be used to extend the header with additional information. The new state support and the attribute support require all clients and servers to be recompiled. - Added OnConnect and OnDisconnect events to TCPIP Indy server transport. - Added support for DXSocks 3.0 as transport. Define KBMMW_DXSOCKTCPIPTRANSPORT_SUPPORT in kbmMWConfig.inc. - Added support for using DXSocks 3.0 as ISAPI transport. Define KBMMW_ISAPITRANSPORT_USING_DXSOCK in kbmMWConfig.inc. If not defined uses Indy as always. Fixes/changes ============= - Published Client property of TkbmMWClientQuery and TkbmMWClientStoredProc - Fixed spelling of Generel tab to General. - Fixed wrong count and missing raise in TkbmMWCustomDataset.Resolve. - Fixed not calling GetProcessAffinityMask and SetProcessAffinityMask on Win95,Win98,WinME. - Fixed missing Connected:=true and Connected:=false in InternalOpenConnection and InternalCloseConnection in the ADOX adapter. - Fixed file service file exclusive locking for files opened for read. - Fixed minor bug where Stat garbagecollection could give A/V during shutdown of server. - Fixed bug giving exception about databasename multiple defined in MYSQLDAC adapter. - Changed so exceptions even during fielddefinitions are propogated to client. This results in client not displaying 'There must be at least one field', but instead displays the reason for it. - Fixed transaction handling in IBX datastore adapter. - Fixed bug where exception during resolving would not be propogated back to client. 1.00 Beta 1 31. Oct 2002 Important notes =============== * This release require kbmMemTable v. 3.06 or newer. * RegisterService and RegisterServiceByName now has additional parameters which must given. false,false are giving old behaviour. * The eventhandlers of the resolver has changed parameters and thus needs to be recreated. - Published AutoPopulateOnOpen:boolean on all database adapters and clientcursors. Controls if opening a dataset should perform requests to populate it with data. - Changed internal AutoFieldDefsOnOpen:boolean to AutoFieldDefsOnOpen:TkbmMWAutoFieldDefsOnOpen; - Published AutoFieldDefsOnOpen:TkbmMWAutoFieldDefsOnOpen on all database adapters and clientcursors. Controls when fielddefs should be updated when opening the dataset. - Moved connection features from TkbmMWCustomPooledCursor to parent TkbmMWCustomPooledDataset. - Added ObtainConnection and ReleaseConnection to TkbmMWCustomPooledDataset to simplify connection handling. - Added TkbmMWTransaction and TkbmMWTransactions for internal 2 phase commit transaction handling. - Added Default and DontQueue argument to RegisterService/RegisterServiceByName, Default can be set to false or true depending on if that specific service should be run in case no service match the clients request. DontQueue can be set to false (default) or true depending on if an error should be returned to the client in case no free service slots are available. - Added EnableDefaultService on TkbmMWServer which controls if a default service should be run in case no match for requested service is made. - Surfaced ServicePool:TkbmMWServicePool and TransportList:TkbmMWTransportList as public properties on TkbmMWServer. - Fixed a few minor bugs in the service wizard. - Added new standard service which should be extended: TkbmMWProxyService Its purpose is to work as a proxy between kbmMW clients and kbmMW app. servers. It should be used as default service, ie the one being called when no other service names matches. - Added MinClientPort and MaxClientPort to TkbmMWTCPIPIndyClientTransport when using Indy 9. Restricts the ports the client will use to communicate with the server. - Altered exception handling to allow returning Data and Token client identity parameters to client even if request was not ok. - Published OnGarbageCollection property on TkbmMWServer. It can be used to add some code which should be run regularly async of client requests. - Fixed bug when Query service always believed a request is a stored proc. when the service is being used for mixed purposes. - Made NamedQueryName and IsNamedQuery public properties of TkbMMWCustomQueryService writable. - Changed so all resolving will be using transactions if supported regardless of if AllOrNothing has been set. If AllOrNothing is false the transaction will be committed even when an exception was raised during resolve. - Removed invalid commit from IBO adapter. - Added property KillConnectionOnException:boolean which is default true to TkbmMWCustomPooledCursor. - Setting it to false forces kbmMW not to timeout a datastore connection even if last operation resulted in an exception. - Fixed case bug when locating a service in servicedefinitions. Wrong case could cause creating new service instances. - Fixed bugs in TkbmMWInventoryClient which would not accept and use version of neither inventory service or selected service.. Now issue Refresh each time to get updated inventory data. - Fixed IBO adapter to not include IBO generated DBKEY field. - Fixed MT adapter to check for template attachmaxcount on connection open if template is closed. - Fixed service wizard to include kbmMWGlobal and service and dbadapter wizards to include kbmMW.inc to get compiler level defines. Change from testing for VER140 to testing for LEVEL6. - Fixed not calling SetProcessAffinityMask on Win95/Win98 OS. - Fixed bug deleting crypt component while transport active. - Fixed bug not detecting missing TransportStreamFormat which resulted in AV. - Added FetchMaxRecords property to client datasets to limit the number of records fetched from server. This is different from FetchRecordsOnDemand as the later will in a later release fetch records on demand from server in blocks depending size of the value. - Added MinConnections to all connectionpools to allow preallocation of connections during runtime. Not active during designtime. - Added support for RowsAffected in all database adapters and the datastore adapter wizard. - Added support for RowsAffected in client dataset. - Published Client property of client datasets. It allows for pointing it to a TkbmMWCustomSimpleClient which will be used for communication towards the app. server. Notice that the transport property of that simple client is automatically set and reset by the client dataset connection pool. If Client is nil (not set) an internal generated simple client will be used (old behaviour). This change allows for one common setup place for client orientated settings like user, pwd etc. - Added datastore adapter for DOA (Direct Oracle Access from www.allroundautomations.com) Define KBMMW_DOA_SUPPORT in the kbmMWConfig.inc file to enable it. Requires kbmMemTable v. 3.06 or newer. - Added support for returning parameters from query execution. - Added datastore adapter for ODAC v. 4 (Oracle Direct Access Components from www.crlab.com) Define KBMMW_ODAC4_SUPPORT in the kbmMWConfig.inc file to enable it. - Added OnQueryStatement to TkbmMWCustomQuery which is called on each query/execute/definition/resolve request from clients. Its purpose is to allow the application server to rewrite the name of the named query or the statement before execution. - Fixed problem Token getting reset in client when server throws exception. - Added additional check for resolver inserts/updates/deletes are performed as expected. - Updated all database adapters to handle that check. - Updated datastore wizard to handle new check. 0.93c 29. Aug. 2002 Fixes/changes ============= Fixed A/V when kbmMWServer removed before transport. Fixed Zeos MySQL adapter with resolve issues. Moved needed initialization and destruction code out of ConstructService and DestroyService to make it easier when subclassing TkbmMWCustomService. 0.93b 28. Aug. 2002 Fixes/changes ============= - Fixed D6 project file which mistakenly included a non delivered file. - Fixed service stream problem where multiple copies or garbage would be included in the stream. - Fixed TIBDatabase bug in IBX5 database adapter. 0.93a Important notes =============== * This release require kbmMemTable v. 3.04 or newer. * Notice that due to changes in the streaming format between Delphi/BCB 5 and Delphi/BCB 6, TkbmMWBinaryStreamFormat had to be modified to support streaming those fields in a compatible way. This requires all clients and servers to be recompiled using this new format unless a define is uncommented. For more info, please check the header of the kbmMWBinaryStreamFormat.pas file. * Notice due to renaming of service functions within the CustomQueryService, pre v. 0.93a servers will not be compatible with clients running 0.93a or newer. * ExcludeFromUpdateInsert and ExcludeFromWhere events now as Sender as type TkbmMWCustomQueryResolver. * Notice due to addition of extra Data value, the streamformat between client and server have been changed which require a recompilation of all clients and servers. * Due to addition of garbage collection, an additional parameter has been added to all RegisterService methods. To not have garbage collection set the parameter to 0. Fixes/changes ============= - Fixed Stored procedure parameters not fetched problem. - Renamed PerformRefreshFieldDefs to PerformRefreshDefinitions throughout all sources to reflect the scope not only being field definitions but also possibly parameters. - Updated all database adapters supporting stored procedures to correctly reflect parameters. - Fixed problem not allowing for using Interbase Local driver with the BDE in kbmMW. - Improved IBX transaction support. - Fixed bug in resolvers in case of multiple key fields. - Fixed problem in CopyRawRecords which would affect caching of records not happening as it should. - Fixed problem with BCB (actually C++) not allowing virtual static's (class functions in Delphi). For a lengthy description see TkbmMWCustomService declaration. - Improved catching exceptions and propogating them to the client earlier on. - Made substantial inner changes in the TkbmMWClient component including the auto reconnect on error code. - Moved ExcludeFromUpdateInsert and ExcludeFromWhere events from TkbmMWCustomSQLResolver to TkbmMWCustomQueryResolver. This breaks existing eventhandler code since the Sender argument changed type to TkbmMWCustomQueryResolver. - Changed Token property to read/write on TkbmMWCustomClient. - Fixed returning the Token value to the client. - Updated transport formats from 100 to 101. This require all servers and clients being rebuild to operate. Additions ========= - Added support for BCB 6 both for compilation/installation and in the service wizard. Currently a problem persists with the C++ autotranslation of the OnServeRequest. The call is not translated correctly by current versions of BCB. Thus in BCB servers please avoid using that event. - Added UniqueDBName property to TkbmMWBDEConnectionPool (default true) which controls if databasename should be made unique or not. - Added new TkbmMWClientStoredProc. Use as a normal TStoredProc after setting the default StoredProc to a TkbmMWxxxStoredProc on the queryservice, or use named stored procedures via the @NAME format (similar to the TkbmMWClientQuery operation). - Added support for default Stored procedure on query service. - Added FetchDefinitions to TkbmMWCustomClientCursor which therefore is available for TkbmMWClientQuery and TkbmMWClientStoredProc. It will fetch fielddefs and params from app server. This is required after setting f.ex. stored proc name and/or overload during runtime. During designtime, the definitions are fetched automatically. - Added support for using real instantiated objects as arguments and results for in client requests towards a service via the new functions in kbmMWGlobal.pas: function kbmMWObject2Variant(AObject:TObject):Variant; function kbmMWVariant2Object(AVariant:Variant):TObject; procedure kbmMWRegisterStreamableObject(AObjectClass:TClass; AObjectReader:TkbmMWObjectReader; AObjectWriter:TkbmMWObjectWriter); - Added ZIPPED-HTTP transport stream format combining HTTP with compression. Add this definition to kbmMWConfig.inc to enable it: {$DEFINE KBMMW_ZIPPED_HTTP_TRANSPORTSTREAM_SUPPORT} - Added support for streaming calculated/lookup fields by setting the sfCalculated/sfLookup properties of TkbmMWBinaryStreamFormat. - Added ConstructService and DestroyService as alternative constructor/destructor methods in case something needs to be initialized/finalized for a service to work. The point of putting it here is to avoid needless initialization/finalization in cases where C++/BCB just needs to access some static info from the service like service flags/name/version etc. - Added InitializeService and FinalizeService virtual methods to a service. InitializeService is called after the service has been created and internal initialization is finished. FinalizeService is called right before the service ressources are freed and the serviceinstance is disposed. - Added new TkbmMWISAPIServerTransport and TkbmMWISAPIClientTransport. Put a ISAPI server transport on your datamodule and it will automatically be able to work as an ISAPI dll under any ISAPI compliant caching web server like IIS, WebServer etc. Put a ISAPI client transport on your clients and they can get to the application server via your standard web server. Thus no firewall problems :) Add the following definition in kbmMWConfig.inc to add support for it: {$DEFINE KBMMW_ISAPITRANSPORT_SUPPORT} ISAPI support. - Made several changes to the inner workings of the transport and the transport stream. Added BeginReceive, ReceiveStream, ReceiveBuffer, ReceiveTransmissionHeader, EndReceive, BeginTransmit, TransmitStream, TransmitBuffer, TransmitTransmissionHeader, EndTransmit to TkbmMWCustomTransport. Removed DoEncrypt, DoDecrypt. Removed A transport _must_ provide at least ReceiveStream, ReceiveBuffer and TransmitStream, TransmitBuffer. ReceiveTransmissionHeader and TransmitTransmissionHeader should (optionally) be used for sending verification data for the transported data, and routines to verify the transported data early on without having to receive all data. The earlier the transport can be verified the better. - Added BeforeFetch, Fetch, AfterFetch, BeforeDeliver, Deliver, AfterDeliver, BeforeSigning, AfterSigning, BeforeVerify, AfterVerify, BeforeEncrypt, AfterEncrypt, BeforeDecrypt, AfterDecrypt, BeforeWriteHeader, AfterWriteHeader, BeforeReadHeader, AfterReadHeader to kbmMWCustomTransportStream. Removed Get, Put, Receive and Transmit from TkbmMWCustomServerTransport and TkbmMWCustomClientTransport. - Added direct support for DCPCrypt v. 2 in the new TkbmMWDCPCrypt component. Add the following definition in kbmMWConfig.inc to add support for it: {$DEFINE KBMMW_CRYPT_DCPCRYPT2} DCPCrypt 2 Make sure to download and install DCPCrypt v. 2 Beta 2 from http: www.cityinthesky.co.uk/cryptography.html - Added the following properties to TkbmMWCustomQueryResolver which means they are available for resolvers wanting to support those features: InsertOnFailedUpdate:boolean - If true will insert if update fails. IgnoreFailedInsert:boolean - If true will ignore insert errors. IgnoreFailedUpdate:boolean - If true will ignore update errors. IgnoreFailedDelete:boolean - If true will ignore delete errors. UpdateWhereAll:boolean - If true will use all original fieldvalues as key when searching for original record instead of only keyfields. - Added protected DisposeCursor:boolean method to TkbmMWCustomPooledCursor which controls if the internal cursor returned by PerformQuery etc are disposed after use or not. Default is true. Override and set to false if the database adapter does not create a new cursor on each PerformQuery, but instead reuses one. - Added new kbmMWMT database adapter which allows a central TkbmMemTable to be used as a database. The Query property defines the filtering on the memtable. - Updated all relevant database adapters to support/publish new properties. - Published AttachMaxCount and AttachedAutoRefresh properties on all relevant database adapters. - Updated database adapter wizard to reflect database adapter changes. - Updated service wizard to handle 3rdparty services. - Added GetExtendable:boolean, GetDescriptionAbstract:string and GetDescriptionDetail:string class functions to TkbmMWCustomService. They are all used for making the service self describing for the service wizard. - Added procedure kbmMWRegisterServiceType(AServiceClass:TkbmMWCustomServiceClass), procedure kbmMWUpdateServiceType(AServiceClass:TkbmMWCustomServiceClass) function kbmMWGetServiceTypeRegistryIndex(AServiceClass:TkbmMWCustomServiceClass):integer function kbmMWIsServiceTypeRegistered(AServiceClass:TkbmMWCustomServiceClass):boolean procedure kbmMWRegisterServiceTypes(AServiceClasses:array of TkbmMWCustomServiceClass) procedure kbmMWUpdateServiceTypes(AServiceClasses:array of TkbmMWCustomServiceClass) procedure kbmMWRegisterServices(AServiceClasses:array of TkbmMWCustomServiceClass) procedure kbmMWRegisterService(AServiceClass:TkbmMWCustomServiceClass) function kbmMWGetServiceByClassName(AServiceClassName:string):TkbmMWCustomServiceClass; for services to register themself for use by the service wizard. The servicetype procedures/functions will register service types in the registry for use by the wizard. The service procedures/functions will add the serviceclass to the list of known service classes. - Added Data property of variant type to TkbmMWCustomClient which allows sending additional userdefined data to the service called. On the server side, the Data can be obtained via the ClientIdent argument on the ProcessRequest method and other methods. Any settings the server will make to the Data variant will be propogated back to the Data property on the client. - Added service garbage collection. - Added OnGarbageCollect event to TkbmMWServer. - Added boolean GarbageCollection property to TkbmMWServer - Added integer GarbageInterval property to TkbmMWServer Specify interval in seconds. - Added parameter MaxIdleTime to RegisterService(s). Set it to 0 for letting a service instance live forever or to any number of seconds the service is allowed to be idle before being garbagecollected. - Added LastRequestTime:TDateTime property to TkbmMWCustomService. Gives information about when last request was serverd using that specific instance. - Added StartTime:TDateTime property to TkbmMWCustomService. Gives information about when that specific instance was started. - Added TotalRequests:integer property to TkbmMWCustomService. Gives information about how many requests that specific instance have served. - Published Params of Indy client transport. - Added protected WriteRequest, ReadRequest to TkbmMWCustomRequestTransportStream - Added protected WriteResponse and ReadResponse to TkbmMWCustomResponseTransportStream - Added dbExpress database adapter. 0.92a Changed the license agreement to protect against viral licenses for other libraries. Please make sure to read it! Added QueryServiceVersion property to client query to supplement the QueryService property. Made service name and version not case sensitive when asking for service from client. Created new kbmMW service creation wizard. Fixed stats not being cleaned from time to time. Added thread checking every 10 secs. to clean. Added AutoResolveOnChange to ClientQuery. This will force an automatic resolve after each Post. Added AutoResolveOnClose to ClientQuery. This will force an automatic resolve when the dataset is closed. Made protected properties CurConnections, CurConnectionOwnerIDs and CurRequests public in connectionpool. Using those properties information about current number of connections, ID's of owners of current request and number of outstanding requests can be obtained. Added support for FetchFieldOnDemands on backend database components. Setting it >0 will request data from backend database in chunks. Simplified database adapters. Added support for database adapters stored procedure components returning datasets. Improved speed fetching data from backend datastore. Added GetPublishedQueries to TkbmMWClientQuery. Will return a commatext list of names of queries that has been published on the server. Running the actual query still require that the client is authorized to do so. Replaced MaxStatelessConnections and MaxStateFullConnections with MaxConnections on the connection pool. This will break existing code which means all forms/datamodules/services where a connection pool is placed needs to be opened in the IDE designer. Ignore any errors related to those two properties. Then set the MaxConnections property to the desired value and recompile. Added experimental support for the ZEOS database library. Thus now there is direct support for: MSSQL, DB2, Oracle, Progress, MySQL and IB via the Zeos library. The Zeos library can be found at: http: sourceforge.net/projects/zeoslib and http: www.zeoslib.org Please notice that the Zeos library is LGPL'ed or GPL'ed. Before using the kbmMW Zeos support files _MAKE SURE_ to read the new kbmMW license (license.txt). Added experiemental support for MySQLDAC from microOLAP (http: www.microolap.com) Added database adapter wizard for creation of new custom database adapters. Added GetDescription class function to TkbmMWCustomConnectionPool and all descendants. Its purpose is to give a text description of the type of connectionpool. Added better automatic reconnection support to client transports via the properties: MaxRetries, MaxRetriesAlternative and OnReconnect. This is a step in the direction of automatic failover and loadbalancing. 0.91h Fixed encryption not fully implemented in kbmMWServer.pas and related bug in kbmMWClient.pas. Improved kbmMWADOX.pas with regards to resolving and connection parameter assignment. Extended named query syntax to allow specification of client side statement on specified named query. Normal syntax: @namedqueryname Extended syntax: @namedqueryname@statement Added support for client side Execute of query statements in addition to opening a query dataset. Changed from using ICE (www.nevrona.com) to InnoSetup (www.innosetup.com). 0.91g Fixed a M/D event situation when detail memo field was edited and the detail data was fetched from cache in client. This would result in unexpected eventcalls and detail reload which would interfere with the edit mode. Requires kbmMemTable v.3.00f7 Beta or newer. 0.91f Added Client property to TkbmMWCustomClientDataset and thus to TkbmMWClientQuery which allows you to access the actual client connection properties like Username and Password and others. Fixed small bug where the config flag (kbmMWConfig.inc) KBMMW_INDYTCPIP_SUPPORT was not respected. Added idTCPServer property to TkbmMWTCPIPIndyServerTransport. Added idTCPClient property to TkbmMWTCPIPIndyClientTransport. Thus its now possible to go behind the scenes to obtain more Indy related information. Added VerifyTransfer to client and server transports. Published it for Indy client/server transports. If set kbmMW will create a verification header which will be verified at arrival. If it doesnt match, garbage data was send to the reciepient, and the data will be discarded. Added new TkbmMWLocalServerTransport and TkbmMWLocalClientTransport for allowing a server to have an embedded client. Fixed problem when resolving a cached resultset would replace the cached resultset with a wrong one. Now instead removes the cached resultset. Fixed massive leak in kbmMWBinaryStreamFormat also require update of kbmMemTable to v.3.00f6. Fixed a few small bugs. 0.91e Fixed ADOX exception 'parameter not found' and 'parameter setup invalid'. 0.91d Fixed typo in CopyParamsValueAndType. Fixed problems during resolve of client side queries with params. Fixed setting the datatype of KBMMW_KEY_ parameters which affected resolving. Fixed resetting UpdateStatus of cached datasets. Fixed ADOX database adapter. Some database types (the BDE f.ex.) require you to set PrependTableName to true if any fields contain space in their names. Improved Master/Detail support. Added RequeryDetail property of TkbmMWClientQuery. Set it to false if the complete detail table is fetched and the M/D is done 100% on the client. Set it to true if the client should fetch the detail records by querying the server. Speed can be improved by enabling caching on the detail table. Improved resolving to also update local cache if cache is enabled. Added kbmMWConfig.inc which contains descriptions of the kbmMW install configuration. Modify it to fit your choise of databases. Changed install to a unified install. All database adapters is now included in the install. Only the ones enabled in the kbmMWConfig.inc file will be available for development. Added experimental HTTP streaming support in addition to ZIPPED and STANDARD. It will wrap the data with normal HTTP POST/HTTP OK messages. In combination with setting the TCPIP port to f.ex. 80 it should allow access through a firewall. Fixed all database adapters when resolving. Fixed datatype 24 (widestring) error during query and resolve. Fixed load from briefcase not remembering updatestate of whole dataset. 0.91c Fixed TkbmMWCustomPooledQuery.CreateParams not to create multiple instances of params having same name. Fixed Param not set in query bug when using same paramname several times in query. Fixed updating key fields on resolve. Fixed keeping record position in clientdataset after resolve. Fixed date/time in params problems. Fixed IBX5 transaction bug. 0.90b Added support for FlashFiler 2. 15. Dec. 2001 Fixed resolving server to client bug when database error occured. Requires recompilation of all clients and servers since stream format changed. Published Crypt property on IndyTCPIP transport format. Currently only crypt component is the TkbmMWEventCrypt which enabled events for encryption and decryption. Other components with build in encryption/decryption can be derived from TkbmMWCustomCrypt. 0.90a Fixed several A/V situations during removal of a component. Added support for DBISAM v. 3.xx. Added support for IBX v. 5.xx. Fixed bug where fkInternalCalc fields didnt get transferred correctly. Fixed bug where fieldnames was corrupted while checking for fields to load from stream. Fixed several other resolving bugs. 0.90 First public alpha prerelease. 08. Dec. 2001