This release corrects a problem with the self-extracting archive file that affects users who use report styles. There is no new functionality.
The DO element of output date conversion can be used to insert the ordinal day number (1st, 2nd, 3rd, etc).
The date output conversion code now supports the text modifier to insert specific text between selected items in the converted date.
The query processor STYLE keyword and the REPORT.STYLE command now allow a style to be reference indirectly via an R-type VOC record.
The QMBasic !USERNO() subroutine can be used to relate a user name to the corresponding QM user number(s) as a field mark delimited list.
The QMBasic compiler now accepts use of a dimensioned array element as the control variable in a FOR/NEXT loop.
As an aid to determining the optimum value for the NUMLOCKS configuration parameter, the LIST.READU command now has a DETAIL option that displays the current and peak numbers of record locks.
The LOGTO command now has a RESET option that discards all active programs, menus, etc at the current command processor level. This is particularly useful when using LOGTO in a menu.
Use of the EV (edit values) command of the ED editor when on line 2 of a dictionary I-type item now breaks elements of a compound expression onto separate lines to simplify editing. The same change has been made to the SED editor dive function.
The PAGESEQ query processor option can be use to provide contiguous page numbers over successive separate reports. This might be useful, for example, when assembling monthly reports into a single composite analysis for the year.
The NO.DATE.WRAPPING mode of the OPTION command can be used to suppress rolling dates with overlarge day numbers into the next month. Date wrapping is a standard feature of Information style environments.
The algorithm used by the QMBasic RND() function has been modified to improve the randomness of the returned values. Note that no guarantee is given that the returned sequence will be identical from one release to the next even if the RANDOMIZE statement is used to set a seed value.
The QMBasic SYSTEM(1029) function can be used to determine the current internal subroutine depth.
The -K option to the qm executable to kill users now requires administrator rights. This option will now also take a user login name as its qualifier and logs out all QM processes running as that user.
|QM 2.4-17 (released 18 Dec 2006)|
There is now a 30 second timeout on the prompt for the account name on entry to QM for sessions where this prompt is displayed. The same timeout also applies to the user name and password on Windows 98, and on direct entry to QM from a network (as opposed to via the operating system shell) on Linux and FreeBSD. These timeouts ensure that automated connections to a QM server cannot hang on these prompts, consuming a licence.
The COPYP command now reports the number of records copied.
An additional layer of caching has been added to the TRANS() operation to improve performance when using files accessed via Q-pointers.
The R (range check) conversion code has been added.
The QMBasic INPUT @ and INPUTFIELD statements now support a PANNING option that allows entry of an unlimited number of characters in a given display width by panning the data where necessary.
The QMBasic object oriented programming features have been enhanced to allow the default limit of 32 arguments in a public function to subroutine to be increased (see the CLASS statement). Also, a new syntax of three periods (...) can be used as the final argument to a public function or subroutine to extend the argument list up to the maximum permissible length with unnamed arguments that can be accessed using the ARG() function or the SET.ARG statement.
This release includes a correction for a fault introduced in the QMFix tool at release 2.4-10 where use of the -R option may cause a file corruption.
The FL$UPDATE key of the QMBasic FILEINFO() function can be used to determine whether a file has been updated by another process.
The SKT$INFO.OPEN key of the QMBasic SOCKET.INFO() function can be used to test whether a program variable represents an open socket.
This release is mainly concerned with improved compatibility with other enviroments to further simplify migration.
The install process on Windows now creates a TEMP subdirectory under the QMSYS account. This is used to pass control information between the QMSvc service and the QM processes that it starts. All users need full access to this directory.
VOC and dictionary record type codes are now case insensitive for improved compatibility with other environments.
QM now supports a variant of SP.ASSIGN to ease migration from other environments. This uses form queue definitions created using SET.QUEUE and maps these onto SETPTR commands internally. Direct use of SETPTR is recommended for new developments.
As part of the above development, QM now supports print mode 6 in SETPTR to specify that the output is to be written to a file and also printed.
The SETPTR command has also been extended to add a mode where it reports the settings of a print unit in a form that can be captured by a program and later used to restore those settings.
The SP.OPEN and SP.CLOSE commands have been added for improved compatibility with other environments. The KEEP.OPEN option of the SETPTR command should be used by preference in new developments.
The ED editor now looks for an X-type VOC record named $ED.OPTIONS on entry to set defaults for case sensitivity, block command confirmation prompting and entry of non-printing characters.
The XEQ command of the ED editor now supports several special tokens to insert items such as the file name into the executed command. These have been added for compatibility with other systems.
The PICK.IMPLIED.EQ mode of the OPTION command can be used to enable a Pick style shortcut in the query processor such that a field name in a selection clause that is followed by a literal value enclosed in double quotes with no intervening operator behaves as though there was an EQ operator.
The QUERY.PRIORITY.AND mode of the OPTION command causes the query processor to treat the AND operator as higher priority than the OR operator.
The QMBasic compiler now allows the EQUATE statement to be used with @variables.
The QMBasic INPUT @ and INPUTFIELD statements now have an optional APPEND keyword to position the cursor at the end of any existing data.
The QMSvc service on Windows now uses improved telnet parameter negotiation to allow use with a wider range of terminal emulators.
This release includes a beta test version of PQ style Proc processing. This is available for general use but users should be aware that it has limited support during the test period. Any defects should be reported via the normal support channels, including a simple test case where possible.
This release is mainly to fix a serious bug in alternate key index scanning.
The VOC now contains an F-type entry named MD as a synonym for VOC to give better compatibility with other systems.
Shutting down the QMSvc service on Windows systems now force logs out all QM users on network connections.
The NO.QUERY option of the CATALOGUE command can be used to suppress all confirmation prompts.
The ACCOUNT.RESTORE command will now create the @ID dictionary entry if it does not already exist.
The behaviour of the query processor REPEATING option has been modified to use the dictionary S/M flag to determine whether the item should be repeated.
The query processor NO.GRAND.TOTAL option can be used to suppress the grand total line. This is a VOC phrase that expands to the previous method of GRAND.TOTAL "'L'".
Although dynamic files are very robust, there is a small possibility of file corruption after a power failure or other event that causes outstanding write operations not to complete if a split or merge action is lost. QM now includes a mechanism that allows split and merge operations to be suppressed using the NO.RESIZE option to the CONFIGURE.FILE command. Subsequent use of the IMMEDIATE option will apply the deferred splits/merges. Use of this feature removes the possibility of file corruptions from lost splits or merges but will cause a reduction in performance. Typically, deferred splits/merges might be applied overnight after the system backup. See the description of dynamic files in the user documentation for more details.
Several changes have been made to the query processor to improve compatibility of with other multivalue environments in queries that use breakpoints.
The C conversion code performs concatenation of data items and separators.
The QMBasic INPUT@ and INPUTFIELD statements now support two new mode options. The EDIT option causes input to commence in edit mode, suppressing the normal clearance of the input field if the first character entered by the user is a data character rather than an edit character. The OVERLAY options starts input in overlay mode where data entered by the user replaces the character under the cursor rather than being inserted.
The documentation set has been revised. There are now just four manuals in addition to the index. The new QM Reference Manual (qm.pdf) combines the contents of the previous QMBasic Reference Guide, QMClient API Guide, Command Reference Guide, Editors Reference Guide, Introduction to QM and Query Processing Guide into a single, fully hyperlinked document. The Windows help has been updated to be a compiled HTML file and a new HTML help package is available for non-Windows users. The Windows install will delete the old documents on the QM server. Copies installed on other PCs or on non-Windows platforms must be deleted manually. Note that a recent Windows security fix prevents the compiled HTML help file being installed on a mapped drive.
The STARTUP configuration parameter can be used to specify a command, typically a paragraph, to be run when QM starts (shared memory load, not a individual user login).
The optional ON.LOGTO VOC item will be executed by the LOGTO command before moving to a new account.
The PROMPT option of the PTERM command can be used to change the command prompt.
Printed output can now be directed to the auxiliary port of a terminal or emulator by use of SETPTR mode 5. The output is buffered in the $HOLD file and sent to the terminal when the printer is closed. This feature relies on correct setting of the mc5 (aux on) and mc4 (aux off) terminfo items.
The query processor TO option when used with a delimited report now has an optional APPENDING qualifier to append the data to an existing file.
The $NO.CATALOGUE compiler directive can be used in a QMBasic program to specify that a module is not to be catalogued where the $BASIC.OPTIONS record includes a CATALOGUE line to automatically catalogue all programs.
The DELETE.CATALOGUE command can now take a list of catalogue items in a single command.
The query processor now supports use of Soundex matching in WHEN clauses.
QMBasic class modules may now inherit public variables, functions and subroutines from other classes.
The algorithm used by the qmfix utility -r (recover) option has been modified such that the layout of overflow is optimised for performance of sequential file scans.
The terminfo colourmap key can be used to translate internal QM colour values to alternative values used by specific terminal emulators.
The -stdout command line option can be used on Windows systems to cause QM to use the stdout file handle instead of the Windows console APIs. This is of use when capturing the output or piping it into another process. It should not be used for normal operation as some display features may not work.
The QMBasic FOLD() and FOLDS() functions have been extended to support the three argument format found in Pick style systems and to support multivalued width arguments.
The syntax of local functions and subroutines in QMBasic has been changed to remove an anomoly when compared to public functions and subroutine in class modules. Local functions and subroutines should now be terminated with an END statement. The QMBasic compiler will report a warning if this END is missing. Programs should be modified as soon as possible as this will become an error at a later release.
This release fixes a problem with the Linux install process. There is no new functionality.
This release fixes a problem that could affect printing from the query processor. There is no new functionality.
The query processor now supports use of STYLE NONE to override any default report style set using SETPTR or REPORT.STYLE.
The QMBasic SET.ARG statement can be used to set the value of a subroutine argument based on its position in the argument list. It is intended for use with subroutines declared with the VAR.ARGS option.
The QMClient API is now provided as a QMBasic class module to enable its use from within QMBasic programs to access remote servers.
The inline prompt mechanism has been extended to allow multiple parameters to a paragraph to be accessed in a single prompt and to add default values to some modes.
The COMPILE.DICT (CD) command now takes the NO.PAGE option to suppress pagination of output to the user's screen.
In response to user requests, the CREATE.FILE command now reports an error if the file cannot be created because the operating system components already exist. In previous releases, a unique name for the operating system files was generated automatically in this situation.
OPTION LOCK.BEEP can be used to cause QM to emit a beep at the terminal once per second while waiting for a record or file lock.
The query processor REPEATING keyword can be used to repeat single valued items alongside each value of a multivalued item. It will also repeat the final value of multivalued items where multivalued data has a different number of elements.
Private and public variables in class modules are now initialised to the unassigned state in the same way as local variables. Previous versions set these variables to zero on creation.
The QMBasic GET.PORT.PARAMS() function now returns additional information regarding the state of serial port control data.
The QMBasic OBJINFO() function can be used to return information about an object variable.
The QMBasic ON GOSUB and ON GOTO statements now support up to 65535 labels.
The QMBasic debugger DUMP command can be used to dump the contents of a variable to a file for external analysis. This is of particular use with very large character strings.
QM now monitors for processes that have terminated abnormally, releasing the resources and licence slot automatically. This check is performed at five minute intervals by the QMSvc service on Windows and by a new daemon process, qmlnxd, on other platforms.
The command processor will now look for a catalogued item if a command line references a VOC item that is not of executable type. In previous releases, an error was reported instead of checking the catalogue.
The .X command editor operation has been extended to allow execution of commands stored in alternative files. Such items can also now be executed with the RUN command.
The ACCOUNT.SAVE and ACCOUNT.RESTORE commands now correctly save and restore QM alternate key indices.
The PSTAT command now shows the account name of each process reported.
The LOGIN.PORT command can be used to login a serial port from within another QM session. This might be of use, for example, to start a process that will monitor a dial up line for incoming connections. This command is currently only available for Windows systems.
QMBasic programs using the $CATALOGUE compiler directive or the equivalent option of the $BASIC.OPTIONS record and not specifying a catalogue name now default to use the program source record name instead of the name in the PROGRAM, SUBROUTINE, FUNCTION or CLASS statement. An error is reported if these names do not match. This change may require modification to some programs.`
The QMBasic KEYCODE() function now returns char(27) if an Escape character is received but not followed by further characters within 200mS. This mechanism can be disabled using the BINDKEY() function.
The QMBasic MATREADCSV statement reads a line of text containing comma separated variable format text from a file opened using OPENSEQ and parses it into the elements of a dimensioned matrix.
The QMBasic CSVDQ() function dequotes a comma separated variable string according to the CSV standard, returning a dynamic array of extracted items.
The QMBasic SYSTEM(1027) function returns the serial port name of a QM user process connected via a serial port.
This release fixes a fault where query processor reports may not be correctly paginated. There is no new functionality.
QM now supports login from serial connections on Windows systems. This is controlled by the SERIAL configuration parameter.
The NEWLINE option of the SETPTR command can be used to select the character sequence sent by the QMBasic PRINT statement at the end of a line. This may be CR, LF or CRLF and is mainly intended for output captured in files for further processing.
The query processor ABSENT.NULL keyword, typically used with a select list, causes the query processor to treat an absent record as a null item instead of an error. This allows a query to span a set of related files where the complete set of record ids might not appear in all of the files. Without this option, it is necessary to construct an intermediate file.
The PDEBUG command allows debugging of phantom and QMClient processes.
QM account names may now be up to 32 characters in length. Then name must start with a letter and may not contain spaces. It will be translated to uppercase internally.
The SEL.RESTORE command has been extended to allow a list of records to be restored.
The FILE.SAVE and RESTORE.ACCOUNTS commands have been added.
The query processor now accepts the NO.CASE qualifier after all relational operators to indicate that the comparison is to be performed in a case insensitive manner. This can also be set as the default by use of the QUERY.NO.CASE mode of the OPTION command.
The query processor TO option used in LIST and SORT with the CSV or DELIMITER options now prompts for confirmation if the target file already exists. This can be suppressed by use of the NO.QUERY qualifier after the pathname. Note that this change may require modification of existing programs and scripts.
The QMBasic DELETESEQ statement can be used to delete an operating system file. It is intended primarily as a counterpart to OPENSEQ but can be used to delete any operating system file.
The QMBasic RTRANS() function has been added as a variant of TRANS() for closer compatibility with Revelation (and perhaps other environments) where the returned data does not have the mark characters lowered by one position. Note that this makes it impossible to distinguish between retrieval of multivalued data from a single record and retrieval of single valued data from multiple records.
The QMBasic PAUSE and WAIT statement can be used to synchronise activity in related QM processes.
Public functions and subroutines in QMBasic CLASS modules can now be declared with the VAR.ARGS option.
Optional arguments may be supplied to the QMBasic OBJECT() function when instantiating an object. These will be passed into the CREATE.OBJECT subroutine within the class module.
A new $MODE setting for QMBasic programs has been introduced to given closer compatibility with the behaviour of substring assignment on Pick style systems. This option, PICK.SUBSTR.ASSIGN, overrides use of the existing PICK.SUBSTR and causes QM to apply the D3 style definition of this operator.
This release introduces object oriented programming. This has been done by extending the QMBasic language to add CLASS modules. Existing applications will be unaffected by this new functionality though object based components can be added alongside the traditional multivalue programming structures. For more details, see the CLASS statement and the OBJECT() function in the QMBasic Programming Guide.
VOC F and Q-type entries can now use two additional special prefixes on file pathnames. @TMP will be replaced by the value of the TEMPDIR configuration parameter. @HOME will be replaced by the value of the HOME environment variable.
The ACCOUNT.RESTORE command now has two new options. The NO.CASE option causes new dynamic hashed files to be created with case insensitive record ids. The DIRECTORY option causes new files to be created as directory files.
ACCOUNT.RESTORE also now supports a wider variety of tape formats to aid migration from other environments.
The FIND.ACCOUNT command can be used to locate an account on a Pick style FILE.SAVE tape prior to use of ACCOUNT.RESTORE.
The SEL.RESTORE command can be used to restore a specific file from a Pick style ACCOUNT.SAVE or FILE.SAVE tape.
The SETPTR DISPLAY command now takes an optional LPTR keyword to direct the report to a printer.
The MCAN and MC/AN conversion codes can be used to extract all alphanumeric or non-alphanumeric characters from a character string.
The QMBasic RETURN statement no longer needs brackets around the return value when used to return from a function. Existing programs that have the brackets will not be affected by this change.
XLATE() can now be used as a synonym for TRANS() in QMBasic programs and I-type dictionary items.
The QMBasic ARG.COUNT() function can be used to determine the number of arguments supplied to a subroutine. This is of particular use with subroutines that are declared with the VAR.ARGS option. The ARG() function can then be used to access an argument by its position in the argument list.
Use of the QMBasic ERRMSG statement or the Pick format versions of ABORT and STOP will save the message id in @SYSTEM.RETURN.CODE if it is numeric.
The TRAP.UNUSED option of the QMBasic $MODE directive or its equivalent in the $BASIC.OPTIONS record causes the compiler to display a warning if a variable is assigned a value but never used.
The G command of the QMBasic debugger can be used to continue execution at a specific line number.
QM now supports use of sequential files over 2Gb up to a limit determined by the underlying operating system.
Trigger functions can now include pre and post-clear file modes.
A SELECT operation during which no file updates occur now automatically corrects the load value of a dynamic file which can become inaccurate if a process terminates abnormally. Although this error has minimal effect, this corrective mechanism helps to ensure accuracy.
The FSYNC configuration parameter has been extended to allow optional file synchronisation at transaction commit.
The QMBasic MAX() and MIN() functions can be use to return the greater or lesser of two values.