What Was New in Release 2.8?
|QM 2.8-10 (released 16 Mar 2009)|
The inline prompt mechanism has been extended to allow the equivalent of QMBasic CHANGE(), ICONV() and OCONV(). This feature is most useful with nested inline prompts where the change or conversion is applied to some other prompt value.
The SED editor now supports a TRIM command to remove trailing spaces from all lines in the record being edited.
The synonym @ACCOUNT may now be used in place of @WHO.
The QMBasic FILELOCK and FILEUNLOCK statements have been extended to add optional THEN and ELSE clauses.
|QM 2.8-9 (released 2 Mar 2009)|
Alternate key indices may now be defined as being case insensitive when they are created using CREATE.INDEX or MAKE.INDEX. The internal sorting of a case insensitive index is based on an uppercase version of the data but operations such as SELECTINDEX will find data regardless of casing. Note that because indices are stored in sorted order, a case sensitive index cannot be used in a query that uses case insensitive comparisond or vice versa.
The column widths of the FSTAT command have been increased to allow for the high performance of MFT drives.
The options to the LIST.FILES command have been modified such that the default action is to show the statistical counts and the pathnames of open files. The BRIEF option suppresses the pathname display. The DETAIL option extends the report to show the user numbers and user names of the users with each file open. A file name can also be provided to show only users with that file open. The USER option can be used to show only files open to a specific user.
When a print unit is directed to a file, a check is made to see if there is a catalogued subroutine named HOLD.FILE.LOGGER and, if there is, this is called when the file is opened and again when it is closed. This subroutine can be used, for example, to build a log of hold file entries or to take some action after the file has been closed.
The QUERY.MERGE.PRINT mode of the OPTION command causes a query report directed to a printer to merge the output as a continuation of the active print job if the printer is already active, leaving the printer active on completion of the report. Without this option, the printer is closed at the end of the report.
The REBUILD.ALL.INDICES command rebuilds the alternate key indices of all files referenced by F-type VOC pointers in the account from which it is executed. This may be of use following a system power failure where some data may not have been written to disk, ensuring that the indices correctly reflect the data stored in the files.
The SETPTR command now has an EJECT option to force insertion of a form feed at the end of the job.
The query processor now supports Pick style explosion limiters on BY.EXP and BY.EXP.DSND if the QUALIFIED.DISPLAY mode of the OPTION command is enabled.
The STACKLIST option of the QMBasic EXECUTE statement causes QM to save the current state of the default select list (list 0) prior to executing the command and then restore it on return to the program. This allows the executed command to use the default select list internally.
Key value 1021 (FL$WHO) to the QMBasic FILEINFO() function returns a field mark delimited list of the QM user numbers of user that have the file open.
The QMBasic MD5() function encodes a string to its MD5 message digest value.
The QMBasic OPEN and OPENPATH statements now support a NON.TRANSACTIONAL option to indicate that updates to the file are not to be treated as part of any transaction in which they occur.
The QMBasic SYSTEM() function has been extended to add key value 1036 to return the delay period for a login that had to wait for a spare user to become available when using the LGNWAIT configuration parameter. Applications can use this data to perform statistical analysis for determining whether a larger licence is required.
Key value 1037 of the QMBasic SYSTEM() function returns a list of all QM files open in the system and the user numbers of the users with them open.
The full screen mode of the QMBasic debugger has been extended to add the /* command to view all variables in the program.
The PDA version of QM now supports limited capabilities for incoming telnet connections.
The terminfo database now supports the stylus and pdakeys capabilities for the PDA version of QM.
|QM 2.8-8 (released 19 Jan 2009)|
For compatibilty with other systems, a divide by zero in a correlative now returns zero with no warning or fatal error. Divide by zero in QMBasic programs or I-type dictionary items continues to behave as in previous releases.
The PICK.ML.CONV.MASK mode of the OPTION command can be used to modify the behaviour of the ML and MR conversion codes so that the format mask element may be enclosed in round brackets. Use of this mode diables recognition of a left round bracket as a code requesting negative values to be enclosed in round brackets.
The CREATE.FILE command now supports a MODE option to set the access permissions for the file (not Windows).
The DELETE command now reports a warning and continues if a record cannot be deleted because it is locked by another user.
The INFORM option of the SETPTR command causes the name of the output file to be displayed when a mode 3 print job starts.
The QMBasic CLEARCOMMON statement has been extended to allow clearing of a specific named common block.
Use of mode 3 printer output to direct printer output to a file now takes an update lock on the item while it is being written.
|QM 2.8-7 (released 17 Dec 2008)|
Validation of directory file record ids has been modified to allow an extended range of characters.
The Proc processor has been enhanced to support  as a call to a subroutine in the same procedure and to allow an alternative FB syntax.
For compatibility with other multivalue systems, the IF conditional expression in a correlative now returns a null string if the relevant THEN or ELSE element is not specified in the expression.
The FORCE.RELOAD mode of the OPTION command can be used to force a complete reload of the QMBasic object code cache when a program is compiled or catalogued. This should be used with care as described under the QMBasic CALL statement in the QM Reference Manual.
The LISTU command has been extended to include a DETAIL option to show the current count of QM processes of each type and the peak number of processes that consumed a licence.
The query processor selection commands now treat a field name on the command line that is not part of a selection or sorting clause as being an implied use of SAVING MULTIVALUED. This is for improved compatibility with other systems.
The query processor L breakpoint option is ignore when used with the U option for improved compatibility with other multivalue environments.
QMBasic now supports trailing substring assignment, e.g. A = 'ABC'.
The QMBasic TESTLOCK() function can be used to return the owner of a specified task lock, zero if the lock is free.
The TRANS(), RTRANS() and XLATE() functions have been modified such that failing to open the file will take the error action defined by the error code argument to the function.
Local functions and subroutines in QMBasic programs that take a whole matrix as an argument, no longer need a DIM statement to declare the dimensionality of the matrix.
The WATCH command of the QMBasic debugger has been extended to allow a condition that must be met for the program to stop.
The LGNWAIT configuration parameter can be used to set a period in tenth of a second units for which a process will wait if it is unable to login because the user limit has been reached, trying again every tenth of a second. This feature can be useful in web server applications where peak loads could briefly exceed the licensed user limit.
Five new terminfo codes have been defined; eblink, eprot, edim, erev and ebold as the codes to turn off the corresponding blink, prot, dim, rev or bold display attribute. If these are not present in the terminal definition, the sgr0 code is used as in previous releases. This change allows QM to handle terminals that support multiple simulataneous display attributes.
|QM 2.8-6 (released 10 Nov 2008)|
This release fixes a bug in the Linux installer that may set permissions incorrectly. There is no new functionality.
|QM 2.8-5 (released 6 Nov 2008)|
This release contains an important change for Windows users. QM is only usable while the QMSvc service (or QMSrvr on Windows 98/ME) is running. This change has been necessitated by a change in Windows regarding how shared memory works. For a detailed description of the reason for the change, see the OpenQM KnowledgeBase at www.openqm.com/cgi/lbscgi.exe?t0=h&t1=kb.00008.
The ABSENT.IGNORE keyword can be used in a query command to suppress the list of unfound records when ids are present on the command line or in a select list that are not present in the file being processed.
The query processor CSV option now supports a third mode (3) to quote all items.
The BASIC command NO.QUERY option can be used to suppress prompts from the compiler. Currently the only prompt that can occur is the confirmation when replacing a catalogued item.
A new command, FILE.STAT, has been added to produce a summary report of all files in one or more accounts.
The IF command used in a paragraph now supports EXISTS and NOT.EXISTS to check whether a record exists.
The LISTU command now shows the account name for each user. As part of this modification, the process id column (PID) is now sized to fit the longest PID value in the report with a minimum width of four characters. This may affect any programs that capture and post-process the output from LISTU. Such programs are probably better modified to use the !LISTU() subroutine.
The RESET option of the LOGTO command has been extended to add RESET ALL which discards all programs, menus, paragraphs, etc at all command levels.
For improved compatibility with other systems where phantom processes can be started as specific user numbers, the PHANTOM command now has an optional USER clause that specifies that the user number for the new process. This number must be in the range defined by the PHANTOMS configuration parameter.
The SET.FILE command has been modified to allow creation of Q-pointer chains though this not recommended.
The qmfix tool has been extended to add a new option, -z, that will clear the dead space at the end of a group. This has been added to correct a security risk where an encrypted file could have unencrypted data left in this area after splitting a group. Users with encrypted files are recommended to run qmfix with this option once on each encrypted file. The underlying error in the group split process has been corrected so the problem will not recur.
|QM 2.8-4 (released 9 Oct 2008)|
The diagnostic data produced by the PDUMP command now shows the length of a string variable.
The MD conversion code is now more flexible in the order of its options.
The !LISTU() QMBasic subroutine now returns the account name for each user.
|QM 2.8-3 (released 3 Oct 2008)|
To avoid some operating system security restrictions, the configuration file has been moved into the QMSYS account directory where it is now named qmconfig on all platforms. An upgrade installation will automatically move this file. Use of the QMClient QMConnectLocal() API needs to know the location of this file. If it is not in the default location (C:\QMSYS on Windows, /usr/qmsys on other platforms), the QMSYS environment variable must be set to specify the location.
The AUTHENTICATE command can be used by a QM process started by the STARTUP configuration parameter to reduce its privileges to those of some other user known to the operating system.
The query processor BREAK.ON and BREAK.SUP keywords now support the N option to reset the page number to one at each breakpoint. This option implies the P option if not used with B or P.
The $MODE compiler directive can be used to enable support for the default file variable found in some other multivalue products. Two variants of the default variable are provided; one in which the variable is local to the program in which it is used (as in D3 and UniData), the other in which the variable is common to all programs at the same command processor level (as in UniVerse). The QMBasic statements that support use of the default file variable are CLEARFILE, CLOSE, DELETE, DELETEU, FILELOCK, FILEUNLOCK, MATREAD, MATREADL, MATREADU, MATWRITE, MATWRITEU, OPEN, OPENPATH, READ, READL, READU, RELEASE, SELECT, SELECTN, SELECTV, SSELECT, WRITE and WRITEU. Other statements and functions can use @STDFIL to reference the default file variable.
A new QMBasic GETPU() function mode, PU$FORM.QUEUE, can be used to retrieve the form queue number from the last use of SP.ASSIGN for a print unit.
The QMBasic debugger now supports a "step over" command to step over a call to an internal or external subroutine without debugging its execution unless it contains a DEBUG statement to force entry to the debugger.
A QMBasic program can now test the STATUS() function immediately after an END TRANSACTION statement to determine whether the transaction committed successfully.
The QMBasic SYSTEM() function supports two new key values. Key 1033 returns true if a COMO file is active. Key 1034 returns true if COMO output has been suspended.
Entering a blank command line in the QMBasic debugger now repeats the last command.
|QM 2.8-2 (released 12 Sep 2008)|
The COMO command has been extended to allow an existing record to be appended. Also, logging of output can be suspended and subsequently resumed with the SUSPEND and RESUME keywords to the COMO command.
Records in the $COMO file now go through the same process as other directory file records to transform names that contain invalid characters.
The DELETE.ACCOUNT command now checks for subdirectories that are also accounts before deleting an account. The FORCE option suppresses this check.
The LISTDICT command reports A and S-type dictionary records in a format similar to that used by Pick style systems.
The KEEP.OLD.OBJECT mode of the OPTION command causes the QMBasic compiler to leave any previous version of the object code in place after a failed compilation instead of deleting it. Use of this mode provides compatibility with some other products but is not recommended as a developer who fails to notice the compilation error may then go on to debug a program that has not actually been compiled.
The QMBasic CHILD() function can be used to determine whether a phantom process started from the session in which this function is used is still running.
The QMBasic DQUOTES(), QUOTES() and SQUOTES() functions provide multivalued equivalents of the DQUOTE(), QUOTE() and SQUOTE() functions, enclosing each element of a dynamic array in the appropriate type of quote.
The !LISTU() QMBasic subroutine can be used to obtain the raw data used by the LISTU command.
The way in which QM searches for public names in a class module has been changed to provide a substantial performance improvement to classes with very large numbers of public names. As a result of this change, class modules compiled at this release cannot be run on earlier releases of QM. Older class modules will run on the new version without recompilation.
Entries in the error log now include the account name of the process that generated the message.
|QM 2.8-0 (released 25 Jul 2008)|
IMPORTANT NOTE: Release 2.8-0 renames the subfiles that form a dynamic hashed file. In earlier releases these were ~0, ~1, etc. They have been renamed to %0, %1, etc because two PC cleanup utilities have been indentified that incorrectly assume that any files with names commencing with a tilde are temporary items that can be deleted. Conversion to the new names is automatic when a file is first opened by the new release but reverting to an earlier release will require manual renaming of the subfiles. Use of QMNet to access files on a different revision is not affected. A quick way to convert all files in an account is to use LISTF as this will open each file referenced by the VOC.
QM now supports use of A and F-correlatives as conversion codes. These are provided to ease migration from other systems and their use is not recommended in new developments. In particular, the performance of an A-correlative used as a conversion code with the ICONV() or OCONV() function will be poor as the expression must be transformed to the equivalent F-correlative and then executed interpretively for every use of the conversion function. When used in the query processor, this transformation is performed only once as part of parsing the query.
The COPYP command has been modified for improved compatibility with other systems such that entering a null response to the To: prompt will display the records at the terminal.
The STACKED.ACCOUNT mode of the OPTION command causes a program that performs an EXECUTE which directly or indirectly logs to a different account to revert to the original account on return from the EXECUTE.
The query processor IN operator can be used in a WITH or WHEN clause to restrict output to only those items where the content of a field is in a previously saved select list. This can simplify queries that test against a large number of values. The corresponding NOT.IN operator reports only items not in the named list.
The QMBasic ABORT and STOP statements now automatically use Pick style message handling if there is a comma after the message.
The QMBasic REMOVEF() function can be used to extract successive delimited items from a string using the same performance optimisation as REMOVE.
The QMBasic debugger now includes the PDUMP command to generate a full process dump file and the XEQ command to execute commands.
A new QMClient function, QMTrapCallAbort, has been introduced to allow a QMClient session to trap aborts that occur in a subroutine called by QMCall.