This file provides information concerning the contents of the delivery
diskettes or tapes, how to get help, and important information on new
features or changes in Raima Data Manager System that are currently not
contained in the User's Guides or Reference Manuals.  It is important that
you study this document thoroughly as it includes information that is vital
to the proper usage of Raima Data Manager on your system.

This file supplements the manuals and contains the most up to date
information on Raima Database Manager 3.30, QUERY 3.30, and
REVISE 3.30.



==========================================================================
TABLE OF CONTENTS
==========================================================================

The following is a list of the major topics found in this file.  While this
document is not broken into pages, these topics are in the following order
and can be used in text searches.

GETTING HELP                  How to contact Raima Technical Support;
                              general warnings and recommendations.
                              
GENERAL INFO                  General warnings and reminders
                              
RAIMA DATABASE MANAGER 3.30   Function changes, utility changes, new error
                              codes, required application changes
                              
QUERY 3.30                    Changes from 2.21a; hints on memory usage
                              
REVISE 3.30                   Changes from 1.04/1.04a
                              
MISC. INFORMATION             Notes on Windows 3.0, Windows 3.1, Zortech
                              C++ 3.0, Phar Lap
                              
OBJECT MANAGER                Notes on ROM-RDM compatibility,
                              
LOCK MANAGER COMMUNICATION    The differences and uses of the lockmgr for
                              each platform
                              


==========================================================================
GETTING HELP
==========================================================================

SUPPORT SERVICES
----------------

     If you need assistance or have questions, call Raima's Technical
     Support Department at 206-557-5333.
     
     
     
BULLETIN BOARD
--------------

     We have a BBS (Bulletin Board System).  You can contact Raima by modem
     (300, 1200, 2400, or 9600 baud, 8 data bits, 1 stop bit, no parity) at
     206-557-5337.  Our modem DOES support the MNP protocols.  When you
     dial in the first time, you will be prompted for your name, company,
     and password.    Call Raima's Technical Support Department to obtain
     login details or just dial in and follow instructions.
     
     
     
FAX & TELEX
-----------

     Our Technical Support Fax number is 206-557-5357.  Our Telex number is
     6503018237 MCI UW.
     
     
     
==========================================================================
GENERAL INFO
==========================================================================

DIRECTORY STRUCTURE
-------------------

     The directory structure for the RDM System is as follows.  The
     structure is designed so that DOS and Windows can be installed into
     the same 'RDM_home' directory.  However, OS/2 must be installed into a
     separate 'RDM_home' directory because the protected-mode and real-mode
     utilities and/or libraries conflict with each other.
     
     bin            All the pre-made RDM utilities.
     lib            The pre-made libraries broken down by compiler in
                    subdirectories.  'vwin' and 'qwin' are the Windows
                    import libraries and DLLs for RDM and QUERY
                    respectively.
     examples       Subdirectories of sample programs and databases.
     revise         Non-Windows REVISE libraries and program broken down by
                    compiler into subdirectories.  If REVISE library source
                    is installed it is placed here.
     include        Non-Windows header files.
     winclude       Windows header files.
     query          Non-Windows QUERY example program sources and
                    executables.  If QUERY library source is installed, it
                    will be placed here.
     wquery         Windows version of 'query' directory.
     runtime        Non-Windows source for the RDM libraries.
     wruntime       Windows source for the RDM libraries.
     ida            Non-Windows source code for the Interactive Database
                    Access utility.
     wida           Windows version of 'ida' directory.
     lockmgr        Non-Windows source for the lock manager and remote
                    console utilities.
     wlockmgr       Windows version of 'lockmgr' directory.
     dal            Non-Windows source for Database Access Language
                    utility.
     dbimp          Non-Windows source for database import utility.
     utility        Non-Windows source for most of the RDM utilities.
     dbedit         Non-Windows source for the database editor utility.


DOCUMENTATION
-------------

     Please note that the Raima help library for Windows has not been
     upgraded from RDM 3.21.  If any conflicts come up between the help
     library, the manuals, and the readme/addendum, refer to the readme or
     addendum then the manuals.
     


WARNING
-------

     You should also check alignment of data structures whenever you change
     compilers.  If alignment is different you may need to adjust your
     alignment for the compiler, the database, or both.  If you are
     upgrading from an earlier version of RDM, there is no need to re-run
     DDLP if the current dictionary is accurate.  If you do rerun DDLP,
     make sure the new dictionary contains the same alignment pattern so
     that the database does not become corrupted.
     


WARNING
-------

     Be very careful about nesting structures in records.  The alignment of
     nested structures is very compiler dependent.  While Raima has tried
     to compensate for this, DDLP may not get it correct every time.
     
     While numeric and char data can be in the same record, we recommend
     that numeric data and char data not be mixed together (i.e. put the
     doubles, longs, ints, and shorts first with chars last).  If nested
     structures are to be used, it is recommended that they start on word
     boundaries (i.e., with numeric data).  Starting the structs on eight-
     byte boundaries may be necessary on some machines when the structs
     contain doubles.
     


WARNING
-------

     Due to file format changes in the TAF and DBL files, RDM 3.21A+
     applications are not able to simultaneously share databases with
     applications compiled with previous versions of RDM (db_VISTA).  The
     databases can be shared, just not at the same time.  For customers
     upgrading all their software to RDM 3.21A+, the easiest way to get the
     TAF and DBL files converted is to take the databases off line and
     delete the TAF and DBL files after ensuring that no recovery is
     needed, and let RDM create new ones.
     


WARNING
-------

     Due to file format changes in the DBL file for the General Lock
     Manager (LMC_GENERAL), RDM 3.30 applications are not able to
     simultaneously share databases with applications compiled with
     previous versions of RDM (db_VISTA).  The databases can be shared,
     just not at the same time.  For customers upgrading all their software
     to RDM 3.30, the easiest way to get the DBL file converted is to take
     the databases off line and delete the DBL file after ensuring that no
     recovery is needed.
     


NOTE FOR 3COM USERS
-------------------

     The default options of the 3COM NetBIOS command are inadequate for the
     lock manager.  On the workstation where the lock manager will be run,
     add the following options to the NetBIOS command:
          NetBIOS /C /M /W2
     These options are not required on workstations where the lock manager
     is not executing.
     


NOTE FOR NOVELL NETWARE USERS
-----------------------------

     Make sure that Novell's "castoff /all" is executed on the machine that
     will be running the lock manager before starting the lock manager.
     This is to stop broadcast messages from the network since they will
     adversely affect the lock manager by stopping all processes on the
     computer until someone hits control-enter to erase the message.
     


NOTE FOR GENERAL LOCK MANAGER USERS
-----------------------------------

     The PRDBL and GENCLRDB utilities no longer exist.  Instead the CONSOLE
     utility can be used to view the contents of a DBL file and either the
     CONSOLE or the LMCLEAR utility can be used to remove a dead user from
     the DBL file.  For more information on these utilities refer to the
     section on RDM 3.30 new utilities.
     


RECOMMENDATION
--------------

     When you have completed installing RDM you may test your installation
     by compiling and running the example database and program that is
     included with this delivery.  The example (called TIMS) provides
     illustrations of several aspects of using RDM, including an example
     schema, source code, an import specification, compilation, linking,
     and using the DDLP, INITDB, and DBIMP utilities.  The TIMS example
     resides in the subdirectory named EXAMPLES/TIMS.
     


NOTE FOR UNIX CUSTOMERS
-----------------------

     RDM can put demands on the system resources that your default system
     configuration may not allow.  The number of files that the system can
     have open at once may need to be increased.  The number of message
     queues and semaphores available to the system may need to be
     increased.  The maximum size of each message queue and the total
     amount of memory for the queues for the system may need to be
     increased.  One (1) queue and semaphore is needed for each user
     (DB_TASK) and for each lockmgr.  Individual queue sizes of 4K may be
     needed in some cases.
     


NBIOSE (DOS NetBIOS Emulator)
-----------------------------

     Raima's NetBIOS emulator NBIOSE as been discontinued starting with
     Raima Data Manager 3.21.  The only reason for it to exist was to allow
     the NetBIOS lock manager and application to communicate when no real
     network was available so that a multi-user application could be
     tested.  Since RDM 3.20 (db_VISTA), the communication requirements
     between the application and the lock manager have exceeded the
     capabilities of NBIOSE.  In place of NBIOSE, multi-user applications
     can be tested without a real network by using the General Lock Manager
     (LMC_GENERAL) or the new Internal Lock Manager (LMC_INTERNAL).
     


SHARE (MS-DOS & WINDOWS)
------------------------

     You must run "share.exe" to access your database in multi-user mode.
     With share.exe loaded it is no longer possible to run two one user
     applications on the same database.  This has lead to database
     corruption in the past.  To access the same database from multiple
     applications open in shared mode and use RDM locks.  To cut down on
     the locking requirements, check to see if static records can be used.
     


SIGNAL AND INTERRUPT HANDLERS
-----------------------------

     By definition signal and interrupt handlers are asynchronous
     functions.  This means that the state of the program is not known at
     the time the handler is called.  Because of this, there are
     limitations on what the handler can do.  In general the handler can
     not do disk I/O, memory management, nor inter-process communication.
     Specifically this means that most of the RDM and QUERY functions can
     not be used.  Functions that communicate with the lock manager are
     expressly prohibited!  About the only Raima function that is safe to
     call from a signal or interrupt handler is QUERY's q[t]_set_global().
     


==========================================================================
Raima Data Manager 3.30
==========================================================================

Changes between db_VISTA 3.21A and Raima Data Manager 3.30:

SUMMARY:
-------

     1)  API Changes
     2)  New Error/Status Codes
     3)  Required Application Changes
     4)  Utility Changes
     5)  Miscellaneous Information


API Changes:
------------

d[t]_setpages()          (changed)
d[t]_on_opt()            (changed)
d[t]_off_opt()           (changed)
d[t]_encode_dba()        (changed)
d[t]_decode_dba()        (changed)
d[t]_internals()         (changed/new)
d[t]_dbtaf()             (changed)
d[t]_dblog()             (changed)
d[t]_destroy()           (changed)
d[t]_dbnum()             (changed)
d[t]_checkid()           (changed)
d[t]_recread()           (changed)
d[t]_crread()            (changed)
d[t]_csoread()           (changed)
d[t]_csmread()           (changed)
d[t]_open()              (changed)
d[t]_curkey()            (changed)
d[t]_rdmini()            (new)

     d[t]_fldnum()            (new)
     d[t]_recnum()            (new)
     d[t]_setnum()            (new)
     d[t]_lmstat()            (new)
     


d[t]_dbnum()

     Description
          
          The string can now contain a path for when databases have the
          same name but different paths.  If a path is included, it must be
          the exact path used in d_open().  The path(s) from d_dbdpath()
          are not considered.  If no path is included, only the database
          name will be used even if d_open() contained a path.
          
                    *              *              *
          


d[t]_checkid()

     Description
          
          After verifying that the string contains only numbers, letters,
          or an underscore, the lockmgr is asked whether the proposed name
          is currently being used.
          
                    *              *              *
          


d[t]_open()

     Arguments
          
          The open mode can now be in either upper or lower case.
          
                    *              *              *
          
     
     
d[t]_destroy()

     Description
          
          d_destroy() now correctly deletes the new files given by
          d_renfile() instead of deleting the original files listed in the
          dictionary.
          
                    *              *              *
          
     
     
d[t]_dbtaf()

     Description
          
          When using LMC_GENERAL lockmgr, the path to the TAF is also used
          for the path to the DBL file.  Make sure d_dbtaf() is called
          before any functions which communicate with any lockmgr.
          
          Since each database group can only be controlled by one lockmgr,
          and since each database group can only have one TAF, the lockmgr
          will instruct users to recover only the users of the same TAF.
          This will help prevent security problems.
          
                    *              *              *
          
     
     
d[t]_dblog()

     Description
          
          Since all log files need to be accessible to all users of the
          database group, they should be placed in the same physical
          directory.  Because each user can use a different path to get to
          the log files, when the lockmgr instructs a user to recover
          another user, the user doing the recovery will ignore the path
          given by the lockmgr for the log file and use his own log path to
          find the log file needing recovery.
          
                    *              *              *
          
     
     
int d_setpages(int pages, int ovpages);
int dt_setpages(int pages, int ovpages, DB_TASK * task);

     Description
          
          The minimum sizes for the cache pages and overflow-index pages
          have gone from eight (8) and two (2) to five (5) and three (3)
          respectively.
          
                    *              *              *
          


d[t]_on_opt() & d[t]_off_opt()
     
     Arguments
          
          Now they take an unsigned long for the option instead of a signed
          int.
          
     New Options
          
          DELETELOG      d_close() will delete the log file.  The default
                         is not to delete it.
                         
          NOVELLTRX      Use Novell's "Netware 386" transaction system
                         instead of Raima's.  The default is to use Raima's
                         transaction system.
                         
     Note
          
          LMC options can NOT be or-ed together with non-LMC options.
          However, LMC options can be or-ed together with other LMC
          options; and non-LMC options can be or-ed together with other non-
          LMC options.
          
                    *              *              *
          
     
     
d_encode_dba()
     
     Arguments
          
          It now takes an unsigned long for the record slot parameter and a
          short for the file parameter instead of a signed long and int
          respectively.
          
                    *              *              *
          
     
     
d_decode_dba()
     
     Arguments
          
          Now it takes a pointer to an unsigned long for the record slot
          parameter and a pointer to a short for the file parameter instead
          of a signed long and int respectively.
          
                    *              *              *
          
     
     
d[t]_curkey()
     
     Lock Requirements
          
          This function now requires a record lock when the database is
          opened in shared mode.
          
                    *              *              *
          
     
     
d[t]_internals()
     
     Description
          
          This function is now available in the single-tasking libraries.
               
     New Options
          
          ID_CACHE_HITS       unsigned long, number of pages searched for
                              and found in the cache.
                              
          ID_CACHE_LOOKUP     unsigned long, number of pages searched for
                              in the cache.
                              
          ID_MAX_FILES        maximum number of data & key files open at
                              once (TAF, DBD, LOG files not included).
                              
          ID_MAX_CACHEPGS     maximum number of data/key pages allowed in
                              the database cache.
                              
          ID_MAX_IXOVPGS      maximum number of overflow-index pages
                              allowed in the overflow cache.
                              
          ID_LOCKCOMM         the current lock manager type being used.
                              
     Changed Options
                         
          ID_PGZERO           This option used to return only the next_slot
                              value from the PageZero of the given file.
                              This option has been changed to
                              TOPIC_PGZERO_TABLE and will now return the
                              next_slot, dchain, and timestamp fields as
                              defined in the PGZERO struct in "trxlog.h".
                              
     
     
                    *              *              *
          
     
     
d[t]_recread()
     
     Currency Changes
          
          This function now updates the timestamp for the Current Record in
          the Currency Table from the database.  This may require changes
          in the placement of d_gtscr() within the application.  Record
          and/or set locks may be needed to ensure current data when the
          read is being used to get the new timestamp since this function
          can do dirty reads.
          
     
     
                    *              *              *
          
     
     
d[t]_crread()
     
     Currency Changes
          
          This function now updates the timestamp for the Current Record in
          the Currency Table from the database.  This may require changes
          in the placement of d_gtscr() within the application.  Record
          and/or set locks may be needed to ensure current data when the
          read is being used to get the new timestamp since this function
          can do dirty reads.
          
     
     
                    *              *              *
          
     
     
d[t]_csmread()
     
     Currency Changes
          
          This function now updates the timestamp in the Currency Table for
          the Current Member of the set from the database.  This may
          require changes in the placement of d_gtscr() within the
          application.  Record and/or set locks may be needed to ensure
          current data when the read is being used to get the new timestamp
          since this function can do dirty reads.
          
     
     
                    *              *              *
          
     
     
int d[t]_csoread(...)
     
     Currency Changes
          
          This function now updates the timestamps in the Currency Table
          for the Current Owner of the set and for the Set from the
          database.  This may require changes in the placement of d_gtsco()
          and d_gtscs() within the application.  Record and/or set locks
          may be needed to ensure current data when the read is being used
          to get the new timestamp since this function can do dirty reads.
          
     
     
                    *              *              *
          
     
     
int d_rdmini(char * dir_name)
int dt_rdmini(char * dir_name, DB_TASK * task)

     Arguments
     
          dir_name       (input)   The location of the file "rdm.ini".
          
     Description
     
          RDM has the ability to read an initialization file to determine
          the characteristics of the user's system and database.  The file
          is named "rdm.ini".  By default RDM looks for this file in the
          current directory.  d_rdmini() can be used to change the location
          of the file but not the name of the file.  Under Windows, the
          path used in dt_rdmini() MUST be a fully qualified path including
          the drive letter.  While the "rdm.ini" file can be placed
          anywhere, it is recommended that it be placed in the same
          directory as the dictionary because the RDM utilities will only
          look in the current directory for the INI file.
          
          The file can contain all of the RDM and QUERY paths, options, and
          variables.  Comments are allowed by starting them with a
          semicolon in the first column.
          
          The format of the file is as follows:
          
          [section_heading]
          key_word=value
          key_word=value
          ...
          [section_heading]
          key_word=value
          ; comment line
          
          While the case of the section headings and key words make no
          difference, white space is important.  Section headings are
          enclosed in square brackets ([ ]).  Key words are followed by an
          equal sign (=).  Numeric values are in decimal and may have white
          space between the '=' and the number.  String values start
          immediately after the '=' and are terminated by the end of the
          line.  If the value following the '=' is missing, the value used
          will be undefined.  Therefore it is recommended that the unused
          settings be omitted from the file or commented out instead of not
          set.
          
          The reading of the INI file is done by d_open() if the INI file
          exists.  For the platforms that d_open() can read environment
          variables, the environment takes precedence.  The appropriate
          functions (e.g., d_dbdpath()) take precedence over both the
          environment and the INI file.
          
          Since there are three ways to pass information about the system
          and database(s) to RDM (d_ functions, the environment, the INI
          file), you must make sure that they are used consistently so that
          conflicts do not arise.  For example, if you call
          d_on_opt(IGNORECASE) in your application instead of using a
          "country table" or the INI file, you will not be able to pass
          this information to DBCHECK or KEYBUILD thus causing the database
          to be corrupted or at least appear to be corrupted.  However, all
          applications and the RDM utilities do read the INI file.  The RDM
          utilities always look in the current directory for the INI file.
          
          Note:  Under Windows, by default RDM checks to see if SHARE is
          loaded.  If the RDM DLL is loaded on a CD-ROM, this check may
          cause the application to terminate abnormally depending on the CD-
          ROM drivers.  To prevent the testing for SHARE, add this line to
          the "rdm.ini" file
               shareTest=0
          The only difference that might be noticed if SHARE is not tested
          for is the type of error returned if the files can not be opened
          (e.g., S_NOSHARE verses S_DBLACCESS).
          
          Currently the  sections supported are "[RDM]", "[LOCKMGR]",
          "[db_QUERY]", and "[db_REVISE]".  The supported key words are all
          of the RDM and QUERY path variables, all of the RDM and QUERY
          options, and all the QUERY variables that can be changed with
          q_set_global().   If the option or variable has a prefix (e.g.,
          LMC_, QG_, QO_, etc.), the prefix is not used in the INI file.
          When specifying the paths in the INI file, the trailing directory
          character may or may not be significant; refer to the appropriate
          manual sections for each variable.  See the following example.
          
          
          
     Currency Changes
     
          None.
          
     Locking Requirements
     
          None.
          
     Common Return Codes
     
          S_INVTASK           Invalid DB_TASK referenced.
                              
          S_NAMELEN           The directory name is too long.
                              
          S_BADPATH           Under Windows, the path MUST be a fully
                              qualified path including the drive letter.
                              
     See Also
     
          d_on_opt(), d_off_opt(), d_dbdpath(), d_dbfpath(), d_ctbpath(),
          d_dbtaf(), d_dblog(), d_lockmgr(), d_lockcomm(), q_on_opt(),
          q_off_opt(), q_set_global(), q_lockcount(), q_qdbpath(),
          q_qdfpath(), q_qrfpath()
          


An example RDM.INI file follows.  While the numbers used in this example
are values that will not be rejected, they are not necessarily the best
values to use.

===========================================================================

;    This example rdm.ini contains all of the currently supported
;    sections and keywords.
;
;    Semicolons start a comment.
;    Finding the section ([xx]) and keywords (xx=) are case-blind searches.
;    On/off or true/false is done by 0 == false/off and by > 0 == true/on.
;    Numbers must be decimal.
;    Strings can be case sensitive and leading/trailing white space is bad.
;
[RDM]
; dblog from here takes directory only!
dblog=f:\taflog\
dbtaf=f:\taflog\
dbdpath=c:\v321\examples\tims\dbase
dbfpath=c:\v321\examples\tims\dbase
ctbpath=c:\v321\examples\tims\dbase

; CD-ROM apps should turn sharetest off (=0)
sharetest=1
maxFiles=2
maxCachePages=64
maxOVPages=8
ignorecase=1
DCHAINUSE=1
TRLOGGING=1
ARCLOGGING=0
CLOSEFILES=0
READONLY=0
SYNCFILES=0

; dbyield is windows only
DBYIELD=1
portable=0
delname=0
deletelog=1
novelltrx=0

[db_QUERY]
; RAM drives work best for qdfpath!
qdfpath=q:\user\tmp\
qdbpath=c:\root\dbd\
qrfpath=c:\root\qrf\
QWILDONE=?
QWILDALL=*
view2cache=1
datefrom1970=0
title2upper=2

; qformfeed == 0 ==> use many '\n' to end page, > 0 ==> use '\f'
QFORMFEED=1
QMAXALIASES=0
QTABSTOP=8
QUSEOPTKEY=0
QREPSIZE=1
QTRACE=0
QLOCKCOUNT=0
QYIELDCOUNT=10
QHASHSIZE=47

[lockmgr]
name=Special
type=LMC_NETBIOS

[db_REVISE]
; workpath points to the directory containing db_work.dbd
; and where to put the db_work data and key files.
workpath=c:\tmp\
pages=67
report=1
debug=0
quick=0
verbose=1
inter_enable=0
abort_level=0
comp_level=1
exec_level=1

===========================================================================

                    *              *              *
          
     
     
int d_recnum(int * indexNum, int userDefine, int dbn);
int dt_recnum(int * indexNum, int userDefine, DB_TASK * task, int dbn);

     Arguments
          
          indexNum       (output)  The Record Table index.
          
          userDefine     (input)   The #define for the record from DDLP.
          
     Description
          
          This functions takes the #define for records (from DDLP) and the
          database number and returns the Record Table index for that
          record.  The index number can then be used with functions like
          d_internals().
          
     Currency Changes
     
          None.  (If an error occurs, the output buffer is not changed.)
          
     Locking Requirements
     
          None.
          
     Common Return Codes
     
          S_INVTASK           Invalid DB_TASK referenced.
                              
          S_INVREC            Invalid record is referenced.
                              
     See Also
     
          None.
          
                    *              *              *
          


int d_setnum(int * indexNum, int userDefine, int dbn);
int dt_setnum(int * indexNum, int userDefine, DB_TASK * task, int dbn);

     Arguments
          
          indexNum       (output)  The Set Table index.
                         
          userDefine     (input)   The #define for the record from DDLP.
                         
     Description
          
          This functions takes the #define for sets (from DDLP) and the
          database number and returns the Set Table index for that record.
          The index number can then be used with functions like
          d_internals().
          
     Currency Changes
     
          None.  (If an error occurs, the output buffer is not changed.)
          
     Locking Requirements
     
          None.
          
     Common Return Codes
     
          S_INVTASK           Invalid DB_TASK referenced.
                              
          S_INVSET            Invalid set is referenced.
                              
     See Also
     
          None.
          
                    *              *              *
          


int d_fldnum(int * indexNum, long userDefine, int dbn);
int dt_fldnum(int * indexNum, long userDefine, DB_TASK * task, int dbn);

     Arguments
          
          indexNum       (output)  The Field Table index.
                         
          userDefine     (input)   The #define for the field from DDLP.
                         
     Description
          
          This functions takes the #define for fields (from DDLP) and the
          database number and returns the Field Table index for that
          record.  The index number can then be used with functions like
          d_internals().
          
     Currency Changes
     
          None.  (If an error occurs, the output buffer is not changed.)
          
     Locking Requirements
     
          None.
          
     Common Return Codes
     
          S_INVTASK           Invalid DB_TASK referenced.
                              
          S_INVFLD            Invalid field is referenced.
                              
     See Also
     
          None.
          
                    *              *              *
          
          
          
int d_lmstat(char *userName, int *userStatus);
int dt_lmstat(char *userName, int *userStatus, DB_TASK *task);

     Arguments
     
          userName       (input)   The name of the user to get status of.
                         
          userStatus     (output)  The status of the user.
                         
     Description
     
     This function call allows the application to find the status of a
     particular user if the user's name (dbuserid) is known.  This
     function will not be useful to everybody, but is included at the
     request of a few RDM users who need this particular information.
     The status values that are returned are the following:
     
     U_EMPTY         the user does not exist to the lockmgr.
     
          U_LIVE          the user is in a normal state.
          U_DEAD          the user 'died' and has not been cleaned up.
          U_BEING_REC     the user is being recovered.
          U_RECOVERING    the user is recovering for another user.
          U_REC_MYSELF    the user has reentered and is recovering itself
          U_HOLDING_X     the user has left exclusive locks when closing.
          
     Currency Changes
     
          None.
          
     Locking Requirements
     
          None.  (In single user U_EMPTY will always be the status.)
          
     Common Return Codes
     
          S_DBOPEN            No Databases are open.
          
          S_INVTASK           Invalid DB_TASK referenced
          
     See Also
     
          None.
          
               *              *              *
          




NEW ERROR MESSAGES:
-------------------

     S_BADPATH      Under Windows, the path must be a fully qualified path
                    including the drive letter.
                    
     S_SETCLASH     The internal set pointers changed after you retrieved
                    the record making further navigation invalid.
                    
     S_LOGIO        An error has occurred during file I/O on the log file.
                    This error code is to help distinguish between errors
                    on data and key files verses log files verses TAF/DBL
                    files.
                    
     S_NOPROTOCOL   The communication layer or DLLs can not be found or
                    loaded.  This was the old S_NONETBIOS error.
                    
     
     
REQUIRED APPLICATION CHANGES
----------------------------

     Support of multiple lock managers types has changed from RDM 3.21a.
     In RDM 3.21a by default all lock manager communication (LMC) modules
     were linked in due to d_lockcomm() referencing all of them.  In RDM
     3.21a the unwanted ones could be left behind by #define's or the use
     of the explicit lmc?_lockcomm() functions.  In RDM 3.30 they have
     become table driven due to the INI file support.  In ONE AND ONLY ONE
     of the application modules, you will need to #define the symbol
     "LOCKCOMM_DATA" before the #include of "vista.h", except for Windows
     and OS/2 applications that link with DLLs.  Under Windows and OS/2
     this is not needed and WILL cause link problems if used.  By default
     this will bring in all available LMC modules.  The use of #define's
     before the #include of "vista.h" will still limit the LMC modules
     linked in as they did before.  The explicit lmc?_lockcomm() functions
     are no longer available.  For example, the new application code will
     look something like this:
     
          #define LOCKCOMM_DATA         /* put the table in the module */
          #define LMC_GENERAL           /* allow the General lockmgr */
          #define LMC_NETBIOS           /* allow the NetBIOS lockmgr */
          #include "vista.h"
          ...
          int main(int argc, char *argv[])
          {
               ...
               /* the rdm.ini file can contain the name and type of the
                  lockmgr to use.  Since only LMC_GENERAL and LMC_NETBIOS
                  are allowed by the #defines above, d_open() will fail if
                  the INI file says to use any other type.
               */
               d_rdmini(directoryName);
               if (d_open(...) != S_OKAY) {
                    ...
                    exit(1);
               }
               ...
          }
     
     Single-user applications, which do not use any lock managers, should
     use LMC_NONE with LOCKCOMM_DATA.  This will prevent any LMC modules
     from being linked in and save up to 50K in application size.
     
     Also see the API changes above for other possible application changes.
     
     Because of the memory placed on the medium memory model, Raima's
     medium-model, context-switching libraries have been discontinued.  If
     your application requires multiple DB_TASKs, you will need to change
     to the large model libraries or rework the application to use the
     single-tasking, medium-model library.
     


COUNTRY TABLE CHANGES
---------------------

     When a country table is being used for sorting purposes, single char
     fields will now be compared using the Country Table when they are
     signed (e.g., char my_field;).  Unsigned chars will be sorted without
     the use of the country table.
     
     
     
UTILITY CHANGES
---------------

     DDLP now can process CONSTANTs , #define's, predefined structures and
     typedefs.  All of these keywords must be used before  ddlp recognizes
     the keyword "database".  Everything up to the keyword "database" is
     copied to the resulting header file, so the application will not need
     to redefine anything.
     
     DDLP also has the ability to create C++ classes for use with Raima
     Object Manager.  By specifying -OO on the ddlp command line, no ".h"
     file will be created, but instead a ".hpp" file will be created with
     the Object Manager classes.  Other options can also be specified after
     the -OO switch to modify the way these classes are created.  These are
     the following.
     
          -ood   -  Attempt to create default constructors.
          -oor   -  Create a RecName() member function.
          -oopri -  make all data members private.
          -oopub -  make all data members public.
          -oopro -  make all data members protected.
     
     DDLP will also now increase the page size of the database from the
     default 1024 bytes by 512-byte increments as it needs to during the
     processing of the records to fit the records on the page.  This will
     only occur when the page size is not explicitly set.  If the page size
     is explicitly set, an error is still generated when the record is too
     big for the page.
     
     In an attempt to prevent memory corruption from corrupting the
     database, RDM now has sanity checks on the information in the internal
     page zero tables.  Along the same lines, DBCHECK no longer
     inadvertently expands the files if the next slot value has been
     corrupted.
     
     
     
MISC. INFORMATION
-----------------

     Some of the larger object modules have been divided into smaller
     function groups so that unused functions are not pulled in by the
     linker with the needed functions.  Also, the RDM INI file functions
     for DOS can be stubbed out if you choose not to use them by linking in
     the appropriate 'INISTB??.OBJ' file before the RDM library.
     
     The timestamp values in each page zero are no longer updated in
     d_trbegin() for every file.  The are now updated on a per-file basis
     during a write lock or exclusive lock requests.  Because of this, the
     performance of the transactions will be better since now only the
     files that are used are updated instead of all the files.  However,
     now the timestamps will not be synchronized between the files meaning
     that timestamps from one file can no longer be compared with
     timestamps from other files.  Comparing timestamps from the same file
     are still be valid.
     
     
     
     
     
==========================================================================
QUERY 3.30
==========================================================================

For MS-DOS installations:
------------------------

     In the ...\query directory you will find a different QUERY example
     executable for each compiler package you installed.
     
     m6db_qry.exe        MS C 6.00b
     m7db_qry.exe        MS C/C++ 7.00
     m8db_qry.exe        MS Visual C++ 1.00 (MS C 8.00)
     bdb_qry.exe         Borland C++ 3.10
     zdb_qry.exe         Zortech C++ 3.10
     
     You may wish to copy one of these executables to your ..\bin as
     db_query.exe, as the documentation refers to using db_query.exe.
     
     
     
New Functions
-------------

     q_set_workingproc()
     qt_set_workingproc()
     
          This is a new call-back function that allows the user to see how
          much work has been done.  These two functions register your call-
          back function with QUERY.  Your call-back function must be of the
          form
               void QEXTERNAL_FIXED my_working(
                         unsigned long current, unsigned long maximum)
          "current" is the current number of root records read for this
          select statement.  "maximum" is the maximum number of root
          records possible.    If multiple record types share the same file
          or if key optimization is done, "current" may not start at the
          beginning or end at "maximum."  However, when the report is
          finished the callback function will be called one last time with
          "current" set equal to "maximum" to signal the end of the report.
          If root record instances are added after the report is started,
          "current" may exceed "maximum."
          
          
          
     q[t]_on_opt()
     
          New option:  QO_DATEFROM1970
               Since Microsoft changed the base date for the "system" dates
          in MS C/C++ 7.00 from the world's standard of 1970 to 1900, the
          QUERY DLLs for Windows have had trouble reading database that
          contain "system" dates using the standard 1970 base.  When this
          option is ON (the default), no conversion is used.  When it is
          off, the dates in the database are temporarily converted to the
          non-1970 standard during comparisons and displaying.  This option
          is not available under VAX/VMS OS or the DOS Zortech C++
          compiler.
          
          
          
New Features
-------------

     int q[t]_set_displayfunc(...)
     int q[t]_set_printerfunc(...)
     
          These functions are now recognized on every platform, not just
          under Windows.  Now all platforms can have programmer defined
          print and display functions used by QUERY instead of using
          q_nextrow() or q_nextval() and then doing the custom display.
          
     Query Routine Files (QRFs) can now have file extensions other than
     ".QRF".  If no extension is given--just the dot is considered an
     extension--then the default extension ".qrf" is assumed.
     
     Any type of path can be used with a QRF by enclosing the path and file
     name and file extension in single or double quotes.
     
     The QRFPATH handling has changed slightly in regards to relative
     paths.  If the file [and path] is not fully qualified, the QRFPATH is
     appended to the front of the file [and path].  However, if the use of
     a relative path is needed with out the appending of the QRFPATH, the
     relative path MUST start with a dot.
     
     QRF and form files are now buffered under Windows for better
     performance.  Also the form files are searched for just like the QRFs.
     
     QUERY now properly handles unsigned shorts, unsigned ints, and
     unsigned longs.
     
     The names of the records, sets, and fields, are now allocated from
     three different memory pools so that each pool can be up to the
     "size_t" limit.  This allows for bigger databases, or at least bigger
     names.
     
     The DB_ADDR() function now works when a grouping pass is needed.
     
     Aggregate functions in IF() statements and user functions are now
     evaluated properly.
     
     String comparisons now use the RDM country table if available.  This
     means that if "IGNORECASE" has been turned on, QUERY will not be able
     to do a case-sensitive comparison.  However, if "IGNORECASE" is turned
     off, case-blind comparisons are still available by using the UPPER()
     and LOWER() functions.
     
     For the date fields using the [YY]YYMMDD format, now all four digits
     of the year are required to be stored in the database.  However, if
     the year taken from the user (e.g. @01/02/93) contains only two
     digits, 1900 will automatically be added to the user's input.  If the
     user wants to refer to a year prior to 0100, he must input enough
     leading zeros to have at least three digits.  For example, "93" ==
     "1993" == 1993, "093" == "0093" == 0093.
     
     "help" statements are now available again.
     
     Literal percent signs are no longer allowed in the form files due to
     the heavy use of printf() et al.
     
     Internal errors such as the YACC stack overflowing now filter back to
     the user instead of just mysteriously terminating the report.
     
     QUERY now treats RDM binary arrays (char ccc[xx][1]) as non-strings
     just like RDM does.  Previously all multiply-dimensioned char arrays
     were treated as arrays of strings (null terminated).  Two-dimensional
     arrays with the second dimension greater than one (1) and all three-
     dimensional arrays are still treated as arrays of strings as
     documented.
          d_query() and q_nextrow() format the binary arrays in hexadecimal
     using upper case letters.  The field statements with the "display as
     [left | right | center] (###)" clause can be used to set the display
     width keeping in mind that the hexadecimal printing of each byte
     requires two (2) spaces.  q_nextval() and user-defined functions get
     the VALUE structs with a new field as part of the union.  "bv.ptr"
     contains the address of the buffer containing the binary array, and
     "bv.len" contains the exact length of the binary array.  The new
     "type" for the binary arrarys is 'b'.
     
     
     
Fixed Bugs To Be Heeded
-----------------------

     QRF nesting is now handled correctly.  However, the passing of
     parameters has changed.  Previously, the inner QRFs implicitly
     received the parameters from the outer QRF.  Now the parameters to the
     inner QRF must be explicitly passed from the outer QRF.
     
     The default callback functions q_ctod(), q_translate(), and
     q_function() have been removed from the libraries since they did
     nothing and just made the libraries bigger.  To use these functions
     the application now must use the appropriate q_set_*() function to
     register the callback function.  Attempts to use the callbacks without
     registering them will get the error Q_PROCNEEDED.
     
     Because the VALUE structure has changed between Beta Release 2 and
     Beta Release 3, to guarantee the alignement of the structure, all
     applications using the VALUE structure (i.e. q[t]_nextval()) will need
     to be recompiled.
     
     
     
Hints on Memory Usage
---------------------

     The uses of query initialization files (QIFs) are to create views,
     define macros, set up fields, etc., automatically when the database is
     opened.  While this may be very helpful to the users, it is not
     necessarily the best thing for performance.  Views, fields, and macros
     are created from global memory.  Once a view, macro, or field is
     defined, it exists forever.  The use of long "describe as" clauses
     eats even more memory.  When fewer views, fields, and macros are
     defined, more memory can be used for cache pages giving a performance
     boost.  For example, when Raima removed the infrequently used field
     statements and all "describe as" clauses from company-wide databases,
     db_query.exe gained four cache pages.  Also the opening of the
     databases became NOTICEABLY faster.
     
     Obviously not all views and fields can be removed.  However the memory
     can be reused.  For example, if most of your processing is done
     through query routine files (QRFs) that define views which are not
     used outside the QRF, the memory for these "unseen" views can be
     reused by naming all the views the same in each QRF.  The old memory
     will be freed, and new memory will be allocated instead of more
     getting allocated for each view.
     
     Through field statements it is possible to re-map raw data to easily
     understood data by using nested if()'s.  However, nesting if()'s more
     than three (3) deep is not recommended.  A better method is to use a
     "values are" clause, a "translate using" clause, or a user function.
     While "translate using" and user functions require a little more work
     up front in writing the C code, your compiled C code will run faster
     than the QUERY interpreted tree (which QUERY has to build) and will
     probably take up less memory.
     
     
     
     
     
==========================================================================
REVISE 3.30
==========================================================================
     
     
RECOMMENDATION
--------------

     It is highly recommended that static revisions be done to the database
     before running REVISE.  Doing so can make REVISE run quicker.  It will
     also prevent fields from being converted in unexpected or unwanted
     ways.  See section 4.2 in the REVISE manual for more information about
     static revisions.
     
     
     
MULTI-USER CONSIDERATIONS
-------------------------

     REVISE does not perform any file locking.  The user must eliminate any
     possibility of update to the source database during the time REVISE is
     executing.
     
     
     
SAMPLE DATABASE
---------------

     In subdirectory SRC (below the DBREV subdirectory) is a sample
     database that can be used to test the installation of REVISE.  The
     database can be re-created with the following commands:
     
          cd src
          ddlp tims.ddl
          initdb tims
          dbimp tims.imp
          
     The DEST directory contains a changed schema (note the differences).
     To perform the sample revision, enter the following commands from the
     REVISE home directory:
     
          cd ..\dest
          ddlp tims.ddl
          initdb tims
          cd ..
          dbrev  -r  -v  src\tims  dest\tims
          
     
     
CUSTOMIZING CONVERT.C
---------------------

     An object code library of REVISE is supplied with this delivery.  This
     may be used to link a new REVISE containing your own customized field
     conversion (see Section 4.4.2.2 in the REVISE User's Guide).  The file
     convert.c is provided as a template for creating your own conversions.
     
     To build a new REVISE, you must modify convert.c, compile it, and link
     it with DBREV.LIB.  For example, if you are using a Microsoft C
     compiler, the commands would be something like:
     
     cl -AL -c convert.c
     
          link /STACK:8092 convert.obj,dbrev.exe,,dbrev.lib;
          
     
     
HINTS AND TRICKS
----------------

     Problem:  REVISE did not process databases with duplicate field names.
          
     Fixes:  Fields with duplicate names are not used to establish
          correspondence between a record of source and destination
          databases any more.  Instead, after a record correspondence is
          established, the information is used to assign fields with
          duplicate names to particular records.
          
          The point is that fields with duplicate names do not contain any
          information about records. The user should supply this
          information explicitly in the script file if it can not be
          gathered from the database dictionary.  For example:
          
               source.ddl                    dest.ddl
               ---------------------         --------------------
               ...                           ...
               record author {               record author {
                    char name[32];                char name[32];
               }                             }
               
               record borrower {             record borrower {
                    key char friend[32];          key char name[32];
                    long date_borrowed;           long date_borrowed;
                    long date_returned;           long date_returned;
               }                             }
               ...                           ...
               
          To revise the above schema you would need to supply as script
          file with the following statement:
          
               revise.rdl
               ---------------------
               project record author into author;
               
          Then run revise with:
               dbrev -s revise.rdl sourcedb destdb
          
          
          
     The dot syntax in field name specification is allowed. If it is
     necessary to explicitly specify the record that the field belongs to
     in the field conversion statement, it is possible now.
     
     By default REVISE looks in the current directory for the "dbwork"
     database.  If you have a single DBDPATH specified, it will look there
     instead of in the current directory.  The location of the "dbwork.dbd"
     file can be specified in the "rdm.ini" file under section
     "[db_REVISE]" with the keyword "workpath=".  By doing so, REVISE will
     look for the dbwork database dictionary in this directory only and
     place the dbwork data and key files in this directory.
     
     
     
     
     
==========================================================================
MISC. INFORMATION
==========================================================================

     
     
MS-DOS Compilers and Stack Space
-----------

     A stack overflow will occur in the RDM libraries in the DOS memory
     models when the default stack size is used.  To correct this problem
     when using Borland's compilers you must set the stack size to a larger
     value within your source using the global variable '_stklen'.  To set
     the stack to an 8 kilobyte value, code the following:
          extern unsigned _stklen = 8192U;
     (See the Borland C++ Library Reference for a full description of the
     _stklen global variable.)  When using Microsoft and Zortech compilers,
     the stack options for the linker utility are used to set the stack
     size.
     
     
     
Windows
-------

     For large transactions or databases, you may need to add the following
     line to your system.ini:
          NetHeapSize = 28
     
     RDM 3.21+ supports Standard and 386 Enhanced modes only.  Real mode is
     no longer supported.
     
     To run the Lock Manager, lm.exe in a DOS box you need to add the
     following to your system.ini file under the [386Enh] section:
     
          IdleVMWakeUpTime=1
          TimerCriticalSection=500
          ReflectDosInt2A=true
          NetHeapSize=28
          
          
          
     NOTE: Do not use the function _fcalloc or _fmalloc in your Windows
     applications.  This can cause multiple problems when used with the
     GlobalAlloc function.
     
     
     
PHAR LAP 286
------------

     Phar Lap 286 is supported for Microsoft C 6.00A+, Microsoft C/C++ 7.0,
     Microsoft Visual C++ 1.0 (Microsoft C/C++ 8.0), and Borland C/C++ 3.1.
     Refer to your Phar Lap manuals on how to create Phar Lap executables.
     The only thing that needs to be done specifically for RDM is under all
     Microsoft compilers, the RDMPHAR.LIB or RDMPHARC.LIB needs to be
     linked as an object file instead of as a library.  Under Borland the
     RDMPHAR.LIB or RDMPHARC.LIB simply needs to be linked before the
     corresponding VISTA??.LIB.
     
     Raima has heard of reports about problems in creating large
     applications with Borland's TLINK linker.  This may cause problems for
     programmers wanting to use Phar Lap libraries.
     
     
     
Windows For Workgroups Bug
--------------------------

     Inquiries have been made to Microsoft about peer to peer sharing of
     files and the appearance of these files not getting updated as they
     should be (as if some undocumented caching or a caching bug was
     present).  To date, Microsoft has responded to our queries about this
     by denying the presence of caching in WFW. However, on 19-Aug-93 a
     client received the following message on CompuServe from Val A.
     Peterson, Section Lead, Windows for Workgroups Beta, Microsoft Corp.:
     
              "This is an issue we are aware of.  Windows for Workgroups
          does cache data from the network to make things faster.  Some
          database apps do have problems with this because of the conflict
          of how they handle file handles and the caching going on over the
          network.  This issue is being investigated, but I have no idea at
          this time what sort of work is being done on it."
          
     One apparent work-around for this WFW bug is to use the CLOSEFILES
     option through d_on_opt().  The consequences of this for RDM running
     on WFW include poorer RDM performance with no guarantee of correctness
     even after taking this performance hit.  Raima is looking into other
     work-arounds with smaller performance penalties such as the SYNCFILES
     option.  Regular Windows does not have this problem.
     
     
     
DOS size issues
---------------

     Many DOS customers run into problems with the size of the executable
     after linking with RDM.  Although new features and bug fixes have been
     introduced into the code Raima has worked to keep the overall size
     increase down.  The actual library files have increased significantly,
     but this can mostly be attributed to the support for the new lock
     manager types (LMC_SPX and LMC_NOVELL), which DOS applications do not
     have to link in.  By default, LMC_INTERNAL, LMC_GENERAL, LMC_SPX, and
     LMC_NETBIOS are linked into the executable.  If LMC_NOVELL is desired,
     a separate object file must be linked, and this process is described
     below in the LMC_NOVELL section.  If not all of the lock manager types
     are required to be link into the application, the programmer can
     specify which ones to link in by defining, when LOCKCOMM_DATA is
     defined, the constants for the lock manager types that he or she
     wishes.  For example, if both LMC_NETBIOS and LMC_GENERAL were
     required, one module in the executable would look something like this.
     
          #include <stdio.h>
          {{ Other include files }}
     
          #define LOCKCOMM_DATA
          #define LMC_NETBIOS
          #define LMC_GENERAL
          #include "vista.h"
          {{ Rest of the module }}
     
     After this, the d_lockcomm() function call will accept only the
     LMC_GENERAL and LMC_NETBIOS parameters.  If any others are supplied,
     the function will return S_INVLOCK.
     
     We strongly recommend only linking in the lock manager protocol types
     that you will require for your application.  If you only require one
     lock manager protocol type, you may save as much as 30K in the size of
     the application, depending on which protocol you use.
     
     Another way to reduce the size of the application is to remove the new
     INI file functionality.  Refer to the section on the d_rdmini()
     function earlier in this document for information on this feature.  To
     remove this functionality from your application, link in the inistb??
     object module before the RDM library.  The "??" should match the last
     one or two characters of the RDM library you use (vista??.lib).  This
     object module provides stub functions for all of the INI file
     functions.  Since these functions call functions from the RDM API that
     you may not need, the savings may be in the range of 10K.
     
     
     
Truename
--------

     DOS provides an interrupt that can be used to get the true name of a
     file.  Most networks link into this interrupt to provide true names
     with server names and device names.  Windows 3.1 also provides a way
     to get this information, but Windows 3.0 does not.  RDM will determine
     whether or not it can get the true name of file.  If so, the LMC_SPX,
     LMC_NETBIOS, and LMC_GENERAL protocols will use these true names for
     comparing, making it easier to access databases from anywhere.
     However this limits applications to DOS or Windows 3.1.  If Windows
     3.0 applications need to access the same database simultaneously with
     Windows 3.1 applications or DOS applications, the applications must
     turn off the truename option.
     
          d_off_opt(LMC_OPT_TRUENAME);
     
     Otherwise your applications will receive S_TAFSYNC errors.  The lock
     manager uses the name that the application sends it to determine if
     multiple applications are using the same file.  Therefore the names
     must match exactly if they are the same file.  If truename is turned
     off, it is up to the programmer to assure that the names and paths
     match.  The drive letter will be ignored, but mappings into
     subdirectories will cause corruption.
     


===========================================================================
LOCK MANAGER COMMUNICATION
===========================================================================

LMC_NOVELL
----------

     A limitation with the LMC_NOVELL lock manager protocol that is not
     discussed in the manuals is that files cannot be closed during a
     transaction.  This may cause problems for users with large
     transactions.  Normally RDM will attempt to close file handles using a
     least recently used algorithm, when more file handles are needed.
     Under Novell TTS this will not work.  Therefore the application and
     RDM must have enough handles to open every file that will be changed
     in the transaction.  If other files are open prior to the transaction
     and they will not be needed during the transaction, they can be closed
     before the transaction starts using the d[t]_closeall function.
     
LMC_SPX
-------

     The DOS SPX lock manager may cause some problems when it is run in a
     Windows DOS Box.  Windows may display a message that the DOS
     executable has caused problems with the system integrity on some
     machines.  We believe that the problem is related to one of Novell's
     function calls.  We have done some testing with a pre-release version
     of Novell's new SDK and the problem seems to have disappeared.
     However, because it was with pre-release software, we did not change
     the version that we are shipping.  If you need to use the SPX lock
     manager in a Windows DOS Box contact Technical Support for the name of
     a file on the BBS that will contain the "patched" version.  When
     Novell releases their SDK, we will do some further testing and release
     a new copy of the DOS lock manager on the BBS.
     
KNOWN PROBLEMS
--------------

     The following bugs have either been discovered too late to be fixed in
     the release of 3.30 or are related to third party software.
     
     Setting high timeout values can cause problems with the SPX and
     NetBIOS lock managers.  If the runtime has not had a response from the
     lock manager in 30 seconds, it assumes that the lock manager has died
     and generates an S_LMCERROR.  However the lock manager may not have
     been able to grant the request because of other requests.  Until this
     can be fixed we do not recommend setting timeout values of greater
     than 30 seconds, or setting the timeout to -1 (do not time out).
     
     The Novell TTS locking protocol does not work correctly on Token Ring
     networks.  Novell has tested and verified that this is a bug in their
     software and is currently working at getting it fixed.
     
     The Windows version of the SPX lock manager can have problems starting
     or ending on the second or later time that it is run in the same
     Windows session if an older version of NETX is being run.  We see the
     problem by starting the Windows SPX lock manager, terminating it and
     starting it again, etc.  Using VLM this does not cause any problems.
     We have not at this time isolated the bug to Novell or RDM.  We
     recommend using VLM or exiting Windows if the Windows SPX lock manager
     needs to be rerun.
     
     
     
==========================================================================
OBJECT MANAGER
==========================================================================

     Due to the changes in the RDM API listed in the RDM section above, the
     Raima Object Manager (ROM) 1.10 library sources for the functions that
     mimic the RDM d_ functions will need to be modified just like your
     application sources using RDM may need to be.  After recompiling the
     ROM libraries, the application will need to be relinked.
     
          Encode()            vistaobj.cpp, vistaobj.hpp
          Decode()            vistaobj.cpp, vistaobj.hpp
          
     We have done some limited testing with Microsoft Visual C++ 1.0
     (MSVC), Raima Database Manager 3.30 and Raima Object Manager 1.10.  If
     you would like to use MSVC, we recommend that you recompile the Object
     Manager libraries with MSVC instead of using the Microsoft C/C++ 7.0
     Object Manger libraries.
     


==========================================================================
END OF FILE
==========================================================================
