DOCUMENT #713
     =======================================================================
     CHECKING DATABASE INTEGRITY
     =======================================================================
     PRODUCT:  R:BASE           VERSION:  3.1 or Higher
     =======================================================================
     CATALOG:  Data Integrity   AREA   :  Pointers       
     =======================================================================
     
 
     You should always check your database for errors before making a 
     backup. After all, a corrupt backup isn't a good backup. And errors
     accessing data such as, "Disk problems. Please check disk and files"
     should be investigated for possible database damage. 
 
     Microrim provides three different ways to check your database
     structure and data pointers: AUTOCHK, RBCHECK, and R:SCOPE. Both
     AUTOCHK and RBCHECK are included with R:BASE 3.x and 4.x. R:SCOPE is
     a separate product that can be purchased from our Sales Department 
     (800-628-6990). 
 
     AUTOCHK is a small program that can be easily incorporated into an 
     application and called with ZIP (see README.TXT for examples using 
     AUTOCHK). AUTOCHK returns a value to the R:BASE error variable. An 
     AUTOCHK value other than 0 indicates damage to the database. AUTOCHK 
     does not check the entire database, it stops checking as soon as it 
     encounters an error. To get a complete picture of the possible damage
     in the database you need to use either RBCHECK or R:SCOPE.
 
     R:SCOPE is the most complete of the three database checking tools; it
     checks database structure, data pointers and indexes. It also 
     incorporates database correction features. The R:SCOPE documentation
     includes detailed information about R:BASE database file structure 
     and data storage. But you may not have R:SCOPE and you'd like to know
     the possible damage right away. Even having R:SCOPE sent overnight 
     may not be quick enough.
 
     RBCHECK is an undocumented utility designed for use by Technical 
     Support to help diagnose database problems. When you call Technical 
     Support and it sounds like you might have database damage, we'll 
     suggest that you run RBCHECK. RBCHECK checks the structure file 
     (1.RBF) and the pointers in the data file (2.RBF), it does not check
     the index file (3.RBF). RBCHECK does not correct damaged databases, 
     it only indicate if there is damage. 
 
     Note: R:BASE 4.5 names the database files dbname.rb1, dbname.rb2 and
     dbname.rb3. To check a 4.5 database you need the 4.5 version of 
     R:SCOPE or AUTOCHK. The 4.5 version of AUTOCHK incorporates the full
     database checking features of RBCHECK.
 
 
     Using RBCHECK
     =============
     RBCHECK is executed at the operating system prompt, not from within 
     R:BASE. You can run RBCHECK from the directory where the database is 
     located, or from the RBFILES directory indicating the drive and 
     directory location of the database. When running RBCHECK, you must 
     direct the output to see all the results. RBCHECK requires the 
     database owner password if one has been defined.
 
     RBCHECK stops checking data in a table when it hits an error. It may 
     not report all the errors in a table. After correcting the reported 
     errors, run RBCHECK again.
 
     You cannot run RBCHECK against a database that is currently being 
     used. Everyone using a database must be disconnected from the database 
     or exited from R:BASE in order to check the database.
 
     Be sure to use the correct version of RBCHECK. Don't use the version 
     of RBCHECK that came with R:BASE 3.1A to check a database that you are 
     now working on with R:BASE 4.0. A current version of RBCHECK is 
     included with each version of R:BASE. If checking databases used with 
     R:BASE prior to 3.x, be aware that many names may be reported as errors
     in the structure check. RBCHECK checks for legal names based on the 3.x, 
     4.x rules. The R:TOOLS version of RBCHECK (RBCHECK2.EXE) is available on 
     the BBS as well as the 4.x version. Use the R:TOOLS version to check 
     databases from earlier versions of R:BASE (R:BASE for DOS, 2.11, or 
     System V).
 
     Examples of RBCHECK syntax, checking the sample database Concomp:
 
     RBCHECK concomp
     ---------------
     Results scroll across the screen without pausing. If there is an owner 
     password defined, RBCHECK stops and prompts for the password. Use this 
     syntax for a quick check, total errors are reported at the end of the 
     output.
 
     RBCHECK concomp |more
     ---------------------
     The check results pause on the screen page by page, you can read them 
     but once they've gone by you must redo the command to see them again. 
     More is a DOS utility that displays output a page at a time. The 
     output is not displayed until the check has completed. Because the 
     output is redirected (to the program More), you don't see the password 
     prompt if your database has an owner password defined. The program
     simply waits for keyboard entry. After the copyright message displays, 
     type in your owner password.
 
     RBCHECK concomp >check.dat 
     --------------------------
     This is the recommended syntax. The check results are directed to a 
     file called check.dat. You can replace check.dat with a filename of 
     your choosing. View the output file at the DOS prompt by entering TYPE 
     CHECK.DAT |MORE, the file displays page by page. In R:BASE, the 
     command TYPE CHECK.DAT at an R> prompt also displays the file page
     by page. You can load the file into a word processor, use the R:BASE 
     editor, or print the file. Because the output has been redirected (to 
     the file check.dat), you do not see the password prompt if your 
     database has an owner password defined. The program simply waits for 
     keyboard entry. After the copyright message displays, type in your 
     owner password.
 
     RBCHECK -Upassword concomp >check.dat
     -------------------------------------
     The check results are directed to a file called check.dat. The -U 
     option tells RBCHECK that the letters immediately following are the 
     owner password for the database.
 
     It is recommended to direct the RBCHECK results to a file. The results 
     can be easily viewed or printed.
 
 
     Interpreting the results and correcting errors
     ====================================================
     RBCHECK error messages are cryptic and intended for internal use. The 
     first step is understanding the error messages, second is figuring out 
     what to do about the error. The most common errors are described below. 
     If you get an error that's not listed below, call Technical Support.
 
     RBCHECK checks and reports errors in two groups: file 1 (structure) 
     and file 2 (data). File 1 is further broken down into database 
     parameters and relation & column tables. RBCHECK reports the name of 
     the table it's checking and any errors are reported immediately 
     following the table (or column) name.
 
     The number and type of errors indicate what to do in response to the 
     errors. Some errors can be ignored, some can't be easily fixed.
     Generally you want to evaluate the time and effort needed to correct 
     the errors versus restoring a backup copy and reentering data. The 
     article "Understanding Data Pointers" in this Exchange has additional
     information on correcting database errors.
 
     Correcting the errors again depends on what the errors are. Sometimes 
     an error is easily corrected if it is the only one you have, but in 
     combination with other errors can be difficult to correct. Some errors 
     are corrected in R:BASE, others with R:SCOPE, still other errors 
     require restoring the database backup.
 
     In general, if the only reported errors are in the structure file 
     (1.RBF), and you can view all the data in the tables with errors, 
     the errors can be corrected by using the R:BASE BACKUP/RESTORE or 
     UNLOAD/INPUT commands. For further information on UNLOAD/INPUT you 
     can download document #637 from Microrim's automated fax server at 
     (206) 649-2789. To correct structure errors, you need to recreate the 
     structure file in R:BASE and then load the data. Do not attempt to 
     correct structure errors in R:SCOPE; and do not try to replace the 
     structure file with an older copy of the file. Structure errors are 
     often best corrected by restoring the backup copy of your database. 
 
     If you have errors in the data file (2.RBF), you can use RSCOPE to 
     fix the errors. Some tables can be corrected in R:BASE using the
     PROJECT method with an indexed column. 
 
     If you are unsure of how to proceed to correct the errors, call 
     Technical Support. Have the RBCHECK output handy, we'll want to know 
     what the exact errors are.
 
     Always be sure you have a current backup copy of the database made 
     using the DOS COPY or BACKUP commands or a third party backup utility 
     before proceeding with any steps to correct the errors. 
 
 
     File 1 (database structure) errors
     =======================================
 
     R5KVER is mmm, should be nnn.
     -----------------------------
     The database was not properly exited. When a database is closed this 
     value must be either -201 or -214. The -214 indicates that the database 
     is a 4.x extended database, it has more than 80 tables or 800 columns 
     and can only be connected by 4.x. All other databases should have a 
     value of -201. For example, a value of -204 indicates that the database 
     was left in a COMPATIBILITY OFF mode. To correct the error, simply 
     connect the database in the correct mode and then disconnect and exit 
     normally from R:BASE.
 
     F2SIZE is mmmmmm, should be nnnnnn. 
     -----------------------------------
     The size of the 2.RBF file (data file) is incorrect. The actual size 
     on the hard disk is mmmmmm, but the 1.RBF file indicates that the size 
     should be nnnnnn. This error can occur if R:BASE is not exited normally.
     Expect to also see errors in the data file check. This error indicates 
     that data is physically missing from the data file. There is no way to 
     recover the missing data. A PACK or RELOAD will correct the database 
     errors and the missing data can be reentered. When checking a 4.x 
     database with an earlier version of RBCHECK you will see this error but 
     there is not a problem with the database. R:BASE 4.x pre-extends the 
     size of file 2 to alleviate full disk problems.
 
     F3SIZE is mmmmmm, should be nnnnnn. 
     -----------------------------------
     The size of the 3.RBF file (data file) is incorrect. The actual size 
     on the hard disk is mmmmmm, but the 1.RBF file indicates that the size 
     should be nnnnnn. This error can occur if R:BASE is not exited normally. 
     It indicates that data is physically missing from the index file. There 
     is no way to recover the missing indexes. A PACK or RELOAD will rebuild 
     all the indexes and correct the errors. When checking a 4.x database 
     with an earlier version of RBCHECK you will see this error but there 
     is not a problem with the database. R:BASE 4.x pre-extends the size of 
     file 3 to alleviate full disk problems.
 
     RNAME invalid. 
     --------------
     RNAME comes from Relation NAME. The term RELATION means TABLE. The 
     table name (RNAME) shown after the word checking is an illegal name 
     in R:BASE 3.x or 4.x or RBCHECK has seen control codes or extended 
     ASCII characters in the name or the name is blank. If there are not 
     other errors in the database, it may be possible to correct with 
     R:SCOPE. Usually this error means restore the database backup.
 
     ANAME invalid. 
     --------------
     ANAME comes from Attribute NAME. The term ATTRIBUTE means COLUMN. 
     The column name (ANAME) shown is an illegal name in R:BASE 3.x or 
     4.x or RBCHECK has seen control codes or extended ASCII characters 
     in the name or the name is blank. If there are not other errors in 
     the database, it may be possible to correct with R:SCOPE. Usually
     this error means restore the database backup.
 
     NCOL invalid. 
     ------------
     NCOL is (nn), should be (mm). 
     The row length stored for a table is not correct. The row length for 
     the table is either less than two (minimum row length) or greater 
     than 2,048 (maximum row length) and there are no NOTE fields in the 
     table. If you receive this message you can expect a corresponding SIZE 
     LESS THAN MINIMUM or SIZE GREATER THAN MAXIMUM error in the 2.RBF file. 
     Usually this error means restore the database backup. It is rare for 
     this to be the only error in file 1.
 
     IDATT is mm, should be nn. 
     --------------------------
     This is one of the most common errors you'll see when using RBCHECK. 
     It is a harmless error, and has no effect on the operation of your 
     database. R:BASE stores all the columns in a numbered list, each table
     references a beginning location in that list. The first table in the
     database starts at one. The second table in the database starts at one 
     plus the number of columns in table1. The third table starts at the 
     beginning location for table2 plus the number of columns in table2 etc. 
     RBCHECK calculates the expected reference value using this formula. 
     If the beginning location referenced by a table is not the same as the
     calculated number RBCHECK reports an error. Once you have this error 
     on one table in a database, all succeeding tables should report the 
     same error. You often have a NUMATT error reported also. This error 
     happens when columns are left in the column list but are no longer 
     associated with a table. It occurs most often in converted databases. 
     These errors cannot be corrected with R:SCOPE. You must recreate the 
     database using the R:BASE BACKUP/RESTORE or UNLOAD/INPUT commands. If 
     these are the only errors, they can also be corrected with the 
     RBPACKF1.EXE program from the Microrim Bulletin Board 
     (1-206-649-9836).
 
     ATTCOL invalid (nn). 
     ATTCOL is (mm), should be (nn). 
     -------------------------------
     This is the location of the data within a row. It is calculated 
     similar to the IDATT. The first column in a table must have an ATTCOL 
     of one. The second column's ATTCOL is one plus the length of the first 
     column in words ( one word = two bytes or characters). If you get this 
     error, you probably also get an ATTYPE and ATTLEN error. Usually this 
     error means restore the database backup.
 
     ATTYPE invalid (nn).
     -------------------- 
     R:BASE stores the data type of a column as a number. If the number 
     stored for the column is invalid you will receive this message. If 
     you get this error, you probably also get an ATTCOL and ATTLEN error. 
     Usually this error means restore the database backup.
 
     ATTLEN invalid (nn).
     ATTLEN is (mmm), should be (nnn). 
     ---------------------------------
     All data types are stored with a length of 1 except TEXT and NOTE. 
     TEXT data types are stored with their actual lengths. Therefore, TEXT 
     30 is stored as 30. NOTE fields are stored with a length of 4. You get 
     this error if the stored length does not match the datatype. If you get 
     this error, you probably also get an ATTCOL and ATTYPE error. Usually 
     this error means restore the database backup.
 
     NUMATT is (nn), should be (mm).
     ------------------------------- 
     The number of columns in the column list of the database does not 
     match the sum of the number of columns stored for each table. If you 
     have IDATT errors, you usually have this error also. This error cannot
     be corrected with R:SCOPE. You must recreate the database using the 
     R:BASE BACKUP/RESTORE or UNLOAD/INPUT commands.
 
     ATTKEY invalid (nn). 
     --------------------
     The value of ATTKEY is the starting location of the index information 
     in file 3. This error means that the value is either less than zero or 
     ATTKEY times 512 is greater than the size of file 3 (F3SIZE). Generally, 
     ATTKEY errors can be corrected by rebuilding indexes with a PACK, 
     RELOAD or CREATE INDEX command. 
 
 
     File 2 (database data) errors
     =============================
 
     Read error at id = nnnn. 
     ------------------------
     RBCHECK could no longer read data from the file. The address (ID) shown 
     is often either negative or beyond the end of file 2. The database may 
     also report an F2SIZE error when checking database parameters. There is 
     no way to recover the missing data. A PACK or RELOAD will usually 
     correct the error and the missing data can be reentered.
 
     Id = nnn, NEXT out of range (mm). 
     ---------------------------------
     This is a common error and indicates the table has what is called a 
     "broken pointer". You usually get this error when you can't find all 
     the data in a table. The error means that at the address nnn, the 
     value that identifies the location of the NEXT row of data, mm, is not 
     valid. It is not an address within the size of file 2. When you have 
     this error, you can also expect to see a row count error. The row 
     count error will tell you where in the table the "broken pointer" is 
     and how many rows of data are missing. This error can be corrected 
     with R:SCOPE, using a PROJECT method within R:BASE (see article 
     "Understanding Data Pointers") or by doing a PACK or RELOAD (if only 
     a few rows would be lost).
 
     Id = nnn, PREV invalid (mm). 
     ----------------------------
     This is similar to the NEXT out of range error. At the address nnn, 
     the previous row pointer, mm, is not correct. This error does not 
     necessarily mean that you can't find data in the table. The table 
     should be checked in R:SCOPE or in R:BASE. To check the data pointers 
     in R:BASE use the command: COMPUTE ALL (1) FROM tablename. The rows 
     and count of the result should be the same. If they are different then 
     there are other errors in the table and you should proceed as if you 
     have a broken pointer (NEXT out of range). When you have a PREV 
     invalid error, you can also expect to see a row count error. 
 
     Id = nnn, move id invalid (mm). 
     -------------------------------
     The only rows that should be moved in the data file are rows from 
     tables that have NOTE fields. When data is added to a NOTE field it 
     no longer can fit in the same space in file 2 so R:BASE moves it to 
     a new location. When the row is moved the size is changed to 0 and 
     the new row address is noted. This error means the row at address nnn 
     is marked as moved (SIZE equal to zero) but the address, mm, of where 
     it is moved to is invalid (less than zero or beyond the end of file 2). 
     Fixing this error depends on whether or not the table has NOTE fields 
     and on the other errors in file 2.
 
     Id = nnn, SIZE (mm) less than minimum. 
     --------------------------------------
     File 1 stores a row size (NCOL) for each table. There is also a row 
     size stored with the data in file 2. This error means that the size 
     of this row stored in file 2 is less than the value stored in file 1. 
     This error may occur for every row in a table, or only for some of the 
     rows. It is not corrected with R:SCOPE, but through doing an R:BASE 
     BACKUP/RESTORE or UNLOAD/INPUT of the table. 
 
     Id = nnn, SIZE (mm) greater than maximum. 
     -----------------------------------------
     File 1 stores a row size (NCOL) for each table. There is also a row 
     size stored with the data in file 2. This error means that the size 
     of this row stored in file 2 is larger than the value stored in file 1.
     This error may occur for every row in a table, or only for some of the 
     rows. It is not corrected with R:SCOPE, but through doing an R:BASE
     BACKUP/RESTORE or UNLOAD/INPUT of the table. 
 
     IDEND is mmm, should be nnn.
     ----------------------------
     The address, mmm, of the last row of data found in file 2 for the 
     particular table does not match the value for the last row as stored 
     in file 1, nnn. This error usually is reported along with NEXT out of 
     range and PREV invalid errors. The error can be corrected in R:SCOPE 
     or by doing a PACK or RELOAD of the database.
 
     Row count is nn, should be mm. 
     ------------------------------
     The number of rows for the table as stored in file 1 does not match 
     the actual number of active rows counted as the data was checked. 
     You usually get this error in addition to other file 2 errors. The 
     error can be corrected in R:SCOPE or by doing a PACK or RELOAD of 
     the database.
 
     After correcting file 2 errors the database must be PACKed, RELOADed, 
     or rebuilt using BACKUP/RESTORE or UNLOAD/INPUT. This will correct 
     IDEND and row count errors as well as rebuilding all indexes. Indexes 
     must be rebuilt after making file 2 corrections.
 
 
     RBCHECK Example using Concomp
     =============================
 
     Database:  concomp                 Name of the database given to RBCHECK
 
     ----- Checking File 1 -----
 
     Checking Database Parameters
                                        Errors in file size or database
       0 errors.                        mode reported here 
 
     Checking Relation & Column Tables  Beginning structure check of each 
                                        table
 
     Checking SYSCOMP                   Table name (RNAME) followed by list
      Column SYSREL                     of column names (ANAME) defined for 
      Column SYSATT                     the table. This information is repeated
 
      Column SYSTYP                     repeated for each table in the
      Column SYSPOL                     database. 
      Column SYSTBL                     All tables are listed, R:BASE system  
      Column SYSTBL                     tables (including hidden tables) 
      Column SYSALG                     and data tables.
      0 errors.
 
     Checking SYSINFO 
      Column SYSSNAME
      Column SYSCNAME
      Column SYSDESCR
      Column SYSINC  
      Column SYSFMT  
      Column SYSNEXT 
      Column SYSLONG 
      0 errors.
 
     Checking SYSREP
      Column SYSRNAME
      Column SYSRDATA
      Column SYSRSEQ
      0 errors.
 
     Checking customer
      Column custid  
      Column company 
      Column custaddr
      Column custcity
      Column custstat
      Column custzip 
      Column custphon
      0 errors.
 
     Checking transdet                  Only the first 8 characters of table 
      Column transid                    and column names are displayed.
      Column detailnu
      Column model   
      Column units   
      Column price   
      Column extprice
      0 errors.
 
     Checking transmas
      Column transid 
      Column custid  
      Column empid   
      Column transdat
      Column netamoun
      Column freight 
      Column tax     
      Column invoicet
      0 errors.
 
     Checking prodview,  This is a 3.x view. 
                                        Views are not checked, they are
                                        listed and identified as views.
 
     ----- 0 errors for File 1 -----    Reporting of total errors in database 
                                        structure
 
 
     ----- Checking File 2 -----        Beginning data check of each table
 
     Checking data for SYSCOMP 
      6 active rows, 0 deleted rows, 0 errors.
 
     Checking data for SYSINFO 
      73 active rows, 0 deleted rows, 0 errors.
 
     Checking data for SYSREP  
      100 rows                          Rows are counted by hundreds.
      200 rows
      300 rows
      400 rows  
      454 active rows, 0 deleted rows, 0 errors.
                                        
     Checking data for customer
      9 active rows, 0 deleted rows, 0 errors.
 
     Checking data for transdet         Only first 8 characters of table name
      41 active rows, 0 deleted rows, 0 errors.     are displayed.
 
     Checking data for transmas
      19 active rows, 0 deleted rows, 0 errors.
 
     Checking data for prodview
      View
 
     ----- 0 errors for File 2 -----    Report of total errors in database 
                                        data
 
 
     Total errors:  0                   Report of total errors, structure 
                                        and data