What Was New in Release 3.4?

QM 3.4-11 (released 25 Jul 2017)

The locking system now records the time at which a record or file lock was acquired as an aid to debugging locking issues. The time is included in the LIST.READU report if the DETAIL option is used and also appears in process dump files or deadlock diagnostics.

The optional replacement character in an MCP conversion code can be enclosed in single or double quotes. Empty quotes cause non-printing characters to be removed without replacement.

The I-type compiler now supports a subset of the options to the $MODE QMBasic compiler directive.

Overwriting an existing local catalogue pointer in the VOC now queries for confirmation if the pathname of the object code is different.

A new @-variable, @PSTAT, has been added. This can be used to set diagnostic information that will be displayed by the PSTAT command.

The USER, GROUP and MODE keywords have been added to CREATE.ACCOUNT, CREATE.FILE and CONFIGURE.FILE to allow setting of ownership and access permissions on Linux/Unix systems.

The SAVE.LIST, GET.LIST and DELETE.LIST commands now all support an alternative file name.

The SHOW command has a new keyword, SORT.SUP to suppress the default @ID sort.

The WRITE.DELETE.THEN.ELSE setting of the $MODE compiler directive has been extended to include the MATWRITE and MATWRITEU statements.

The SETPTR and SET.QUEUE commands now accept the AT clause in mode 5 to identify the printer to be used on the client PC. This is applicable only to AccuTerm when using a terminal type with the -at suffix.

The FL$LOCKS key to the QMBasic FILEINFO() function returns a list of the locks in the file owned by the calling process. Attempting to enter the debugger in a phantom process raises exception SYS.PROGRAM.NO_PDEBUG if no interactive process is waiting in the PDEBUG command.

The QMClient API now includes QMSystem() to return the value of a SYSTEM() function on the server and QMTrans()/QMRTrans() to perform the equivalent QMBasic TRANS() and RTRANS() operations.

Setting the DEADLOCK configuration parameter to 2 extends the action of mode 1 to save the state of the lock tables as an aid to diagnosis.

QM 3.4-10 (released 7 Apr 2017)

This release adds multi-tenancy support for Windows installations.

The ADD.DF command has been extended to add an option that causes the part file pathnames to be stored in relative form.

The DISABLE.PUBLISHING command now also disables account replication.

The NO.MSG option to the PHANTOM command suppresses display of phantom start and termination messages in the parent process.

It is now possible to execute a class module using RUN or a catalogue reference. The class must include a public subroutine named MAIN.

A new option, CREATING, has been added to the QMBasic OPENSEQ statement to force immediate creation of the file if it does not already exist.

The External Call Interface has been extended to allow multiple function libraries.

QM 3.4-9 (released 14 Dec 2016)

The IF command in a paragraph now has an option to perform case insensitive relational comparisons.

A B option has been added to commands within the SHOW utility to move to the bottom of the available items.

An ECS quaifier has been added to the QMBasic OPENTEMP statement to create the file in ECS mode.

A PARAMS property as been added to the !CALLHTTP.CLS class module to provide an alternative way to pass URI parameters in a GET request.

QM 3.4-8 (released 28 Oct 2016)

This release introduces minimal support of character maps into the non-ECS version of QM. This allows developers to adapt the default map to give better support for the accented characters found in European languages without needing to use the ECS version.

The CREATE.FILE command now checks for an optional $ENCR VOC record to control automatic application of encryption to hashed files.

The ENCRYPT.FILE command has been extended to provide a simple way to apply encryption to many files in a single operation.

The QMBasic EREPLACE() and FIX() functions have been added for improved compatibiltiy with other multivalue products.

The QMBasic OPTION() function has been extended to allow setting/clearing of an otion.

A QMClient session can now use the AUTOLOGOUT command to terminate the session after a period of inactivity.

QM 3.4-7 (released 23 Aug 2016)

This release introduces a pure Java version of the QMClient API, removing the need for the Java Native Interface which required different versions for each supported platform. The old JNI versions will continue to be supported for at least one year.

The COPY command has been extended to allow record ids to be forced to either upper or lower case when copying items from a directory file on a case insensitive file system to a case sensitive file.

When using the CREATE.FILE command to create an element of a multi-file, the INHERIT.MFILE.PATH mode of the OPTION command can be used to make the default location of the new subfile the same as the default subfile.

The RPL.STATUS command can be used to display a summary of the replication system status.

The SED editor now has a SCROLL1 option to control scrolling from page to page.

The SED editor can take a sequence of edit commands from the data queue.

The SELECT.DIR command can be used to build a select list containing the names of files or subdirectories in a specified directory.

The TERM command now supports setting the default printer page dimensions.

For improved compatibilty with other multivalue products, the query processor COL.HDR.SPACE keyword inserts a blank line under the column headings in a tabular report.

The OPEN.FAIL.ZERO.FVAR setting of the $MODE compiler directive causes a failed open to set the file variable to zero instead of unassigned.

The QMBasic SADD(), SCMP(), SDIV(), SMUL() and SSUB() functions have been extended to support non-integer values.

This release is mainly to correct an issue described in section 5 but also includes the following enhancements.

The DECRYPT.FILE command can be used to cancel encryption for a file or specific fields.

The OSCOPY command and corresponding !OSCOPY() subroutine have been extended to allow appending to an existing file.

The QMBasic ELEMENT.EXISTS() function can be used to determine whether a named element is present in a data collection.

The compiler no longer reports an error if a subroutine argument passed as a matrix is not dimensioned.

The QMSAVE tool (see http://www.openqm.com/cgi/lbscgi.exe?T0=h&t1=kb.00011) has been modified to add verification of the file and record counts.

QM 3.4-5 (released 18 Apr 2016)

This release introduces the ability to log every command executed on the system together with its origin. This may be useful for diagnostic purposes but has been added primarily to meet audit rules applicable to some applications.

The ED, MODIFY and SED editors now all support automatic sequential record id generation.

The SCAN command provides a simpler and more logical semantics for the DISPLAY mode of the SEARCH command.

The AS clause of the SETPTR command has been extended to allow use of an alternative hold file name.

The SHOW.LIST command displays an active numbered select list, allowing the user to remove items from the list using keystrokes based on those of the SHOW command.

The SP.VIEW command has been extended to allow hold file items to be deleted.

Two new QMBasic functions, BOOL() and NUMERIC() have been added as an efficient way to transform data to Boolean or numeric form. The STR() function with the second set to one or omitted provides the most efficient way to force a value to be stored as a string.

The QMBasic FCONTROL() function has a new mode, FC$CRLF, to allow a program to override the default operating system dependent selection of directory file line terminator.

The QMBasic JBUILD() function has been modified to encode any mark characters in a JSON string element as hex Unicode values. The effect of this is that a JSON string can always be stored as an element of a dynamic array such as a database record.

The QMBasic MATBUILD and MATWRITE statements have been enhanced to return the last used matrix element index via the INMAT() function in a manner similar to MATPARSE and MATREAD.

The QMBasic SET.ESC.MAP.NAME() function can be used to change the ECS character map within an application program.

The sort system now allows data or keys over 32k characters.

The QMClient API has been extended to allow use in multi-threaded applications on all platforms (previously Windows only).

This release introduces the Python wrapper for the QMClient API. See the qmclient.py item in the SYSCOM file for details.

A new tool catalogued as *FIXDIR has been added to provide a simple way to correct the line terminator in a directory file item that has been moved between Windows and Linux in binary mode.

QM 3.4-4 (released 17 Dec 2015)

For improved compatibility with other products, if field 3 of a VOC Q-pointer is null, QM now assumes VOC by default.

The CREATE.DICT.NO.CASE mode of the OPTION command can be used to make CREATE.FILE create dictionaries with case insensitive ids. The NO.CASE option of the CREATE.FILE command has also been extended to allow selection of case insensitivity for the data and/or dictionary portions of the file.

The SEARCH command has been extended to add a DISPLAY option that shows each line that contains any of the search strings. When this option is used, a select list is only created if the TO option is also used.

The query processor SORTED.SAMPLE keyword is similar to the SAMPLE keyword but is applied after sorting.

A new QMBasic $MODE setting, EXECUTE.CLEARLIST, has been added to improve compatibility with other products regarding how the default select list is handled by the EXECUTE statement.

As an aid to debugging programs, the QMBasic PDUMP statement creates a process dump file of the process in which it is executed.

The QMBasic OPENTEMP statement has been extended to create the file in the QM temporary directory if the pathname is omitted or is a null string.

The QMClient API now supports sequential file processing.

The QMClient API QMTxn() function can now commit non-durable transactions.

The WEBSVC command and !CALLHTTP class module can be used to implement simple web services.

QM 3.4-3 (released 18 Sep 2015)

This release extends the data encryption features of QM to allow encryption of records in directory files and encryption of indices on hashed files that use record level encryption. Also, encryption keys can be password protected.

The I-type compiler now allows references to dictionary items with hyphens in their names.

The CREATE.INDEX and MAKE.INDEX commands have a DELETING option to delete any previously existing index of the same name as the one being created.

The DELETE.COMMON command has been extended to allow deletion of all except a given list of common blocks.

The IF IN construct in a paragraph now has a NO.CASE option for case insensitivity.

The LISTU command now marks phantom processes that are grouped with their parent.

The COMMAND.LEVEL.LOCKS mode of the OPTION command associates record and file locks with the command processor level at which they were acquired, releasing locks automatically on return to the command processor at that level.

The QUERY.FOOTER.PAUSE mode of the OPTION command causes a query processor report with a footer to pause for user input. This gives greater compatibility with other multivalue systems.

QMBasic expressions can use the ~= operator to force a case insensitive string comparison.

The QMBasic OPENTEMP statement creates and opens a temporary file that will be deleted automatically when it is closed. The FILEINFO() function FL$TEMP key allows an application to detect whether an open file is temporary.

The QMBasic OSPATH() function with key value 20 (OS$INFO) returns a dynamic array of file information similar to that returned by the STATUS statement.

Key value 1073 (SYS$GROUPED.CHILDREN) to the SYSTEM() function is similar to key value 1058 (SYS$CHILDREN) but includes only phantom processes that are grouped to terminate with their parent.

QM 3.4-2 (released 1 Jul 2015)

The IPADDR configuration parameter can be used to make QM listen for incoming telnet or QMClient sessions on a specific IP address. This may be useful in situations where multiple separate instances of QM run on the same server.

The QUERY.SORT.NO.CASE mode of the OPTION command makes all sorts within the query processor case insensitive.

The ADMIN.USER command now allows selection of whether a forced account name should be applied to phantom processes.

The CREATE.FILE command now has a MULTIFILE option which causes it to create the data portion of the file as a multifile even if no subfile name is given.

The LIST.INTER, LIST,UNION, LIST.DIFF and MERGE.LIST commands have been modified to give a significant performance improvement when merging large lists.

The TANDEM command can be used by administrative users to monitor another QM session. Because this could be a serious security risk, it must be enabled in the QM configuration parameters.

The query processor COUNT and SELECT commands now support a REPORTING option to display progress information when using a selection clause.

The PARTIAL.EXPRESSIONS setting of the $MODE compiler directive modifies the way in which logical expressions are evaluated such that remaining elements of the expression are not evaluated if they cannot change the result. Without this option, an expression is always fully evaluated.

The PICK.READNEXT setting of the $MODE compiler directive causes the READNEXT statement to leave the record id variable unchanged when taking the ELSE clause.

All variants of the QMBasic LOCATE statement now support an option to force case sensitivity/insensitivity.

The QMBasic MERGELIST() function can be used to merge two field mark delimited sorted lists.

Use of SYSTEM(1071) after a successful OSREAD operation returns a dynamic array of file information similar to that returned by the STATUS statement.

QM 3.4-1 (released 12 Mar 2015)

Logging in a telnet or QMClient session on Windows now supports domain\username as an alternative to username@domain.

The initial state of terminal input case inversion can now be set using the INVCASE configuration parameter.

The CREATE.ACCOUNT command now has a NO.CASE option to create the VOC as a case insensitive file.

The GET.LIST and SAVE.LIST commands use a default name if no list name is given.

The LIST.PRINTERS command can be used to show a list of all printers known to the underlying operating system (currently Windows only).

The CLEAR.SELECT mode of the OPTION command causes the default select list (list 0) to be cleared on return to the command processor except when the list was created by a command or program whose role is to create a list for processing by subsequent commands.

The NUMERIC.EXPONENT mode of the OPTION command enables acceptance of exponent form numeric constants (123.45E-1). This applies whenever QM converts a character string to a numeric value.

The $QUERY.DEFAULTS record has been extended to allow specification of the format code to be applied to the automatically inserted @ID column if there is no dictionary entry.

The $BASIC.OPTIONS record now supports turning off compiler modes. This is useful if a shortcut name is used that sets many modes but some are not wanted.

Include records to be inserted automatically into all programs can now be specified in the $BASIC.OPTIONS record.

The QMBasic INPUTNULL and INPUTTRAP statements have been added.

The QMClient API QMIConv() and QMOConv() functions now have multivalued equivalents, QMIConvs() and QMOConvs().

The QMClient API QMIndices() function can be used to retrieve information about alternate key indices.

QM 3.4-0 (released 12 Dec 2014)

This release introduces connection pooling for QMClient sessions to improve performance of applications such as web servers that create many short life QMClient sessions. This is currently available only on Windows.

The user authentication mechanisms have been enhanced such that a Linux "user mode" installation of QM on which the qmlnxd daemon is running as root will now apply operating system level validation to the user name and password, running the QM process as this user name if login is successful. For systems with qmlnxd running as a non-root user, validation is performed using QM's own user register if security is enabled.

The automatic save and restore of the command stack when the $COMMAND.STACK X-type VOC record is present no longer treats a QMConsole session on Windows as a special case. The command stack is now stored in the stacks subdirectory of the account in which the user entered QM regardless of process origin. On ECS mode systems, the stack is saved in UTF-8 encoding. The GET.STACK and SAVE.STACK commands have been extended to allow an alternative file name to be specified.

When using a CALL correlative, the @ACALL.FNO variable contains the field number from the A/S-type dictionary item.

The DO.REMOTE command can be used to execute a command on a remote QM server.

The MAP command now has an option to list locally catalogued programs.

The CATALOGUE.LOCAL setting of the OPTION command causes the CATALOGUE and DELETE.CATALOGUE commands to default to using the local catalogue. Both commands have been extended to allow the mode to be explicitly specified as PRIVATE to override this default.

A USER option has been added to the WHO command to display the user name.

The QMBasic compiler now includes the ability to specify in the $BASIC.OPTIONS record a list of files that will be searched for include records.

The QMBasic FILEINFO(FL$OWNER) and OSPATH(OS$OWNER) functions can be used to find the owner of a file on Windows.

A new shared mode for files opened with OPENSEQ allows multiple QM processes to append data to the same file as might be required, for example, in an audit trail log.

The OS$FULLPATHX key to the QMBasic OSPATH() function acts like OS$FULLPATH but preserves the casing of file names on case insensitive file systems.

A new SYSTEM() function key, 1065, has been added to return information from the transaction cache. This can be used to obtain diagnostic information when tracking down faults in transactional applications.

The QMBasic TRY/CATCH construct has been extended to allow optional creation of a call stack trace when an exception is thrown.