Troubleshooting Hints MetalBase 5.0 ------------------------------------------------------------------------------- Can't compile - There are several options you can add to or remove from CFLAGS= in your makefile. stdinc.h will look at several compiler-generated settings to determine your system type and choose defaults, but they may need to be modified... standard machine definitions are: -DAMIGA - Amiga -DNeXT - NeXT -DCOHERENT - COHERENT -DMSDOS - Any MS-DOS compiler -Dapplec - Mac Programmer's Workshop -Dsgi - SGI -DM_SYS3 - Xenix -DM_SYS5 - Xenix -DM_7 - Xenix If you have a machine on the right, try adding the thing on the left to CFLAGS and recompiling. If that doesn't help, read on: There are several definitions which define how the code will be set up... of them, -DSTRUCT_# isn't necessary unless you're compiling the library itself: -STRUCT_#........MetalBase uses this to determine which structure-packing algorithm you're using; run STRUCT or STRUCT.EXE to find out. It'll tell you what to do with this. -DLONGARGS.......If your machine screams about your prototypes, this may be the problem. If you don't define this, odds are the prototypes MBASE will define will look like void main (); Define it, and you'll get void main (int, char **); -DSYS_FCNTL......If can't be found, try defining this--it'll move the search to -DCHAR_IS_UNS....Most compilers define this if the default character type is unsigned; some may not. Try this if you suspect a problem. -DNEED_ULONG.....Most machines don't have the type "ulong"; some do. Try adding this if your compile freaks because of ulongs. -DNEED_USHORT....Parallel to "ulong"; this makes a typedef for ushort. -DNOVOIDPTR......Many older compilers still don't recognize "void *x;" as a valid instruction--define this to change those kind of declaration to "char *x;". -DNON_ANSI.......If you're not using VT emulation (ANSI.SYS counts as VT emulation; Amiga users have it built in to AmigaDOS), define this. Just makes Build a little prettier. -DNOSYNC.........A few machines don't have fsync() or sync()--if you get either as an unresolved external, add this. MS-DOS users: By default, stdinc.h tries some inline assembly. If you're not running MB programs under windows, just define this and it won't... otherwise, you may want to try to get that translated to whatever works for you. MB_BUSY (Relation is too busy--if returned by a call other than mb_inc()) - Only thirty operations may be processed simultaneously--and this was number thirty one. Try again in a second or two. MB_BUSY (Relation is too busy--if returned by mb_inc()) or MB_LOCKED (Relation is locked by another user) - If you're stuck by one of these, try the utility blast -- it erases the record of the number of users on a relation. But the cause is still there: you may want to check your programs to make sure each terminates with mb_die() [ MBCloseAllRelations() ] or mb_exit(), or just mb_rmv()'ing all the relations you've used... if a relation isn't closed properly, its count will increase each time you use the thing, until it's got 255 users and won't let you add any more. Then, you've gotta blast it. MB_NO_OPEN (Cannot open given filename) or MB_NO_READ (Cannot read given filename) - MetalBase does not use any evironment variables to check for possible directories for relations; it expects a full pathname if one is required. MB_NO_OPEN usually means the file can't be found; while MB_NO_READ means mb_inc() can't read the initial signature at all from the relation--possibly permissions, or a 0-length file. MB_FORMAT (Relation is not in MetalBase 4.0+ format) - Gods. Good luck. This is caused if a) the initial signature (see format.dox) isn't (char)40 or (char)41, or b) the fields in the relation don't make sense, or c) the indices.... basically, this is your generic "THIS SHOULDN'T HAVE HAPPENED!!!" error. If you get it, make _sure_ you're opening the right file, for starters: always pass mb_inc() the name of the file WITHOUT the extension. I don't trust the extension bit... MB_TIMEOUT (Temporary lock has not been removed) - MetalBase sets temporary locks on relations during add/delete/update/search operations--when a temporary lock has been placed on a relation, other commands wait for a set amount of time for the relation to be unlocked-- this process is normally transparent to the user. Though these waiting periods are kept as small as possible (obviously), under very peculiar situations, a program may be interrupted while a lock is still in place. On other occasions, two commands may have been issued nearly simultaneously, and the lock will be almost ready to remove when the second command gives up. If you receive this error, you should try your command again--failing that, execute mb_rst(1) or use blast to remove the temporary lock. MB_DISKFULL (Not enough disk space left) - mbconv requires again as much free space as the size of the relatation being converted; if you don't have that much, it'll stop the conversion. Note that no check is made for enough free space before conversion so make sure yourself before you start, or 10 minutes into its work it may stop with this error. MB_TMPDIR (You must define a TMP directory) - On some systems, MetalBase requires that you have the environment variable TMP set to an appropriate directory for temporary files; for example, TMP=/tmp; export TMP or set TMP=C:\TMP If you prefer, you can use the variable "TEMP" instead. MB_TMPERR (Cannot work with TMP directory) - In order to control concurrency problems, MetalBase 5.0 uses a rather complex system of locking, which involves many busy loops of ReadByte, CheckByte, ReadByte and so on. That kind of work really, really slows down access to a relation, so the locking mechanism has been moved off to a separate file. This file is named after the relation, with the extension replaced with ".LCK", and is placed in the temporary directory given as per MB_TMPDIR (explained right above this). This file is created every time mb_inc() is called, if it does not already exist... if it cannot be created, or opened for read/write access, this error is returned. Try moving the temporary directory to another location. Too many relations--see trouble.dox Too many fields--see trouble.dox - Form has two manifest constants, MAXnREL and MAXnFLD. These are defined for 5.0 to be 20 and 40 respectively; if you have more than 20 relations in a given data-entry template, add -DMAXnREL=30, etc, to CFLAGS in the Makefile and recompile. Report doesn't quite look like the template - Check your semicolons. Every print statement, every skip statement; hell, most statements, will freak if they don't end in a semicolon, and different systems freak in different ways. :)