DOCS: Diskbase
From: Michael Current (aa700@cleveland.Freenet.Edu)
Date: 01/28/92-10:46:35 PM Z
From: aa700@cleveland.Freenet.Edu (Michael Current)
Subject: DOCS: Diskbase
Date: Tue Jan 28 22:46:35 1992
Reprinted from the A.C.E.C. BBS (614)-471-8559
DISKBASE 1.0
Documentation
April 1988
Todd Bake
722 Clairepointe
St. Clair Shores, Mi.
48081
DISKBASE is a public domain database program for Atari 8-bit
computers. Designed for ease of use, DISKBASE has many powerful
features such as the ability to print records and fields selectively,
to read data from ascii files, to copy all or some records or just
the data "structure", and to sort files of over 2500 records
(regardless of record size) without any additional disk space
required!
DISKBASE requires 48K and can be used with any DOS with a MEMLO
of $1D00 or less (this includes Atari DOS 2.0 and 2.5, DOS XL, and
SpartaDOS).
IMPORTANT NOTE: If you are using SpartaDOS, do NOT use the
"TDLINE" program, as this interferes with DISKBASE's functioning.
Also you should set KEY OFF, since DISKBASE has it's own "fast key"
feature (assuming you're using an XL or XE).
Each of DISKBASE's features are discussed below.
MAIN MENU
After DISKBASE loads, the Main Menu is displayed. Besides the
choices listed in the menu, there are the following additional
features:
Pressing "!" causes the write verify feature of DOS to be
toggled on and off. Turning write verify off speeds up the
write-to-disk process a little, and usually it's safe enough to do
without it; if you want to be cautious, though, the verify feature
can be left on (the default).
You may also press "?" to see the amount of free memory left,
although this has no bearing on how much space is left for new
records (that depends on disk space only); it merely reflects the
remaining memory buffer space. Generally speaking, you don't need to
worry about this; it will only affect the maximum number of records
that can be sorted, which will vary depending on the record size.
Each of the items on the Main Menu is discussed below.
page 1
DOS FUNCTIONS
These are the same as the usual DOS functions and fairly
self-explanatory, with the exception of COPY RECORDS and WRITE
STRUCTURE.
Since DISKBASE files use absolute sector/byte pointers, you
should not use the regular DOS Copy feature to duplicate them; if you
do, the new file will not contain valid pointers for its new location
on the disk. Instead, use this built-in COPY routine.
Unfortunately, because of the small amount of buffer space available
to the program, you need two drives (or a RAMdisk) to copy a file
between disks, as disk switching isn't supported. The DOS Duplicate
Disk function can be used, however. NOTE: If you're using SpartaDOS,
then you CAN use the DOS Copy function to copy DISKBASE files after
all, since Sparta returns relative file pointers, not absolute. If
you copy Sparta files to or from other DOS's, though, you must use
DISKBASE's COPY feature.
Besides copying entire files, COPY RECORDS lets you copy just
selected records if you choose. After being prompted for the
destination filename, you are asked to input a conditional expression
describing which records you want to be included in the new file.
Just press RETURN to copy the whole file, or enter a conditional
expression as described under the PRINT RECORDS section of this
documentation, if you want only certain records transferred.
WRITE STRUCTURE is the same as COPY, except that only the file
header information (field names/lengths, etc.) is copied, not the
data itself. You can use this to start a new file with the same
field definitions, but different data.
Press "M" to return to the Main Menu.
OPEN FILE
This is used to create a new file or open an old file for
changes or additions. When you select this option, you are prompted
for a filename. If the file is not found, then DISKBASE assumes you
want to start a new file. (If you made a mistake, you can press ESC
to abort, here and most other places in the program.) If any file is
already open when you select this option, it is saved and closed
before the "new" file is opened.
Opening a New File
You will be prompted for the number of fields you want in each
record, which can be from 1 to 255. Then you are asked for the field
name length; this is simply the size of the "label", which is the
same for all fields. It can be from 1 to 20. Obviously, if you have
a large number of fields, you'll want to keep the field name length
short; remember you'll still need room in the buffer for a least one
record!
page 2
Next the field name/length entry screen will appear, and you
will be prompted to enter a name and length for each field. Pressing
RETURN moves the cursor from Field Name to Field Length, or from
Field Length to Field Name on the next line. You can use the up and
down arrow keys to move from one line to another if you wish to make
changes to what you have already entered. If you specified more
fields than can fit on one screen, then the screen will scroll up
when you reach the end; or it will scroll down again if you move the
cursor back up past the top. You don't HAVE to enter a name for each
field now, and you can come back and change field names (but not
lengths!) later, but if you don't enter names, you won't be able to
specify fields for the PRINT and SORT and SEARCH routines until you
do, so enter something. Field lengths can be from 1 to 255.
When you're sure the file has been defined the way you want it,
press ESC. The file will be created, and you will be returned to the
Main Menu.
Opening an Old File
After you enter the filename, the file will be opened and you
will be returned to the Main Menu.
Whenever a file is open, its name will be displayed at the
bottom of the Main Menu screen. Needless to say, you should NEVER
remove the disk when a file is open!
ALTER FIELDS
If you want to change the field names of an already created
file, as stated above, this function allows you to do so. The file
must be open; then selecting ALTER FIELDS will take you to the field
name/length entry screen as described above. You will not be able to
change field lengths at this point, however, only names. Press ESC
when you're finished and the changes will be recorded.
CHANGE RECORDS
Once a file is opened, select CHANGE RECORDS to change or add
data. This will take you to the edit screen, where the first record
will be displayed.
The Edit Screen
At the top of the edit screen, the name of the currently open
file is displayed, as well as the current record number followed by
the total number of records in the file separated by a slash (e.g.,
"1/12"). Also shown is the number and length of the field that the
cursor is currently positioned on.
Below this information, the name and contents of each field is
displayed. For instance:
page 3
Name :Todd Bake
Address :722 Clairepointe
City :St.Clair Shores
State :Mi
Zip :48081
If a field is too long to fit on the screen, then only part of
it will show. However, this "window" can be scrolled to view or edit
the entire contents of the field. In CHANGE mode, moving the cursor
past the end of the line will cause the window to scroll left; moving
the cursor back past the beginning of the window will cause it to
scroll right. You can also use TAB and CTRL-TAB to move the cursor
and scroll the window by larger amounts. In VIEW mode (see below),
the cursor will appear on the colon separating the field name from
the data; pressing the left or right arrow keys, TAB or CTRL-TAB will
scroll the window.
Pressing the up and down arrow keys will move the cursor from
one field to another. Pressing RETURN will also move you to the next
field. If there are too many fields to fit on one screen, then the
screen will scroll up or down when the cursor moves past the bottom
or top. You can also press CTRL-U to scroll up a whole page or
CTRL-D to scroll down a page, or CTRL-T to go to the "top" (first
field) or CTRL-B to go to the "bottom" (last field). (You don't have
to press CTRL if you're in VIEW mode.)
To edit the contents of a field in CHANGE mode, simply type in
the data you wish. Note that all the usual editing keys such as
insert and delete function normally within the window. (All fields
are interpreted as strings, so you should right-justify any numerical
data, if you think you will want to sort records by those fields
later.)
Press CTRL-N to go to the next record, or CTRL-P to go to the
previous record (just N or P in VIEW mode). You will also go to the
next record automatically if you press RETURN while in the last
field.
The Options Menu Line
Pressing ESC in CHANGE or VIEW modes causes the Options Menu
Line to appear at the bottom of the screen. These options are each
described below.
GOTO #
To go to a particular record, press "G" at the Options Menu,
then enter the desired record number.
FIND
To search for a record with a particular contents, press "F".
You will be prompted for a field name and a string to search for.
page 4
You don't have to enter the entire field name, just enough of it to
distinguish it from any other field; likewise anything that begins
with the string you entered will match. You will also be asked if
you want the search to proceed forward or backward from the current
point, or to be global (search the whole file). Press "+" to search
forward, "-" to search backward, or "G" to search the whole file
starting at the beginning.
When a record containing the specified data is found, you are
asked if you want the search to continue. Press "Y" to continue to
search past that record, or "N" to stop there for further
editing/viewing.
You may also cancel the search at any time by pressing ESC.
DELETE
Press "D" to delete the current record. You will be asked to
verify that you want the record deleted, and if you then respond "Y",
the record will be removed. Deleted records CANNOT be "undeleted",
so make sure that's really what you want before you confirm!
(Technical note: deleted records are actually placed at the end of
the file as blanks, so deleting a record will not reduce the file
size. If you need to free up some space on your disk, you can COPY
the file to another name, then erase the old file containing the
extra blank records. Of course, the blanks at the end of the file
are used for the new records that you add, so there is no need to go
through the copying procedure if you know you will be adding new
records.)
BOF
Press "B" to go to the Beginning of the File, i.e., record
number 1.
EOF
Press "E" to go to the End of the File, the last record.
CHANGE/VIEW
In either the CHANGE or VIEW mode, you can switch to the
alternate mode by pressing "C" or "V", as appropriate, from the
Options Menu.
Press M to return to the Main Menu. Press ESC to return to
editing/viewing if you don't wish to select any of these options.
VIEW RECORDS
Selecting VIEW RECORDS from the Main Menu is much the same as
CHANGE RECORDS, except as noted above.
page 5
READ RECORDS
By selecting this option, you can read data into the currently
open file from an ascii file. This allows you to use your favorite
word processor to create data files, then enter them to DISKBASE for
management. Such ascii files can also be created by DISKBASE itself,
and files in this form can of course be copied using the standard
Copy function of whatever DOS you're using, unlike regular DISKBASE
files.
When you select READ RECORDS you will be prompted for a
filename, and if the file is found, its contents will be read in and
added to the end of the open database. You can interrupt the READ
process by pressing START.
When creating ascii files using a word processor, each field
should end in a RETURN. Do NOT put an extra RETURN between records.
Essentially READ treats input from the file you specify as if it were
keyboard input, after first going to the end of the file and entering
CHANGE mode. (You could conceivably take advantage of this fact by
placing characters in the ascii file corresponding to various
DISKBASE keypresses, to achieve macro-like effects.)
PRINT RECORDS
DISKBASE allows you to send records to a printer, disk file, or
the screen, in three different formats. You can print all or just
certain fields, of all or just certain records.
First you are prompted as to where you want the output sent. If
you choose printer output, you are also given the option of entering
a printer control string, i.e., a string of characters to format your
particular printer for whatever kind of pitch or page spacing that
you prefer; see your printer manual for specifics. If you select
disk output, you are prompted for a filename. (Remember you can
press ESC at any of these points to cancel the procedure.)
You are then prompted to select the format of the output. Pick
"1-regular format" to print records in a form resembling the way they
appear on the edit screen, "2-horizontal format" to print one record
per line across the page, or "3-data only" to create ascii files that
DISKBASE can READ back in again. Press the corresponding number key.
Next you are asked to specify which fields to print. Just enter
a blank if you want to print all fields, otherwise enter the names of
the fields you want to be printed, one at a time. When you're
finished, enter a blank to continue.
Finally you are asked to type a conditional expression to
specify which records you want printed. Just press RETURN to print
all records. Otherwise, enter the conditional expression in this
form:
page 6
#=integer
...or...
fieldname="string"
You are not limited to the equals sign; you can use =, <, >, <=,
>=, or <> as comparisons.
"#=integer" specifies which record numbers to print. Literally,
you might enter:
#=3
...to print record 3, or
#<127
...to print all records less than 127. Or:
#>=34
...to print records greater than or equal to 34.
Examples of fieldname/string comparisons are:
city="Detroit"
...or...
LastName<"Smith"
...and so on. Note that you DO NOT put quotes around the field
name, but you DO put quotes around the comparison string. Note also
that as with the Search function described previously, any field that
begins with the specified string will match, regardless of what
characters follow. To avoid undesired matches of this sort, you
could enter:
LastName="Smith "
...with some trailing blanks to insure that something like
"Smithley" wouldn't match.
You can also use parentheses, "&" (for AND) and "" (for OR), to
create as complex an expression as you wish. For example:
#<100 & (name="Smith" name="Jones")
...would print records less than 100 whose "name" field was
"Smith" or "Jones". Note that "&" takes precedence over "" unless
parentheses are used. Without the parentheses, the above example
would print records less than 100 whose "name" field was "Smith", and
also ANY records whose "name" was "Jones". (If you're in doubt about
page 7
precedence, just use parentheses.) Nested parentheses are okay too.
Note that the conditional expression may be up to 250
characters, although the input window is only 24 characters wide; it
will scroll if necessary the same as input windows on the edit
screen.
After you enter the expression, printing proceeds. Press ESC to
cancel printing.
(All of the above rules also apply to the conditional expression
entered when using COPY RECORDS, mentioned previously.)
SORT
Since all of the available buffer space is used by the Sort
routine, whatever file is currently open (if any) is saved and closed
when you make this selection. You are asked for the name of the file
you want sorted. If the file is extraordinarily huge (over 2600
records or so depending on record size, field name length, etc.),
DISKBASE may not be able to sort it. (Three bytes are required for
each record in the file, and the free memory area is about 8K; also
space is needed for the field names and lengths.) In any case,
DISKBASE will let you know if the file is too big to sort. If all is
well, you will then be asked if you want an ascending (A-Z) or
descending (Z-A) sort. Press "+" for ascending, "-" for descending.
DISKBASE will report as it indexes, sorts, then relinks the file
in sorted order. The contents of the records is not actually moved,
only the pointers connecting the records. This means that the links
between the records will be somewhat convoluted after the sort;
record 1 may be near the beginning of the physical file and record 2
near the end, etc. This will cause no problem for DISKBASE's
handling of the file, but it may slow down subsequent Search and
Print procedures somewhat. Therefore, it's highly recommended that,
if possible, you use the Copy function to first move any file to be
sorted to RAMdisk, sort it there, then Copy it back to the floppy
disk. The sort will be MUCH faster on the RAMdisk, and when the file
is Copied back to floppy, the pointers will be "untangled" so that
consecutive records will actually be next to each other on the disk.
ESC: Close File
Pressing ESC from the Main Menu saves the buffer and closes the
currently open file. Be SURE to do this before leaving the program,
or you may lose changes in your data or even foul up the file
irreparably.
When you are ready to leave the program, do so by pressing
RESET.
TECHNICAL STUFF
In case anyone wants to write their own programs to manipulate
page 8
DISKBASE files, or just happens to be curious, here are some notes on
the file structure.
DISKBASE files consist of a header, followed by records in the
form of a doubly-linked list. When the file is first created, the
list will consist of all blank records; when the user adds records
beyond the last blank, a new block of blanks is appended (a message
to this effect is displayed at the bottom of the screen when this
occurs).
The size of a block is equal to the number of records in the
memory buffer. The minimum buffer size is a half K; if the user
defines a record size smaller than that, then there will be a number
of records in the buffer. If the record size is larger than 512
bytes, then the buffer is expanded to accommodate at least one
record.
A DISKBASE file will always contain a number of actual records
(counting blanks) evenly divisible by the number of records in the
buffer. Even a file with no records input by the user will contain
one block of blanks into which newly entered records will be placed.
Each record begins with 6 bytes of pointer information: the
sector/byte location of the previous record, and the sector/byte
location of the next record. (The sector value is 2 bytes, LSB
first.) Record 1 points to 0,0 as its previous record, and the final
record points to a random location as its next record (actually it
points to where the next record would be appended, if it were
appended at that time, but that may change).
Following the pointer information is the actual data of the
record. Fields are not delimited in any way.
The header consists of the following:
1 byte: the version number (1)
(files that don't begin
with this byte will be
rejected by DISKBASE
when the user tries to
open them).
2 bytes: LSB,MSB of the number
of non-blank records
in the file.
2 bytes: LSB,MSB of the total
number of records in
the file, including
blanks.
page 9
3 bytes: file pointer
(sector LSB,MSB; byte)
to the last record in
the file, including
blanks.
1 byte: the number of fields
in each record.
1 byte: the field name length.
n bytes: the field names; the
size of this part of
the header equals the
number of fields times
the field name length.
n bytes: the field data lengths;
the size of this part
is equal to the number
of fields, each byte
signifying the length
of the corresponding
field.
3 bytes: file pointer
(sector LSB,MSB; byte)
to the first record in
the file.
3 bytes: file pointer
(sector LSB,MSB; byte)
to the last non-blank
in the file.
A FINAL NOTE
DISKBASE can handle up to 65536 records. Since each record must
consist of at least 7 bytes, that many records would take up 458,752
bytes, which is more than even a double-sided, double-density disk
contains. Just in case you're one of those rare people rich enough
to afford a hard drive, however, consider yourself warned. (Though I
can't imagine anyone typing in two-to-the-sixteenth-power records
anyway!)
-------------------------------------------------------------------
page 10
--
Michael Current, Cleveland Free-Net 8-bit Atari SIGOp -->> go atari8 <<--
The Cleveland Free-Net Atari SIG is the Central Atari Information Network
Internet: currentm@carleton.edu / UUCP: ...!umn-cs!ccnfld!currentm
BITNET: currentm%carleton.edu@interbit / Cleveland Free-Net: aa700
-----------------------------------------
Return to message index