Date: 05-28-2004 Subject: RELEASE 9.0 Runtime Files Included you will find the patch release of: PLBSERVE 9.0 28 May 2004 9,0,0,0 PLBCLIENT 9.0 28 May 2004 9,0,0,0 PLBCLICON 9.0 28 May 2004 9,0,0,0 PLBWIN 9.0 28 May 2004 9,0,0,0 PLBDSIGN 9.0 28 May 2004 9,0,0,0 SUNAAMDX 9.0 28 May 2004 9,0,0,0 SUNINDEX 9.0 28 May 2004 9,0,0,0 SUNSORT 9.0 28 May 2004 9,0,0,0 SETGUID 9.0 28 May 2004 9,0,0,0 SUNMOD 9.0 28 May 2004 9,0,0,0 MAKEDEF 9.0 28 May 2004 9,0,0,0 EMBEDINI 9.0 28 May 2004 9,0,0,0 MAKECON 9.0 28 May 2004 9,0,0,0 MAKECLI 9.0 28 May 2004 9,0,0,0 . ODSBAC32.DLL 9.0 28 May 2004 PLBWSEC.DLL 9.0 28 May 2004 9,0,0,0 SUNFYSYS.DLL 9.0 28 May 2004 9,0,0,0 SUNFHDLL.DLL 9.0 28 May 2004 9,0,0,0 SUNFHDLL.LIB 9.0 28 May 2004 SUNWADO.DLL 9.0 28 May 2004 9,0,0,0 SUNWODBC.DLL 9.0 28 May 2004 9,0,0,0 SUNWMSQL.DLL 9.0 28 May 2004 9,0,0,0 SUNWSRV.DLL 9.0 28 May 2004 9,0,0,0 . PLBCMP 9.0 28 May 2004 PLBDBUG 9.0 28 May 2004 ADMEQU.INC 9.0 28 May 2004 PLBEQU.INC 9.0 28 May 2004 PLBMETH.INC 9.0 28 May 2004 *============================================================================== Notes for some NEW Items: - Modified PL/B File IO to support 64bit operations. - Added compiler directives %ENCRYPTON and %ENCRYPTOFF. - Modified to support INTEGER 8 construct. - Added support for AAMDEX, INDEX, and new SORT statements. - Added support for TRANSACTION statement. - Added new statements DECODE64, ENCODE64, and OCCURS - Added new statements LISTCNT and LISTGET to process COLLECTIONs. - Added new instruction WHEREIS. - Added new statements DMAKE, DFREE, and DRELEASE. - Upgraded DBxxxx database statements and added new DBxxxx statements. - Added new DBxxxx support DLLs named SUNWODBC, SUNWADO, & SUNWMSQL. - Added support for Large DIM constructs. - Added INT8 and PINT8 to PROFILE and WINAPI. - Added new properties for FONT object. - Added %AUTODIM directive for PLBCMP. - Added new GUI object named ANIMATE. - Added new GUI object named LABELTEXT. - Added PLBCS_SINGLEUSE keyword for PLBCLIENT. - Added support for NT Service in the PLBSERVE server. - Added new Object Tree view for PLBDSIGN. - Added IMAGELIST and TIMER object support in PLBDSIGN. - Added new GUI object named MENUITEM. - Added MENU, SUBMENU, and FLOATMENU object support in PLBDSIGN. - Added a generic object pointer named OBJECT. *============================================================================== Notes for WARNINGS: *NOTE* ---------------------------------------------------------------------- *NOTE* ALL PROGRAMS MUST BE RECOMPILED FOR VERSION 9.0 AND ALL ISAM AND AAM *NOTE* FILES MUST BE REINDEX WITH A 9.0 SUNINDEX OR SUNAAMDX COMMAND!!!!!!! *NOTE* ---------------------------------------------------------------------- - The SUNFHSYS DLL for version 9.0 is not compatible with any prior runtime releases. If the v9.0 SUNFHSYS is used with a v8.x PLBWIN, then the runtime gives the following error: 'Fatal error condition U40 encountered.' If a v8.x SUNFHSYS is used with a v9.0 PLBWIN, then the Windows OS gives the following error: 'The procedure entry point FhDbGetDataSources could not be located in the dynamic link library SunFhSys.dll' - The PLBWSEC DLL for version 9.0 is not compatible with any prior runtime releases. For any PLBWIN and PLBWSEC version conflicts, the PLBWIN runtime gives the following error: 'Fatal error condition U21 encountered. Internal diagnostic condition 9. Invalid version of PLBWSEC.DLL being used!' - The version 9.0 PL/B runtimes are not compatible and can not execute any PL/B programs compiled for any prior versions. A U12 error will occur if a v9.0 runtime attempts to execute an older version of a PL/B program. Use a v9.0 PLBCMP to recompile a program that encounters this error. - All of the ISI and AAM indices must be re-indexed/aamdexed to be used/accessed using v9.0 PL/B programs. - The default port numbers for PLBSERVE and SUNFM have been changed to be 3933 and 3934 respectively. The new port numbers are User Registered Port Numbers as assigned to the Sunbelt server products by IANA ( Internet Assigned Numbers Authority ). - If a version 9.0 runtime can not be used to log on to a version 8.x file manager. An appropriate I81 occurs if this is tried. In addition, a version 8.x runtime can not be used to log on to a version 9.x file manager. - Corrections have been implemented for the SEARCH instruction to eliminate indeterminate results and GPF errors when data variables other than DIM or FORM variables were found in the variable list. With changes implemented to correct these problems, the SEARCH instruction now stops searching through the variable list when a variable other than a DIM or FORM is encountered. - The ENCRYPT and DECRYPT instructions have been modified for Unix forward byte-order runtimes to generate encryption strings compatible with reverse byte-order runtimes. The users for forward byte-order systems need to be aware that the encryption strings for these instructions for the version 9.0 release are NOT COMPATIBLE with prior releases for any forward byte-order runtimes. *============================================================================== Notes for DOCUMENTATION: - Added an I36 error when using the keyword 'PLBWIN_XPIO'. I36 - An OS fileio function has caused an error while the runtime is attempting to validate a file size in support of the PLBWIN_XPIO keyword. - Change the documentation for the I56 description as follows: I56 - This error indicates that an ISI file size is invalid. If the subcode has a value of 90, then the OS is reporting an EOF size for the ISI file that is smaller than the EOF size expected in the ISI header. This error indicates a problem where the OS is not properly tracking/reporting when the ISI file is being extended. If the subcode has a value other than 90, then the OS API function to retrieve the ISI EOF size has given an error. This is an OS system problem. Subcode: 90 - AllocateSector EOF size invalid! The OS reported EOF size is shorter than the expected ISI file size. - Added new error I37 to identify ISI data errors that indicate data corruption problems. I37 - ISI isam tree data is invalid. Subcode: 90 - Data for the ISI tree structure is determined to be invalid when an ISI key sector is being de-allocated and added to the free sector list. The ISI data structure may be corrupted. 91 - A sector retrieved from the ISI free sector list has an invalid free sector ID. The ISI data structure may be corrupted. 92 - An invalid DDR sector ID has been encountered while while processing through the DDR sector list to remove a single DRN (Data Record Number). 93 - An invalid DDR sector ID has been encountered while reading the next sequential sector in the DDR sector list. - Update the TYPE instruction for variable type values as follows: Data Type Sunbelt SWDBC INTEGER (8) 2056 (0x0808) 2 PANEL 11824 (0x2E30) 16 SPLITTER 12080 (0x2F30) 16 EDITNUMBER 12336 (0x3030) 16 EDITDATETIME 12592 (0x3130) 16 LABELTEXT 12848 (0x3230) 16 ANIMATE 13104 (0x3330) 16 - Update the DIALOG object data variable to indicate that the GUI object is an obsolete data type. - An A07 error needs to be added to the runtime errors. The A07 error can occur when accessing a SUNFM file manager to perform a FILEPI operation and more than 50 managed files are specified for the FILEPI. - A U50 error has been added to the runtime errors. The U50 error occurs if insufficient memory is available to load the Auto Load DIM variables that have been compiled into a program. The Auto Load DIM variables are compiled into a program when the 'DIM ^size' syntax is used explicitly or implicitly in a program. - The error I13 has been implemented to indicate errors for file variable BUFFER/FIXED/VAR values. Also, this error can occur when an invalid record length is specified in a PREP instruction for AFILE and IFILE file variables. I13 - Invalid record length for a PREP instruction. The record length is zero or greater than the maximum allowed record size. This error can also occur if a file variable BUFFER/FIXED/VAR keyword value is greater than the maximum allowed record size. The maximum allowed record size can not exceed 65533. Subcode: 20 - File variable BUFFER keyword size is too large. 21 - File variable FIXED keyword size is too large. 22 - File variable VAR keyword size is too large. 23 - The record size specified for an IFILE PREP is invalid. 24 - The record size specified for an AFILE PREP is invalid. - The I76 error has been added to the runtime errors. I76 - The data file size larger than ( 2GB - 65535 ) is not allowed when Windows 95/98/ME OS types are being used. Subcode: 20 - 2GB file size error has been detected using IFILE header data when opened with fixed length records. 21 - 2GB file size error has been detected using IFILE header data when opened with variable length records. 23 - 2GB file size error has been detected for a file variable accessing the data file directly. - The I28 error has been added to the runtime errors. I28 - The runtime dead lock time out has occurred. The runtime time has waited in an implied FILEPI lock longer than the number of seconds specified by the PLBWIN_DEADLOCKTIMEOUT keyword. The user applications should be evaluated to determine what files are being locked in one application versus what files are being locked in a second application at the point where the I28 has occurred. *============================================================================== The following files have been changed as follows: ------------------------------------------------------------------------------- PLBSERVE - Modified the default port number to be 3933. The 3933 port number has been assigned as the 'PL/B App Server User Port' by IANA (Internet Assigned Numbers Authority). This is the default port number used if the PLBCS_PORTNUM keyword is not used. - Modified the PLBSERVE server to support ADMLOGON operations using the normal logon listening entry point for the server using the default port number used by the server. This change has been implemented to avoid the necessity to use a different port number when accessing the Administrative Services over a TCP/IP connection. By default this main logon capability is enabled for the PLBSERVE server when the 'ADMIN_PUBLIC=' security keyword is being used. In addition, the keyword named 'ADMIN_MAINLOGN={on|off}' can be included in the PLBSERVE INI file. If the 'ADMIN_MAINLOGON' keyword is set to 'OFF', ADMLOGON via the main logon entry point is disabled. - Modified the PLBSERVE runtime to allow a keyword to be searched for in the default PLBSERVE INI used by the server in the section named ENV_CHILD if the keyword is not found for the normal INI file processing. This change is being made to provide a means of specifying default keyword settings when a keyword is not found in a user specific INI file. - The PLBSERVE server has been enhanced to execute as a Windows service. This requires the use of the SUNWSRV.DLL file. This DLL file must be placed in the same location as the PLBSERVE.EXE file. New command line options have been added to the PLBSERVE server as follows: '-i' - The new '-i' command line option installs the PLBSERVE server as a Windows Service using a combination of the server name and the user serial number for identification. This allows multiple PLBSERVE servers to be used as a service on the same computer. The PLBSERVE Windows Service is installed in an automatic running state. This running state can be changed using the services control panel. '-d' - The new '-d' command line option deletes/uninstalls the PLBSERVE as a Windows Service. '-p' - The new '-p' command line option pauses the main PLBSERVE server logon process. When in a paused state, no new child or administrative tasks are created by the main logon process. All existing users still continue to run. The '-p' command line option can be used to pause the PLBSERVE server main logon task when the server is executing as a Windows Service or as a stand-alone server. When the PLBSERVE server is executing as a service, then the '-p' command line option, the services control panel, or the SC.EXE command can be used to pause the server. '-c' - The new '-c' command line option is used to allow the PLBSERVE server logon process to continue from a paused state. When the PLBSERVE server is executing as a service, then the '-c' command line option, the services control panel, or the SC.EXE command can be used. For stand-alone servers, only the '-c' command line option can be used. Note: 1. A PLBSERVE server service can be started by one of 3 ways: a) The service can be started automatically. b) The service can be started using the service control panel. c) The service can be started using the SC.EXE (Service Control) utility. 2. The '-s' command line option does not start a server as a service. It only starts a PLBSERVE server as a stand-alone process. 3. A PLBSERVE server service can be stopped using one of the following: a) The '-t' command line option can be used. b) The '-f' command line option can be used. c) The services control panel can be used. d) The SC.EXE command can be used. - A new keyword named 'PLBCS_CACHEAVIS={None|Mem|Disk}' has been added for the PLBSERVE server. This keyword specifies the default caching to be performed at a PLBCLIENT workstation for any AVI files obtained from a PLBSERVE server. NONE - No caching (default). MEM - Cache in-memory only. DISK - Cache in-memory and on disk. - Corrected a problem where the INI keyword searching was not being executed to access all possible INI files. This problem was occurring when the PLBSERVE server was started to use the default PLBSERVE.INI file. The keyword searching now is executed as documented by Note 8. for CLOCK INI in the Language Reference Manual. - Corrected a problem where a Unix PLBSERVE server was not setting up a PLBCLIUNX client terminal. This fix corrects problems with *EOFF and *+ for a KEYIN instruction when a Unix client was used. - Corrected a problem where an IMPLODE instruction could erase the instruction cache. This could cause a program to execute in an indeterminate manner because cached instructions were being lost. ------------------------------------------------------------------------------- PLBCLIENT- Modified the default port number to be 3933. The 3933 port number has been assigned as the 'PL/B App Server User Port' by IANA (Internet Assigned Numbers Authority). This is the default port number used if the PLBCS_PORTNUM keyword is not used. - A new keyword named 'PLBCS_SINGLEUSE={on|off}' has been added for the PLBCLIENT executable. When the PLBCS_SINGLEUSE is specified and set to be ON, then the PLBCLIENT executable only loads and executes one plbclient process. In this case, when a user attempts to load a second instance of PLBCLIENT, then the first load of plbclient is executed. When the PLBCS_SINGLEUSE is either set to be OFF or the keyword is not specified, then as many PLBCLIENT load instances can be loaded/executed as allowed by the server user license. - Added a command line option '-?' for PLBCLIENT and PLBCLICON clients to provide a command line syntax help screen. ------------------------------------------------------------------------------- PLBWIN - Modified the runtimes to support 64 bit File IO. This allows PLBSERVE files larger than 4GB to be processed by the PL/B File IO PLB (UNIX) language statements. - Modified the runtimes to always access a SUNFM file manager using a default Public Encryption key if a user's application does not specify an Encryption key to be used. This change insures that all data transferred to and from the SUNFM file manager is secured. - Modified GETFILE to support a RECORDCOUNT= and a DELETECOUNT= option. The RECORDCOUNT retrieves the current record count from an ISI header. The DELETECOUNT retrieves the current deleted record count from an ISI header. - Modified the runtimes to support an AAM/ISI header OS Type flag. The AAM/ISI index files can be created with a Windows or Unix OS Type. If the OS Type exists, then the AAM/ISI index file can only be opened by a runtime that is compatible with the OS Type stamp. If a Windows runtime attempts to open a Unix ISI or if a Unix runtime attempts to open a Windows ISI, then an I20 error occurs. The PREPARE instruction has been modified for an AFILE and IFILE to support a new MODE bit definition named CMP_BY_OSTYPE. When the CMP_BY_OSTYPE mode bit is specified for the PREP, then the AAM/ISI index file is marked with an OS Type depending on whether the runtime is a Windows or Unix type. CMP_BY_OSTYPE 0x00000800 Set AAM/ISI header flag that only allows index file to be opened by a compatible Windows or Unix runtime. - When using the keyword 'PLBWIN_XPIO=ON', an I36 error will be given that indicates a file size truncation problem has been detected. Prior to this change, an I56 error was being given. - Modified the Isam processing for Deleted Data Records to provide and verify a sector identifier for all DDR sectors. If an error is detected for an invalid DDR ID, then an I37 error with a subcode of 92 or 93 is given. If an I37 error occurs, then the ISI tree structure data is invalid and should not be used for further processing until it is corrected. - Modified the OPEN and PREP operations for accessing managed files on a SUNFM server to use a default port number of 3934 instead of 502. The 3934 port number has been assigned as a registered user port number by IANA ( Internet Assigned Numbers Authority ). - The optional File Access Mode parameter for an OPEN and PREP instruction has been modified to support a new mode named CMP_NO_TRAN. When a file variable is opened or preped using this mode bit type, then the file variable does not get included into a transaction. However, the file IO operations can be executed while a transaction is active. CMP_NO_TRAN 0x00001000 - Do not put file under a transaction - Added a new instruction named TRANSACTION. The TRANSACTION instruction is implemented for the PL/B language to allow a group of PLB file IO operations to be performed without modifying any data files until a COMMIT action is executed. This instruction is formatted as: [label] TRANSACTION {action}[,{options}] Where: label - optional Program Execution Label. action - one of the required actions from the table below. options - A list of options based upon the action operand. See notes below. Flags affected: EOS and OVER Note the following: 1. The {action} operand defines the action to be taken. It must be from the following table: START Starts a transaction COMMIT Ends the transaction and commits the data ROLLBACK Ends the transaction without committing the data SAVE Create a new save point RESTORE Restores back to a save point INFO Provides information on the state of the transaction 2. For a START {action} the {options} parameter can be list of logical FILE, IFILE, and/or AFILE variables or a FILELIST to be locked. Each file on the list is locked for the duration of the transaction. The list of files are referenced as a {file lock list}. The TRANSACTION START instruction gives a U48 error if it is executed while a transaction is active. 3. For a COMMIT {action} the {options} parameter can be a VERIFY or VERIFYREAD keyword. By default there is no data integrity verification performed by the COMMIT action. The reason for this default behavior is that all files specified by the TRANSACTION statement are locked for the transaction duration and thus the data files can not be changed by other processes that are using expected locking rules. However, there may be some special situations where a user application wants to perform additional data integrity verification. Additional data verification is initiated using the VERIFY or VERIFYREAD keywords with the transaction COMMIT action. VERIFY - This keyword causes all read/write data that is cached for the transaction to be verified when the transaction is committed. This mode insures that no data associated with the transaction has changed while the transaction was active. The VERIFY mode should only need to be used if there is a possibility that some application other than a Sunbelt application can change data in the data files being used for a transaction. VERIFYREAD - Use of this keyword causes a read text verification operation to be performed for file variables that are not included in the {file lock list}. This means that any data that has been read from a text data file is verified to insure that the text data has not been changed by another program. For this read text verification mode, an IO error occurs if any of the physical disk data associated with the cached read data has been changed after it has been read and before the commit operation is executed in the transaction. The read text verification mode does not occur when a file variable is included in the {file lock list} because; other programs can not change the data while the file variable is locked. The TRANSACTION COMMIT instruction gives a U48 error if it is executed when a transaction is not active. 4. For a RESTORE {action} the {options} parameter can be the 'LEVEL={dnumnvar}' keyword. If not specified, the RESTORE {action} restores to the previous level. Otherwise the RESTORE {action} restores to the specified level. The RESTORE action is used to restore the current cached file data to be the same as previously saved using a SAVE action. The TRANSACTION RESTORE instruction gives a U48 error if it is executed when a transaction is not active. 5. For an INFO {action} the {options} parameter can be the 'LEVEL={nvar}' keyword. The current transaction level is placed in the specified variable. A level of 0 means no transaction is taking place. The TRANSACTION INFO instruction can be executed any time regardless of whether a transaction is active or not. 6. For a SAVE {action} the {options} parameter can be the 'LEVEL={nvar}' keyword. The LEVEL keyword in this case is optional. In this case, the {nvar} numeric variable is used return the current level value after the save action is completed. The SAVE action saves all cached data currently in use for a transaction. The RESTORE action can be used to restore the cashed data files to be the same as save by a SAVE action. The TRANSACTION SAVE instruction gives a U48 error if it is executed when a transaction is not active. 7. A ROLLBACK {action} has no {options} parameter. The ROLLBACK action discards all cached data generated for a transaction. The state of the physical disk data files specified in the {file lock list} remains unchanged and the file variables are restored to an original state as when the transaction was started. The TRANSACTION ROLLBACK instruction gives a U48 error if it is executed when a transaction is not active. 8. Any file variables opened in the READ only mode do not need to be included in the {file lock list}. Any file IO operations for these files are executed and no resulting data for these files is maintained by the runtime for a transaction. 10. Any file variables opened in the EXCLUSIVE mode must be included in the {file lock list} to allow write operations under transaction control. 11. Transaction Errors - A transaction rollback is executed if an untrapped or untrappable error occurs. - A U48 error is given for programmatic errors. Sub-codes of U48 are from 200 to 299 201 Transactions not supported 202 Invalid operation/statement 203 Unknown statement type 204 A Transaction is already active 205 No active transaction 206 Greater than 250 save points 207 Bad restore value 208 No optimistic support 209 Commit and backout failed 210 DISPLAY redirection not allowed 211 SETPROP VISIBLE for COLLECTION, PLFORM, or a WINDOW object is not allowed. - An I27 error is given for transaction errors. Sub-codes of I27 are from 100 to 199 101 Memory allocation failed 102 Unable to get an EOF 103 EOF has moved 104 Unable to lock for commit 105 Read verify failed 106 IO error on commit 107 Maximum read gaps seen 108 I/O error on flush 109 2GB size violation error - An A06 error has been added for a TRANSACTION instruction. This error occurs when a file in the TRANSACTION START file list is not opened. - An A08 error has been added for a TRANSACTION instruction. This error occurs when a FILE variable opened in a Record Locking mode is included in the TRANSACTION START {file lock list}. ------------------------------------------------------------------ The TRANSACTION statement is implemented with the following capabilities and limitations: 1. A transaction supports both local files and managed files for multiple file managers. 2. A transaction locks all files in a manner consistent with FILEPI. This means that any files specified in the TRANSACTION START statement are locked in the same manner as a FILEPI. In addition, any IO operations for AAM and ISI files in a transaction, that are not included in the TRANSACTION START file list, cause an implied file lock to occur as normally expected. It should also be noted that a FILEPI statement can not be executed when a TRANSACTION is active. 3. A transaction supports record locking. Only AFILE and IFILE files opened for record locking can be included in a transaction and used in write operations. 4. A transaction only allows files that are specified in the TRANSACTION START {file lock list} to be used in write operations. An IO error occurs if a write operation is executed for a file variable that is not included in the {file lock list}. 5. Transaction support has been implemented for PL/B using the ACID (Atomicity Consistency Isolation Durability) rules: Atomicity A transaction represents an atomic unit of work. Either all modifications within a transaction are performed, or none of the modifications are performed. Consistency When committed, a transaction must preserve the integrity of the data within the system. If one part of the transaction fails, all of the pending changes are rolled back, leaving the database in its' original state. Isolation Modifications made by a transaction are isolated from the modifications made by other transactions. Durability After a transaction has been committed, all modifications are permanently in place in the system. 6. Transaction Limitations Only 250 concurrent SAVE points are allowed. When an invalid PL/B instruction is executed while a TRANSACTION is active, then an U48 untrappable error occurs. The following statements are not allowed under any TRANSACTION: ACTIVATE AAMDEX ALERT CLOSE COPYFILE CREATE DISPLAY (*W ONLY) ERASE EVENTCHECK EVENTWAIT EXECUTE EXTCALL FILEPI FORMLOAD GETFNAME INDEX KEYIN Object methods OPEN PAGESETUP PAUSE PREP PRINT PRTCLOSE PRTOPEN PRTPAGE PRTPLAY RELEASE RENAME ROLLOUT SETPROP (VISBLE property for COLLECTION, PLFORM, WINDOW) SNDOPEN SORT SPLOPEN SPLCLOSE TRANSACTION START WEOF A TRANSACTION ROLLBACK is performed for the following instructions: CHAIN DSCNCT DETACH SHUTDOWN STOP - The DBxxxx instructions have been updated and improved to provide a better interface to multiple Database Engines. 1. The Windows implementation now supports Active Data Objects (ADO), MySQL, and Open DataBase Connectivity (ODBC). 2. ODBC, MySQL, and PostgresSQL are supported for Unix/Linux. 3. The DBxxxx instruction set has been enhanced to allow multiple connections to different Database Engines at the same time. In addition, the user's application can have multiple active SQL statements that provide different result data sets using multiple DBSTATEMENT variables for a single connection of a DBFILE variable. 4. A new data variable named DBSTATEMENT has been added. A DBSTATEMENT variable declares a working storage for a database SQL statement. 5. The following instructions support either a DBFILE or a DBSTATEMENT variable. DBBREAK Halt an executing query. DBCLEAR Clears out any data placed by a DBSEND. DBERROR Obtain error information from a remote database. DBEXECUTE Execute a query on a remote database. DBFETCH Return one row of a query result. DBSEND Send all or part of a query to a remote database. DBSTATE Determine the state of query. The following are NEW instructions: DBFETCHP Return the previous row of a query result. DBPREPARE Prepares a SQL statement. DBRESULT Return the number of affected row by a DELETE, INSERT or UPDATE operation. 7. The following instructions only support a DBFILE variable. DBCONNECT Connect to a remote database. DBDISCONNECT Disconnect from a remote database. The following is a NEW instruction: DBTRANSACTION Provides access to transaction support on a database connection. 8. The following instructions only support a DBSTATEMENT variable. These instructions are NEW: DBCLOSE Close a database statement. DBOPEN Open a database statement. 9. See the PL/B Language Reference Manual for specific details and syntax of enhanced DBxxxx instructions. 10. The following notes give a brief description of changes applied to the DBxxxx instructions. ------------------------------------------------------ DBSTATEMENT (New Variable) The DBSTATEMENT declares a PL/B variable in a user application that is used to process a SQL statement using a pre-existing database connection identified by a DBFILE variable. The DBOPEN instruction is used to associate the DBSTATEMENT variable with the DBFILE variable whose connection was established using the DBCONNECT instruction. After the DBOPEN instruction has been executed for a DBSTATEMENT, then this DBSTATEMENT variable can be used in a subsequent DBEXECUTE and other DBxxxx instructions to process the SQL statement that was executed. The DBSTATEMENT defines a working space in a user application that is used to process a SQL statement using a pre-existing database connection (DBFILE). The DBOPEN instruction is used to associate the DBSTATEMENT with the DBFILE that has been previously connected using a DBCONNECT instruction. It uses one of the following formats: (1) label DBSTATEMENT [*|%] (2) label DBSTATEMENT ^ ------------------------------------------------------ DBBREAK The DBBREAK instruction has been modified to support either a DBFILE variable or a DBSTATEMENT variable. ------------------------------------------------------ DBCLEAR (New Instruction) The DBCLEAR instruction clears any previous DBSEND data The instruction uses the following format: [label] DBCLEAR {dbfile | dbstatement} ------------------------------------------------------ DBCLOSE (New Instruction) The DBCLOSE instruction closes a database statement. The instruction uses the following format: [label] DBCLOSE {dbstatement} ------------------------------------------------------ DBCONNECT The DBCONNECT instruction has been modified to allow connections to multiple Database Engines at the same time. A new bit map flag value option has been added to the instruction. The instruction uses the following format: [label] DBCONNECT [{window};]{dbfile},{host}: {user},{pass}[,{conn}[,{ext}][,{flags}]] The {flags} has been added as a bit map operand. It is an optional Numeric Variable or decimal number indicating any special settings for the connection. Note the following for all connection types: 1. The optional {window} parameter is used only for the Windows ODBC database driver. 2. The {host} parameter can contain a driver name indicator in the format ;;. The driver indicator is used to obtain an entry from the INI file with the same name as the driver indicator. The entry must contain the name of the driver library first. Then using comma separation the entry can also contain a replacement host value and a replacement ext value. Example {host} parameter strings for program: . . Connection Strings . OdbcHost INIT "Myodbc3-test" OdbcHost1 INIT "Sun Test" MyHost INIT "MYSQL;;111.0.0.1" AdoHost INIT "DBADO;;DSN=Myodbc3-test" Example INI entries: MYSQL=Sunwmsql.dll DBADO=Sunwmado.dll 3. A special driver library name of 'FILEMAN' can be used to access a Database connection through a file manager. The entry in the INI file must have a driver library name of 'FILEMAN', the I/P address of the file manager, and then the port number of the file manager, all separated by commas. The file manager configuration file must also have an entry that has the same name as the driver indicator. The entry must contain the name of the driver library first. Then using comma separators, the entry can also contain a replacement host value and a replacement ext value. Example {host} parameter strings for program: OdbcHost INIT "ODBCR;;MyOdbc3-test" OdbcHost1 INIT "ODBCR;;Sun Test" MyHost INIT "MYSQL;;111.0.0.1" AdoHost INIT "DBADO;;MyOdbc3-test" AdoHost1 INIT "DXADO;;" Example INI entries to access SUNFM: ODBCR=FILEMAN,99.0.0.1,3934 MYSQL=FILEMAN,99.0.0.1,3934 DBADO=FILEMAN,99.0.0.1,3934 Example CFG entries for SUNFM: ODBCR=Sunwodbc.dll MYSQL=Sunwmsql.dll DBADO=Sunwado.dll DXADO=Sunwado.dll,DSN=MyOdbc3-testX 4. If no driver name indicator is found, a Windows runtime defaults to the ODBC driver and the PLB_SQL keyword is used for a Unix runtime. 5. The {flags} operand can be a combination of the following values: Value Description 1 The cursor should be kept at the server 2 The cursor should be kept at the client Note the following for ADO connections: 1. The {window} option is disregarded. 2. The {host} operand is an ADO specific connection string. 3. {user} is not used and may be specified as the null literal "". 4. {pass} is not used and may be specified as the null literal "". 5. {conn} is not used. 6. If {ext} contains 'READ' then the database is opened in READ ONLY mode. Note the following for ODBC connections: Notes for ODBC connections are the same as documented in the PL/B Language Reference Manual. Note the following for MySQL and UNIX SQL connections: Notes for MySQL and UNIX SQL connections are the same as documented in the PL/B Language Reference Manual. ------------------------------------------------------ DBDISCONNECT The DBDISCONNECT instruction is basically the same as for prior releases. However, if DBSTATEMENT variables have been opened using this DBFILE, then all of these DBSTATEMENT variables are automatically closed when the DBFILE is disconnected. ------------------------------------------------------ DBERROR The DBERROR instruction has been modified to support either a DBFILE variable or a DBSTATEMENT variable. ------------------------------------------------------ DBEXECUTE The DBEXECUTE instruction has been modified to support either a DBFILE variable or a DBSTATEMENT variable. In addition, the DBEXECUTE instruction has been modified allow an optional set of {parameters}. The instruction has the following format: [label] DBEXECUTE {dbfile|dbstatement} [ USING {parameters}...] The new optional parameters can be a Character String Variable, or a Numeric variable. These parameters are used for any parameters specified in a SQL statement. ------------------------------------------------------ DBFETCH The DBERROR instruction has been modified to support either a DBFILE variable or a DBSTATEMENT variable. [label] DBFETCH {dbfile|dbstatement},{timeout};{list}[;] ------------------------------------------------------ DBFETCHP (New Instruction) The DBFETCHP instruction retrieves the previous row (record) of a query result. The instruction uses the following format. [label] DBFETCHP {dbfile | dbstatement},{timeout};{list}[;] Note the following: 1. The basic operation of the DBFETCHP instruction is like the DBFETCH instruction. However, the row data is retrieved in a reverse order to that of a DBFETCH instruction. 2. The DBFETCHP instruction is similar to the READKP or READKGP instructions and retrieves the records previously DBFETCHed in the reverse order. 3. If the instruction ends with a ';', the row pointer is left pointing to the current row and a subsequent DBFETCHP instruction continues retrieving data from the ending position of the prior DBFETCHP instruction. 4. The DBFETCHP statement will D215 error if the cursor type is a forward-only cursor. See DBOPEN for cursor types. ------------------------------------------------------ DBOPEN (New Instruction) The DBOPEN instruction opens a new SQL statement for a database connection. The instruction uses the following format: [label] DBOPEN {dbstatement},{dbfile}[,CURSOR={cursor}] Note the following: 1. The DBFILE variable must be already connected to a database. 2. Multiple DBSTATEMENTs can be open on one DBFILE at the same time. 3. The supported cursor types are as follows: Value Function 0 Uses a forward-only cursor. A static copy of a set of records. Additions, changes, or deletions by other users are not visible. The DBFETCHP instruction is not allowed. This is the default cursor type if the CURSOR keyword is not specified. 1 Uses a keyset cursor. Changes, and deletions by other users are visible. The DBFETCHP instruction is allowed. 2 Uses a dynamic cursor. Additions, changes, and deletions by other users are visible. The DBFETCHP instruction is allowed. 3 Uses a static cursor. A static copy of a set of records. Additions, changes, or deletions by other users are not visible. The DBFETCHP instruction is allowed. ------------------------------------------------------ DBPREPARE (New Instruction) The DBPREPARE instruction sends the current SQL statement to the remote database to be prepared for faster access. The instruction uses the following format: [label] DBPREPARE {dbfile | dbstatement} Note the following: 1. The prepared SQL statement can request parameters during execution through the use of the ? character. 2. A SQL statement must be created using DBSEND before a DBPREPARE can be executed. ------------------------------------------------------ DBRESULT (New Instructions) The DBRESULT instruction is used to obtain the number of rows affected by a DELETE, INSERT or UPDATE SQL operation. The instruction uses the following format: [label] DBRESULT {dbfile | dbstatement}{sep}{result} Note the following: 1. If the {result} is equal to zero, the ZERO (or EQUAL) Condition Fag is set (TRUE). 2. If {result} is too small to contain the value, the OVER Condition Flag is set (TRUE). 3. If the SQL operation is not a DELETE, INSERT or UPDATE, the result value is indeterminate. ------------------------------------------------------ DBSEND The DBSEND instruction has been modified to support either a DBFILE variable or a DBSTATEMENT variable. The instruction uses the following format: [label] DBSEND {dbfile | dbstatement};{list} ------------------------------------------------------ DBSTATE The DBSTATE instruction has been modified to support either a DBFILE variable or a DBSTATEMENT variable. The instruction uses the following format: [label] DBSTATE {dbfile | dbstatement} ------------------------------------------------------ DBTRANSACTION (New Instruction) The DBTRANSACTION instruction is used to initiate and terminate a transaction. The instruction uses the following format: [label] DBTRANSACTION {dbfile},{transtype} The {dbfile} is a DBFILE variable defining the database associated with the connection. The {transtype} is a keyword specifying the transaction type. Note the following: 1. The underlying database engine must support transactions. 2. {transtype} may be one the following keywords: Keyword Specified Action ... START Starts a transaction COMMIT Commits the transaction to the database ROLLBACK Discards the transaction - The SQUEEZE instruction has been modified to support an alternate syntax form that specifies a 'KEEP=' keyword. This alternate syntax form is as follows: Format: (2) [label] SQUEEZE {source},{dest}[,KEEP={chars}] Where: {chars} - This is an optional previously defined Character String Variable or Literal indicating the characters to keep from the source string during the transfer when the syntax format (2) is being used. Note the following: 1. If the {chars} is a null variable, spaces are the only characters kept when the {source} string data is transferred to the {dest} variable. - The IMPLODE instruction has been modified to support an optional GIVING syntax form. This change allows an item count of the imploded items stored into the {dest} variable to be returned in a Numeric variable. The new syntax format is as follows: Format: IMPLODE {dest}{sep}{delm} GIVING {result}{sep}{vlist} Where: {dest} - Same as documented in PL/B Manual. {sep} - Same as documented in PL/B Manual. {delm} - Same as documented in PL/B Manual. {result} - This is a Numeric variable that receives the number of items that have been stored into the {dest} variable from the {vlist} list of variables. {vlist} - Same as documented in PL/B Manual. Example: A INIT "A" B INIT "B" C INIT "C" NVAR FORM 3 . IMPLODE S$CMDLIN,";" GIVING NVAR,A,B,C IMPLODE S$CMDLIN,";" GIVING NVAR USING A,B,C IMPLODE S$CMDLIN,";",A,B,C IMPLODE S$CMDLIN,";" USING A,B,C - The EXPLODE instruction has been modified to support an optional GIVING syntax form. This change allows an item count of the exploded items processed from the {source} variable and stored into the variables in the destination list. The new syntax format is as follows: Format: EXPLODE {source}{sep}{delm} GIVING {result}{sep}{vlist} Where: {source} - Same as documented in PL/B Manual. {sep} - Same as documented in PL/B Manual. {delm} - Same as documented in PL/B Manual. {result} - This is a Numeric variable that receives the number of items that have been processed from the {source} and stored into the variables of the {vlist}. {vlist} - Same as documented in PL/B Manual. Example: SRC INIT "A;B" A DIM 5 B DIM 5 C DIM 5 NVAR FORM 3 . EXPLODE SRC,";" GIVING NVAR,A,B,C EXPLODE SRC,";" GIVING NVAR USING A,B,C EXPLODE SRC,";",A,B,C EXPLODE SRC,";" USING A,B,C - A new instruction named OCCURS has been added to the PL/B language. This instruction scans the {search} logical string counting the number of times that the source string is found in the search variable string. The number of times that the string is found is stored into the third variable as the result. The syntax format for this instruction is as follows: is as follows: Format: OCCURS {source}{sep}{search}{sep1}{result} Where: {source} - This parameter can be a Character String Variable, a Character Literal, an Equate character value, or a character value specified as a decimal, octal, or hexadecimal number. {sep} - This is a comma or one of the following prepositions: BY, TO, OF, FROM, USING, WITH, IN, or INTO. {search} - This is a Character String Variable or Literal whose logical string is searched looking for string comparisons as specified in the {source} parameter. {sep1} - This is a comma or one of the following prepositions: BY, TO, OF, FROM, USING, WITH, IN, INTO or GIVING. {result} - This is a Numeric Variable that receives the number of times that the {source} string is found in the {search} string. Flags Affected: EOS, OVER, ZERO Note the following: 1. The {source} and {search} variables are not changed by the operation of this instruction. 2. The EOS flag is set TRUE if either the {source} or {search} variables are a Character String Variable and the variable is NULL. 3. The ZERO flag is set TRUE if the search count that is stored into the {result} is zero. 4. The OVER flag is set TRUE if the {result} Numeric Variable is too small to receive the search count. Example: SOURCE INIT "ABC,DEF,RST" COMMA INIT "," NVAR FORM 5 . OCCURS COMMA IN SOURCE GIVING NVAR OCCURS ",",SOURCE,NVAR OCCURS 0x2C,SOURCE,NVAR - A new instruction named WHEREIS has been added to the PL/B language. This instruction scans the {search} logical string to find the first occurrence where the source string is found in the search variable string. If the source string is found in the search variable string, then the formpointer location value in the search variable where the source string was found is stored into an optional {result} variable. Neither the source nor the search string variables are changed by the WHEREIS instruction. The syntax format for this instruction is as follows: Format: WHEREIS {source}{sep}{search}[{sep1}{result}] Where: {source} - This parameter can be a Character String Variable, a Character Literal, an Equate character value, or a character value specified as a decimal, octal, or hexadecimal number. {sep} - This is a comma or one of the following prepositions: BY, TO, OF, FROM, USING, WITH, IN, or INTO. {search} - This is a Character String Variable or Literal whose logical string is searched looking for a string comparison as specified in the {source} parameter. {sep1} - This is a comma or one of the following prepositions: BY, TO, OF, FROM, USING, WITH, IN, INTO or GIVING. {result} - This is an optional Numeric Variable that receives the formpointer value in the {search} string where the {source} string was found. Flags Affected: EOS, OVER, ZERO Note the following: 1. The {source} and {search} variables are not changed by the operation of this instruction. 2. The EOS flag is set TRUE if either the {source} or {search} variables are a Character String Variable and the variable is NULL. 3. The ZERO flag for the WHEREIS instruction is set to be FALSE when the {source} string is found in the {search} variable. The ZERO flag is set to be TRUE if the {source} string is not found in the {search} string. 4. The OVER flag is set TRUE if the {result} Numeric Variable is too small to receive the search formpointer value. Example: SOURCE INIT "ABC,DEF,RST" COMMA INIT "," NVAR FORM 5 . WHEREIS COMMA IN SOURCE GIVING NVAR WHEREIS ",",SOURCE WHEREIS 0x2C,SOURCE - A new instruction named ENCODE64 has been added to the PL/B language. This instruction encodes characters from the logical string of a source DIM variable and stores encoded characters into a destination DIM variable. The ENCODE64 instruction implements Base64 encoding as described in RFC2045, sec. 6.8. The main purpose of this instruction is to encode into strict ASCII strings that then can be written to other devices that cannot handle binary data. The syntax format of this instruction is as follows: Format: ENCODE64 {source}{sep}{dest} Where: {source} - This is a Character String Variable or Literal. The logical string of this variable is processed to transfer the translated characters to the {dest} variable. {sep} - This is a comma or one of the following prepositions: BY, TO, OF, FROM, USING, WITH, IN, or INTO. {dest} - This is a Character String Variable that receives the translated characters as processed from the {source} logical string. Flags Affected: EOS Note the following: 1. The EOS flag is set TRUE if the {source} variable is NULL. In this case, the {dest} variable is also set to be NULL. 2. The OVER flag is set TRUE if the {dest} variable is too small to receive the translated characters as processed from the source logical string. The required size of the {dest} variable can be calculated as follows: DestLen = ( ( SourceLength + 2 ) / 3 ) * 4 ) - A new instruction named DECODE64 has been added to the PL/B language. This instruction decodes characters from the logical string of a source DIM variable and stores decoded characters into a destination DIM variable. The DECODE64 instruction implements decoding for Base64 encoded strings as described in RFC2045, sec. 6.8. The normal {source} input string for the DECODE64 instruction is the output string as generated by the ENCODE64 instruction. The syntax format for this instruction is as follows: Format: DECODE64 {source}{sep}{dest} Where: {source} - This is a Character String Variable or Literal. The logical string of this variable is processed to transfer the translated characters to the {dest} variable. {sep} - This is a comma or one of the following prepositions: BY, TO, OF, FROM, USING, WITH, IN, or INTO. {dest} - This is a Character String Variable that receives the translated characters as processed from the {source} logical string. Flags Affected: EOS Note the following: 1. The EOS flag is set TRUE if the {source} variable is NULL. In this case, the {dest} variable is also set to be NULL. 2. The OVER flag is set TRUE if the {dest} variable is too small to receive the translated characters as processed from the source logical string. The required size of the {dest} variable can be calculated as follows: DestLen = ( ( SourceLength * 3 ) / 4 ) - Two new instructions named AAMDEX and INDEX have been added to the PL/B language. In addition, the SORT instruction has been re-written to include new features. The utility instructions have been implemented to provide all of the capabilities as found for the Sunaamdx, Sunindex, and Sunsort utilities. The syntax formats for the utility instructions are as follows: Format: AAMDEX {cmd}[,SUNFM={ip}][,CANCEL={cancel}][,OUTPUT={dlist}] INDEX {cmd}[,SUNFM={ip}][,CANCEL={cancel}][,OUTPUT={dlist}] SORT {cmd}[,SUNFM={ip}][,CANCEL={cancel}][,OUTPUT={dlist}] Where: {cmd} - This is a Character String Variable or Literal. The logical string for {cmd} is exactly the same as the corresponding utility command line not including the utility executable name. {ip} - This is a Character String Variable or Literal. The logical string for {ip} is the TCP/IP address and port number of the SUNFM File Manager where the utility instruction is to be executed. This parameter is optional. Examples of the {ip} string are as follows: 127.0.0.1:3934 127.0.0.1 {cancel} - This is a {dnumnvar} numeric value or a BUTTON object that has been previously created. This parameter is optional. This parameter identifies a user interface that can be used to cancel the processing for the utility instruction. {dlist} - This is a DATALIST object that has been previously created. The DATALIST object is used to receive operational output for the utility instruction. Flags Affected: OVER Note the following: 1. The OVER flag is set TRUE if the utility instruction encounters a failure. 2. If the OVER flag is set TRUE, then the S$ERROR$ variable contains the error data as follows: S02 - Read Error S03 - Open Error S04 - Prep Error S08 - Write Error S09 - Memory Error S11 - Large File Support Error S13 - Syntax Error SubCodes 3 to 30 are as follows: 3 - Invalid read size accessing temporary work file. 4 - Invalid read size accessing input data file. 5 - Invalid EOR found for record in input data file. 6 - Invalid fixed record size found for input file. 7 - Variable record length larger than maximum allowed. 8 - Error writing to output file. 9 - Insufficient memory to allocate buffers. 10 - Data file is not in correct format. 11 - Invalid parameter for '-i' option. 12 - Help screen not available. 21 - The operation was canceled by the user. SubCodes 100 to 159 are as follows: 100 - Bad Output File Name 101 - Unable to open an ISI file. 102 - The ISI version is invalid. 103 - ISI header key info invalid. 104 - Invalid command line syntax 105 - Read error accessing text data 106 - Error creating output file 107 - File name too long 108 - Invalid record length specification 109 - Error generating temporary file name. 110 - Error opening/creating temporary work file. 111 - The key specification is too big 112 - Invalid command line syntax 113 - Invalid to overlap keys 114 - ISI maximum key size is too large. The total key size can not be larger than 99. 115 - ISI maximum number of key specs exceeded. The total number of key specs is more than 31 116 - Invalid input file name. 117 - Unable to open alternate sort sequence file 118 - Invalid primary option syntax. 119 - Invalid alternate sort sequence file name. 120 - Unable to open the input file. 121 - Unable to determine file size for input file. 122 - Filename+Extension size limited to 47 characters. 123 - Filename+Extension size limited to 47 characters. 124 - Conflicting utility options specified. (f, s, & v). 125 - Cannot use L option with V or S option 126 - The Output file name can not be same as Input name. 127 - Record size not valid for file length found. 128 - Conflicting key options. 129 - 'm' option fill percentage is invalid. 130 - Invalid reformat specification syntax! 131 - Insufficient memory to support Reformat option! 132 - Output file not specified for tag file specification. 133 - Options '-f or -g' require record length specification. 134 - Output file not given for reformat file specification. 135 - Cannot use more than 10 'P' option parameters! 136 - Uppercase option must be given prior to key specification. 137 - Conflicting record length specifications. 138 - File too large to index without using 'L' option! 139 - Invalid AAM output file name. 140 - Unable to open AAM file. 141 - Not a valid .aam file 142 - Unable to use AAM file because of invalid version. 143 - No keys defined. Invalid .AAM file 144 - Re-index command buffer overflow. 145 - Unable to open AAM Uppercase Translation File! 146 - AAM Uppercase Translation File error! 147 - The input line is too long. 148 - Too many keys have been selected. 149 - A record longer than 32767 bytes was found. 150 - Unable to write segment of aamdex file 151 - Null file must have record length on command line. 152 - Data file is not in the correct format. 153 - Insufficient memory. 154 - Relinquishing super-powers failed. (Unix) 155 - Invalid parameter for -i option! 156 - Too many records to index 157 - Unable to write segment of index file. 158 - Error during output IO. 159 - Invalid 'O' option value! Examples: INDEX "master -1-10" INDEX "master -1-10",OUTPUT=DLIST INDEX "master -1-10",OUTPUT=DLIST,CANCEL=QUITBUTTON INDEX "master -1-10",SUNFM="25.126.40.20" INDEX "master -1-10",OUTPUT=DLIST,SUNFM="www.Sunbelt-Plb.com" INDEX "-l icmd.log master -1-10" - A new instruction named DMAKE has been added to the PL/B language. This instruction allows a DIM character string variable to be dynamically created by a program. This instruction is similar to the SMAKE instruction except the buffer allocation for the DMAKE instruction is performed using the OS memory allocation functions. Therefore, buffer allocations for DMAKE do not reside in the same memory allocation as used for the PL/B program. Thus, dynamic DIM variables can be created and freed without impacting the memory allocation used for programs and the size of these variables are only limited by the OS resources. Also, two associated instructions named DFREE and DRELEASE have been added to free buffer allocations created by the DMAKE instruction. The syntax format for this instruction is as follows: Format: DMAKE {dest}{sep}{size} Where: {dest} - This operand is a previously declared DIM POINTER. {sep} - This is a comma or one of the following prepositions: BY, TO, OF, FROM, USING, WITH, IN, or INTO. {size} - This operand is a decimal number or a numeric variable that identifies the size for the DIM variable that is to created. Flags Affected: ZERO Note the following: 1. The ZERO flag is set FALSE when the DIM variable is created successfully. The ZERO flag is set TRUE when the DIM variable can not be created. 2. Since the buffer allocation for a DMAKE instruction does not reside within the PL/B program memory space, the ROLLOUT instruction can not be used in programs that make use of the DMAKE instruction. A ROLLOUT instruction now causes an untrapped error U49 to occur if a DMAKE variable is active when the ROLLOUT is executed. 3. When a CHAIN or SHUTDOWN instruction is executed, then all DMAKE buffer allocations are automatically freed. 4. If a DMAKE instruction is executed for a {dest} pointer that already references a DIM variable, then a DRELEASE instruction is executed before the DMAKE is executed. Example: pDimA DIM ^ pDimB DIM ^ NVAR FORM "512" . DMAKE pDimA,1000000 DMAKE pDimB,NVAR - A new instruction named DFREE has been added to the PL/B language. This instruction frees a buffer allocation for a DIM variable created using the DMAKE instruction. In addition, any DIM pointer that is pointing to this same buffer allocation is cleared. The syntax format for this instruction is as follows: Format: DFREE {dest} Where: {dest} - This operand is a previously declared DIM POINTER. Flags Affected: None Note the following: 1. If the {dest} pointer does not point to a DIM variable created by a DMAKE instruction, then the pointer is simply cleared. Example 1: pDimA DIM ^ pDimB DIM ^ . DMAKE pDimA,100000 . . Program Executes . DFREE pDimA ;DIM variable buffer is freed ;pDimA pointer is cleared STOP Example 2: pDimA DIM ^ pDimB DIM ^ . DMAKE pDimA,100000 MOVEPTR pDimA,pDimB ;Both point to DIM variable . . Program Executes . DFREE pDimB ;DIM variable buffer is freed ;Both pDimA & pDimB are cleared STOP Example 3: pDimA DIM ^ . DMAKE pDimA,100000 CALL xFunc USING pDimA . . Program Executes . DFREE pDimA ;DIM variable buffer is freed ;Both pDimA & pDimC are cleared STOP ...... pDimC DIM ^ . xFunc LROUTINE pDimC . . pDimC points to DIM variable created by DMAKE . RETURN - A new instruction named DRELEASE has been added to the PL/B language. This instruction detaches a DIM pointer variable from a DIM variable created by a DMAKE instruction. If the DIM variable in the DMAKE buffer allocation is not used by any DIM pointer variables after the DRELEASE operation, then the DMAKE buffer allocation is freed. However, the DIM variable for the DMAKE buffer allocation is not freed if other program DIM pointers are pointing to the buffer allocation after the DRELEASE operation is executed. The syntax format for this instruction is as follows: Format: DRELEASE {dest} Where: {dest} - This operand is a previously declared DIM POINTER. Flags Affected: None Note the following: 1. If the {dest} pointer does not point to a DIM variable created by a DMAKE instruction, then the pointer is simply cleared. 2. The instruction 'MOVEPTR 0,pDIM' detaches/clears a DIM pointer and if the pointer was pointing to a DMAKE DIM variable, then the expected action is the same as a DRELEASE instruction. Example 1: pDimA DIM ^ pDimB DIM ^ . DMAKE pDimA,100000 . . Program Executes . DRELEASE pDimA ;DIM variable buffer freed ;pDimA pointer cleared STOP Example 2: pDimA DIM ^ pDimB DIM ^ . DMAKE pDimA,100000 MOVEPTR pDimA,pDimB ;Both point to DIM variable . . Program Executes . DFREE pDimB ;DIM variable buffer NOT freed ;Pointer pDimB is cleared ;Pointer pDimA is NOT cleared STOP Example 3: pDimA DIM ^ dVar INIT "Testing" . DMAKE pDimA,100000 CALL xFunc USING pDimA . . Program Executes . DRELEASE pDimA ;DIM variable buffer NOT freed ;Pointer pDimA is cleared ;Pointer pDimC still points to ; DMAKE buffer allocation . . Program Continues . CALL xFunc USING dVar . . After the last xFunc operation, the DIM variable . for the DMAKE operation is freed because the . pDimC pointer was changed to point to dVar and . no other pointers pointed to the DMAKE buffer. . STOP ...... pDimC DIM ^ . xFunc LROUTINE pDimC . . pDimC points to input DIM variable . RETURN - Added a new instruction named CHECKPROP. The CHECKPROP instruction allows a user program to determine if a property is valid for a specified GUI object. [label] CHECKPROP {obj}{sep}{prop}[,TYPE={dnumnvar}]: [,MASK={nvar}] Where: label - optional Program Execution Label. obj - {obj} can be a GUI object or a {dnumnvar} numeric value. This operand is used to identify the GUI object type for which the property is being checked. If the {obj} operand is a {dnumnvar} numeric value, then the input value is used to identify the GUI object. This numeric value can be the SUNBELT GUI object types as specified by the TYPE instruction or the numeric value can be specified as the SubType object type values as defined in the Plbequ.inc include file. prop - {prop} is a {svarslit} that contains the property name to be checked. The property name is not case sensitive. The logical string for the {svarslit} is used as the property name. Any trailing blank characters in the logical string are ignored. TYPE - The TYPE parameter is optional. When the TYPE keyword is specified, then the {dnumnvar} value identifies the PLB instruction restriction to be applied for the property search. If this TYPE parameter is not specified, then the default type value is zero. The {dnumnvar} values are defined as follows: 0 - Does the property exist for any instruction. 1 - Does the property exist for a CREATE. 2 - Does the property exist for a GETPROP. 3 - Does the property exist for a SETPROP. 4 - Values greater than or equal to 4 are executed the same as a value of 0. MASK - The MASK parameter is optional. When the MASK keyword is specified, then the {nvar} is to receive the property table instruction bit mask that identifies what instructions the property can be used in. The returned binary bit mask value can be a combination of any of the following: 0x0001 - Property valid for CREATE 0x0002 - Property valid for SETPROP 0x0004 - Property valid for GETPROP Example: If the returned value in the MASK numeric variable is 6. Then the specified property is valid for a SETPROP and GETPROP operation. Flags affected: ZERO and OVER Note the following: 1. The ZERO flag is set to a TRUE state when the property is found and it is valid for the instruction TYPE being checked. Otherwise, the ZERO flag is set to a FALSE state. 2. The OVER flag is set to a TRUE state if any returned value is too large to be stored into a returned variable and must be truncated. - Modified the WINAPI instruction to support new variable types named INT8 and PINT8. These data types provide support for an eight byte INTEGER. - Modified DIM to support sizes larger than 64KB. The runtimes can support a DIM size up to 2GB. See PLBCMP description for more details. - Modified the keyed READ for an AFILE to give an I46 error when a key header is specified without key data and a prior read has not been performed. Prior to this change this error was being reported as an I40 error. Also, note in this case, that if a prior read has been performed for the AFILE, then the I46 error does not occur and the data for the prior read is retrieved. Example 1: A AFILE KEY DIM 20 . OPEN A,"aamfile" MOVE "01L",KEY READ A,KEY;S$CMDLIN ;I46 error Example 2: A AFILE KEY DIM 20 . OPEN A,"aamfile" MOVE "01L123",KEY READ A,KEY;S$CMDLIN ;Read ok! ... MOVE "01L",KEY READ A,KEY;S$CMDLIN ;Read ok with data from ;previous READ. - Modified the ROUTINE and LROUTINE processing to allow a DIM or VAR pointer to accept a CALL USING Literal parameter. In this case, the DIM/VAR pointer references a duplicate image of the input Literal. The duplicate image of the Literal can be manipulated like any DIM variable without affecting/corrupting the original Literal data. For this specific usage, the CALL USING literal has a maximum size limit of 2047. - Corrected a problem where a CALL USING parameter specified as a variably indexed arrayed variable was causing an F05 error when the array was an array of null pointers and the ROUTINE parameter was a pointer. The F05 error does not occur with this change. - Corrected a problem where a sequential READ (-1) could not access the last record written into a file when the file was opened in EXCLUSIVE mode. The problem occurred for the following sequence of instructions. Example: FILE FILE SEQ FORM "-1" EOF FORM "-3" ZERO FORM "0" . PREP FILE,"FILE.TXT",EXCLUSIVE WRITE FILE,EOF;"ONE" WRITE FILE,EOF;"TWO" READ FILE,ZERO;; READ FILE,SEQ;S$CMDLIN ;OK READ FILE,SEQ;S$CMDLIN ;OVER ERROR! - Corrected a problem where the '-sname.def' runtime command line option did not look in the PLB_SYSTEM directory for the 'name.def' screen definition file if it could not be found in a current working directory. - Corrected a problem where the ZERO flag was being set by a PREPARE instruction. Now the ZERO flag is not affected by a PREPARE instruction which is consistent with the PL/B Language Reference Manual. - Corrected a problem where the *TAB control for a PRINT instruction could fail when multiple SPLOPEN spool files were opened and used in a program at the same time. - Corrections have been implemented for the SEARCH instruction to eliminate indeterminate results and GPF errors when data variables other than DIM or FORM variables were found in the variable list. With changes implemented to correct these problems, the SEARCH instruction now stops searching through the variable list when a variable other than a DIM or FORM is encountered. ------------------------------------------------------------------------------- PLBCON - Corrected a problem where untrapped spool errors were not being reported to the console window. ------------------------------------------------------------------------------- PLBWIN - Modified to support new instructions LISTCNT and LISTGET. See PLBCMP section below for new instruction descriptions. - A new object named EDITDATETIME has been added to the language. This object provides an interface to exchange data and time information with a user. Data is exchanged using the instructions GETITEM and SETITEM or through the use of the TEXT property. Data is exchanged in the same format as the CLOCK TIMESTAMP format: (YYYYMMDDHHMMSS). See the language reference manual for details of this format. Note: 1. An EDITDATETIME object always displays data. The object can not be cleared to display nothing. 2. When an EDITDATETIME object is loaded by a FORMLOAD, then the object is always initialized with the current date and time. The following properties are supported for EDITDATETIME ANCHOR, CAUSEVALID, DOCK, DROPID, ENABLED, FONT, HEIGHT, HELPID, HWND, LEFT, OBJECTID, TABID, TEXT, TOOLTIP, TOOLTIPHWND, TOP, VISIBLE, WIDTH, ZORDER The following new properties have been added for EDITDATETIME. Please see detailed descriptions in the PL/B Language Reference Manual or in the PLBEQU.INC file. CALFGCOLOR=dnumnvar|color object CALBGCOLOR=dnumnvar|color object TITLEBGGCOLOR=dnumnvar|color object TITLEFGCOLOR=dnumnvar|color object TRAILINGCOLOR=dnumnvar|color object CHECKED=dnumnvar CUSTOMFORMAT=svarslit DROPDOWNALIGN=dnumnvar FORMAT=dnumnvar MAXIMUMDATE=svarslit MINIMUMDATE=svarslit SHOWCHECKBOX=dnumnvar SHOWUPDOWN=dnumnvar The EDITDATETIME object supports the following events: CHANGE DRAGDROP DRAGOVER GOTFOCUS KEYPRESS LOSTFOCUS MOVE MOUSEDOWN MOUSEUP MOUSEMOVE VALIDATE - In support of the new enhanced DBxxxx verbs, there are three new DLLs named SUNWODBC.DLL, SUNWMSQL.DLL, and SUNWADO.DLL. These DLLs are dynamically loaded for the DBCONNECT instruction when executed in a PL/B program. SUNWODBC.DLL - This DLL is the interface driver for ODBC. This interface driver replaces the PLBWODBC.DLL module. This interface driver is used as the default database interface for the DBCONNECT verb. SUNWMSQL.DLL - This DLL is the interface driver for the MYSQL Database engine. This DLL is loaded for a DBCONNECT operation when a driver indicator is specified for the and the driver indicator is specified in the runtime INI file. See DBCONNECT for more details. SUNWADO.DLL - This DLL is the interface driver for the Microsoft ADO ( ActiveX Data Objects ) interface that provides access to multiple database engines. For specifics on ADO, see the Microsoft ADO documentation. This DLL is loaded for a DBCONNECT operation when a driver indicator is specified for the and the driver indicator is specified in the runtime INI file. See DBCONNECT for more details. - Modified the PICT object to support a '.BMP' picture that uses a BITMAP EXTENDED FORMAT for the BI_BITFIELDS compression format. This change corrects a problem where a 32 bit BMP was not being displayed properly. For Windows 95 systems this change may not work as expected due to restrictions in the OS. - The LISTVIEW object has been enhanced to allow foreground color, background color, and font attributes to be specified for individual cells being viewed. Five new methods have been added for the LISTVIEW object to provide this capability. Note the following for this change: A new method named InsertAttrColumn has been added to a LISTVIEW that is used to insert a hidden column that contains attribute data strings. The SetItemText method for the LISTVIEW can then be used to set a specialized formatted attribute string for a row item in the attribute data column. The attribute data string is formatted to provide default settings followed by individual column attribute settings that are to be used for a specific LISTVIEW row. The {default} and {column} strings are composed of 3 subfields that provide index numbers separated by a comma. The {default} and each {column} subfield group must be separated by a semicolon. The format of the attribute data strings must be given as follows: "{default};{column1};{column2};....;{columnx}" Where: {default} - The {default} field is optional and if specified, then it gives default foreground color, background color, and font indexes to be used for this row. The {default} field is composed of three subfield indexes that reference attribute tables that have been setup for a LISTVIEW object. {column1} - The {column1} field is optional and if specified , then it gives the specific color and font attribute indexes that are to be used for column 1 for this row. This same field definition format applies for all columns that exist in the LISTVIEW object. The string format for the {default} and {column} fields are defined as follows: "{fgNDX},{bgNDX},{fontNDX}" {fgNDX} - This subfield is a decimal number that is used as an index to retrieve a foreground color from the color table that has been created for the LISTVIEW object. The {fgNDX} decimal number value can be from 1 to 20. {bgNDX} - This subfield is a decimal number that is used as an index to retrieve a background color from the color table that has been created for the LISTVIEW object. The {bgNDX} decimal number value can be from 1 to 20. {fontNDX) - This subfield is a decimal number that is used as an index into the font table that has been created for the LISTVIEW object. The {fontNDX} decimal number value can be from 1 to 20. Example Attribute Strings set into the attribute column: "1,1,1;2,3,4" In this example, the default attribute field has specified an index value of 1 for the foreground color, the background color, and the font. This attribute also specifies that the first column of the LISTVIEW object is to use an index value of 2 for the foreground color, an index value of 3 for the background color, and an index value of 4 for the font. All subsequent columns are to use the default. ",2;1,3;;4" In this example, the default attribute field has only specified an index value of 2 for the back ground color. In this case, the default foreground color and font are determined from the default attribute data settings that have been setup for the LISTVIEW object. For the first column of the LISTVIEW the index value 1 is used to retrieve the foreground color while the index value 3 is used to retrieve the font to be used. The second column of the LISTVIEW is to use only default values. The third column of the LISTVIEW uses the index value of 4 to retrieve the foreground color. Again, all other attributes are specified by the default settings. The general program logic flow to make use of the new LISTVIEW color/font features to control individual cell attributes is as follows: 1. Create a LISTVIEW object. 2. Use the InsertAttrColor, InsertAttrRGB, and InsertAttrFont methods to initialize the color and/or the font index tables for the LISTVIEW object. 3. Use the InsertAttrDefault method to set the default attribute settings to be used for the LISTVIEW object. 4. Use the InsertAttrColumn method to put an attribute column into the LISTVIEW object. 5. Use the SetItemText method to set the attribute data strings for each row of the LISTVIEW where individual row cells are to be controlled. If an item in the attribute column does not have an attribute string, then the default settings are used. -------------------- New LISTVIEW Method Descriptions ............................................................... . InsertAttrColumn Method . The InsertAttrColumn method inserts a special column into a LISTVIEW object that can be used to specify foreground color, background color, and font attributes to be used for individual column cells for a row. The method uses the following format: [label] {object}.InsertAttrColumn [GIVING {return}]: USING [*Index=]{index} Where: {label} is an optional Program Execution Label. {object} is a required LISTVIEW object to be accessed. {return} is an optional Numeric Variable that indicates the success or failure of the method. {index} is a required Numeric Variable or decimal number that specifies a zero based position of the attribute column. Flags Affected: OVER, ZERO Note the following: 1. The data string stored into each item of the new column specifies a special formatted set of attribute fields that define the foreground color, background color, and font of each column cell for the line item. See the description above for the field definitions of the attribute string. 2. The attribute column is inserted with a width size of zero. This allows the attribute column to exist and be used in a LISTVIEW without being visible to a user. 3. It is not recommended that the attribute column should be sorted. This can cause indeterminate results due to the attribute data string format required to control each column cell for a line item. 4. Upon completion, the {return} variable contains the new zero based column number or -1 if the method fails. 5. If the value returned is zero, the ZERO (or EQUAL) condition flag is set (TRUE). 6. If the {return} variable is too small to contain the result of the method, the OVER condition flag is set (TRUE). 7. For improved performance in the Application Server environment, do not specify the optional return value unless it is needed. ............................................................... . InsertAttrDefault Method . The InsertAttrDefault method is used to specify an attribute string that is used as the default for any LISTVIEW line item cells that do not have explicit attributes specified. The method uses the following format: [label] {object}.InsertAttrDefault [GIVING {return}] USING [*Default=]{default} Where: {label} is an optional Program Execution Label. {object} is a required LISTVIEW object to be accessed. {return} is an optional Numeric Variable that indicates the success or failure of the method. {default} is a required Character String variable or literal that gives the default attribute data string to be used for the LISTVIEW object. See the description above for the format of the attribute data string. Flags Affected: OVER, ZERO Note the following: 1. If the InsertAttrDefault method is successful, then the {return} value is zero and the ZERO condition flag is set (TRUE). If the method fails, then the {return} value is not zero and the ZERO condition flag is cleared (FALSE). 2. If the default subfields are not specified by the default attribute data string, then default attribute settings determined from the LISTVIEW object are used. 3. The OVER flag is set if the {return} variable is too small to hold the returned value. ............................................................... . InsertAttrColor Method . The InsertAttrColor method is used to initialize the color index table for the LISTVIEW object using COLOR objects. The LISTVIEW color table allows up to 20 colors to be defined. The method uses the following format: [label] {object}.InsertAttrColor [GIVING {return}] USING [*Color1=]{colobj}: [*Color2=]{colobj}: [*Color3=]{colobj}: [*Color4=]{colobj}: [*Color5=]{colobj}: [*Color6=]{colobj}: [*Color7=]{colobj}: [*Color8=]{colobj}: [*Color9=]{colobj}: [*Color10=]{colobj}: [*Color11=]{colobj}: [*Color12=]{colobj}: [*Color13=]{colobj}: [*Color14=]{colobj}: [*Color15=]{colobj}: [*Color16=]{colobj}: [*Color17=]{colobj}: [*Color18=]{colobj}: [*Color19=]{colobj}: [*Color20=]{colobj} Where: {label} is an optional Program Execution Label. {object} is a required LISTVIEW object to be accessed. {return} is an optional Numeric Variable that indicates the first table position changed. {colobj} is an optional COLOR object that is assigned to the color table position. The table positions are either assigned by keyword names or are assigned by relative color object positions in the USING list. Flags Affected: OVER, ZERO Note the following: 1. If a COLOR object is stored into the color table, then the returned value is the first color table position that was set. If no color table positions were set, then a value of zero is returned. 2. The ZERO condition flag is set (TRUE) if the returned value is zero. Otherwise, the ZERO condition flag is cleared (FALSE). 3. The OVER condition flag is set (TRUE) if the {return} variable is too small for the returned value. ............................................................... . InsertAttrRGB Method . The InsertAttrRGB method is used to initialize the color index table for the LISTVIEW object using RGB color values. The LISTVIEW color table allows up to 20 colors to be defined. The method uses the following format: [label] {object}.InsertAttrRGB [GIVING {return}] USING [*RGB1=]{rgb}: [*RGB2=]{rgb}: [*RGB3=]{rgb}: [*RGB4=]{rgb}: [*RGB5=]{rgb}: [*RGB6=]{rgb}: [*RGB7=]{rgb}: [*RGB8=]{rgb}: [*RGB9=]{rgb}: [*RGB10=]{rgb}: [*RGB11=]{rgb}: [*RGB12=]{rgb}: [*RGB13=]{rgb}: [*RGB14=]{rgb}: [*RGB15=]{rgb}: [*RGB16=]{rgb}: [*RGB17=]{rgb}: [*RGB18=]{rgb}: [*RGB19=]{rgb}: [*RGB20=]{rgb} Where: {label} is an optional Program Execution Label. {object} is a required LISTVIEW object to be accessed. {return} is an optional Numeric Variable that indicates the first table position changed. {rgb} is an optional Character String Variable or literal that contains a hexadecimal string that defines an RGB value. The format of the hexadecimal string must be given as follows: "0xRRGGBB" The character values of the 'R', 'B', and 'G' characters must be from 0 to F. Flags Affected: OVER, ZERO Note the following: 1. If a COLOR value is stored into the color table, then the returned value is the first color table position that was set. If no color table positions were set, then a value of zero is returned. 2. The ZERO condition flag is set (TRUE) if the returned value is zero. Otherwise, the ZERO condition flag is cleared (FALSE). 3. The OVER condition flag is set (TRUE) if the {return} variable is too small for the returned value. ............................................................... . InsertAttrFont Method . The InsertAttrFont method is used to initialize the font index table for the LISTVIEW object using FONT objects. The LISTVIEW font table allows up to 20 fonts to be defined. The method uses the following format: [label] {object}.InsertAttrFont [GIVING {return}] USING [*Font1=]{fontobj}: [*Font2=]{fontobj}: [*Font3=]{fontobj}: [*Font4=]{fontobj}: [*Font5=]{fontobj}: [*Font6=]{fontobj}: [*Font7=]{fontobj}: [*Font8=]{fontobj}: [*Font9=]{fontobj}: [*Font10=]{fontobj}: [*Font11=]{fontobj}: [*Font12=]{fontobj}: [*Font13=]{fontobj}: [*Font14=]{fontobj}: [*Font15=]{fontobj}: [*Font16=]{fontobj}: [*Font17=]{fontobj}: [*Font18=]{fontobj}: [*Font19=]{fontobj}: [*Font20=]{fontobj} Where: {label} is an optional Program Execution Label. {object} is a required LISTVIEW object to be accessed. {return} is an optional Numeric Variable that indicates the first table position changed. {fontobj} is an optional FONT object that is assigned to the font table position. The table positions are either assigned by keyword names or are assigned by relative font object positions in the USING list. Flags Affected: OVER, ZERO Note the following: 1. If a FONT object is stored into the font table, then the returned value is the first font table position that was set. If no font table positions were set, then a value of zero is returned. 2. The ZERO condition flag is set (TRUE) if the returned value is zero. Otherwise, the ZERO condition flag is cleared (FALSE). 3. The OVER condition flag is set (TRUE) if the {return} variable is too small for the returned value. - New properties have been added for the FONT object as follows: -------------------- ANGLE Property (New) Format: ANGLE=dnumnvar Statements Supported: CREATE SETPROP GETPROP Description: This property is used to set or get the font angle in 1/10 of a degree. Objects: FONT dnumnvar values: The dnumnvar values are specified in tenths of a degree. Therefore, a value of 450 specifies 45 degrees. -------------------- STRIKE Property (New) Format: STRIKE[=dnumnvar] Statements Supported: CREATE SETPROP GETPROP Description: This property specifies that the font should be displayed with a line through the center of the font. When the value is not provided, this indicates that the STRIKE property is turned on. Objects: FONT dnumnvar values: $OFF EQU 0 // Default $ON EQU 1 -------------------- UNDERLINE Property (New) Format: UNDERLINE[=dnumnvar] Statements Supported: CREATE SETPROP GETPROP Description: This property specifies that the font should be underlined. When the value is not provided, this indicates that the UNDERLINE property is turned on. Objects: FONT dnumnvar values: $OFF EQU 0 // Default $ON EQU 1 - A new GUI object named LABELTEXT has been added to the PL/B objects. The LABELTEXT object displays a string of static text on the screen. This object differs from a STATTEXT in that it can perform word wrapping and is in a window. -------------------- Properties Alignment Anchor Appearance BgColor Border CauseValid Dock Enabled FgColor Font Height Hwnd Left ObjectId Text ToolTip ToolTipHwnd Top UseAltKey Visible Width WordWrap ZOrder Events EventClick EventDblClick EventMouseDown EventMouseUp EventMouseMove Methods None - A new GUI object named ANIMATE has been added to the PL/B objects. The ANIMATE object is a window that displays an AVI clip. An AVI clip is a series of bitmap frames like a movie. ANIMATE objects can only display AVI clips that do not contain audio. The ANIMATE object is not supported for Windows CE. -------------------- Properties Anchor Appearance Autoplay (NEW) BackStyle BgColor Border Center Dock Enabled Height Hwnd Left ObjectId ToolTip ToolTipHwnd Top Visible Width ZOrder Events EventChange Methods Close Open Play Stop Notes 1. If the CENTER property is turned off, this causes the animation to be shown in the top/left position in the window. New Properties -------------------- AUTOPLAY Property (New) Format: AUTOPLAY[=dnumnvar] Statements Supported: CREATE SETPROP GETPROP Description: This property enables or disables the automatic playing of an AVI file when it is opened in an ANIMATE object. Objects: ANIMATE dnumnvar values: $OFF EQU 0 // Default $ON EQU 1 -------------------- Method Descriptions ............................................................... . Close Method . The Close method is used to close an AVI file that has been opened in an ANIMATE object. The method uses the following format: [label] {object}.Close [GIVING {return}] Where: {label} is an optional Program Execution Label. {object} is a required ANIMATE object to be accessed. {return} is an optional Numeric Variable that indicates the success or failure of the method. Flags Affected: EOS, OVER, ZERO Note the following: 1. If the value returned is zero, the ZERO (or EQUAL) Condition Flag is set (TRUE). 2. The OVER and EOS Condition Flags are always cleared (FALSE). 3. A return value of 0 indicates success. ............................................................... . Open Method . The Open method is used to open an AVI file in an ANIMATE object. The method uses the following format: [label] {object}.Open [GIVING {return}] USING [*Name=]{name} Where: {label} is an optional Program Execution Label. {object} is a required ANIMATE object to be accessed. {return) is an optional Numeric Variable that indicates the success or failure of the method. {name} is a required Character String Variable or literal that specifies the file name of the AVI file. Flags Affected: EOS, OVER, ZERO Note the following: 1. If the value returned is zero, the ZERO (or EQUAL) Condition Flag is set (TRUE). 2. The OVER and EOS Condition Flags are always cleared (FALSE). 3. A return value of 0 indicates success. 4. The ! character is used to indicate that the file is located on the client when Application Server is being used. 5. The ? character is used to indicate that the file should be either obtained from the cache or from the server and placed in the cache. 6. The * character is used to indicate that the file should be either obtained from the in-memory cache or from the server and placed only in the in-memory cache. ............................................................... . Play Method . The Play method is used to play an AVI file that has been opened in an ANIMATE object. The method uses the following format: [label] {object}.Play [GIVING {return}] USING [[*Start=]{start}]: [[*End=]{end}]: [[*Repeat=]{repeat}] Where: {label} is an optional Program Execution Label. {object} is a required ANIMATE object to be accessed. {return} is an optional Numeric Variable that gets the return value. {start} is an optional decimal number or Numeric Variable that specifies the starting frame of the AVI file. {end} is an optional decimal number or Numeric Variable that specifies the ending frame of the AVI file. {repeat} is an optional decimal number or Numeric Variable that specifies the number of times to repeat the animation. Flags Affected: EOS, OVER, ZERO Note the following: 1. If the value returned is zero, the ZERO (or EQUAL) Condition Flag is set (TRUE). 2. The OVER and EOS Condition Flags are always cleared (FALSE). 3. A return value of 0 indicates success. 4. The first frame position is at zero. 5. The default value for that Start parameter is zero. 6. The default value for the End parameter is the last frame. 7. The default value for the Repeat parameter is to replay the clip indefinitely. ............................................................... . Stop Method . The Stop method is used to stop playing an AVI file that has been opened in an ANIMATE object. The method uses the following format: [label] {object}.Stop [GIVING {return}] Where: {label} is an optional Program Execution Label. {object} is a required ANIMATE object to be accessed. {return} is an optional Numeric Variable that indicates the success or failure of the method. Flags Affected: EOS, OVER, ZERO Note the following: 1. If the value returned is zero, the ZERO (or EQUAL) Condition Flag is set (TRUE). 2. The OVER and EOS Condition Flags are always cleared (FALSE). 3. A return value of 0 indicates success. - The STATTEXT object has been modified to allow a FONT object to be used when the ANGLE property for the FONT is being used. This change allows text in a STATTEXT to be output at an angle. Notes: 1. A FONT object that uses the ANGLE property can only be used for a STATTEXT object to output text on an angle. - The PRTPAGE statement has been modified to support FONT objects that use the ANGLE property. When the PRTPAGE *FONT is set to a FONT object with the ANGLE property set, then the text output for the PRTPAGE occurs at the ANGLE set for the FONT object. - Modified the Windows runtimes when executing under Windows 95/98/ME to check for a file size limit of 2GB. This 2GB check is required because the Windows 95/98/ME OS file subsystems do not properly access data beyond the 2GB size. In addition, these same Windows OS versions do not give any API errors to indicate that a problem exists. - Modified the DEACTIVATE operation for a Modal WINDOW to reset its parent to be nothing. If the Modal WINDOW is DEACTIVATEd, then a subsequent DESTROY of a parent WINDOW does not automatically destroy the Modal Window. It should also be noted that if a DESTROY of a parent WINDOW is executed, while a child Modal WINDOW is active/visible, then the Modal WINDOW is destroyed. - Modified the event processing for a Modal dialog form to process all of the Windows OS events before a PL/B user event is dispatched. This change means that PL/B user events are processed for a Modal dialog in the same manner as a WAITEVENT. - Added the TABID property for the TOOLBAR and STATUSBAR objects. This change gives a user the ability to set it to zero if desired. - Added a command line option '-?' for PLBWIN and PLBCON runtimes to provide a command line syntax help screen. - Modified the SortColumn method for the LISTVIEW object to generate a stable sort output. - Modified the SortColumn method for the LISTVIEW object to accept a value of zero for the {type}, {type1}, {type2}, and {type3). When a value of zero is specified, this indicates that the associated sort column is to be ignore and not included in the sort process. A failure return value is given when a valid (non-zero) value is not specified for at least one sort column. - The ICON={value} property has been added for a WINDOW object. This change allows the Icon for a Window to be set or changed using a CREATE or SETPROP operation. - Modified the EDITNUMBER object to generate a CHANGE event when data is changed using the UpDown control. - The IMAGELIST object has been modified to support an EventChange event. When registered, this CHANGE event occurs any time any images in the IMAGELIST object is added, deleted, or altered. - A new property named 'USECOLORMASK={dnumnvar}' has been added. This property can be used in a CREATE, GETPROP, or SETPROP for an IMAGELIST object. The {dnumnvar} value for this property determines if the MASKCOLOR property for an IMAGELIST is to be used. When the {dnumnvar} value is zero, then the MASKCOLOR property for the IMAGELIST object is not used. If the {dnumnvar} value is not zero, then the MASKCOLOR property for the IMAGELIST object is used. - The IMAGELIST object has been modified to support the RESOURCE property. When a resource id is specified for an IMAGELIST object, then the image/picture specified by the resource id is segmented and replaces all images for the imagelist. - Modified the ICON object to support the 'IMAGEINDEX={value}' property. The IMAGEINDEX is used as an index into an imagelist linked to the ICON using the new IMAGELIST property. - A new property named 'IMAGELIST={imagelist}' has been added. This property can be used in a CREATE or SETPROP operation for the ICON, LISTVIEW, TOOLBAR, and TREEVIEW objects. This property allows the images from an {imagelist} to be used for the parent object. - A new property named 'IMAGELISTD={imagelist}' has been added. This property is used in a CREATE or SETPROP operation for the TOOLBAR object. This property associates an {imagelist} object with the disabled images of a TOOLBAR object. See the TOOLBAR method 'SetImageListDisabled' for more details about disabled images for a TOOLBAR object. - A new property named 'IMAGELISTH={imagelist}' has been added. This property is used in a CREATE or SETPROP operation for the TOOLBAR object. This property associates an {imagelist} object with the hot images of a TOOLBAR object. See the TOOLBAR method 'SetImageListHot' for more details about hot images for a TOOLBAR object. - A new property named 'IMAGELISTSM={imagelist}' has been added. This property is used in a CREATE or SETPROP operation for the LISTVIEW object. This property associates an {imagelist} object with the small icons of a LISTVIEW object. See the LISTVIEW method 'SetImageListSmall' for more details about small icons for a LISTVIEW object. - A new property named 'IMAGELISTST={imagelist}' has been added. This property is used in a CREATE or SETPROP operation for the LISTVIEW object. This property associates an {imagelist} object with the state icons of a LISTVIEW object. See the LISTVIEW method 'SetImageListState' for more details about state icons for a LISTVIEW object. - Modified the WINAPI statement to automatically load the PROFILE {dll} using LoadLibrary if the {dll} is not previously loaded. This helps to eliminate errors that would occur because a user did not know that a LoadLibrary must be used to load a DLL before a WinApi function can be executed. - The MENU object has been modified to support the following properties. ENABLED MENUORDER (New for MENU object) MERGETYPE (New for MENU object) TEXT VISIBLE -------------------- MENU New Property Descriptions -------------------- MENUORDER Property (New for MENU object) Format: MENUORDER=dnumnvar Statements Supported: SETPROP GETPROP Description: This property specifies the position of the menu in the menubar. Objects: MENU Dnumnvar values: The value is a user defined value. -------------------- MERGETYPE Property (New for MENU object) Format: MERGETYPE=dnumnvar Statements Supported: SETPROP GETPROP Description: This property is used to assign a merge action to a menu. Menus can be merged when a CONTAINER object that has a menu is activated. Objects: MENU Dnumnvar values: $MERGENONE EQU 0 $MERGELEFT EQU 1 $MERGEMIDDLE EQU 2 $MERGERIGHT EQU 3 - The FLOATMENU, MENU, and SUBMENU objects have been modified to support a $ITEMCLICK event. -------------------- FLOATMENU, MENU, and SUBMENU New Event Description ............................................................... . ItemClick Event $ITEMCLICK EQU 26 The ItemClick event occurs when a button in a TOOLBAR object is clicked, or a menu item in a FLOATMENU, MENU, or SUBMENU object is selected. Note the following: 1. The ItemClick event is referenced using an event value of twenty-six (26). The equated label in PLBEQU.INC for this event is $ITEMCLICK. 2. This event depends on the setting of the ACTIVATE property. 3. The Event Result value is the TAG property from the associated TOOLBUTTON or MENUITEM object. 4. For a TOOLBUTTON the Event Modifier contains a one based menu selection value, or 0 if no menu was associated with the TOOLBUTTON. - The FLOATMENU, MENU, and SUBMENU objects have been modified to support methods named AddItem, GetItem, and RemoveItem. -------------------- FLOATMENU, MENU, and SUBMENU New Method Descriptions ............................................................... . AddItem Method . The AddItem method creates a new menu item in a FLOATMENU, MENU, or SUBMENU object. The method uses the following format: [label] {object}.AddItem [GIVING {return}]: USING [[*Checked=]{checked}]: [*Default=]{default}][: [*Enabled=]{enabled}][: [*ItemPos=]{itempos}][: [*Separator=]{separator}][: [*ShortCut=]{shortcut}][: [*SpcMenu=]{spcmenu}][: [*SubMenu=]{submenu}][: [*Tag=]{tag}][: [*Text=]{text}][: [*RunName=]{runname}] Where: label is an optional Program Execution Label. {object} is a required FLOATMENU, MENU, or SUBMENU object to be accessed. {return} is an optional MENUITEM object that gets the return value. {checked} is an optional decimal number or Numeric Variable that specifies the checked flag of the menu item. (see CHECKED property). {default} is an optional decimal number or Numeric Variable that specifies the default flag of the menu item. (see DEFAULT property). {enabled} is an optional decimal number or Numeric Variable that specifies the enabled state of the menu item. (see ENABLED property). {itempos} is an optional decimal number or Numeric Variable that specifies the insertion position of the menu item. {separator} is an optional decimal number or Numeric Variable that specifies the separator flag of the menu item. (see SEPARATOR property). {shortcut} is an optional decimal number or Numeric Variable that specifies the associated short cut key. (see SHORTCUT property). {spcmenu} is an optional decimal number or Numeric Variable that specifies any special menu action. (see SPECIALMENU property). {submenu} is an optional SUBMENU object that specifies any associated submenu. (see SUBMENU property). {tag} is an optional decimal number or Numeric Variable that specifies the tag number of the menu item. (see TAG property). {text} is an optional Character String Variable or literal that specifies the text to be displayed on the menu item. (see TEXT property). {runname} is an optional Character String Variable or literal that specifies the run-time name of the menu item. (see RUNNAME property). Flags Affected: EOS, OVER, ZERO Note the following: 1. If the value returned is zero, the ZERO (or EQUAL) Condition Flag is set (TRUE). 2. The OVER and EOS Condition Flags are always cleared (FALSE). 3. The created menuitem can be accessed through the ITEMS collection. ............................................................... . GetItem Method . The GetItem method obtains a MENUITEM object from a FLOATMENU, MENU, or SUBMENU object. The method uses the following format: [label] {object}.GetItem [GIVING {return}]: USING [*Key=]{key} Where: label is an optional Program Execution Label. {object} is a required FLOATMENU, MENU, or SUBMENU object to be accessed. {return} is an optional MENUITEM object that gets the return value. {key} is a required Character String Variable or Numeric Variable that specifies the run-time name (RUNNAME property) or zero based position of the menu item. Flags Affected: EOS, OVER, ZERO Note the following: 1. If the value returned is zero, the ZERO (or EQUAL) Condition Flag is set (TRUE). 2. The OVER and EOS Condition Flags are always cleared (FALSE). ............................................................... . RemoveItem Method . The RemoveItem method removes a MENUITEM object from a FLOATMENU, MENU, or SUBMENU object. The method uses the following format: [label] {object}.RemoveItem [GIVING {return}]: USING [*Key=]{key} Where: label is an optional Program Execution Label. {object} is a required FLOATMENU, MENU, or SUBMENU object to be accessed. {return} is an optional Numeric Variable that indicates the success or failure of the method. {key} is a required Character String Variable or Numeric Variable that specifies the run-time name (RUNNAME property) or zero based position of the menu item. Flags Affected: EOS, OVER, ZERO Note the following: 1. If the value returned is zero, the ZERO (or EQUAL) Condition Flag is set (TRUE). 2. The OVER and EOS Condition Flags are always cleared (FALSE). 3. A return value of 0 indicates success. - The FLOATMENU, MENU, and SUBMENU objects have been modified to support an ITEMS collection. The internal composition of these objects is made up of multiple MENUITEM objects. The ITEMS collection allows direct access to the MENUITEM objects by the GETPROP or SETPROP statements. The collection uses the following format: [label] GetProp {object}.ITEMS({key}),{property} Where: label is an optional program execution label. {object} is FLOATMENU, MENU, or SUBMENT object to be accessed. {key} is required. This is a Character String Variable or Numeric Variable that specifies the run-time name (RUNNAME property) or zero-based position of the menu item. {property} is the remaining line of the GETPROP statement. - A new GUI object named MENUITEM has been added. This object can be used to access menu items that make up the FLOATMENU, MENU, or SUBMENU objects. This object can be used in GETPROP or SETPROP instructions. This object can not be used in a CREATE instruction. The MENUITEM supports the following properties: CHECKED DEFAULT ENABLED RUNNAME SEPARATOR (New for MENUITEM object) SHORTCUT (New for MENUITEM object) SPECIALMENU (New for MENUITEM object> SUBMENU (New for MENUITEM object> TAG (New for MENUITEM object> TEXT -------------------- MENUITEM New Property Descriptions -------------------- CHECKED Property (Updated for MENUITEM object) Format: CHECKED=dnumnvar Statements Supported: CREATE SETPROP GETPROP - EDITDATETIME object SETPROP GETPROP - MENUITEM object Description: If the object is an EDITDATETIME object, this property is used to set or get the status of a checkbox displayed in the EDITDATETIME object. A checkbox is displayed when the SHOWCHECKBOX property is set to $ON. If the property is set to $OFF, no check mark is shown in the checkbox and the EDITDATETIME object allows no data entry. If the property is set to $ON, a check mark is shown in the checkbox and the EDITDATETIME object allows data entry. If the object is a MENUITEM object, this property sets or clears a check mark beside the menu item. Objects: EDITDATETIME MENUITEM Dnumnvar values: $OFF EQU 0 // Default $ON EQU 1 -------------------- DEFAULT Property (Updated for MENUITEM object) Format: DEFAULT[=dnumnvar] Statements Supported: CREATE SETPROP GETPROP - BUTTON object SETPROP GETPROP - MENUITEM object Description: If the object is a BUTTON, this property specifies that the BUTTON object activation routine is to gain program control when the enter key is entered and a non-button object has the focus. However, if a button object other than the DEFAULT button object has the focus when the enter key is entered then the activation routine of the button object with the focus gains the program control. If the object is a MENUITEM object, this property specifies the menu item selected when a menu has been selected and the enter key is pressed. Objects: BUTTON MENUITEM Dnumnvar values: $OFF EQU 0 // Default $ON EQU 1 -------------------- ENABLED Property (Updated for MENUITEM object) Format: ENABLED=dnumnvar Statements Supported: CREATE SETPROP GETPROP - Objects other than MENUITEM SETPROP GETPROP - MENITEM object Description: This property specifies when an object is to be DISABLED/ENABLED. If the ENABLED property is set to $OFF for the CREATE/SETPROP statements, this is the same as if a DISABLEITEM with an ITEMNO value of zero was executed for the object. If the ENABLED property is set to $ON for the SETPROP, this is the same as if an ENABLEITEM with an ITEMNO value of zero was executed for the object. The GETPROP statement returns the current DISABLED/ENABLED state for the object. Note1: If the ENABLED property is set to $OFF for the objects ICON, MREGION, MOVIE, GROUPBOX, or PROGRESS there is no visible graying which identifies that the object is disabled. However, there are no events processed for these object when the ENABLED property is set to $OFF. Objects: BUTTON CHECKBOX CHECKGRP COMBOBOX DATALIST EDITTEXT GROUPBOX HSCROLLBAR ICON LISTVIEW MENUITEM MREGION MOVIE PICT POPUPMENU PROGRESS RADIO RADIOGRP SHAPE SLIDER STATTEXT STATUSBAR TABCONTROL TOOLBAR TREEVIEW VSCROLLBAR WINDOW Dnumnvar values: $OFF EQU 0 $ON EQU 1 // Default -------------------- RUNNAME Property (Updated for MENUITEM object) Format: RUNNAME=svarslit Statements Supported: SETPROP GETPROP Description: This property specifies the run-time name of the object. It is used when accessing an object from the ITEMS, PANELS or BUTTONS collection. Objects: MENUITEM STATUSPANEL TOOLBUTTON Svarslit value: String containing a name. -------------------- SEPARATOR Property (New) Format: SEPARATOR=dnumnvar Statements Supported: SETPROP GETPROP Description: This property is used to indicate that a menu item is to be shown as a separator line. Objects: MENUITEM Dnumnvar values: $OFF EQU 0 $ON EQU 1 -------------------- SHORTCUT Property (New for MENUITEM object) Format: SHORTCUT=dnumnvar Statements Supported: SETPROP GETPROP Description: This property is used to assign a short cut key to a menu item. A value of 0 indicates no short cut key. A value of 1 - 15 indicates F1-F15 function keys. A value of 16 - 30 indicates shift F1-F15 function keys. A value of 31 - 40 indicates control 0-9. A value of 41 - 66 indicated control A-Z. A value of 67 - 81 indicates control F1-F15 function keys. A value of 82 - 91 indicates control shift 0-9. A value of 92 - 117 indicated control shift A-Z. A value of 118 - 132 indicates control shift F1-F15 function keys. Objects: MENUITEM -------------------- SPECIALMENU Property (New for MENUITEM object) Format: SPECIALMENU=dnumnvar Statements Supported: SETPROP GETPROP Description: This property is used to assign a special menu action to a menu item. Objects: MENUITEM Dnumnvar values: $SPCMENUNONE EQU 0 $SPCMENUCOPY EQU 1 $SPCMENUCUT EQU 2 $SPCMENUDELETE EQU 3 $SPCMENUPASTE EQU 4 $SPCMENUSELALL EQU 5 $SPCMENUUNDO EQU 6 -------------------- SUBMENU Property (New for MENUITEM object) Format: SUBMENU=submenu Statements Supported: SETPROP GETPROP Description: This property is used to assign a SUBMENU object to a menu item. Objects: MENUITEM -------------------- TAG Property (Updated for MENUITEM object) Format: TAG=dnumnvar Statements Supported: SETPROP GETPROP Description: This property is used to identify a MENUITEM or TOOLBUTTON object when a parent object receives a $ITEMCLICK event. Objects: MENUITEM TOOLBUTTON Dnumnvar values: The is a user specified number to identify an object. -------------------- TEXT Property (Updated for MENUITEM object) Format: TEXT=svarslit Statements Supported: SETPROP GETPROP Description: This property specifies the text to display in the object. Objects: MENUITEM STATUSPANEL TOOLBUTTON Svarslit value: String of data. - Modified the CLEAR method to work for a read-only EDITTEXT object. - Added a new keyword named 'PLBWIN_DEADLOCKTIMEOUT={nnnn}'. This keyword should only need to be used in special situations. The value for this keyword specifies how many seconds the runtime should wait in an implied FILEPI enqueue lock before giving an error. An implied FILEPI enqueue lock is used to lock an AFILE/IFILE for a file IO statement when a FILEPI instruction is not used for the file. When using the Windows OS, it is possible that user applications can be created that can cause a Deadlock hanging situation if the user applications access multiple files while the applications allow locks to be applied in different orders. By default this keyword is not used by the PLBWIN runtime. If the {value} is set to a non-zero value less than 60 seconds, then the minimum time out of 60 seconds is used. Time out values larger than 60 seconds can be used depending on the circumstances. If the deadlock timeout time is exhausted while waiting for an implied FILEPI enqueue lock, then an I28 error occurs. If an I28 error occurs, then a user should evaluate all user applications being used and determine if a file locking order problem exists. The following programs give an example that can result in a Deadlock hanging situation. Program 1: IFILE1 IFILE ;FILE1.TXT and FILE1.ISI IFILE2 IFILE ;FILE2.TXT and FILE2.ISI . Open IFILE1,"FILE1" Open IFILE2,"FILE2" .... LOOP FILEPI 99;IFILE1 READ IFILE2,KEY;S$CMDLIN ;Can hang indefinitely! .... FILEPI 0 REPEAT Program 2: IFILE1 IFILE ;FILE1.TXT and FILE1.ISI IFILE2 IFILE ;FILE2.TXT and FILE2.ISI . Open IFILE1,"FILE1" Open IFILE2,"FILE2" .... LOOP FILEPI 99;IFILE2 READ IFILE1,KEY;S$CMDLIN ;Can hang indefinitely! .... FILEPI 0 REPEAT - Modified the GETFNAME instruction to accept a value offset of 100 for the TYPE={value} {mode} parameter. When an offset value of 100 is added to the TYPE {value}, then this causes a ';' character to be used as the delimiting character when multiple file selections are being returned. This change provides a solution to a problem where where file names included a comma character as part of the file names when a multiple files are selected. - Added a new object pointer variable named OBJECT. The OBJECT variable can point to any GUI object data type. The OBJECT variable is implemented to allow an application to execute basic GUI instructions without having to code explicit GUI object data variables. Format: [label] OBJECT [%] [label] OBJECT (arraysize) [label] OBJECT ^ [label] OBJECT ^,{target} [label] OBJECT ^(arraysize) [label] OBJECT ^(arraysize),({target),...,{target}) Where: label Optional. It specifies a program data variable reference. % Optional. Denotes the item as being GLOBAL. arraysize is an integer decimal constant, CONST variable, or EQUATEd value indicating the number of array items. ^ Optional. Denotes the item as being a POINTER. The OBJECT data variable is always implemented as a POINTER whether the '^' syntax format is used or not. target is the name of a previously defined GUI data object. Flags Affected: NONE Note the following: 1. The OBJECT data variable is always generated as a POINTER and must be initialized to point to a valid GUI data object before it can be used. Otherwise, an appropriate FORMAT error occurs. 2. The OBJECT data variable can only be used in the following PL/B instructions: CALL USING parameter CHECKPROP EVENTREG EVENTSEND GETPROP LISTDEL LISTGET LISTINS LOADADR MOVEADR MOVEPTR ROUTINE parameter SETFOCUS SETPROP STOREADR TYPE 3. The OBJECT data variable can not be used in the following PL/B instructions. The compiler gives an error when detected. ACTIVATE CHECKITEM CREATE DEACTIVATE DELETEITEM DISABLEITEM DRAGITEM ENABLEITEM EXPLODE GETITEM IMPLODE INSERTITEM {OBJECT}.Methods SETITEM SETWTITLE 4. An O159 error occurs when an invalid property is specified for the GUI object pointed to by an OBJECT data pointer in a GETPROP or SETPROP instruction. 5. The CHECKPROP instruction can be used to determine if a property is allowed for GUI object pointed to by an OBJECT data pointer. Example: A BUTTON B STATTEXT GEN OBJECT ;This is a POINTER! GEN1 OBJECT ^ . CREATE A=2:3:5:15,"TEST" CREATE B=5:6:5:20,"STATTEXT DATA","" . MOVEADR A,GEN . SETPROP GEN,VISIBLE=1 . CALL SHOWOBJ USING B . LOOP WAITEVENT REPEAT . SHOWOBJ ROUTINE GEN1 . CHECKPROP GEN1,"VISIBLE" IF EQUAL SETPROP GEN1,VISIBLE=1 ENDIF RETURN - Corrected a problem where a FINDFILE instruction did not work properly when a program was executed on a Windows 98 system and the file name being processed started with a '\\server\share' UNC form. This problem was caused because Windows 98 was returning indeterminate data when it should have been reporting an error. - Corrected a problem where PLB_CURDIR usage was causing an error when the specified file name started with a '\' path character. Notice, that a file name specified as '\path\filename.ext' is always intended to be a root relative open operation for the current drive. Also, notice, that if this first open fails, then the '\path\filename.ext' is processed using the PLB_PATH settings. This allows drive specifications to be put into the PLB_PATH and used with the '\path\filename.ext'. - Corrected a problem where GETPROP/SETPROP for the BDRSTYLE property of a PANEL, SPLITTER, and TOOLBAR did not work properly. - Corrected a S10 problem for a SPLOPEN using an '-' device name and the mode is set to 'R' raw data mode. - Corrected a problem where the TOOLBUTTON height and width were not being set properly for a CREATE TOOLBAR operation. - Corrected a problem where the TOOLTIP for a STATTEXT would not work when the parent for the STATTEXT was a PANEL object. - Corrected a problem where the SETITEM instruction was limiting numeric variable values to be less than 65536. This problem was causing COLOR object values to be truncated resulting in an erroneous color. - Corrected a problem where a COMREAD might not receive data if a server closed a socket immediately after sending a message. - Corrected a problem where a COMOPEN statement did not execute an implicit COMCLOSE if a COMFILE was being re-opened while the COMFILE was currently in an opened state. This problem was causing a memory leak to occur. - Corrected a problem where a FORM variable was not being zeroed when an EDITNUMBER object was cleared and a GETPROP operation for the VALUE property was executed. - Corrected a problem where a GETPROP of an EDITNUMBER object for the VALUE property was corrupting the UDA memory when the destination variable was a FORM. This could cause indeterminate program errors. - Corrected a problem where an I11 was occurring for a CREATE PICT operation where the {data} operand was a DIM variable that contained the picture image. - Corrected a problem where SETPROP of the SORTHEADER property for a LISTVIEW object did not change the LISTVIEW header behavior. - Corrected a problem where a SPLITTER position was indeterminate when a mouse drag action for the splitter caused the mouse selector to be positioned outside the parent window of the splitter. - Corrected a problem where TOOLBUTTON objects for a TOOLBAR on an Objects Only Form were not becoming visible when the form was loaded on to a parent window. - Corrected a problem where a PRTCLOSE instruction did not terminate a FILEPI. If a FILEPI was active when a PRTCLOSE entered into a Print Preview, then a system would be in a hung/waiting state until the Print Preview was exited. - Corrected a problem where the border for a basic EDITTEXT object border type did not draw the border over a TABCONTROL object. - Corrected a problem where a GETPROP VALUE=INTEGER operation for an EDITNUMBER object returned invalid values. - Corrected a problem with an EDITNUMBER object where a click action on the up/down buddy control was causing invalid/indeterminate values to be presented. - Corrected a problem where the EDITNUMBER object value was not being incremented/decremented by the value specified by the UPDOWNCHANGE value when using the up/down buddy control. - Corrected an S10 spool error that would occur for a PRTOPEN with a hyphen specified for name after a previous printer name was used that contained a printer name size larger than 31 characters. Prior to this change printer names were limited to 31 characters. Now, the runtime can allow printer file names with a size up to 99 characters. - Corrected a problem where a PRTPAGE *RNDRECT control did not display the round rectangle properly in Print Preview. - Corrected a problem where the RUNNAME property did not work when used to access a PANELS or BUTTONS collection in a STATUSBAR or TOOLBAR object. ------------------------------------------------------------------------------- PLB (CE) - The default font named 'Tahoma' is now used when an object is being created without a font specified when a program is being executed on a PockPC CE device. - Changing a FONTSIZE in a PLFORM for a LISTVIEW object for a program that is executed under Windows CE does not work. This problem is not a bug in the Sunbelt CE runtime. This problem is a Windows CE control problem. The LISTVIEW must be recreated to change the FONTSIZE. - Corrected a problem where a FLOATMENU was not generating a user event when executing under Windows CE. - Corrected a problem where a modal/modeless Window size was created as an extremely small window when a form was loaded by FORMLOAD. - Corrected a problem where the FINDFILE instruction did not work for Windows CE runtimes. ------------------------------------------------------------------------------- PLB (UNIX)- Added a new keyword named 'PLB_USLEEPCOUNT={nnnn}'. This keyword is used to adjust the ratio of file unlock operations executed before a usleep function is executed in a FILEPI unlock action. This means that a usleep function is executed for every {nnnn} OS unlock operations. This keyword can be used to adjust the OS performance for FILEPI processing depending on the kind of application being used. If the {nnnn} value is set to zero, then no OS usleep operations are executed for a FILEPI unlock action. By setting the {nnnn} value to a low non-zero value can help to allow multiple user applications to access a file under a FILEPI in a balanced/equal manner. However, on some Unix OS systems the {nnnn} value may need to be set to a higher value or zero when a batch or single user application is being executed. - Added three new controls for the DISPLAY/KEYIN instructions. These controls are named *EOFON, *EOFOFF, and *EOFFLAG. These controls can be set or cleared in either a DISPLAY or KEYIN instruction. However, they are only used in a KEYIN instruction to detect an error when the standard input has failed. *EOFON - When this control is executed, then a program SHUTDOWN operation is executed when a KEYIN detects that the standard input has failed. This control remains in affect until an *EOFOFF is executed. *EOFFLAG - When this control is executed, then a program KEYIN instruction sets the EQUAL flag when a KEYIN detects that the standard input has failed. This control remains in affect until an *EOFOFF is executed. When this control is in affect, then the EQUAL flag is automatically cleared when a KEYIN instruction is executed. *EOFOFF - When this control is executed, then the *EOFON or the *EOFFLAG control is canceled and the KEYIN instruction executes without detecting that the standard input has failed. Note: 1. The *EOFOF and *EOFFLAG modes are mutually exclusive. When one mode is activated, then the other mode is automatically canceled. The *EOFOFF must be used to cancel either mode. 2. If these controls are used in a program, then the application program must be aware that the KEYIN now affects the EQUAL flag. 3. The implementation of these controls is to address a situation where a program continued to execute after a Telnet client session was terminated prematurely. - Corrected a problem where the OVER flag was being set by mistake for a runtime that does not leave shared files open. This problem can occur when the following sequence of instructions were executed. READ IFILE,EOF;; READ IFILE,BLANKKEY;Data READKS IFILE;Data ;OVER flag set by MISTAKE! - Corrected a problem where encryption strings generated/used by the ENCRYPT/DECRYPT isntructions when executed by a forward byte-order runtime were not compatible with encrytion strings generated/used by reverse byte-order runtimes. A change has been made to the forward byte-order runtimes to generate/use encryption strings that are now compatible with reverse byte-order runtimes. *WARNING* The users for forward byte-order systems need to be aware that the encryption strings for the ENCRYPT/DECRYPT instructions for the version 9.0 release are NOT COMPATIBLE with prior releases for any forward byte-order runtimes. ------------------------------------------------------------------------------- PLBCMP - Modified the compiler to support an INTEGER 8 construct. - Modified the compiler to support a new directive named %ENCRYPTON. When this directive is used, then the compiler will encrypt all INIT and DIM ARRAY initialization strings. This can be used to prevent sensitive data from being readable in the PLC file. Format: %ENCRYPTON [] Note: 1. The parameter is optional. The parameter can only be specified as a literal string. 2. The string must be a valid string as defined for the ENCRYPT instruction. See description for ENCRYPT. 3. If the string is not specified, then the compiler encrypts the data using the default ENCRYPT operations. 4. If a second %ENCRYPTON directive is encountered while a previous %ENCRYPTON directive is active, then the second %ENCRYPTON setting will be used. 5. The user program MUST use the DECRYPT instruction to decrypt any INIT or DIM ARRAY initialization data strings before being used in a program. - Modified the compiler to output the compile command line into a Window Titlebar when using a GUI runtime. - Modified the compiler to support a directive named %ENCRYPTOFF. When the compiler encounters this directive, then the encryption for INIT or DIM ARRAY initialization strings is disabled. All INIT and DIM ARRAY initialization strings are stored into a PLC module unchanged. - Added new compiler option named '-ZL'. This option causes the compiler to delete a spooled file listing output if a program compiled without any errors. This option only takes affect when the 'p' option is specified. - Added new compiler option named '-ZR="{del}"' allows a user to specify up to 2 characters for the {del} string that identifies a comment delimiter used for embedded source line comments. Sample: plbcmp program -zr=";" This command line will cause the compiler to give a compilation error if an embedded source line comment does not start with the semi-colon ( ; ) character. Example for the above Sample command line: MOVE "1",S$CMDLIN ;Comment ok MOVE "2",S$CMDLIN -INVALID COMMENT! - Modified the '-ZQ' compiler option to allow an optional level value. This modification allows 'ZQ=1' to be specified. This 'ZQ=1' option causes the compiler to suppress all displayed output except for the line counter. This change is being made to provide a compilation activity indication. - Added a new instruction named LISTCNT. The LISTCNT instruction retrieves the current object count for a specified COLLECTION. Format: [label] LISTCNT {dest}{sep}{collection} Where: label - Optional Program Execution Label dest - Previously defined Numeric Variable that receives the current object count for the {collection} object. collection - COLLECTION object whose object count is being requested. Flags: OVER - The OVER flag is set TRUE if the value stored into the {dest} variable is truncated. Notes: 1. The object count indicates the number of objects in a COLLECTION object at the root level. This means that a nested COLLECTION object within another COLLECTION is identified a value of 1 toward the total object count. 2. The {dest} count is set to be zero if the COLLECTION has not been created using a LISTINS instruction. - Added a new instruction named LISTGET. The LISTGET instruction stores the address of a specified object, found in the COLLECTION by an index, into a TYPELESS variable. Format: [label] LISTGET {dest}{sep}{index}{sep}{collection} Where: label - Optional Program Execution Label dest - The {dest} variable must be a TYPELESS variable where the specified COLLECTION object address is stored. index - A dnumnvar value that is a 1 based index to identify which object in the COLLECTION is to be retrieved. collection - A COLLECTION object that is being accessed. Flags: OVER - The OVER flag is set TRUE if the object address can not be accessed from the COLLECTION object. Otherwise, the OVER flag is set to be FALSE. Notes: 1. If the COLLECTION object has not been created, then the OVER flag will be set to be TRUE and the {dest} TYPELESS variable remains unchanged. 2. If the {index} has a value larger than the number of objects in the COLLECTION, then the OVER flag is set TRUE and the {dest} TYPELESS variable remains unchanged. 3. The TYPE instruction can be used to retrieve information about the {dest} TYPELESS variable. This type information can be used to store the object into an appropriate object pointer that can be used in other PLB GUI instructions. - Modified the compiler to support the '==' relational operation that can be used in place of the relational operator '='. Example: IF ( S$CMDLIN == "TEST" ) ... ENDIF - Modified the INCLUDE identifiers to support both uppercase and lowercase alpha characters. This means that any combination of identifiers ( a|A to z|Z ) is allowed. This increases the unique id count from 702 to 2756. This does mean that local label references must use the leading INCLUDE identifier as case sensitive when accessed in the PLB source debugger. - Modified the compiler to support DIM sizes larger than 64KB. The DIM data construct maximum size allowed by the compiler is 32MB (33554431 value). When a DIM size larger than 65535 is specified, then the DIM data construct is implemented as an auto load DIM pointer. This helps to keep the '.plc' program file size as small as possible. See the new compiler option description to change the default auto load DIM pointer size. If a user application requires a DIM data variable with a size larger than 32MB, then a DIM pointer can be used and an SMAKE can be used to create a DIM with a size up to 2GB (2147483647 value). This size is limited by the OS memory allowed for the PLB program space. The runtime 'm' or 'MV' command line options can be used to increase the PLB program memory size. Examples: A DIM 65535 ;Old maximum DIM size B DIM 65536 ;Auto load DIM pointer used C DIM 2000000 ;Auto load DIM pointer used . pA DIM ^ . SMAKE pA,40000000 ;'m' option required Tips: 1. If WRITE operations are performed using very large DIM variables, then FILE variables with small buffer sizes should be avoided because it can result in a long time to perform the IO operation. 2. If a WRITE operation is performed using a very large DIM variable, then opening a FILE variable in a SHARENF or EXCLUSIVE mode can give the best performance time to perform the IO operation. - Added a new compiler option named 'ZJ[=nnnnn]. The ZJ option can be used to change the default Auto Load DIM size that the compiler uses when processing a DIM data variable. The Auto Load DIM is a case where the compiler determines that the DIM variable is to be generated where the PLB runtime creates the DIM variable when the program is loaded. By default, without the ZJ option, the compiler forces a DIM variable to used as an Auto Load DIM when the DIM size is larger than 65535. The ZJ option can be used to change this default value. If the ZJ option is used without the 'nnnnn' value, then the default Auto Load DIM size is set to be 256. If the 'nnnnn' value is specified, then the 'nnnnn' value is used as the Auto Load DIM default size. - Added a new instruction named AAMDEX. - Added a new instruction named INDEX. - Modified the PROFILE and WINAPI instructions to support new variable types named INT8 and PINT8. These data types are defined as follows: INT8 is an INTEGER of eight bytes. PINT8 is a pointer to an INTEGER of eight bytes. - Added a new compiler directive named '%AUTODIM {nnnnnn}'. This directive changes the current Auto Load DIM size used for the compilation to be set to the {nnnnnn} value. This gives more control to allow multiple Auto Load DIM sizes for a program compilation. If the {nnnnnn} value is set to zero (0), then the Auto DIM size processing by the compiler is disabled as long as the size is set to zero. The Auto DIM size is used by the compiler to determine when the size for a DIM variable is to be coded using the 'DIM ^size' syntax form. - Modified the compiler to give a compiler error if the Auto Load DIM syntax 'DIM ^size' is being used in a program and a ROLLOUT instruction is encountered. This is not allowed because the Auto Load DIM variables are created using OS memory allocation functions and these variables do not reside in the program memory space. - Modified the GETPROP instruction to support the FONT property for a FONT object. This change can allow an application to retrieve the font named directly from the FONT object. Also, this change allows a FONT object to be duplicated easily. - Modified the *ORIENT control for a PRTPAGE operation to accept a {dnumnvar} operand in addition to the *LANDSCAPE and *PORTRAIT keywords. If the {dnumnvar} value is 1, then PORTRAIT is used. If the {dnumnvar} value is 2, then LANDSCAPE is used. Any other values for the {dnumnvar} value causes PORTRAIT to be used. - Modified the compiler to give a syntax error when a file variable declaration keyword value for BUFFER/FIXED/VAR is too large. The maximum allowed value for these keywords is 65533. - Modified the compiler to give a syntax error when a PREP for an AFILE or IFILE has an invalid record size value specified. The compiler can only verify literal value in this case. The record size value must be greater than zero and can not be larger then 65533. - Modified the compiler to generate pcode for a KEYIN *EDIT control to executed with behavior consistent with the SWDBC compatibility mode. When the 'zc#3' compatibility mode is used, then the *EDIT executes like *DVEDIT with *INSERT turned on. - Modified the initialization for a DIM array to allow a NULL literal ("") to be supported. Example: A DIM 4(3),("a"),(""),("c") - Modified to support the new OBJECT GUI object pointer data variable. See description under PLBWIN for details. - Corrected a problem where a compilation error was occurring when a a PLFORM collection reference was encountered in the source list of objects and the destination operand was a COLLECTION object pointer for a LOADADR instruction. - Corrected a problem where a compilation error was occurring when a COLLECTION object pointer was encountered in the destination object list and the source operand was a PLFORM collection reference for a STOREADR instruction. - Corrected a problem where the compiler was not giving an error when the destination variable of a GETITEM instruction was a FORM and the object was an EDITNUMBER. The compiler now gives an error in this case. - Corrected a problem where the compiler was allowing a STATUSBAR object to be used in a GETITEM and SETITEM statement. The compiler now gives a compilation error when a STATUSBAR is used in a GETITEM and SETITEM instruction. - Corrected a problem where the compiler would hang indefinitely when a CALL statement with the following syntax was encountered. Example: REC RECORD (2) A DIM 5 B DIM 5 RECORDEND . CALL FUNC USING REC(2) ... ------------------------------------------------------------------------------- PLBDBUG - Modified the debugger to support DIM sizes larger than 64KB. - Modified the debugger to detect COMM errors when communicating with the GUI debugger. ------------------------------------------------------------------------------- PLBDSIGN - Modified the startup processing so that the Code window no longer comes to the front on creation of a new form. - Added a new menu item under 'File' named 'New PocketPC FORM'. This menu item selection causes a new form to be created and initialized for designing a form for a PocketPC. When a PocketPC FORM is being used, then the default font is set to the 'Tahoma' font that is supported by PocketPC CE devices. - Modified to initialize the Toolbox window to show all tool buttons. - Added Sunbelt icon to show in the 'About dialog'. - The designer title bar now properly reflects a forms dirty status by giving an '*' character after the form name. - Added a new designer window that shows an Object tree view for the designer. The new Object Tree can show multiple forms that currently opened. All objects are group by object type. With the implementation of an Object Tree, this allows objects that are not visual to be included into a form like TIMER and IMAGELIST objects. - The designer has been changed to prevent the Code Window from popping up on Ctrl-Tab sequence. - Add IMAGELIST and TIMER objects to a form. The visual access for these objects is available through the Object Tree. - Added a combobox display of images to TOOLBAR buttons. - Added hide/show state for PANEL objects. When the user performs a right mouse click action over a PANEL object, then a Hide or Show action is available. These feature allows a user to design multiple PANEL objects for a single form. This can be used to design a PANEL object with a set of objects that can be associated with individual tabs of a TABCONTROL object. - Read-only resources can now be opened by the resource dialog. - Popup property values for properties in the PROPERTY window are now sorted. - Popup property values for properties in the PROPERTY window now show actual value as 'nnn -'. The nnn value in this case is the actual property value that can be used for the property in direct program instruction usage of the property. - Added Change event for the ANIMATE and IMAGELIST objects. - Added ResourceId for the IMAGELIST object. This allows a picture resource to be assigned to provide images for the imagelist. The Windows OS Imagelist control segments the picture into segments according to the ImageHeight and ImageWidth property settings. - Modified the BUTTON object to support an ICON and PICTURE property. This change allows the images to be assigned to a BUTTON object during the design phase of a form. - Modified the WINDOW object to support an ICON for a form. This change allows the form window Icon to be assigned during the design phase of a form. - Added the TABID property for the STATBUSBAR and TOOLBAR properties. This change allows the user to determine if these objects should be included in the tabbing sequence or not. - Modified the designer to support FLOATMENU, MENU, and SUBMENU objects. The implementation for these objects is being done using the new object tree view for the designer. Menu items can be created for each object menu type. In addition, submenu objects can be associated with FLOATMENU, MENU, and SUBMENU objects that have been created. - Corrected a problem where the TOOLBUTTON height and width were not being set properly for a CREATE TOOLBAR operation. - Corrected a problem where a change to the ALIGNMENT property for an EDITNUMBER object did not show immediately in the designer. - Corrected a problem where a VISIBLE false state for TOOLBUTTON buttons for a TOOLBAR was being reset to a true state after a form was saved and reloaded. - Corrected a problem where the EDITNUMBER object size is left at a reduced size when an UpDown control is removed. - Corrected a problem where the EDITNUMBER object data was being selected after the object was resized and then the up/down control was clicked. ------------------------------------------------------------------------------- UTILITY - Modified SUNINDEX to support a new option named 'N$'. This option causes the index utility to ignore duplicate keys and any duplicate key warning messages are ignored/suppressed. - Added new internal option '-Q{logname}' for the SUNAAMDX, SUNINDEX, and SUNSORT utilities. The internal 'Q' option allows the utilities to append displayed data to a {logname} log file. - Added a new user option 'O[={n}]' for the SUNINDEX and SUNAAMDX utilities. The 'O' option causes the AAM/ISI file headers to marked for use by a Windows or Unix PL/B runtime. The {n} OS Type value is optional. If the {n} value is not specified, then the AAM/ISI files are marked for an OS Type depending on whether the utility is being executed as a Windows or Unix utility. If the {n} value is specified, then the value must be either 1 for Windows or 2 for Unix. Please note the following: Examples: 1. sunindex data -1-5,O If the 'sunindex' utility is being executed as a Windows utility, then the 'data.isi' index file is marked so that a Windows runtime ( PLBWIN, PLBCON, ...) can open the ISI file. If the 'sunindex' utility is being executed as a Unix utility, then the 'data.isi' index file is marked so that a Unix runtime ( PLB ) can open the ISI file. 2. sunindex data -1-5,O=1 The 'data.isi' index file is marked so that a Windows runtime can open the ISI file. 3. sunindex data -1=5,O=2 The 'data.isi' index file is marked so that a Unix runtime can open the ISI file. - Modified the MAKEMFD utility to use a default port number of 3934 to access the SUNFM file manager. - When using SUNINDEX to index a file using a binary data option, then the Lnnn record length must be specified. Otherwise, an appropriate utility error occurs. ------------------------------------------------------------------------------- ODSBAC32.DLL- The Sunbelt ODBC driver has been enhanced to improve the performance when communicating with a SUNFM File Manager. - The driver optimization algorithms have been improved to provide the best performance possible. - The optimization for '<', '<=', '>', and '>=' SQL selection combinations has been improved to only process the range requested in the same column. - Support for Restriction Numbers has been implemented for columns to be used in multikey Isam files and temporary Isam file creation. A Restriction Number is a number that identifies the relative importance/uniqueness of a given column. The Restriction Number is specified as a numeric value defined as [res] when specifying the COLnnn column declaration in the SASCHEMA.INI file. The higher the Restriction Number indicates that the column has a higher importance and is more unique as compared to other column declarations. See the 'Readme32.txt' file for more information. - When a non-zero Restriction Number is declared for a column in the SASCHEMA.INI file, then temporary Isam working files are created to optimize the processing required to retrieve the data for a SQL selection request. ------------------------------------------------------------------------------- SUNFHSYS.DLL- Modified the File IO capabilities to provide large file support with file sizes larger than 4GB. - Modified to use the new SUNFM user port number of 3934. - Modified to support TRANSACTION statements. - Modified to support AAMDEX, INDEX, and SORT instructions. - Modified to support DBxxxx enhancements. - Corrected a problem where a FILEPI using a file variable opened in EXCLUSIVE mode was causing a SUNFM file manager child thread to hang indefinitely. ------------------------------------------------------------------------------- ADMIN - Modified the PLBSERVE and SUNFM servers to support ADMLOGON operations using the server main listening logon entry point that uses the default port number for the server. This capability is enabled as a default when the servers are using the ADMIN_PUBLIC keyword to provide secured access to the servers. In addition, a new keyword named 'ADMIN_MAINLOGON={on|off}' is available for the servers to disable the main logon capability. ------------------------------------------------------------------------------- SUNIDE - Increase the size of the fully qualified name allowed for programs to 250 bytes. - Added the GUI debugger. - Added user defined tool menu. - Added tabs to the code window for each file that is open. - Added support for user defined icons for user defined tools. - Modified project file to support a preferred compiler and runtime, the defaults are used if they are not found or not specified. - Modified the Backup project files to include the PLCs. - Add source now causes the most recently added source of a project to be the active program. - Modified Dependency processing to use Large dim support for better performance. - Modified project file format for faster processing. - Made a change in the source map to indicate files that were not found. - Modified the project file so it is stored compressed to save space. *NOTE* The Project file is not compatible with earlier versions of the IDE. - User defended tools can now appear on the TOOLBAR - Modified C15 error checking to re-initialize the SEARCHPATH when a subcode 27 is encountered and retry before failing. - Modified Browse labels column sort to change the sort order. - Modified Browse labels column sort to be accumulative. - Modified the Print logic to expand tabs using the editor defined tabsize. - Added support of displaying the function key flag state. - Fixed a bug where variables defined in includes may not get loaded from a source listing. - Fixed a bug where the -I runtime option may be specified even if there is no specified project INI file. - Fixed a bug where not all programs are reported as up to date when doing a build all. - Fixed a bug where an O105 error could occur if there were no files open. - Fixed a bug where nested dependencies may not be preserved. - Fixed a bug were saved compiler options could become corrupt. - Fixed a problem where the IDE could open the wrong list file if more than one existed on the PLB_PATH. The IDE now reports the list file that is truly being processed so the user can more easily identify if the wrong list file is being evaluated for errors. - Fixed a problem where the CUT/COPY/PASTE and UNDO/REDO edit menu options and toolbar button could be set at random with multiple editor windows open. - Fixed a bug where if a user changed the project working directory, it would not take effect until the next time the project was opened. - Fixed a problem where the good and bad compile counters were only 2 digits resulting in incorrect results for larger projects. - Fixed a bug were the IDE could get stuck in an infinite loop while initially loading list files. - Fixed a problem where the list file counter was only 2 digits resulting in not having all the list files for larger projects loaded. - Fixed various file name handling bugs(names with spaces). - Fixed a bug in the build process where the modification dates of some includes were not getting evaluated. - Corrected a problem where the IDE may not report a LISTFILE as missing and assume a good compile. - Corrected a bug where the IDE may not save all files before a compile or while exiting. - Corrected a problem where stale data could corrupt a new project if it is created to overwrite an existing one.