470 likes | 590 Views
DB-13: Understanding VSTs. By Paul Guggenheim. About PGA. Working in Progress since 1984 and training Progress programmers since 1986 Designed six comprehensive Progress courses covering all levels of expertise
E N D
DB-13:Understanding VSTs By Paul Guggenheim
About PGA • Working in Progress since 1984 and training Progress programmers since 1986 • Designed six comprehensive Progress courses covering all levels of expertise • Major consulting clients include Foxwoods Casino, Health Informatics, Bank One, Textron Fastening Systems, and American Academy of Orthopaedic Surgeons
What are VSTs ? • VST stands for Virtual System Table. • VSTs provide 4GL access to information contained in the Progress Monitor (promon) utility. • VSTs are schema tables that are stored in memory.
Why Use VSTs ? • VSTs may be easily integrated into existing Applications. • Some startup parameters may be updated through VSTs. • Statistical Database Performance Reporting can be easily accomplished. • The Databases can be constantly monitored from within the Application. • Additional information about locking conflicts may be provided to the end-user.
Accessing VSTs • VSTs are metaschema tables • Automatically included in Version 9 • Must enable them in Version 8 with the following command: proutil dbname –C enablevst • To look at in GUI Dictionary, select: View->Show Hidden Tables • To look at in CHUI Dictionary, enter VST table name
Viewing VSTs • VSTs are records in the _file metaschema table • _file-number range for VSTs (9.1D): -16385 to -16423 • Two new tables were added to OpenEdge 10. • _Code-Feature • _Database-Feature • One new field is added to OpenEdge 10. • _server._server-pendconn
VST Inquiry • In program vstinq.p, the VST schema may be viewed.
VST Characteristics • Every VST has one field that ends in ‘id’. • This field serves as the VST’s unique index. • This field is sequentially numbered from 1. • Exception is _TxeLock where Id field is ?.
VST Characteristics • Many VSTs pre-allocate records based upon startup parameters. For example: proserve school -n 3 -Mn 3 -L 250 -B 500 produces a –n of 4. • Progress adds an extra user for shutting down the database or promon.
VST Characteristics • Let’s look at the _Trans table:
VST Characteristics • The default initial values in most VST fields is unknown (?). • The–Mn value is 3. • One record for each server and the one record for the database broker is displayed.
VST Characteristics • Let’s look at _UserLock table. It shows which locks a particular user currently holds.
VST Characteristics • _UserLock-Id 1 is the broker, 2,3 and 4 are the servers, 5,6 and 7 are connected users and 8 is a promonsession. • The formula for this table is: –n + -Mn + 2 where –n is the startup number of users. • Since the –L is 250, Progress rounds it to the nearest multiple of 32 which is 256.
VST Characteristics • The _Lock file will look like the following:
Resolving Locking Conflicts • As a developer, you had 2 choices in resolving locking conflicts: Option 1: Let Progress handle it.
Resolving Locking Conflicts • As a developer, you had two choices in resolving locking conflicts: Option 2: Handling locking conflicts in the procedure repeat: prompt-for student.student-id. find student using student-id exclusive-lock no-wait no-error. if available student then update sfirst-name slast-name. else if locked student then do: find student using student-id no-lock no-error. message "Student record is locked” skip "Please wait until later." view-as alert-box. end. else message "Student number does not exist" view-as alert-box. end.
Resolving Locking Conflicts • Problem with Option 1: • User has to undo their transaction. • The stop key, unless trapped, forces the user to the beginning of the application. • Problem with Option 2: • User doesn’t know who has locked the record…UNTIL VSTs!
Resolving Locking Conflicts • Adding the statements below now provides the user with additional information about who has the record locked: find first _lock where _lock-recid = integer(recid(student)) no-error. message "Student record is locked by user:" _lock-name skip "Please wait until later." view-as alert-box.
Record Locking Inquiries • For each user, Progress provides up to 512 locked records for display and lookup.
Record Locking Inquiries • In lockinq.p, we start with the _UserLock table to show available users in a browse. • For each user selected there is another browse that shows the locked records for that user, it’s table name, RECID and lock flags. • To accomplish this, a temp-table is built storing the RECID and chain number from the corresponding array fields in the _UserLock table.
Record Locking Inquiries • In lockinq.p, we start with the _UserLock table to show available users in a browse. • The second query is opened using this RECID and chain number to read the _Lock record to get the table number. • The table number is then used to read the _file metaschema table to get the table name for the browse.
Record Locking Inquiries • In lockinq.p, we start with the _UserLock table to show available users in a browse. • For each locked record selected, the table name and RECID are passed to the getfieldvalues procedure which dynamically creates a query for that record. • It then calls the procedure showtable which displays the field names and values for that locked record using the tfld temp-table.
4GL User Disconnect • The next program, disuser.p, allows someone to disconnect a user from within the 4GL. • The program uses the _connect and _myconnection VSTs.
4GL User Disconnect • The next program, disuser.p, allows someone to disconnect a user from within the 4GL. • The _connect table is used for the query and browse for connected users. • The _connect-usr values that are unknown and the previously disconnected users (connect-disconnect = 1) are filtered out. • The _myconnection table is used to prevent someone from disconnecting themselves. • This table was added to V9 to make it easy to identify which connection is the current session.
4GL User Disconnect • The next program, disuser.p, allows someone to disconnect a user from within the 4GL. • The actual user disconnection is performed by the _mprshut command using a temporary command text file as standard input. • Because a disconnection may take a few seconds, a pause of 15 seconds executes before re-opening the query. The _connect-disconnect field will be 1 when the disconnected process is finished.
DB Area Statistics • The _DBStatus and the _AreaStatus VSTs supply useful information about the database and database areas.
DB Area Statistics • In program dbareastat.p, the size of the bi is monitored along with the total number of locks, the highest number of locks and highwater marks for database areas. • In V9, the multi-volume bi size is reported by dividing the high water mark blocks by the bi block size.
Record Requests • Promon provides a tremendous amount of database and performance statistics. • By using VSTs, this data can be processed any way desired.
Record Requests • For example, the program userio.p shows the amount of activity for requests vs. record reads per user and in summary. • The _UserIO table provides information on a per user basis for reading and writing to the database, before-image and after-image files. This information may be found on the Block Access screen (3) in promon. • The _ActSummary table provides summary information and some of its data may be found on the Activity screen (5) in promon. • Some useful information provided by _ActSummary is the number of checkpoints and database buffers flushed.
Table Statistics • Table statistics are available through VSTs but not through promon. • Statistics on the number of times a table was read, updated, created and deleted are kept. • Note that data that is undone does not reduce the corresponding statistic. • Unfortunately, there is nothing in VSTs that link user access to specific records in tables. • For example, to show which records were read by a given user would be useful for security or for application troubleshooting purposes.
Table Statistics • The program tablestat.p is used show the tables with the highest number of reads. • The Refresh button may be pressed to show the latest data. • Tablestat.p uses the _TableStat VST.
Buffer Status • One of the most important parameters to set is the database buffers parameter, –B. • Setting it too high can waste memory and could cause swapping. • Setting it too low can cause increased disk access and performance degradation. • The _BuffStatus VST can be used to measure the effectiveness of the –B parameter.
Buffer Status • In buffstat.p, the program opens the _bfstatus record in the query and displays it to the screen when the Refresh button is pressed. • This is the same information that is shown in promon under R&D->1 (Status Displays)-> 7 (Buffer Status).
Buffer Status • In buffstat.p, the program opens the _bfstatus record in the query and displays it to the screen when the Refresh button is pressed. • With the –B set at 500, notice that the total buffers is 502. • One extra buffer is for the Database Master Block. • The 2nd block included is called the Index Anchor Block and is not used in V9.
Buffer Status • If a long report is run, such as: for each registration: end. then the unused buffers become filled from the report.
Setting Read Only Buffers • Question: How do we prevent all the buffers being used up by a report? Answer: Set the read only buffers on the client. • Two ways to do this: 1. At startup using the –Bp parameter 2. Updating the _MyConn-NumSeqBuffers field in the _MyConnection VST.
Setting Read Only Buffers • Read only buffers (ROBs) are new to V9. The –Bp parameter specifies the number of read-only blocks a client may have. • ROBs are part of the total –B buffer pool, so that the remaining buffers are available for modified buffers. • Once a client has ROBs allocated to them, a large report’s records will stay confined to the ROBs.
Setting Read Only Buffers • We will start a session with a –Bp = 64. • We will run a series of reports from the editor: for each student no-lock for each registration no-lock • The used buffers increases slightly, but then remains fixed.
Setting Read Only Buffers • Next, we run updrobuf.p, and set the read only buffers equal to 0. • We then run the reports and notice that the used buffers equal to the total buffers. • The used buffers is a high water mark. It will not go down even though the buffers may be re-used.
Customizing PRO*Tools Toolbar • A convenient place to put the VST programs you created is on the PRO*Tools Toolbar.
Customizing PRO*Tools Toolbar • It is fairly easy to add your own tools to this toolbar. • Right-mouse-click on the toolbar and select Menu Bar. A pull-down menu bar will appear on the toolbar. • Select File->Customize… then press the Add button to add your program. • Select Run Persistent, Display on palette and supply an image. • Select “yes” to override protools.dat so that your tools will show up on every session.
Customizing PRO*Tools Toolbar • Make sure that the PROPATH environment variable contains the directory where your VST programs are located. • Two include files are required in order to be compatible with the PRO*Tools toolbar. • _adetool.i – contains a single internal procedure called ADEPersistent, which prevents the Progress Editor from removing the instance when running other programs. • _runonce.i – prevents multiple instances of the tool to be run at the same time.
Customizing PRO*Tools Toolbar • Each option also contains its own dynamic window and is parented to the PGA toolbar window.
Acknowledgements • I would like to thank Dan Foreman for writing the Virtual System Tables Guide. It was very helpful in creating this presentation.
Summary • VSTs provide 4GL access to information contained in promon. • Many useful reports and tools may be created.