home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DP Tool Club 12
/
CD_ASCQ_12_0294.iso
/
maj
/
421
/
bltnetwk.txt
< prev
next >
Wrap
Text File
|
1993-08-03
|
11KB
|
261 lines
BULLET Network Routines, Supplemental Information. 26-July-1993
BULLET has nine network-related routines that you can use. Each will
be described in this document as will when/how to use them and a bit
of background information.
The BULLET network routines are:
1. LockXB
2. UnlockXB
3. LockKeyXB
4. UnlockKeyXB
5. LockDataXB
6. UnlockDataXB
7. DriveRemoteXB
8. FileRemoteXB
9. SetRetriesXB
Routines 7 through 9 are not discussed here. The CZ documentation
should be adequate for these.
Glossary.
---------
BULLET fileset: Group of files related by their common AccessPack
variable, AP(). A fileset contains 1 data file and from 1 to 32
index files.
Locking: Giving exclusive file access to one application.
Unlocking: Releasing exclusive file access so other applications
may perform a lock.
Flush: Act of updating disk data with data that currently is stored
only in memory.
Background.
-----------
The purpose of locking/network access, in general, is to keep data in the
fileset in a known state. When only a single application access a data
file the state will always be known since only that application can
alter the state. However, when multiple applications access a data
file each application can alter the state without imforming the others
of the new state. To solve this problem, the locking of the data to a
single application at any one time is done. Thus giving an application
exclusive access to the data, allowing it to alter its state, then to
release the exclusive access (unlock) so that others can again access
the data.
A BULLET file is made up of both header and data portions. The header
describes the makeup of the file and may be changed by accesses to
that file (adding records, reindexing, etc.). The data is essentially
just user-data (data records, key fields, etc.). In order to properly
access a file in a multi-access environment, both the data and header
portions must always be in a known state. This requires that, upon
initial access (the lock), the current application's internal header
information (internal BULLET data areas) be reloaded from the physical
image on disk. It also requires that any buffered data from previous
accesses be discarded. All internal BULLET data structures are properly
refreshed when a LockXB is called. However, the application must also
insure that any data that IT has retained from a previous access be
discarded since it may no longer be valid.
After a successful LockXB, the fileset is in a known state -- BULLET
has reloaded its internal structures and is ready to operate. At this
time you can perform any file operation such as InsertXB, UpdateXB,
ReindexXB, GetFirstXB, etc. Deleting may also be performed but your
application (logic) should first verify that the delete is valid --
you don't want to delete a customer-record if the customer has
outstanding invoices, etc.
Once done with the operation, you should release the lock. While the
lock is in place, no other application may access the fileset, so it's
best to get in, do what you need, and get out. Don't keep a fileset
locked unless you need to have exclusive access. To release the
fileset locked by LockXB, use UnlockXB. This will reverse the actions
of LockXB. First, it flushes any BULLET data buffers, including
updating the file headers on disk with the current state of the file.
This is important since, while the data portion of a file is written
essentially in real-time, the header portion remains in memory until
an UnlockXB or until the file is closed (always! unlock files before
closing them). After the flush, the disk image matches that known
state of the fileset of the application in control, and so BULLET
unlocks the fileset. The fileset is now available to other
applications. When another application requires the fileset, it goes
through the exact same procedure.
Current versions of BULLET allow record locking in addition to file
locking. BULLET implements file locking by locking all bytes of a
file, rather than by opening the file in an exclusive access mode.
This permits BULLET to control access without the need to constantly
open and close files with an exclusive access mode (though that is
also available). There are times, however, when exclusive access to
the entire data file is not required, but rather only to a single record.
By setting the AP(n).RecNo=RecordNumberToLock, the BULLET lock routines
only lock that single record number in the data file, allowing other
applications access to that data file. Note that this mode -- record
locking, does NOT reload the data file header*, it simply locks that
one record preventing other applications from altering it. For index
files, the entire file is locked since the b-tree is one big, happy
dataset, not independent data records as with the data file. Note
that since the header of the data file is not locked, you cannot
perform any operations on the data file that would alter its state.
If all you want to do is read and _hold_ a single record, you may want
to use a record lock. However, if you can get in and get out, perhaps
setting a field in the record to hold with a flag, then the full
LockXB() is the best solution (and recommended).
*Future versions will reload the header, but not lock it. The programmer
can use ReadDHXB to reload the data file header manually.
The following is not a network-only concern, but is very important:
One other thing that the programmer must be aware of is keeping index
files in-sync with its associated data file. If keys within an index
file(s) are based on a data file, and if that data file is altered
without also updating the index file(s), then that index file is no
longer valid. To ensure the index file(s) remain in-sync with its
respective data file, use only the high-level access routines when
adding or updating data (InsertXB and UpdateXB) and use an AccessPack
(AP()) with _ALL_ related index files controlled from that one AP().
Note that since Xbase-specs do not physically delete data records,
one can DeleteRecordXB (but not DeleteKeyXB!) as often as one likes
without invalidating the index files. However, if there are records
tagged as 'deleted' in a data file, and if that file is PackRecordsXB'ed,
then all associated index files must be ReindexXB'ed, else the index
file(s) contains, again, invalid key pointers. It is the programmer's
responsibility to ensure that index files remain in-sync with their
data file.
Routines.
---------
1. LockXB
----------
LockXB is the highest-level lock function. It coordinates the locking
of an entire BULLET fileset with a single call and performs memory-
buffer refresh of the respective file headers in the fileset. LockXB
is a combination of LockKeyXB and LockDataXB. The process is:
F#=1, indexing first AP() pack.
Step 1. Attempt to lock key file F#.
Step 2. If success, read F# header, increment F#.
While success, and for each AP() index file, repeat
steps 1 & 2.
If any failure, undo previous locks performed by steps 1&2
and set RC = F# of failed lock. Go to step 5.
If all index files successfully locked and headers loaded,
proceed to step 3:
Step 3. Attempt to lock data file.
Step 4. If success, read header.
If failure (including header load failure), undo lock
performed by step 3, if at all, and locks performed by
steps 1 & 2. Set RC = F# (F# is equal to number of index
files locked in steps 1&2 _PLUS_ 1. E.g., two index files
locked okay but data file failed to lock, RC=3.
Step 5. If failure, RC (return code) is returned to the caller in
the ax register, or if called from a high-level langauge,
as the return code (e.g., as stat in stat = BULLET(AP(1))).
This return code is not the error code. REPEAT, is not the
error code. To obtain the _error_ code, use
ecode=AP(stat).Stat
If success, the RC (hence, stat) is 0. There is no partial
success. Either LockXB locks and loads everything, or it
fails.
Also note that the return code of the _ALL_ Lock() routines
differs from the other high-level access routines in that
it return code=0 always implies success. See InsertXB() for
more. (If CZ is loaded, just move the cursor onto InsertXB()
above and press the hotkey!)
2. UnlockXB
------------
UnlockXB is the highest-level unlock function. It coordinates the
unlocking of an entire BULLET fileset that was locked with LockXB
with a single call and performs memory-buffer flushing of the
repective file headers in the fileset. UnlockXB is a combination of
UnlockKeyXB and UnlockDataXB. The process is:
F#=1, indexing first AP() pack.
Step 1. Flush key file header F# to disk.
Step 2. If success, unlock key file F#, increment F#.
While success, and for each AP() index file, repeat
steps 1 & 2.
If any failure, set RC = F# of failed unlock. Go to step 5.
(Relocking is not attempted. Programmer must manually
unlock remaining locks using UnlockKeyXB.)
If all index files successfully unlocked and headers flushed,
proceed to step 3:
Step 3. Flush data file header to disk.
Step 4. If success, unlock data file.
If failure (including header flush failure), set RC = F#
(F# is equal to number of index files unlocked in steps 1&2
_PLUS_ 1. E.g., two index files unlocked okay but data file
failed to flush, RC=3.
Step 5. If failure, RC (return code) is returned to the caller in
the ax register, or if called from a high-level langauge,
as the return code (e.g., as stat in stat = BULLET(AP(1))).
This return code is not the error code. REPEAT, is not the
error code. To obtain the _error_ code, use
ecode=AP(stat).Stat
If success, the RC (hence, stat) is 0. There is partial
success with UnlockXB. However, partial success implies
partial failure. It is the programmer's responsibilty to
flush & unlock any failed unlocks. It is unlikely that
a failure will occur with an UnlockXB operation, but be
aware of what must be done if it were to occur.
3. LockKeyXB
-------------
LockKeyXB is as LockXB but steps 1 & 2 only. If success, proceed to
step 5 rather than 3.
4. UnlockKeyXB
---------------
UnlockKeyXB is as UnlockXB but steps 1 & 2 only. If success, proceed
to step 5 rather than 3.
5. LockDataXB
--------------
LockDataXB is as LockXB but steps 3 & 4 only.
6. UnlockDataXB
----------------
UnlockDataXB is as UnlockXB but steps 3 & 4 only.
<EOF>