|QM 2.9-0 (released 29 May 2009)|
This release adds support for the PowerPC variant of the IBM RS6000 under AIX.
This release introduces distributed files that provide a view of multiple separate hashed files as though they were a single file. Uses of distributed files include improved query performance by working with a reduced data set, load balancing over multiple disks, avoiding operating system file size limits and geographical separation of data over multiple servers.
This release extends date and time handling to include support for applications that operate across multiple time zones. The QMBasic EPOCH() function can be used to return the current date and time in time zone independent epoch form. The E conversion code can be used to convert this to external form and vice versa. The time zone used by the E conversion is determined by the TIMEZONE private configuration parameter that may be updated for an individual QM session using the CONFIG command or the QMBasic SET.TIMEZONE statement. The default time zone is taken from the operating system TZ environment variable. As part of this development, the D conversion code has been extended to support two ISO 8601 date formats. There are several functions to convert between epoch values and traditional multivalue date/time values. Note that epoch handling is only fully supported in the Linux, FreeBSD and Mac versions of QM. AIX provides partial support. Windows support of time zones is very limited and cannot provide the full functionality of other platforms.
The number of digits in the cyclic sequence number used by the NEXT option of the SETPTR and SET.QUEUE commands can be changed from its default value of four by entering the required number of digits in field 3 of the record named $NEXT in the dictionary of the $HOLD file. This value must be in the range 3 to 9.
The AUTHENTICATE command has been extended to support encrypted passwords.
The COPY.LISTP command has been introduced as a Pick syntax version of COPY.LIST.
The LIST.INDEX command has been extended to allow the report to be directed to a printer. It can now also report indices in all files in the account.
The LIST.PHANTOMS command provides a variant on the information shown by LISTU and STATUS.
The LIST.TRIGGERS command has been added to provide a summary of all trigger subroutines used by files in an account.
The Pick style LISTDICT command (as distinct from use of LIST DICT) has been enhanced to include D and I-type records.
The MAKE.INDEX and BUILD.INDEX command now support a CONCURRENT option that allows an index to be built while the file is in use. There is a performance penalty for this and the QMBasic SELECTINDEX, SELECTLEFT and SELECTRIGHT statements may stall waiting for the build to complete.
The PSTAT command has been extended to allow selection of the processes to report by user login name. Multiple user numbers or login names may be included in a single command.
The SET.DATE command has been withdrawn.
The CHAINED.SELECT mode of the OPTION command enables Pick style behaviour of a SELECT operation where, if the data queue is active, the command in the data queue will be executed on completion of the select if at least one record was selected. If no records were selected, the data queue is cleared.
The OPTION D3 and OPTION MVBASE commands provide shortcuts for setting multiple options that provide closer compatibility with other products.
The IMPLIED.STOP option of the $MODE compiler directive will insert an implied STOP at the end of a program, subroutine or function in place of the RETURN that is normally inserted.
The QMBasic DIR() function has been modified to preserve the case of items in case insensitive file systems (e.g. Windows). This change may require some applications that use this function to be modified to convert the returned data to uppercase. This function now also returns a third value containing the file attributes for each item. The format of this new data is platform dependant.
The QMBasic FLUSH.DH.CACHE statement can be used to force other QM processes to flush their cache of recently closed dynamic files. This should rarely be needed but allows a process to ensure that it is not blocked in an operating system level file action by some other process having a file cached.
Two new styles of the FOR/NEXT loop have been introduced in QMBasic. These allow execution of a loop for a comma separated list of values and for each mark character delimited item in a variable.
When the SELECTV option of the $MODE compiler directive is in effect, the QMBasic SELECT and READNEXT statements treat the list variable as optional, defaulting to an internal variable that is local to the program in which these statements are used.
The QMBasic VOCPATH() function can be used to resolve a filename to its corresponding pathname, following Q-pointers and applying extended filename syntax rules.
The !PHLOG() subroutine can be used to determine the name of the log record for a phantom process.
Where both ends of the connection support it, QMClient and QMNet now encrypt network traffic. As a consequence of this change, the qmclilib.o object module previously released on Linux, FreeBSD and Mac has been replaced with the libqmclient.a library. The only change required in non-Windows QMClient applications is to use this new library in place of the old qmclilib.o when linking the program. Existing programs will continue to run but will not encrypt network traffic.
The QMRevision() function of the QMClient API can be used to determine the version levels of the client and server sides of the connection.
A new private configuration parameter, DHCACHE, has been added to control the size of the dynamic file cache. In most instances, the default value of 10 is probably adequate.
A process started by the STARTUP configuration parameter now runs with @TTY set to "startup". This allows, for example, special handling in the LOGIN paragraph.