--------- IMPORTANT --------- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Dimeric Software Product Information Virtual Database (VDB) FULL Version * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Thank you for purchasing VDB -- we hope you will find it as useful and reliable as we do. If you have any questions or comments, please vist our website... http://www.Dimeric.com/ or send us an email... Support@Dimeric.com Release Notes ------------- 2.1.6 - February 11, 2003 --------------------- Changes in DSExtraIDE --------------------- * New feature: A new command is now available on the Project menu, "Multi-Project Options". This displays a dialog that allows you to set the project options of all projects in your project group, to match the project options of the current project. This saves you from having to make the same changes to several projects. This feature is not yet complete: currently it only works with the Version Info, but in time we plan to support the entire set of project options. A check-box list allows you to specify a sub-set of the project options, and another one allows you to specify a sub-set of the projects in the project group. -------------- Changes in VDB -------------- * No VDB changes in this release. ------------------ Changes in Utility ------------------ * DSThreadPool: New unit implementing a thread pool for for performing tasks on background threads while reducing the number of threads that must be created and destroyed. This unit is particularly useful in conjunction with DSSchedule. To execute a long- running task via DSSchedule, you can perform the real work of the task on a background thread using DSThreadPool. This avoids tying up the scheduler, which may need to run other important tasks. * DSThreadUtil - Allow IThread wrappers to be created for an existing TThread object. - Fixed the destructor of IThread to handle the case where GetCurrentThreadID = FThread.ThreadID. In this situation, we simply set FThread.FreeOnTerminate to True. * DSSchedule - Fixed a problem with shutdown in a DLL. Apparently, newer versions of Windows have changed the shutdown behavior -- Windows now seems to be terminating background threads automatically, so we are now checking for this. * DSTypedStreams - Support new methods that allow the underlying stream object to be changed. * DSStreams - Add the ability to change the MaxBufSize property of IBufOutStream. - IChunkedInputStream and IChunkedOutputStream no longer use a memory stream when stream exceptions. Instead, a nested chunked stream is employed. - IChunkedOutputStream has a new method, SendSimpleException, which works like SendException except that it avoids recursion when errors occur during streaming of the exception. This is used internally by SendException, but it might be useful to application code. - IChunkedInputStream has a new method, RaisedError, which indicates whether the stream raised an exception that was encoded in the stream. In other words, it indicates whether a read operation found an exception written by IChunkedOutputStream's SendException method, and was not ignored by DiscardRemainingData(False). - TBufInStream.Close now calls ClearBuffer. This simply discards any remaining buffered data sooner (it was happening in the destructor before). - Typed streams now support new methods that allow the underlying stream object to be changed. * DSChunkedStreams - See notes above for DSStreams. * DSIsapiPlugin - TWebResposneStream.Close now closes the connection. * DSZLibStreams - This unit uses the new DSZLib unit, which exists to provide better interoperability between various versions of Delphi. - New interface, ICompressStream, implements ZLib compression and decompression for the DSStreams library. The routines NewDecompressStream and NewCompressStream create compression and decompression streams. * DSWebUtil - Fixed a bug where the server would not keep the connection alive when using the HTTP chunked protocol (and the ContentLength was 0). - Improve the error message raised when the connection is prematurely closed on the HTTP chunked protocol. 2.1.5 - January 31, 2003 ------------------ Changes in Utility ------------------ * DSWebServer - Allow top level folder handlers to override files of the same name. - Return a 500 error when the server gets an unhandled exception. - Surface the PeerWork method of IWebServer. - HTML-encode the error response. * DSWebUtil - Make HTTPRequest work with HTTP 1.1 and KeepAlive. - Make IHTTPChunkedInStream an IBufInStream. * DSHoustonConfig, DSHouston_Impl - Remove Rinse from DSHouston (Rinse is now moving to HTTP, so a Houston server can ping a Rinse application with nothing more than a URL). * DSDeployUtil - Use IWebRequestHandler instead of IDeployServer. * DSSchedule - Define the ErrorHandler property of IScheduler, which allows applications to handle exceptions raised inside a task. - IScheduler.ScheduleTask has a new parameter that gives a name to the task. This is mostly useful in the error handler (above) for identifying the task that raised the exception. * DSStreams - Make StreamReadUntil and StreamReadLn available in the interface section of this unit. -------------- Changes in VDB -------------- * No changes to VDB in this version. 2.1.4 - January 29, 2003 * This release contains minor changes for compatibility with our new product, Rinse. ------------------ Changes in Utility ------------------ * DSSmartRecord - TSmartRecordDataSetIterator now implements IIterator, IIntfIterator, and IPropBagIterator. * DSStringUtil - New routines for converting TDateTime values to and from strings: // Returns the standard date/time format used by // DSDateTimeToStr, DSStrToDateTime, and DSTryStrToDateTime. function DSDateTimeFormat: string; // Converts a date/time to a string, using DSDateTimeFormat. function DSDateTimeToStr(Value: TDateTime): string; // Converts a string to a date/time, using DSDateTimeFormat. function DSStrToDateTime(const Value: string): TDateTime; // Attempts to convert a string to a date/time, using // DSDateTimeFormat. function DSTryStrToDateTime( const Value: string; out DateTime: TDateTime): Boolean; * DSDeployUtil, DSDeployClient, DSDeployServer - Support multiple named applications. * DSHoustonConfig - Remove the AppName field of the THoustonConfig record, which was not being used and was causing problems in a 'with' statement. -------------- Changes in VDB -------------- * VDB_DBX - We have sub-classed TSQLQuery to override the GetRecordCount method. In DBX, this method sometimes raises an error saying that the operation is unsupported, but sometimes attempts to find the answer (and this is sometimes wrong, and sometimes fails, but in any event take extra time). Our sub-class of TSQLQuery always raises an exception, as RecordCount is a property that should be avoided when using DBExpress. 2.1.3 - January 21, 2003 ------------------ Changes in Utility ------------------ * The include file "Ver.inc" has been renamed to "DSVer.inc". * DSSqlBuilder - - This new unit helps you build SELECT statements dynamically. * DSDelphi5 - - This unit may now be used with Delphi 6 & 7. This makes it easier to have a single project that compiles under multiple versions of Delphi. * DSStringUtil - - TranslateString now supports character ranges. - ExpandTranslateString is a new routine that expands character ranges in a string (used by TranslateString). - GetNameAndValue, GetNamePart, GetValuePart now take an optional parameter that specifies the separator. This defaults to '='. * DSLog - - The log is now initialized to a null stream, so an application that does not initialize the log will simply discard any data written to the log. - InitLogWithConsole is a new routine that initializes the log, allowing you to specify the Console Stream (a stream that will recieve a copy of all data written to the log). * DSTypedStreams - - The declarations of the typed stream interfaces have moved to DSStreams. The classes that implement these interfaces are still defined here, however. - IPersistList has been removed. Use IIntfList instead. - NewMemoryStream has been moved to DSStreams. - An overloaded version of ITypedInputStream.ReadVariant allows you to read a Variant value *or* detect that an end tag was encountered. The end tag is written with the WriteEnd method of ITypedOutputStream. This feature can be used to write a sequence of Variant values, without initially knowing how many items will be written. - A new overloaded version of ITypedInputStream.ReadObject allows you to read an object *or* detect that an end tag was encountered. See the not above for more details. * DSChunkedStreams - - The declarations of IChunkedOutputStream and IChunkedInputStream have moved to DSStreams. * DSStreams - - The routine NewBasicMemoryStream has been renamed to NewMemoryStream. This stream supports IPersistObject. - Fixed a bug in the reallocation of memory streams. - NewIterator: this routine creates an IIterator around an IBufInputStream. The iterator returns the contents of the stream, one line at a time. This iterator supports IPersistObject. - IPersistObjectEx is a new interface that is related to IPersistObject. This optional interface allows objects to specify whether they support reading into an existing instance. This feature may be used to define a class that is reconstructed as a different class. In other words, it allows objects to change type as they cross the persistence boundary. * DSStringList - - The ValueFromIndex property is now supported in all versions of Delphi. - IStringList.NewNameIterator returns an IIterator that yields all names in the string list (using name/value pairs with the Values[] property). - IStringList.NewValueIterator returns an IIterator that yields all values in the string list (using name/value pairs with the Values[] property). * DSDataUtil - - Several overloaded versions of NewIterator create IIterators that return data from a dataset. The two basic options are (1) returning a column (or columns, in a Variant array), and (2) returing a string with one or more values separated by a specified delimiter. * DSPropertyBagDB - - Two overloaded versions of NewPropBagIterator create an IPropBagIterator object from a dataset. These iterators yield one IPropertyBag for each row in the dataset -- containing one property for each column in the dataset. One version allows you to specify which columns to use, the other version uses all columns. * DSDiffUtil - - The Diff and CalcEquivalence methods now take an optional argument that indicates case sensitivity mode. This defaults to csCaseSensitive. * DSObject - - Filters of Variant values are now supported with TFilterFunc, TFilterMeth, IFilter, and NewFilter. - Comparators of Variant values are now supported with TCompareFunc, TCompareMeth, ICompare, and NewCompare. - New feature: transforms. A transform is an object or call-back that alters a value. Transforms of Variant values are supported with TTransformFunc, TTransformMeth, ITransform, and NewTransform. Transforms of IInterface values are supported with TObjectTransformFunc, TObjectTransformMeth, IObjectTransform, and NewTransform. * DSPropertyBag - - New type: IPropBagIterator. - New version of IPropertyBagList.AddItems, allowing you to specify an IPropBagIterator as the source of the items to add to the list. - New overloaded version of NewPropBagList, allowing you to specify an IPropBagIterator as the source of the items to add to the new list. - New function: NewPropBagIterator, creates a new IPropBagIterator around an IPropBagList. - Transforms of IPropertyBag values are supported with TPropBagTransformFunc, TPropBagTransformMeth, IPropBagTransform, NewTransform, and TransformExpr. - New versions of FilterExpr and CompareExpr now take a MiniCalc expression string. - An overloaded version of NewPropBagIterator creates a wrapper around another IPropBagIterator, adding the ability to filter and transform the wrapped iterator. * DSVariantList has been renamed to DSList. * Various types related to lists have been renamed... ISimpleIntfList -> IIntfList IUntypedList -> IIntfList TUntypedList -> TIntfList * DSGenUtil - - New overloaded version of IfNull takes an array of Variant. - Define IIterator and IIntfIterator interfaces. These iterfaces are the foundation of a large framework of iterator types and objects. Iterators are forward-only, read-only cursors that are more abstract than lists. This is because a list must hold all of its elements in memory, but an iterator may generate or obtain its values dynamically (e.g., from a stream or from a dataset). All iterators support IPersistObject. - New function NewIterator creates an IIterator from an IVector object. - Renamed kNilUnknown to NilInterface, and renamed kNilDispatch to NilDispatch. * DSSmartRecDB - - Added overloaded versions of all routines that take TCustomClientDataSet, to also support ICustomClientDataSet. - Changed return type of all functions returning client datasets as IDataSet to return IClientDataSet instead. * DSList - - Major rearchitecting of this unit. - Merged IUntypedList and ISimpleIntfList into a single interface: IIntfList. - Moved IList, previously defined in the unit DSVariantList, into this unit. - Enhancements to IList: > Don't allow SetItem when Duplicates is dupIgnore (raise an exception). > Use Unassigned instead of FNulls[0] for unused space. > Don't bother clearing unused space after SetLength or during Clear. - Added support for iterators: > Function NewIntfIterator returns a new IIntfIterator around an IIntfList. Other overloaded versions create a new IIntfIterator around an existing IIntfIterator, adding the ability to transform and/or filter the wrapped iterator. > Function NewIterator returns a new IIterator around an IVector. Other overloaded versions create a new IIterator around an existing IIterator, adding the ability to transform and/or filter the wrapped iterator. > IIntfList.AddItems is now overloaded to support lists and iterators. * DSMiniCalc - - Support for Variant filters, comparators, and transforms: VariantFilterExpr, VariantCompareExpr, and VariantTransformExpr. - Support for new operators: > Assignment: := > Sequence: , > Statements: ; > Bit-shift: shl/shr - Function NewCalcExprList creates a new, empty ICalcExprList object. - Function MiniCalcVarToStr converts a variant to a string, according to the way that ICalcExpr.AsString works. - Function MiniCalcInspect converts a variant to a string, in a format that is appropriate for debugging. - The = and <> operators are now implemented with VariantEqual, defined in DSGenUtil. - New function AggregateIterator evaluates an aggregate expression over the contents of an IIterator. - New MiniCalc functions: > @NewPropBag: Creates a new IPropertyBag. > @Unassigned: Returns the Unassigned variant. > @Cast: Converts a value to a specified Variant type. > @SetGlobal: Sets a global variable by name. > @GlobalEnv: Returns the global environment. > @LocalEnv: Returns the local environment. > @Inspect: Converts a variant to a string, in a format that is good for debugging. > @IsMap: Tests whether an object implements IMap or IIntfMap. > @IsList: Tests whether an object implements IList, IIntfList, or IStringList. > @IsArray: Tests whether a value is a Variant array. > @IsIterator: Tests whether an object implements IIterator. > @Chr: Works like the Delphi function of the same name. > @Add: Adds an item to a list object. > @AddPaths: Calls DSStringUtil.AddPaths. > @ArrayOf: Creates a Variant array of Variant. > @ArrayOfType: Creates a Variant array of a specified element type. > @NewList: Creates a new IList object. > @NewIntfList: Creates a new IIntfList object. > @NewStringList: Creates a new IStringList. > @NewMap: Creates a new IMap object. > @NewIntfMap: Creates a new IIntfMap object. > @NewPersist: Creates a new object by name, using DSTypedStreams.PersistManager. > @Int64: Converts a number to Int64 type. > @IsPersist: Tests whether an object implements IPersistObject. > @Supports: Tests whether an object implements a specified interface. > @While: Repeatedly evaluates one expression as long as a second expression is true. > @For: Like @While, but emulates the for statement of C++. - MiniCalc function @Aggregate now supports iterators, in addition to arrays and vectors. - New global variables: > @Nil: the nil IInterface pointer. > @dupIgnore: Classes. dupIgnore. > @dupAccept: Classes.dupAccept. > @dupError: Classes.dupError. > @tsSingleThread: DSGenUtil.tsSingleThread. > @tsThreadSafe: DSGenUtil.tsThreadSafe. > @csCaseSensitive: DSGenUtil.csCaseSensitive. > @csIgnoreCase: DSGenUtil.csIgnoreCase. * DSSocket - - Added IThreadedServerSocket.PeerTimeout property. This allows you to specify the idle time (in seconds) before the server closes a peer connection. The default value of this property is 0, which means infinite. * DSSmartRecord - - Fixed a documentation bug in DeepCompareSmartRecord. - Support for iterators: > Define ISmartRecordIterator interface. > An overloaded version of NewSmartRecordList takes an ISmartRecordIterator. > Function NewSmartRecordIterator creates an ISmartRecordIterator from an ISmartRecordList object. > An overloaded version of NewSmartRecordIterator creates an ISmartRecordIterator that wraps an existing ISmartRecordIterator, adding the ability to transform and/or filter the wrapped iterator. * DSWebServer - - New method IWebQuery.HasOneValue, indicates whether the query has a single, non-empty parameter with the specified name. - Fix a problem with HTTP 1.0 responses that do not have a content-length. - Ensure that the headers are always sent, even if the request handler did not send any information. -------------- Changes in VDB -------------- * VirtualDB - - VDB now supports a new syntax for VDB profile strings. The old syntax is still supported, but the new syntax is preferred. Developers should convert to the new syntax as time permits. See below for details. * VDBPropertyBag - - New function NewPropBagIterator: Returns a new iterator that generates all rows in the dataset. Each row is returned as an IPropertyBag containing all field name/value pairs. The dataset is specified by supplying an IDatabase object and a SQL statement (optional query parameters). * VDB_Informix - - Support float data type (type 3) as ftFloat. - SUpport money data type (type 8) as ftBCD. -- NEW VDB PROFILE STRING SYNTAX -- VDB now supports a new syntax for profile strings. 1) The old syntax is still fully supported, and will continue to work for quite some time. 2) The new syntax is simpler *and* more flexible. Although the old syntax will be supported for a long time to come, we should all start using the new syntax, and convert old INI files and registry settings. The new syntax involves changes to the way the engine is specified, and to linked profiles. Here is an example of a VDB profile under the new syntax: vdb:vdbEngine=BDE;driver=Informix;server=DevServer;... Note that the old syntax begins with "vdb://", while the new syntax simply begins "vdb:". This makes it easy to distinguish between the two. Also, the engine is now specified with a parameter named "vdbEngine". Technically, this may appear anywhere in the profile string, but we recommend placing it first (as shown above). The other area of change involves linked profiles. Previously, a linked profile was specified as if it were an engine name, but enclosed in square brackets... // OLD SYNTAX Sales-Base=vdb://BDE/driver=Informix;database=sales Sales=vdb://[Sales-Base]/server=DevServer Furthermore, the old syntax used a convention that profile names that were not valid Delphi identifiers would not be loaded into the application. For example, Sales-Base (above) is not a valid Delphi identifier (because it has a dash), so there is really only one profile that the application can use (named "Sales"). The new syntax for linked profiles is to specify the base profile via the new "vdbBaseProfile" parameter. For example... // NEW SYNTAX @Sales-Base=vdb:vdbEngine=BDE;driver=Informix;database=sales Sales=vdb:vdbBaseProfile=@Sales-Base;server=DevServer Note that the "building-block" profiles are now identified with an @-sign. Applications do not have access to such profiles. It no longer matters whether the name of a profile is a valid identifier. The new syntax is easier to understand and yet is is also more flexible. It is easier to understand because the engine and base profile are treated the same as every other parameter (rather than having a special syntax). It is more flexible for the following reasons: 1) Profiles may now have any name (valid Delphi identifier or not). The @-sign indicates which profiles should not be available for the application to use for database connections. 2) A linked profile may now change the engine specified in a base profile. 3) Base profiles no longer need to specify an engine. 4) Base profiles and engines may now appear anywhere in the profile string. See note below. 5) A linked profile may now have multiple base profiles. See note below. NOTE: The location of the vdbBaseProfile is important. This parameter is effectively replaced with the entire contents of the base profile. The resulting profile string is processed from left to right, later settings overriding earlier ones. For example, consider the following... // PROBLEM Sales-Dev=vdb:vdbEngine=BDE;driver=Informix;server=DevServer Sales-Test=vdb:server=TestServer;vdbBaseProfile=DevServer The problem above is that the test server (TestServer) is specified before the base profile. Thus, the Sales-Test profile is effectively... vdb:server=TestServer;vdbEngine=BDE;driver=Informix;server=DevServer Again, if the same parameter (in this case, "server") appears twice in a profile string, the last setting is the one that VDB uses. To help make sense of this policy, just remember that new information takes precedence over old. The fix is simply to move the vdbBaseProfile parameter to the beginning of the Sales-Test profile string: // FIXED Sales-Dev=vdb:vdbEngine=BDE;driver=Informix;server=DevServer Sales-Test=vdb:vdbBaseProfile=Sales-Dev;server=TestServer Now, the Sales-Test profile is effectively this... vdb:vdbEngine=BDE;driver=Informix;server=DevServer;server=TestServer This issue of ordering the vdbBaseProfile parameter is also important when a single profile string has two or more occurances of vdbBaseProfile. For example... @Logging=vdb:vdbLogFile=Foo.log @Pooling=vdb:vdbPoolTimeout=60 Foo=vdb:vdbEngine=IBX;vdbBaseProfile=@Logging;vdbBaseProfile=@Pooling;... Here we see how multiple base profiles may be used. Again, this results in simple substitution of the base profile(s) into the linked profile. So, the Foo profile is effectively... Foo=vdb:vdbEngine=IBX;vdbLogFile=Foo.log;vdbPoolTimeout=60;... Naturally, if @Logging and @Pooling both specified the same parameter, then their relative order within the Foo profile would be important. All of this may seem a bit complex, but there are only two rules to remember: 1) Any vdbBaseProfile parameter is replaced with the contents of corresponding profile. 2) Reading from left to right, later settings override earlier ones. 2.1.1 - December 2, 2002 Changes in Utility ------------------ DSSocket * DSSilentException now descends from EIdConnClosedGracefully, which the Delphi 7 IDE adds to the list of exceptions to ignore. DSWebPlugin * New properties in ISimpleWebRequest: RemoteIP, RemotePort, LocalIP, LocalPort. * New method in ISimpleWebResponse: SupportsKeepAlive. * Changed parameters for NewSimpleWebRequest. * Removed SetWebRequestHandler. * Track whether a plugin is available with new routines: SetWebPluginAvailable, ClearWebPluginAvailable, and WebPluginIsAvailable. * Ability to execute the Web Plugin Init Procedure with new routine: ExecuteWebPluginInitProc. * Allow sub-classing of TSimpleWebRequest and TSimpleWebResponse. DSISAPIPlugin * Enhanced to work with latest DSWebPlugin. DSCGIPlugin * New unit that supports CGI applications with the DSWebPlugin architecture. DSWebServer * Use ISimpleWebRequest and ISimpleWebResponse. DSTypedStreams * Register IStringList in this unit. DSStringList * Changed the ObjectName of IStringList to 'DS.StringList'. * IStringList is registered with DSTypedStreams in DSTypedStreams.pas, not in DSStringList.pas. DSHoustonKillTask * Set the Kill File's OwnsHandle property to False earlier (as soon as it is opened). DSStreams * Fix a division bug that caused infinite loops when allocating memory for very large memory streams. * Allow RawMemoryStream to be empty and to use a nil pointer when empty. * Implement IDelphiLiteralOutStream, a random output stream filter that creates a Delphi .PAS unit that defines an array containing the stream data. DSMathUtil * Added DSSimpleRoundTo, which calls SimpleRoundTo with PrecisionMode = pmDouble. DSGenUtil * Added GetEnvironmentStrings. Changes in VDB -------------- None. 2.1.0 - November 18, 2002 Changes in Utility ------------------ DSDataUtil * New routine: CopyCurrentRow DSSortUtil * New types: TVariantCompareMeth, TVariantCompareFunc, IVariantCompare * New routines: NewVariantCompare, StdVariantCompare, NewQSCompare DSVariantList * This is a new unit DSGenUtil * New routines: RaiseNoBreak, VarIsClearOrNull * New types: IVector, IAssociation DSStringUtil * New routine: CopyStrArrayTo DSSmartRecord, DSList, DSStringList, DSPropertyBag, DSDataSet, DSMap - * Support IVector and/or IAssociation DSMiniCalc * The dot operator now uses IAssociation instead of IPropertyBag. * @Length now uses IVector instead of IUntypedList. * New MiniCalc functions: @GetElem, @GetValue, @HasValue, @IsAssoc, @IsVect, @SetElem, @SetValue. DSMap * New routines: GetMapKeysAsStrings, EnumMapKeys, EnumMapKeysAt DSWebPlugin * Add ability to use an event, not just a procedure, for the WebRequestHandler. Houston - new units: * DSHouston, DSHouston_Impl, DSHoustonClient, DSHoustonConfig, DSHoustonWebServer 2.0.0 - October 28, 2002 Changes in VDB -------------- General: * Enhanced error messages in VDB. * New units: VDBPostProtect and VDBSerialColUtil. VDB_Base: * VDB query logging no longer uses Delphi native files, but goes direct to the OS instead. * Fixed issue with unpreparing cached queries when the unidirectional property has changed. VDB_DBX: * Define and use constants for DRIVER and ALIAS VDB_BDE: * Define and use constants for DRIVER and ALIAS VDB_ADO: * Handle DATA SOURCE and INITIAL CATALOG properties * Define and use constants for DRIVER and ALIAS VDB_DBISAM: * Added work-around necessary because DBISAM Session component is not thread-safe. VirtualDB: * New routine: AddParam * Added vdbUnidirectional profile parameter. This controls the default value of the Unidirectional property of queries created in VDB. * Added IDataEngine.UsesUnidirectional. Changes in Utility ------------------ DSStreams: * Use Integer instead of Int64 for all arguments that represent buffer sizes. * DSStreamUtil now depends on DSStreams, not the other way round. * SameStreamData now calls SameObject. * NewOutStreamRandomizer. * NewDelphiStream. * Support for TPersistent streaming. * Remove GetStream method stream interfaces. * Add NewFileAppendStream. * Overloaded versions of CopyStream that take TStream source and IOutputStream destination. DSMap: * Performance enhancement. * Stream case sensitivity. * Use version number for streaming. * MakeThreadSafe method. * Eliminate custom hash/compare functions. * Eliminate mapIgnoreCase and mapCaseSensitive. DSPipe: * New unit. DSStringList: * Added overloaded version of NewStringList that calls ParseCSV. * Added overloaded version of NewStringList that takes an IInputStream. * Support DSStreams where TStream is used. DSSmartRecord: * Added ConvertSmartRec. DSSmartRecord: * Fixed some bugs (need to set Result to nil). DSHtmlUtil: * HTTPEncode now encodes comma and dollar sign, but not tilde. * HTML parser no longer requires whitespace after "". * Remove HTTPEncodeHexOnly. * Use IMemoryStream instead of TMemoryStream. * Performance enhancement for HtmlEncode. * Remove dependency on DSStreamUtil. Houston unit renaming. DSLog: * Fixed bug (was not respecting MaxFileSize parameter). * Add overloaded version of InitLog that takes the output stream. DSWebUtil: * HTTPRequest now supports HTTPS. * HTTPRequest now includes Host header. * HTTPRequest no longer closes output socket. DSWebServer: * New ViewState feature. * New version of IWebQuery.NeedOneValue (takes a string array). DSFileUtil: * Improved error message in OpenTextFile. DSPropertyBag: * New routines - PrintPropBag, PrintPropBagList, PropBagPrintHandlers, CreateSubObjectsIfPossible. DSPropertyBagDB: * ReadPropBagPrefixXxx routines. DSStringUtil: * Bug fix in QuoteAndWrapString (did not quote empty string). * New routines: GetNameAndValue, GetNamePart, and GetValuePart. DSGenUtil: * New routine: Touch. DSTimer: * New methods: Resolution, GetState, Pause, Resume, ElapsedTicks, TicksPerSecond. * New routine: PauseNewTimer. DSMathUtil: * Significant performance improvements for IsPrime and NextPrime. 1.5.6 - August 22, 2002 * Added optional Boolean parameter, CreateSubObjects, to all ReadPropBag and ReadPropBagList routines. * Fixed date/time issues in InterBase5 dialect. * New features in DSStringList: - Added Join and ParseCSV methods, which call the corresponding routines in DSStringUtil. - Added Delphi 7 properties: NameValueSeparator and ValueFromIndex. * Move THttpMethod enumeration from DSWebServer to DSWebUtil. * New routine in DSStringUtil: StripUnderscores. * Enhancements to DSLaunchUtil: - Added routine OpenDocument. - Added new version of ExecChild, taking a TLaunchOptions set, allowing the child process to be visible. * Enhancements to DSWebUtil: - New methods: HTTPGet, HTTPGetString, HTTPRequest, and HTTPRequestString. - HTTPPost and related routines are now fully compliant with HTTP 1.0 and HTTP 1.1. * Performance enhancements in the following units: DSMiniCalc DSCRC DSStringUtil 1.4.5 - August 8, 2002 * Fix a problem with IDatabase.GetDefaultParams in the dbExpress engine. * Introduce new interface wrappers: IComponent, ICustomClientDataSet, and IClientDataSet. * New unit: DSMD5.pas (for computing MD5 checksums). * Performance improvements in DSStringUtil.QuoteAndWrapString. 1.4.3 - July 19, 2002 * A very minor update to fix a few small bugs. * Removed most Asserts and replaced them with explicit if ... then raise ... so that the error checking (and any important side effects) still happens even when assertions are turned off. 1.4.2 - June 24, 2002 * Please uninstall any prior version of VDB before installing this one. * VDB now supports MIDAS applications. You can build a MIDAS server that does all data access via VDB. This type of application can benefit from connection pooling. * A new demo project, VDBNTier, illustrates how to build a MIDAS client and server application using VDB. * A new section of the VDB documentation, entitled "N-Tier Development", discusses these new features. 1.4.1 - June 19, 2002 * The VDB 1.4 install package for Delphi 5 was missing a unit (DSDelphi5.pas), but it is included in 1.4.1. * VDB now ships with runtime packages... DSUtil - core utilities DSUtilDSnap - MIDAS utilities (depends on MIDAS/DataSnap) DSUtilNet - network utilities (depends on Indy) DSVDB - core VDB DSVDBDSnap - extra VDB units (depends on MIDAS/DataSnap) DSVDB_ADO - VDB engine for ADOExpress (dbGo) DSVDB_ADS - VDB engine for Advantage Database Server DSVDB_BDE - VDB engine for BDE DSVDB_DBISAM - VDB engine for DBISAM DSVDB_DBX - VDB engine for dbExpress (Delphi 6 only) DSVDB_FlashFiler - VDB engine for Flash Filer DSVDB_IBX - VDB engine for Interbase Express These packages are installed in binary form (except for FlashFiler), and full source for the packages is also included (even in the trial edition). To use the package DSVDB_FlashFiler, you will need to edit the package source (.dpk file) to add the appropriate Flash Filer runtime package to the requires clause. This is necessary because the name of the Flash Filer runtime package depends on the version / patch level you are using. Similarly, when using packages for other 3rd-party libraries, you may need to edit the DSVDB_Xxx.dpk file (and re-build it) if you are using a different version of the 3rd-party library. * A new demo program (in the Demos\VDBWithPackages folder) shows how to dynamically load and unload packages that implement engines for specific database libraries. * The uninstall program now displays the name of any file, folder, registry value, or registry key it is unable to remove. 1.4 - June 12, 2002 * Added support for Flash Filer 2 from Turbo Power Software (www.TurboPower.com). The new unit VDB_FlashFiler implements this VDB engine. * You may need to recompile the units that implement VDB engines for 3rd party products (in case you have a different version of the 3rd party product than we do). There are two ways to do this: (1) explicitly add the .pas unit to your project, or (2) copy the .pas unit from the Delphi\Dimeric\VirtualDB folder to Delphi\Dimeric\Lib. The specific units that support 3rd party products are: VDB_ADS, VDB_DBISAM, and VDB_FlashFiler. * Added TParamRecArray (dynamic array of TParamRec) to the VirtualDB unit. 1.3 - June 7, 2002 * Added support for DBISAM Database Server from Elevate Software (www.ElevateSoft.com). The new unit VDB_DBISAM implements this VDB engine. 1.2 - June 6, 2002 * Added support for Advantage Database Server from Extended Systems (www.AdvantageDatabase.com). The new unit VDB_ADS implements this VDB engine. 1.1 - June 5, 2002 * Added support for Delphi 5. VDB also probably works with C++Builder 5, but we haven't tested it. * Enhance IBX engine so that query objects will now automatically open the associated database when the query is opened or prepared. This covers up one area in which IBX is different from the other DBLibs (they all do this for you). 1.0 - May 17, 2002 Initial release of VDB (including VDB Explorer) and DSUtil. Documentation ------------- This product includes context-sensitive help that integrates into the Delphi IDE, as well as three separate files: Streams and Persistence.rtf - Detailed introduction to the streaming sub-system of DSTools (DSStreams.pas and DSTypedStreams.pas). MiniCalc.pdf - Detailed reference for MiniCalc, the expression parser/evaluator offered by DSTools (the MiniCalc.pas unit). VDB-Tutorial.pdf - A detailed tutorial for VDB. This is the same information that can be found in the context- sensitive help (minus the reference section), but in a format that is more printer-friendly. This product also ships with a demo application, named VDBDemo. This program illustrates how to perform many common operations, all of which are implemented using both VDB and BDE (for comparison purposes). The demo application is a good place to get started with VDB. VDB Explorer ------------ VDB Explorer was inspired by Borland's SQL Explorer, but has a subset of its functionality. VDB Explorer works with any database that is supported by VDB (not just BDE). It also has a few features missing from SQL Explorer: *) Ability to cut-and-paste in the data-aware grid. *) Ability to export the contents of the data-aware grid to a comma-separated text file. VDB Explorer allows you to browse the tables in a database, and to execute SQL statements against a database. It comes in handy when you need to export data to a plain text file, or simply to test a VDB profile string. You may define new profile strings for use with VDB Explorer in the "VDBExplorer.ini" file. It is also possible to add and modify profile strings interactively within VDB Explorer, but the user interface for doing this is rather quirky (this will be addressed in an upcoming release). The file "VDBExplorer.ini" is only used by VDB Explorer -- your own VDB applications should use their own INI files (or the registry, or whatever other mechanism you prefer). Please make sure that VDBExplorer is not running when you edit the "VDBExplorer.ini" file. Deploying Applications Built With VDB ------------------------------------- VDB features royalty-free application deployment. You may distribute free of charge applications (EXE files) and libraries (DLL and BPL files) built with VDB and/or DSUtil. You may not distribute VDB or DSUtil source code (PAS, INT, DCU and DCP files). See the software license (License.txt) for more information.