What Was New in Release 2.6?

The QMBasic socket functions have been extended to handle UDP connections.

QM 2.6-12

The BASIC command now supports the NO.PAGE option. This option can also be specified via the $BASIC.OPTIONS record.

The CATALOGUE command will now retain the security subroutine definition when locally recataloguing a program that has a security subroutine defined.

The DELETE.ACCOUNT command now supports the FORCE option to suppress the cross-check for files referenced from other accounts.

The PHANTOM command now has a NO.LOG option to suppress generation of a log record in the $COMO file.

The SETPTR command NOEJECT option can be used to suppress the normal page throw at the end of a print job.

The STATUS command now supports the ALL keyword to display the status of all phantom processes. Without this keyword, only phantoms started by the process in which the command is executed are displayed.

The TIME command has been extended to allow translation between internal and external format time values.

The CSV and DELIMITER clauses of a query now both support use of AS to specify that output is to be sent to a record in a directory file. This is an alternative to use of TO which takes a pathname.

The LIST.ITEM and SORT.ITEM commands now support use of COL.SUP to suppress field numbering and use of ID.SUP to suppress display of the record id.

For improved compatibility with Pick systems, the IF keyword can be used in place of WHEN in a query.

A single query may now have multiple SAVING clauses.

The $MODE QMBasic compiler directive now supports a HEADING.NO.EJECT mode to make the NO.EJECT option of the HEADING statement the default action.

The QMBasic INPUT, INPUT @ and INPUTFIELD statements no longer display the prompt character when taking input from the DATA queue. Use of the NO.ECHO.DATA option of the $MODE compiler directive suppresses echo of input data when using INPUT.

The QMBasic SYSTEM(19) function returns a unique value formed from the internal format date and time as two five digit values. If the function is used more than once system wide in the same second, an alphabetic suffix is added to ensure that the value is unique.

The QMBasic UNLOCK statement can now be used without a lock number to release all tasks locks owned by the process.

QMBasic programs will now take the ON ERROR clause, if present, if a program attempts to use a file handling statement when the file variable supplied does not correspond to an open file.

The QMBasic SELECTV statement now uses the same optimisation as generation of numbered select lists with SELECT where processing a dynamic hashed file builds the list group by group as the list is read.

Three new additive values have been added to the OPTION configuration parameter for the QMSvc service on Windows to disable logging of successful incoming connections. A value of 16 disables logging of telnet connections. A value of 32 disables logging of QMClient connections. A value of 64 disables logging of serial port connections.

Use of qm -k from the operating system command processor has been extended to add the ability to kill a process by pid.

The DISABLE.INDEX command can be used to disable update and use of one or more alternate key indices. Importing large volumes of data or performing intensive update processing may be faster if indices are disabled and then rebuilt because BUILD.INDEX can optimise the update sequence whereas import or processing is likely to be effectively random.

The PTERM command can now be used to display or modify the code page used by Windows console sessions.

This release introduces a further layer to QM's data encryption system whereby it can be made necessary to enter the master encryption key using UNLOCK.KEY.VAULT every time that QM is started (once only, not once per user login). This ensures that encrypted data is inacessible if the entire system is stolen. It is recommended for use with portable systems.

The QMBasic EQUATE statement has been extended to include the LITERALLY element found in other multivalue products. In addition, equated tokens may now be used in any position within QMBasic source, not just as variable names. This wider use may cause some programs that relied on the limited substitution in earlier versions to need generate compilation errors. Such programs will need modification.

The QMBasic SET.BREAK.HANDLER statement can be used to establish a subroutine which will be called if the user presses the break key. This subroutine allows an application to take its own action for handling use of the break key. The handler will be deactivated when the program terminates. Alternatively, the corresponding REMOVE.BREAK.HANDLER statement can be used to deactivate the handler.

The @(-29) and @(-30) terminal control codes (set 80 column mode and set 132 column mode), previously only available for the QMTerm terminal type are now supported on all AccuTerm terminal definitions. Two new terminfo tokens, set80 and set132 have been introduced to define the control codes.

QM 2.6-9

This release introduces the concept of a private vocabulary, searched after all other command sources when looking up the command name provided as the first token in a command line. The private vocabulary is separate for each user login name and allows users to store personal sentences, paragraphs, etc without placing these in the publc vocabulary shared by all users of the account. The privte vocabulary is a multi-file named PVOC with subfiles named as the uppercase form of the user login names. This file may be created and edited directly or by use of an extended form of the .D, .L, .R and .S command stack editor commands.

The GET.LIST and SAVE.LIST commands now include the COUNT.SUP option to suppress display of the number of items in the list.

The LISTF, LISTFL and LISTFR commands now show the details for each element of a multifile separately.

The LISTQ output has been extended to include the optional server name used when defining a QMNet connection.

The UMASK command can be used to control the access rights applied to files created within the QM session.

The default value of the INTPREC configuration parameter has been changed from 13 to 11 as the previous value was found to be inadequate. This change will not affect upgrades to existing installations. In this case, the value of INTPREC must be modified in the configuration file.

Dictionary link (L-type) records can now be used within I-type expressions to access D or I-type items in another file without needing to write a separate TRANS() function with its associated record id expression for every item referenced in the other file.

When the PICK.GRAND.TOTAL mode of the OPTION command is in effect, the query processor now provides closer compatibility with Pick style systems where there is no underline above the grand total values. This underline can be reinserted by use of the U control option in the GRAND.TOTAL clause. If PICK.GRAND.TOTAL is not active, the U control option removes the underline.

The QMBasic MATCHESS() compares each element of a dynamic array with a pattern template, returning an equivalently structured dynamic array of true/false values. Note the spelling of this function name with the trailing S to pluralise the name in common with other multivalue functions.

QM 2.6-8

The SETPTR command now uses an optional $PCL VOC record to set defaults for PCL printers. This can be used, for example, to change the default A4 page size from A4 to Letter. Details of this new control record can be found in the QM Reference Manual description of the SETPTR command.

The QMBasic OSREAD and OSWRITE statements provide a very simple way to read or write an operating system file. These statements take no part in the locking system and should, therefore, be used with care. The data is a true bianry image of the file content with no translation of newline sequences.

The QMBasic OSDELETE statement allows a program to delete an operating system file by pathname.

QM 2.6-7

System administrators can use the INHIBIT.LOGIN command to prevent new QM sessions logging in. This action does not logout other users who are already active. Whilst login is inhibited, the only new QM processes that can be started are phantoms created by the user that set the inhibit.

When a print job is directed to a file using the AS NEXT option of the SETPTR command to generate a rotating sequence number, this sequence number can be determined using the QMBasic GETPU() function while the print unit is open. The most recent print job sequence number used within a QM session can be found using the @SEQNO variable.

The PICK.PROC mode of the OPTION command can be used to enable closer compatibility with D3 Procs. At this release, enabling this option affects the IH command in PQ style Procs such that the special meaning of IH\ and IH \ is not recognised. Although this syntax is documented in the D3 reference manual, D3 does not actually treat the \ as a special symbol. Also, the IH command always behaves as though the B option is present. Use of this option also implies the PROC.A option. Further compatibility features may be controlled by this option in future releases.

QM 2.6-5

The PDUMP configuration parameter can be used to close a potential security risk by preventing users other than administrators dumping processes running under a different user name.

The record locking system has been modified to include an optimisation that will improve performance of closing files on systems with large record lock tables.

The terminfo xmc parameter is now supported. This indictates the number of screen character cells occupied by a change of display attribute and can be used to determine if the terminal type in use requires space to be left for attribute changes.

QM 2.6-3

The MCT conversion code is implemented differently across multivalue products. Previous versions of QM followed the D3 definition where the first letter after a non-alphabetic character was converted to uppercase, all remaining letters to lowercase. At this release the MCT.SPACE mode of the OPTION command can be used to provide compatibility with UniVerse where the character immediately after a space is converted to uppercase.

The UNASSIGNED.COMMON option of the QMBasic $MODE compiler directive can be used to specify that common blocks are to be created with their elements left unassigned instead of the default behaviour of setting them to zero. This gives closer compatibility with some other multivalue products. Programs using this feature will not run on earlier versions of QM.

The QMBasic WRITECSV statement can now write a whole dynamic array as a single data item, treating each field as a separate item in the CSV list..

QM 2.6-0

This release introduces data encryption for QM hashed files. Full details can be found in the QM Reference Manual. Encryption is not supported in the Personal Version and is not available on the PDA at this release.

QM now attempts to use telnet negotiation to determine the terminal type in use for users entering QM directly from a network. If this fails, it then falls back on the previous method of using the TERM environment variable.

The Personal Version of QM now allows simulataneous use of one interactive session, one QMClient session and one phantom process.

The size of the command stack maintained by the command processor can be set by use of the CMDSTACK configuration parameter. This must be in the range 20 to 999 and defaults to 99 if not present. Creation of a new account now adds the $COMMAND.STACK VOC record automatically. This record can be deleted if the command stack is not to be saved on leaving QM.

The COPY and COPYP command now both have an option to force a binary mode copy when moving data between a hashed file and a directory file in either direction.

The INTERNAL keyword to the DATE command can be used to show the current date in internal form. Similarly, TIME INTERNAL shows the current time in internal form (seconds since midnight).

The behaviour of the Proc A(n,m) command can be made to match that of D3 by use of the PROC.A mode of the OPTION command.

Handling of the $QUERY.DEFAULTS record has been modified considerably. See the QM Reference Manual for details.

The QSELECT command now uses the default select list (list 0) if it is active and no record ids or FROM clause is present in the command line.

The B64 conversion code can be used to translate to or from base64 encoding.

The @GID and @UID variables contain the group id and user id for the user's process. The QMBasic SYSTEM() function has new keys to return the user id (27), effective uid (28), group id (29) and effective group id (30). These features are not available on Windows or the PDA where they all return zero.

The QMBasic compiler XREF option now tracks label name references as well as variables.

The QMBasic compiler now allows use of $INSERT as a synonym for $INCLUDE.