<?xml version='1.0' encoding='utf-8'?>
<feed xmlns='http://www.w3.org/2005/Atom'>
<id>page56</id>
<title>Ref Files/FAQ's</title>
<updated>2009-10-23T10:03:30.623-07:00</updated>
<link href='http://isam.ca/products/disam/d7/refs.html' rel='self'/>
<author></author><entry>
<title type='text'>DISAM History, complete</title>
<id>DISAM_History</id>
<updated>2009-10-23T10:03:30.623-07:00</updated>
<link href='http://isam.ca/products/disam/d7/refs.html#DISAM_History'/>
<content type='html'>
 The first DISAM was released in March of 1988.&lt;br /&gt;This hisitory commences with Version 5.&lt;br /&gt;--------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;september 24th, 1995 - version 5.93 - first official release&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;october 3rd, 1995 - version 5.94&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;this version incorporates the initial release of variable length data&lt;br /&gt;records, and two minor bug patches relating to data record locks and&lt;br /&gt;natural order read/search.&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;october 8th, 1995 - version 5.95&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;this version includes an optional administration facility to keep&lt;br /&gt;track of active isam file descriptors.&lt;br /&gt;&lt;br /&gt;the administration facility allows the library to keep track of&lt;br /&gt;duplicate opens on isam files and to share a single pair of system&lt;br /&gt;file handles between duplicate instances of the same file.&lt;br /&gt;&lt;br /&gt;ISMAXFILES and ISMAXLK are now redundant, and the associated tables&lt;br /&gt;are now dynamically allocated, meaning that the number of open files&lt;br /&gt;and the number of active record locks is now only limited by system&lt;br /&gt;resources.&lt;br /&gt;&lt;br /&gt;the initial beta version of the transaction processing module is&lt;br /&gt;included.  this version features an enhancement over the original&lt;br /&gt;disam code in that it supports virtual open/close within transactions.&lt;br /&gt;any attempt to close a file that is part of an active transaction&lt;br /&gt;will be deferred until the transaction is complete.  if you chose&lt;br /&gt;to reopen the file within the same transaction, the virtual handling&lt;br /&gt;system will just pass you back the same handle you were using before.&lt;br /&gt;this, in theory, should help to correct the EMFILE errors inherent&lt;br /&gt;in the original disam versions.  refer to trans.ref for details.&lt;br /&gt;&lt;br /&gt;the test/user.c executable has been enhanced slightly in that it can&lt;br /&gt;now make system calls (sys) and run rudimentary scripts (run).&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;october 16th, 1995 - version 5.97&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;featuring a number of adjustments and enhancements to the variable&lt;br /&gt;length option, and the implementation of a fairly rigorous storage&lt;br /&gt;checking/statistics facility in ascheck.&lt;br /&gt;&lt;br /&gt;the remainder of the changes cover basic adjustments for portability&lt;br /&gt;and a degree of cleanup and optimisation in the remainder of the code.&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;october 31st, 1995 - version 5.98&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;initial beta - threadsafe and threadproof handling - see thread.ref&lt;br /&gt;for more details.&lt;br /&gt;&lt;br /&gt;implemented true support for duplicate opens within the same process.&lt;br /&gt;record locking on duplicate handles is honoured, and locks will not&lt;br /&gt;be lost when a duplicate handle is closed.&lt;br /&gt;&lt;br /&gt;isrecover now returns appropriate error codes on failure.&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;december 15th, 1995 - version 5.99&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;essentially a collection of adjustments based on beta test reports.&lt;br /&gt;added isprecious() and islockcheck() options to the wrapper code.&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;january 2nd, 1996 - version 6.0&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;the updates in this version consist of the inclusion of the isCluster&lt;br /&gt;and isAudit calls, documented in base.ref and audit.ref respectively.&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;january 28th, 1996 - version 6.1&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;the transaction processing module has been upgraded to comply with&lt;br /&gt;the current cisam standard, and includes full support for variable&lt;br /&gt;length records.  disk i/o has been improved (at the expense of an&lt;br /&gt;extra chunk of memory) and the lock time on the file log reduced.&lt;br /&gt;&lt;br /&gt;added ISDUPLOCKS option to the configuration options to permit&lt;br /&gt;cisam (non xopen) functionality with regard to duplicate opens&lt;br /&gt;in the same process - see entry for version 5.98 for more detail.&lt;br /&gt;please note that ISDUPLOCKS should not be set to zero when porting&lt;br /&gt;do DOS, Windows, OS/2 or non ELF versions of Linux.  if this is a&lt;br /&gt;problem to you, please contact Byte Designs.&lt;br /&gt;&lt;br /&gt;the flag structure in the index header that denotes ISMASKED files&lt;br /&gt;has been changed.  this means that masked files built before this&lt;br /&gt;release are no longer compatible.  the fixflags utility in the util&lt;br /&gt;directory will patch existing files to comply with the new method.&lt;br /&gt;&lt;br /&gt;added isindex, ispop, iscopy and isclone calls - see upgrade.ref&lt;br /&gt;for further details.&lt;br /&gt;&lt;br /&gt;the ascheck utility now includes a -B option to allow specific indexes&lt;br /&gt;to be rebuilt without disturbing the remainder.  see ascheck.ref for&lt;br /&gt;more details.&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;february 5th, 1996 - version 6.2&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;isClose now returns a boolean TRUE or FALSE rather than the original&lt;br /&gt;NULL pointer.  this change is specific to the base library and does&lt;br /&gt;affect the standard interface.&lt;br /&gt;&lt;br /&gt;base and wrapper function prototypes are now C++ compatible.&lt;br /&gt;&lt;br /&gt;added isseekey() to the wrapper library.&lt;br /&gt;&lt;br /&gt;ascheck now does index/data mismatch checking - slower but better.&lt;br /&gt;&lt;br /&gt;aslist in the util directory is an incomplete but fully functional&lt;br /&gt;means of listing the contents of an isam index file.&lt;br /&gt;&lt;br /&gt;added isPush and isPop to the base library.&lt;br /&gt;&lt;br /&gt;added threadsafe isvbuild to the wrapper to allow building variable&lt;br /&gt;length files without the use of the global isreclen variable.&lt;br /&gt;&lt;br /&gt;added isWrCurr and iswrcurr to the base and wrap libraries.&lt;br /&gt;&lt;br /&gt;added isfilter (wrapper only) and islkcall (inhouse only)&lt;br /&gt;&lt;br /&gt;pure index files - see pure.ref&lt;br /&gt;&lt;br /&gt;transparent file links - see link.ref&lt;br /&gt;&lt;br /&gt;stubs for isstat variables - see status.ref&lt;br /&gt;&lt;br /&gt;added ISRDONLY mode in isopen for handling read only files.&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;february 14th, 1996 - version 6.4&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;null key masking - see nullkeys.ref&lt;br /&gt;&lt;br /&gt;custom key extensions - custkeys.ref&lt;br /&gt;&lt;br /&gt;RLE compression option for variable length - ISVARIABLE in install.ref&lt;br /&gt;&lt;br /&gt;renamed isLockMode and islockmode to isSetMode and issetmode.&lt;br /&gt;&lt;br /&gt;implemented ISSYNCWR mode in open and build - see base.ref&lt;br /&gt;&lt;br /&gt;upgraded isprecious logic to complete implementation&lt;br /&gt;&lt;br /&gt;adjusted isGoto to not return an error if file not open for reading.&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;version 6.5 was an interim release, changes from 6.4 covered below.&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;february 14th, 1996 - version 6.6&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;threadsafe transaction processing module - beta only - see&lt;br /&gt;trans.ref for details.&lt;br /&gt;&lt;br /&gt;added ISVARCMP mode on isbuild to allow runtime compression&lt;br /&gt;flagging on variable length files, adjusted variable length&lt;br /&gt;compression handling, and added ISNOCARE option to isOpen to&lt;br /&gt;allow easier handling of varlen files - see varlen.ref for&lt;br /&gt;details.&lt;br /&gt;&lt;br /&gt;reworked threadsafe duplicate open handling.&lt;br /&gt;&lt;br /&gt;added EINTR handling to lockmode 2 for threadsafe, and allowed&lt;br /&gt;multiple lock fail codes to be specified in isport.h&lt;br /&gt;&lt;br /&gt;stchar arguments were reversed, and the float machine independant&lt;br /&gt;routines now have float arguments rather than double.&lt;br /&gt;&lt;br /&gt;open and build now allow the lock mode to default to ISMANULOCK&lt;br /&gt;if not specified.&lt;br /&gt;&lt;br /&gt;adjusted isStart behaviour to match cisam standards.&lt;br /&gt;&lt;br /&gt;cleaned up a number of compiler warnings.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;march 22nd, 1996 - version 6.7&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;allow varlen compression to be specified on a per file basis,&lt;br /&gt;see varlen.ref&lt;br /&gt;&lt;br /&gt;implemented ISNOCARE open mode to make it easier to open unknown&lt;br /&gt;(varlen or fixlen) files.  also modified isgetmode to get all&lt;br /&gt;open mode bits rather than masking out only the lock mode, and&lt;br /&gt;adjusted issetmode to accept an unmasked mode value without&lt;br /&gt;complaint.  see varlen.ref&lt;br /&gt;&lt;br /&gt;added common dictionary access - see wrap.ref, should be of&lt;br /&gt;value to those converting from old disam.&lt;br /&gt;        &lt;br /&gt;error code offset value define - see install.ref&lt;br /&gt;&lt;br /&gt;added varlen and varcmp mention in ascheck.&lt;br /&gt;&lt;br /&gt;display contents of known key types in aslist.&lt;br /&gt;&lt;br /&gt;user info pad in index headers - see info.ref&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;april 10th, 1996 - version 6.8&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;adjusted ISDUPLOCKS 1 mode to disallow erase/rename on files already&lt;br /&gt;open in the current process - DUPLOCKS 0 retains original behaviour,&lt;br /&gt;but be warned that a sequence of open, erase, write, close will result&lt;br /&gt;in data loss - see install.ref and caveat.ref for details.&lt;br /&gt;&lt;br /&gt;added isdi_kdsc() to the wrapper library - see wrap.ref&lt;br /&gt;&lt;br /&gt;library expiration date option - see expire.ref&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;may 3rd, 1996 - version 6.9&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;added NPARTS define for cisam/xopen compatibility.&lt;br /&gt;&lt;br /&gt;completed ISDATAVOID conditioning in the wrapper interface.&lt;br /&gt;&lt;br /&gt;added missing TNULL key compression option.&lt;br /&gt;&lt;br /&gt;corrected STRINGTYPE key loading bug.&lt;br /&gt;&lt;br /&gt;added missing key description validity checks.&lt;br /&gt;&lt;br /&gt;no longer legal to erase the last remaining index in a file.&lt;br /&gt;&lt;br /&gt;overflow on opening files with too many indexes no longer fatal.&lt;br /&gt;&lt;br /&gt;isdelcurr will now fail after isstart first/last.&lt;br /&gt;&lt;br /&gt;adjusted error return code in isrewcurr and isdelcurr on empty file.&lt;br /&gt;&lt;br /&gt;corrected dislocation problems caused by use of is_recnum().&lt;br /&gt;&lt;br /&gt;revised error return conditioning in isread and isstart to ensure&lt;br /&gt;appropriate error returns under various conditions.&lt;br /&gt;&lt;br /&gt;isread ISNEXT now returns current after ALL isstart operations&lt;br /&gt;except isstart ISNEXT.&lt;br /&gt;&lt;br /&gt;corrected non-portable bug when selecting descending order indexes.&lt;br /&gt;&lt;br /&gt;adjusted isgoto to handle natural order index properly.&lt;br /&gt;&lt;br /&gt;isolated natural order current.&lt;br /&gt;&lt;br /&gt;null flag in stfltnull and stdblnull should not have been a pointer.&lt;br /&gt;&lt;br /&gt;aspack was not handling null primary indexes properly.&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;august 18th, 1996 - version 6.10&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;much pruning and transplanting..&lt;br /&gt;&lt;br /&gt;the source is now distributed in two flavours - standard unix format,&lt;br /&gt;and a dos/win/os2 version.  both are generated from the same meta&lt;br /&gt;source but contain unique platform extensions.&lt;br /&gt;&lt;br /&gt;base/ismemory.c and wrap/stdmif.c must be added to make/project.&lt;br /&gt;&lt;br /&gt;now only four headers.  isconfig.h is common to all, isbase.h and&lt;br /&gt;iswrap.h as before, iscustom.h is optional.&lt;br /&gt;&lt;br /&gt;isport.h is gone, as is ISPLATFORM.  BSD extensions and threadsafe&lt;br /&gt;configuration are now in isconfig.h&lt;br /&gt;&lt;br /&gt;added isLockCheck to the base interface, parallel to islockcheck&lt;br /&gt;in the wrapper.&lt;br /&gt;&lt;br /&gt;the base now has it&apos;s own mif calls - ldInt, stDblNull, etc, and&lt;br /&gt;these have been wrapped for access from the standard interface.&lt;br /&gt;&lt;br /&gt;added isErrno, isErrio, isRecNum, isRecLen, isSetRec, isSetLen&lt;br /&gt;calls to base.&lt;br /&gt;&lt;br /&gt;additional support for DLL compilation included, see dynamic.ref&lt;br /&gt;for more details.&lt;br /&gt;&lt;br /&gt;additional support for microsoft windows added, see windows.ref&lt;br /&gt;for more details.&lt;br /&gt;&lt;br /&gt;misc/dbmemory.c is a debugging replacement for ismemory.c, see&lt;br /&gt;same for comments and usage.&lt;br /&gt;&lt;br /&gt;added ISLOCKING 3 for dos based systems and support for &apos;lowest&lt;br /&gt;common denominator&apos; NFS based configurations.&lt;br /&gt;&lt;br /&gt;the built in check call prototypes, codes and structures are now&lt;br /&gt;included in both the base and wrapper headers, and ischeck.h is&lt;br /&gt;no longer provided or required.&lt;br /&gt;&lt;br /&gt;entry function prototyping has been revised to provide more&lt;br /&gt;flexible support for building dynamic link libraries.&lt;br /&gt;&lt;br /&gt;the general lock handling scheme has been revised somewhat to&lt;br /&gt;cover requirements arising from the ISLOCKING 3 option.&lt;br /&gt;&lt;br /&gt;corrected a relatively obscure memory under-run bug in the tree&lt;br /&gt;pruning module.&lt;br /&gt;&lt;br /&gt;added isLastRec(), isGetLastRec(), isSetLastRec() to the base,&lt;br /&gt;islastrec(), isgetlastrec(), issetlastrec() to the wrapper.  must&lt;br /&gt;add base/islast.c and wrap/stdlast.c respectively to make/project&lt;br /&gt;to use.  undocumented (as yet)&lt;br /&gt;&lt;br /&gt;added base library file descriptor sanity checks&lt;br /&gt;&lt;br /&gt;corrected invalid eof on read next after adding records to an&lt;br /&gt;empty file.&lt;br /&gt;&lt;br /&gt;pure indexes not following isfirst/isnext rules after delete&lt;br /&gt;and erase corrected.&lt;br /&gt;&lt;br /&gt;transaction processing - commit/rollback was failing when no&lt;br /&gt;updates made within transaction.&lt;br /&gt;&lt;br /&gt;isStart/isstart should not allow the user to set keylength greater&lt;br /&gt;than the length of the selected key.&lt;br /&gt;&lt;br /&gt;isCopy/iscopy was reporting a bogus error on success.&lt;br /&gt;&lt;br /&gt;build and addindex were being a bit too fussy about the contents&lt;br /&gt;of a null key descriptor.&lt;br /&gt;&lt;br /&gt;isindexinfo and related were not counting null primaries.&lt;br /&gt;&lt;br /&gt;lock handling not releasing internal record lock state flags under&lt;br /&gt;some situations.&lt;br /&gt;&lt;br /&gt;------------------------------------------------------------------------------&lt;br /&gt;october 16th, 1996 - Version 6.11 - James Knight bids his official farewell&lt;br /&gt;------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;Byte Designs assumes ownership of Disam96 - changes to copyright/banners&lt;br /&gt;&lt;br /&gt;ascheck, aspack and aslist references changed to dcheck, dpack and dlist&lt;br /&gt;respectively&lt;br /&gt;&lt;br /&gt;------------------------------------------------------------------------------&lt;br /&gt;sept 1st, 1997 - Version 6.12&lt;br /&gt;------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;dec modules standardize to fit disam96 function prototyping&lt;br /&gt;&lt;br /&gt;isclone ensures null primary is cloned&lt;br /&gt;&lt;br /&gt;compnext now returns FALSE if no current record&lt;br /&gt;&lt;br /&gt;isopen reuses system fds on failure&lt;br /&gt;&lt;br /&gt;dpack copies unique ids on rebuild &lt;br /&gt;&lt;br /&gt;dcheck added -q quiet mode option&lt;br /&gt;&lt;br /&gt;iserrno initialization on successful return&lt;br /&gt;&lt;br /&gt;int64 support for maintenance of large files, ISHUGE 1 in isconfig.h&lt;br /&gt;&lt;br /&gt;cisam version 7.1 locking concurrency added, C7LOCKING 1 in isconfig.h&lt;br /&gt;&lt;br /&gt;rewnxt/RewNxt now correctly returns EENDFILE rather than looping on last&lt;br /&gt;record &lt;br /&gt;&lt;br /&gt;extensive transaction processing rewrites&lt;br /&gt;&lt;br /&gt;cisam 7.1 no-wait on open and automatic record locks, C7NOWAIT 1 in isconfig.h&lt;br /&gt;&lt;br /&gt;cisam isstat cobol variables implemented&lt;br /&gt;&lt;br /&gt;-------------------------------------------------------------------------------&lt;br /&gt;may 1st, 1999 - Version 6.13 - Client / Server&lt;br /&gt;-------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;client/server capability - see client.ref&lt;br /&gt;&lt;br /&gt;file mirroring capibilty - see mirror.ref&lt;br /&gt; &lt;br /&gt;-------------------------------------------------------------------------------&lt;br /&gt;january 15th, 2000&lt;br /&gt;-------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;addtional c-isam behaviour implementations - C7NOWAIT set to 1&lt;br /&gt;ISSKIPLOCK and no skip on locked records&lt;br /&gt;&lt;br /&gt;fix to ensure deletions of compressed index values don&apos;t cause uncompression&lt;br /&gt;of previous index values to bump past end of node - caused 105 EBADFILE errors&lt;br /&gt;&lt;br /&gt;-------------------------------------------------------------------------------&lt;br /&gt;may 1st, 2000&lt;br /&gt;-------------------------------------------------------------------------------&lt;br /&gt;c-isam version 7.2x locking concurrency support&lt;br /&gt;&lt;br /&gt;isconfig.h - C7LOCKING setting should be set to 2&lt;br /&gt;&lt;br /&gt;-------------------------------------------------------------------------------&lt;br /&gt;july 5th, 2000&lt;br /&gt;-------------------------------------------------------------------------------&lt;br /&gt;added the utility - dsplit - allows a large file to be split into two smaller&lt;br /&gt;files.&lt;br /&gt;&lt;br /&gt;------------------------------------------------------------------------------&lt;br /&gt;january 16th, 2001&lt;br /&gt;------------------------------------------------------------------------------&lt;br /&gt;added libinfo structure in association with new subroutines isLibInfo()&lt;br /&gt;and islibinfo(). isLibInfo()/islibinfo() when called with an empty libinfo&lt;br /&gt;pointer, will load the libinfo structure with the expiration date, if set,&lt;br /&gt;the library compilation date and the number of clients if set.&lt;br /&gt;&lt;br /&gt;added asplog flag to ensure that socket error reporting within the client&lt;br /&gt;code, is logged to a file rather than displayed. new functions, AspGet()&lt;br /&gt;and AspSet( int flag ) in the base library code and, aspget() and &lt;br /&gt;aspset( int flag ), will set and report the current value of asplog.&lt;br /&gt;&lt;br /&gt;several refinements to the client/server code..extensive log reporting.&lt;br /&gt;&lt;br /&gt;added dstat utility that reports library statistics, see dstats.ref for&lt;br /&gt;more information.&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------------&lt;br /&gt;may 1st, 2001&lt;br /&gt;---------------------------------------------------------------------------&lt;br /&gt;added auto repair for index/data corruptions that may occur if a process&lt;br /&gt;is killed or if a system failure occurs. see repair.ref and ISREPAIR&lt;br /&gt;setting in isconfig.h&lt;br /&gt;&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;september, 2001&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;added ISCISAM 2 option - same as ISCISAM 1, ie. mimic C-ISAM behaviours, but&lt;br /&gt;with the addition of ENOCURR on isread/ISEQUAL failure.&lt;br /&gt;&lt;br /&gt;duplicate count logic - rev.2 - isgrow.c effected.&lt;br /&gt;&lt;br /&gt;added check for ISWAIT on AUTOLOCK open with ISCISAM &gt; 0 or ISNOWAIT 1&lt;br /&gt;&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;november, 2001&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;isIndexInfo/isindexinfo - EBADARG(102) when file opened with other than&lt;br /&gt;ISINOUT&lt;br /&gt;versions effected: 6.12 unix and MS, 6.13CS unix and MS - isinfo.c&lt;br /&gt;&lt;br /&gt;isupdate.c, isdelete.c - increased allocated size of oldpad buffer&lt;br /&gt;general reorganization of rewrite() and delete() routines for better&lt;br /&gt;efficency.c&lt;br /&gt;versions effected: 6.12 unix and MS, 6.13CS unix and MS&lt;br /&gt;&lt;br /&gt;added more functionality to ISAUDIT - additional options 2 through 7 see&lt;br /&gt;audit.ref&lt;br /&gt;tune which operations are audited, see audit.ref for options&lt;br /&gt;versions effected: 6.12 unix and MS, 6.13CS unix and MS&lt;br /&gt;isconfig.h, isdelete.c, isupdate.c and iswrite.c&lt;br /&gt;&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;january, 2002&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;addition of remote system functions - eg. fread, fwrite etc.&lt;br /&gt;&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;may, 2002&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;ISKCOMP - compile time flag - isconfig.h - see compkey.ref for details&lt;br /&gt;&lt;br /&gt;isprune.c replacement to correct index count and fatal errors encountered&lt;br /&gt;during continuous rewrite cycles where the key values are effected &lt;br /&gt;&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;aug, 2002&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;isadmin.c - correction to reference ADM(id)-&gt;isam-&gt;openmode should&lt;br /&gt;read ADM(did)-&gt;isam-&gt;openmode&lt;br /&gt;&lt;br /&gt;isrepair.c - modifications to correct repaired writes&lt;br /&gt;&lt;br /&gt;isadmin.c, iserase.c - iserase() failure caused admin table corruption&lt;br /&gt;&lt;br /&gt;isdelete.c - drop record lock prior to adding record number to free&lt;br /&gt;list&lt;br /&gt;&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;sep, 2002&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;isprune.c - corrected bug that caused index mismatch errors under&lt;br /&gt;certain conditions&lt;br /&gt;&lt;br /&gt;ISLOCKING 3 on unix platforms would incorrectly initialize isam-&gt;iserrno&lt;br /&gt;to 0, overwriting a valid error value  &lt;br /&gt;&lt;br /&gt;isadmin.c - dup struct pointer not freed on open failure, corrected&lt;br /&gt;&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;nov, 2002&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;isprune.c - dupnum calculation on insertion into new root corrected&lt;br /&gt;&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;jan, 2003&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;isbuild.c, isopen.c, isopen.c and isbase.h - added CISAM compatible&lt;br /&gt;ISSEMILOCK. see #define SEMILOCK in isconfig.h  &lt;br /&gt;&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;feb, 2003&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;issystem.c, isconfig.h, iswrap.h, isbase.h, stdwrap.c and stdwrap.h&lt;br /&gt;added ISEXTENDED compile time option to allow for extended lock &lt;br /&gt;reporting when locks are blocked by other processes. see read/extended.ref&lt;br /&gt;&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;mar, 2003&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;isIndexInfo/isindexinfo - EBADARG(102) when file opened with other than&lt;br /&gt;ISINOUT&lt;br /&gt;versions effected: 6.12 unix and MS, 6.13CS unix and MS - isinfo.c&lt;br /&gt;&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;may, 2003&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;ISCISAM &gt; 0 check for natural order - isread.c&lt;br /&gt;ISCISAM &gt; 0 allow ISOUTPUT record locking, ie. isLock()/islock()&lt;br /&gt;&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;aug, 2003&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;isconfig.h - D3XAUTOLOCK set to 1 in isconfig.h prior to compiling the&lt;br /&gt;library will enable older D-ISAM v3.x behaviour releasing record locks&lt;br /&gt;on subsequent read, update or delete&lt;br /&gt;&lt;br /&gt;ischeck.c - additional check for last datfree corruption &lt;br /&gt;&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;jan, 2004&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;isgrow.c - change to satisfy C-ISAM bcheck higher level node ordering&lt;br /&gt;problem did not effect the integrity of the isam file or&lt;br /&gt;Disam96&apos;s ability to maintain the file.&lt;br /&gt;&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;feb, 2004&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;isread.c - change to ensure partial key searches are C-ISAM compatible&lt;br /&gt;when ISCISAM set to non-zero&lt;br /&gt;Note difference between C-ISAM and Disam96 in the following&lt;br /&gt;scenario.&lt;br /&gt;          Set key compare length to partial key length via isstart()&lt;br /&gt;          Given 3 records with key values of 1110, 1120 and 1130&lt;br /&gt;          setting compare length to 1 will result in&lt;br /&gt;          isread/ISFIRST - first record with key 1110 is returned&lt;br /&gt;          isread/ISGREAT - iserrno 111 - ENOREC - Disam96&lt;br /&gt;          Since only the first byte of the key is compared and none&lt;br /&gt;          are greater than the value of 1. With C-ISAM the isread/ISGREAT&lt;br /&gt;          will return the key 1120 record, which means the isstart&lt;br /&gt;          setting of partial key length compare to 1 doesn&apos;t have any&lt;br /&gt;          effect.&lt;br /&gt;                                 &lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;mar, 2004&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;isgrow.c - previous change to satisfy C-ISAM bcheck not quite correct&lt;br /&gt;for uncompressed keys - refined/corrected. compressed&lt;br /&gt;key logic correct.&lt;br /&gt;&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;jul, 2004&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;isadmin.c - rewrite of dup mutex handling on failure. Mutexes were&lt;br /&gt;being unlocked rather than destroyed on function failure, isAdmFail&lt;br /&gt;&lt;br /&gt;isentry.c - reversal of isAdmFail() and isDropLock() in isFail().&lt;br /&gt;mutexes were being destroyed before being unlocked. &lt;br /&gt;This problem first appeared on Itanium where stricter control&lt;br /&gt;of mutexes exist. All platforms effected.&lt;br /&gt;&lt;br /&gt;isread.c - ISCISAM 2 specific - ensure check for ISPATH-&gt;recnum is only &lt;br /&gt;done when reading by index and not for natural or record number&lt;br /&gt;order reads.&lt;br /&gt;          &lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;sep, 2004&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;iserase.c - Correction of bug that allowed erase/rename of locked file.&lt;br /&gt;                  &lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;nov, 2004&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;isread.c - change in ISCISAM 2 ENOCURR check&lt;br /&gt;                  &lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;aug, 2005&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;isadmin.c, stdextra.c, isbase.h - changes to correct isAdmFail master lock&lt;br /&gt;end rather than drop. addition of new function isThreadedDone()/&lt;br /&gt;isthreadeddone() to drop master lock. application code should call &lt;br /&gt;isthreadeddone() prior to the application exiting..closing to isthreaded()&lt;br /&gt;call.&lt;br /&gt;&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;oct, 2005&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;isaudit.c - changes to correct behaviour to conform to C-ISAM/X-OPEN,&lt;br /&gt;original behaviour can be reinstated by defining D96ORIG in isaudit.c&lt;br /&gt;&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;feb, 2006&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;islock.c - correction to only set bit in lkstate for lock all and not&lt;br /&gt;record&lt;br /&gt;&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;sep, 2006&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;isprune.c - reset node-&gt;recnum after compressed key delete&lt;br /&gt;&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;nov, 2007&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;isbase.h,iswrap.h,isread.c - isStart() added C-ISAM ISKEEPLOCK functionality &lt;br /&gt;isopen.c - ensure isAdmClose if isopen fails while logging in progress  &lt;br /&gt;&lt;br /&gt;isvarlen.c - allocation of isam-&gt;hashtab changed from hardcoded 4 to &lt;br /&gt;sizeof( long * ), to ensure proper support of platforms where &lt;br /&gt;long is &gt; 4 bytes, namely native 64bit environments.&lt;br /&gt;&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;jan, 2008&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;istrans.c - replaced missing call to isVLread in log_vdel routine to ensure &lt;br /&gt;isrollback() reinserts variable length portion of deleted record.&lt;br /&gt;&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;jan, 2009 - offical release of DISAM v7.0 new to this release&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;isopen.c, isbuild.c, isvarlen.c, isvarlen.h and isconfig.h - changes to &lt;br /&gt;variable length idx file format to allow for &gt; 16777216 record limit when&lt;br /&gt;storing record numbers in 3 char bytes for varinfo and continuation node &lt;br /&gt;pointers. isconfig.h setting ISOLDVARLEN 1 or any non 0 ISCISAM setting&lt;br /&gt;will maintain old disam/c-isam variable length file format compatibility.&lt;br /&gt;ISCISAM 0 and ISOLDVARLEN 0 ensures new format. new format requires that&lt;br /&gt;dvlrebld( see dvlrebld.ref ) be run on existing variable length files.&lt;br /&gt;&lt;br /&gt;stdextra.c - schema/record layout support - new wrap functions&lt;br /&gt; load schema from isamfile to path/filename&lt;br /&gt;    ISD1 int ISD2 isldschema( int isfd, char *path )&lt;br /&gt; dump schema from isamfile to stdout&lt;br /&gt;    ISD1 int ISD2 isdpschema( int isfd )&lt;br /&gt; store schema from loadfile to isamfile&lt;br /&gt;    ISD1 int ISD2 isstschema( int isfd, char *loadfile )&lt;br /&gt; remove schema from isamfile&lt;br /&gt;    ISD1 int ISD2 isrmschema( int isfd )&lt;br /&gt;&lt;br /&gt;isschema.c - schema record layout support - new base functions&lt;br /&gt; load schema from isamfile to path/filename&lt;br /&gt;    ISD1 int ISD2 isLdSchema( IsFile *isam, char *path )&lt;br /&gt; dump schema from isamfile to stdout&lt;br /&gt;    ISD1 int ISD2 isDpSchema( isFile *isam )&lt;br /&gt; store schema from loadfile to isamfile&lt;br /&gt;    ISD1 int ISD2 isStSchema( IsFile *isam, char *loadfile )&lt;br /&gt; remove schema from isamfile&lt;br /&gt;    ISD1 int ISD2 isRmSchema( IsFile *isam )&lt;br /&gt;* see read/schema.ref for function details and schema/ReadMe for sample programs&lt;br /&gt;&lt;br /&gt;dreport.c - new schema related isam data reporting utility.&lt;br /&gt;&lt;br /&gt;record number limit changed from LONG_MAX to ULONG_MAX value&lt;br /&gt;&lt;br /&gt;client/server capabilities incorporated into standard DISAM. for a limited single client server program please contact ByteDesigns.&lt;br /&gt;-----------------------------------------------------------------------------&lt;br /&gt;
 </content>
 </entry>
<entry>
<title type='text'>expiration date</title>
<id>expiration_date</id>
<updated>2009-10-14T09:26:17.765-07:00</updated>
<link href='http://isam.ca/products/disam/d7/refs.html#expiration_date'/>
<content type='html'>
 expiration date&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;a simple mechanism for setting an automatic&lt;br /&gt;expiration date in the library is provided by means of a define.&lt;br /&gt;
 </content>
 </entry>
<entry>
<title type='text'>key compression</title>
<id>Question3</id>
<updated>2009-10-13T20:29:44.620-07:00</updated>
<link href='http://isam.ca/products/disam/d7/refs.html#Question3'/>
<content type='html'>
 COMPRESS/LCOMPRESS/TCOMPRESS  &lt;br /&gt;&lt;br /&gt;ISKCOMP 0&lt;br /&gt;due to fixed index file format specifications, a single char is used&lt;br /&gt;to store the number of leading compressed bytes and another to store&lt;br /&gt;the number of trailing compressed bytes. this forces a limitation&lt;br /&gt;of 255 bytes ( max unsigned char ) for compressed key size,&lt;br /&gt;regardless of ISMAXKEY setting to ensure full compression of all&lt;br /&gt;trailing spaces or nulls for TCOMPRESS, and all leading duplicate&lt;br /&gt;characters for LCOMPRESS.&lt;br /&gt;&lt;br /&gt;ISKCOMP 1&lt;br /&gt;allows compressed key sizes larger than 255 bytes, but will only&lt;br /&gt;permit partial compression on leading and trailing characters.&lt;br /&gt;a maximum of 255 leading duplicate characters, and 255 trailing &lt;br /&gt;spaces or nulls will be compressed.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------  &lt;br /&gt;Worldwide Copyright (c) Byte Designs Ltd (2009)&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;
 </content>
 </entry>
<entry>
<title type='text'>wrapper reference</title>
<id>wrapper_reference</id>
<updated>2009-10-13T20:21:16.023-07:00</updated>
<link href='http://isam.ca/products/disam/d7/refs.html#wrapper_reference'/>
<content type='html'>
 wrapper reference&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;the standard interface is provided in the form of a wrapper, and is&lt;br /&gt;intended to allow plug and play compatibility with existing cisam&lt;br /&gt;(or equivalent) application code.  only the differences between the&lt;br /&gt;base and wrapper interfaces are explained below - you should refer&lt;br /&gt;to the base library reference for the remaining details.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;the integer handle wrapper&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;this interface is provided for those who prefer or require a cisam&lt;br /&gt;compatible API.  this interface will link transparently with existing&lt;br /&gt;cisam or cisam compatible application source, and should require no&lt;br /&gt;changes to your code, other than to switch to the iswrap.h header.&lt;br /&gt;&lt;br /&gt;all modules that use the integer wrapper should include iswrap.h&lt;br /&gt;&lt;br /&gt;all function names are identical except that they use exclusively&lt;br /&gt;lower case letters.&lt;br /&gt;&lt;br /&gt;all parameters are identical except that an integer file handle is&lt;br /&gt;used in place of the IsamFile structure pointer, and except for the&lt;br /&gt;isbuild() call, which has the standard cisam arguments, whereas the&lt;br /&gt;base version includes an extra argument for variable length support.&lt;br /&gt;&lt;br /&gt;all functions return 0 on success, or -1 on error, with the exception&lt;br /&gt;of isbuild and isopen, which return an integer file handle or -1 on&lt;br /&gt;error.&lt;br /&gt;&lt;br /&gt;SUCCESS and ERROR are defined in the header and can be used to test&lt;br /&gt;the returns from these calls.&lt;br /&gt;&lt;br /&gt;isrecnum, isreclen, iserrno and iserrio are global variables declared&lt;br /&gt;in the wrapper, defined as externals in iswrap.h and are maintained&lt;br /&gt;in the same way as defined for the equivalent isfd values in the base,&lt;br /&gt;and by the usual cisam standard.&lt;br /&gt;&lt;br /&gt;since the base library maintains an individual set of these variables&lt;br /&gt;on a per file basis, we have also provided a collection of four calls&lt;br /&gt;that will return a pointer to the associated variable:&lt;br /&gt;&lt;br /&gt;long *is_recnum( int isfd );&lt;br /&gt;int *is_reclen( int isfd );&lt;br /&gt;int *is_errno( int isfd );&lt;br /&gt;int *is_errio( int isfd );&lt;br /&gt;&lt;br /&gt;these can be used to enquire or set values for individual files, and&lt;br /&gt;are not overwritten on each isam call made.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;common dictionary access&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;char *isdi_name( int isfd );    file name as used in isopen/isbuild&lt;br /&gt;int isdi_datlen( int isfd );    fixed record length&lt;br /&gt;int isdi_curidx( int isfd );    current index number (zero based)&lt;br /&gt;int isdi_idxfd( int isfd );     index file system handle&lt;br /&gt;int isdi_datfd( int isfd );     data file system handle&lt;br /&gt;struct keydesc *isdi_kdsc( int isfd ); current key description&lt;br /&gt;&lt;br /&gt;isdi_name return a pointer to the file name string, or NULL if&lt;br /&gt;the isfd value is invalid.  the remainder return an integer value&lt;br /&gt;or -1 on failure.&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------  &lt;br /&gt;Worldwide Copyright (c) Byte Designs Ltd (2009)&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;
 </content>
 </entry>
<entry>
<title type='text'>variable length records</title>
<id>variable_length_records</id>
<updated>2009-10-13T20:20:41.748-07:00</updated>
<link href='http://isam.ca/products/disam/d7/refs.html#variable_length_records'/>
<content type='html'>
 variable length records&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;refer to install.ref for activation and configuration details.&lt;br /&gt;&lt;br /&gt;the following is a list of the functional and programmatic differences&lt;br /&gt;between fixed length and variable length isam file handling.&lt;br /&gt;&lt;br /&gt;isreclen is a global integer used to pass variable length info around&lt;br /&gt;in much the same way as isrecnum.&lt;br /&gt;&lt;br /&gt;isaddindex&lt;br /&gt;  the parts of any key added must reside within the fixed length part&lt;br /&gt;  of the record.&lt;br /&gt;&lt;br /&gt;isbuild&lt;br /&gt;  you can add ISVARLEN to the mode argument to create a varlen file.&lt;br /&gt;  if so then the record length argument must define the maximum possible&lt;br /&gt;  length of the records.  you must also set isreclen to the size of the&lt;br /&gt;  fixed length header portion of the record.  key fields can only reside&lt;br /&gt;  in the fixed length portion.  you can also use ISVARCMP in place of&lt;br /&gt;  ISVARLEN to specify that RLE compression be applied to the data.&lt;br /&gt;  &lt;br /&gt;isvbuild  &lt;br /&gt;  isvbuild should be used in place of isbuild if you are creating&lt;br /&gt;  variable length files in a multithreaded environment - refer to&lt;br /&gt;  thread.ref for details.&lt;br /&gt;&lt;br /&gt;isindexinfo&lt;br /&gt;  if file is variable, the msb of di_nkeys will be set to indicate same.&lt;br /&gt;  di_recsize contains the maximum record size, the fixed length size is&lt;br /&gt;  returned in isreclen.&lt;br /&gt;&lt;br /&gt;isopen&lt;br /&gt;  if the file is variable length you must use ISVARLEN in the mode, or&lt;br /&gt;  else isopen will return an EBADARG error.  the converse is also true -&lt;br /&gt;  if the file is not variable length, then specifying ISVARLEN will&lt;br /&gt;  return the same error.  if successful then isreclen will be set to the&lt;br /&gt;  maximum record length of the opened file.&lt;br /&gt;  &lt;br /&gt;  to get around the inconvenience of the above, you can use ISNOCARE&lt;br /&gt;  in the open mode, in which case the file will be opened regardless&lt;br /&gt;  of whether it is variable or fixed length.  you can then check the&lt;br /&gt;  open mode value to determine which kind of file was opened.  this&lt;br /&gt;  is found in isam-&gt;openmode if you are using the base library calls,&lt;br /&gt;  or loaded by means of isgetmode( int isfd, int *mode ) if using&lt;br /&gt;  the wrapper library.&lt;br /&gt;&lt;br /&gt;isread&lt;br /&gt;  isreclen will be set to the actual size of the record just read.&lt;br /&gt;&lt;br /&gt;isrewcurr&lt;br /&gt;isrewrec&lt;br /&gt;isrewrite&lt;br /&gt;iswrcurr&lt;br /&gt;iswrite&lt;br /&gt;  set isreclen to actual size of record before calling.&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;compression&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;the library provides optional RLE compression on the variable length&lt;br /&gt;portion of the data record.  this is specified when creating the file&lt;br /&gt;by using a mode flag of ISVARCMP in place of ISVARLEN.  note that&lt;br /&gt;ISVARCMP and ISVARLEN are NOT additive - you must use one or the&lt;br /&gt;other, not both.&lt;br /&gt;&lt;br /&gt;once a compressed varlen file has been created, you can use either&lt;br /&gt;ISVARLEN or ISVARCMP when opening the file - either will work, and&lt;br /&gt;the file will be opened in the appropriate mode.&lt;br /&gt;&lt;br /&gt;note that RLE encoding is only valuable if your data has a fair&lt;br /&gt;distribution of repeated zero (0), decimal zero (48), or space (32)&lt;br /&gt;bytes.&lt;br /&gt;&lt;br /&gt;compression is transparent to the application - records are written&lt;br /&gt;and read as before.&lt;br /&gt;&lt;br /&gt;compression is not cisam compatible.&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;notes&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;the check utility will analyse and test the variable length storage&lt;br /&gt;nodes and report statistics.&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------  &lt;br /&gt;Worldwide Copyright (c) Byte Designs Ltd (2009)&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;
 </content>
 </entry>
<entry>
<title type='text'>transaction processing</title>
<id>transaction_processing</id>
<updated>2009-10-13T20:20:12.674-07:00</updated>
<link href='http://isam.ca/products/disam/d7/refs.html#transaction_processing'/>
<content type='html'>
 transaction processing&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;we have attempted to provide a transparent implementation of the&lt;br /&gt;transaction processing routines provided by cisam.  the library&lt;br /&gt;should perform as specified in the cisam manuals, but includes&lt;br /&gt;a few additional enhancements.&lt;br /&gt;&lt;br /&gt;we are not certain that we have identified the log file locking offsets&lt;br /&gt;properly.  there is a possibility that the library will not co-operate&lt;br /&gt;in concert with cisam, but we have not found any problems to date.&lt;br /&gt;&lt;br /&gt;transaction processing is activated via ISLOGGING in isconfig.h&lt;br /&gt;&lt;br /&gt;the overlapping transactions option has been modified, and issusplog&lt;br /&gt;and isresumlog have been discontinued - see overlapping transactions&lt;br /&gt;for more details.&lt;br /&gt;&lt;br /&gt;NOTE: please ignore references to multi-thread support in the&lt;br /&gt;      following - we are currently working on a revision, but&lt;br /&gt;      this is not yet available.  please let support know if&lt;br /&gt;      this is a problem to you, and we will add you to the list&lt;br /&gt;      of people to notify when it is ready.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;----------------------------------------------------------------------&lt;br /&gt;function calls reference&lt;br /&gt;----------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;----------------------------------------------------------------------&lt;br /&gt;int islogopen( char *name )&lt;br /&gt;----------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;opens log file.  once the log file is opened all subsequent operations&lt;br /&gt;on all files will be logged until the log is closed or suspended.  each&lt;br /&gt;process is responsible for opening a log file.  usually all processes&lt;br /&gt;within an application will open the same log file.  access is governed&lt;br /&gt;by concurrency locks to prevent simultaneous writes, but this feature&lt;br /&gt;might not be compatible with cisam.  files opened/built with ISNOLOG&lt;br /&gt;in the mode will not be logged.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;------------------------------------------------------------------&lt;br /&gt;int islogclose( void )&lt;br /&gt;------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;closes log file for the process.  all subsequent operations will not&lt;br /&gt;be logged.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;------------------------------------------------------------------&lt;br /&gt;int isbegin( void )&lt;br /&gt;------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;defines the beginning of a set of operations on all files opened with&lt;br /&gt;ISTRANS in the mode argument.  this set of operations is known as a&lt;br /&gt;transaction.&lt;br /&gt;&lt;br /&gt;all records updated within the transaction will remain locked to ensure&lt;br /&gt;no other process can affect the results.  in multi-user situations it&lt;br /&gt;is important to keep the time spent within a transaction to a minimum&lt;br /&gt;to avoid impacting on other processes&apos; access to the records involved.&lt;br /&gt;&lt;br /&gt;all calls to isclose within the transaction will be deferred to avoid&lt;br /&gt;releasing the locks mentioned above.  if the same file is reopened&lt;br /&gt;within the same transaction you will simply get the same file handle&lt;br /&gt;back.&lt;br /&gt;&lt;br /&gt;all updates affect the data file immediately.  if the process should&lt;br /&gt;terminate before completing the transaction, the changes will remain&lt;br /&gt;unless isrecover is used to rebuild the data from the last backup.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;------------------------------------------------------------------&lt;br /&gt;int iscommit( void )&lt;br /&gt;------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;defines the successful completion of a transaction.  all locked&lt;br /&gt;records will be released and all deferred closes honoured.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;------------------------------------------------------------------&lt;br /&gt;int isrollback( void )&lt;br /&gt;------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;defines the unsuccessful completion of a transaction.  all updated&lt;br /&gt;records will be restored to their original state, all record locks&lt;br /&gt;released and all deferred closes honoured.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;------------------------------------------------------------------&lt;br /&gt;int isrecover( void )&lt;br /&gt;------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;used to rebuild a set of data files from an original condition by&lt;br /&gt;means of a common log file.  islogopen() must be called first to&lt;br /&gt;open the log.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;------------------------------------------------------------------&lt;br /&gt;usage reference&lt;br /&gt;------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;data file recovery&lt;br /&gt;&lt;br /&gt;if, at the time a full data backup was made, the transaction log&lt;br /&gt;was purged, then, provided all updating processes call islogopen()&lt;br /&gt;before making changes, it is possible to rebuild the data files&lt;br /&gt;from the backup and the log file.&lt;br /&gt;&lt;br /&gt;it is not necessary that files be opened with a mode of ISTRANS&lt;br /&gt;for changes to be logged.  files that are opened with a mode of&lt;br /&gt;ISNOLOG will not be logged and will not be recoverable.&lt;br /&gt;&lt;br /&gt;to do so it is necessary to compile a recovery utility that will&lt;br /&gt;call the following functions in order:&lt;br /&gt;&lt;br /&gt;islogopen( &lt;logname&gt; );&lt;br /&gt;isrecover();&lt;br /&gt;islogclose();&lt;br /&gt;&lt;br /&gt;the recovery procedure will then be to restore the backup ( make&lt;br /&gt;sure not to overwrite the log file ) and run the recovery utility.&lt;br /&gt;the utility should check the return from isrecover() to ensure no&lt;br /&gt;errors occurred during recovery.&lt;br /&gt;&lt;br /&gt;it is also possible to implement incremental backups by this&lt;br /&gt;method.  the log file can be backed up and purged on a regular&lt;br /&gt;basis.  to recover it will be necessary to restore the original&lt;br /&gt;backup, then restore and run the recovery utility on each log&lt;br /&gt;file in chronological order.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;------------------------------------------------------------------&lt;br /&gt;transaction processing fundamentals&lt;br /&gt;------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;the theory behind transaction processing is that a collection of&lt;br /&gt;changes to a group of data files can be defined in such a way as&lt;br /&gt;to be able to undo these changes at any time during the operation.&lt;br /&gt;&lt;br /&gt;the collection of changes is referred to as a transaction.&lt;br /&gt;&lt;br /&gt;a sample program might best serve to illustrate.  proper error&lt;br /&gt;checking has been omitted to simplify:&lt;br /&gt;&lt;br /&gt;/* post a sales invoice */&lt;br /&gt;&lt;br /&gt;#include &lt;iswrap.h&gt;&lt;br /&gt;&lt;br /&gt;int invcFile;   /* source invoice record file */&lt;br /&gt;int custFile;   /* customer master records */&lt;br /&gt;int tranFile;   /* accounting transaction file */&lt;br /&gt;&lt;br /&gt;main()&lt;br /&gt;  {&lt;br /&gt;  islogopen( &quot;logfile&quot; );&lt;br /&gt;&lt;br /&gt;  invcFile = isopen( &quot;invoice&quot;,     INOUT + ISTRANS );&lt;br /&gt;  custFile = isopen( &quot;customer&quot;,    INOUT + ISTRANS );&lt;br /&gt;  tranFile = isopen( &quot;transaction&quot;, INOUT + ISTRANS );&lt;br /&gt;&lt;br /&gt;  isstart( invcFile, ..., ISFIRST );&lt;br /&gt;&lt;br /&gt;  /* loop through invoices */&lt;br /&gt;  while( isread( invcFile, invcrec, ISNEXT ) == SUCCESS )&lt;br /&gt;    {&lt;br /&gt;    isbegin();                  /* define transaction start */&lt;br /&gt;&lt;br /&gt;    if(&lt;br /&gt;      postCust() == SUCCESS     /* update customer master */&lt;br /&gt;      &amp;&amp;&lt;br /&gt;      postTran() == SUCCESS     /* create transaction record */&lt;br /&gt;      &amp;&amp;&lt;br /&gt;      delInvc() == SUCCESS      /* delete invoice record */&lt;br /&gt;      )&lt;br /&gt;      iscommit();               /* successful, commit changes */&lt;br /&gt;    else&lt;br /&gt;      isrollback();             /* failed, erase changes */&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;  isclose( invcFile );&lt;br /&gt;  isclose( custFile );&lt;br /&gt;  isclose( tranFile );&lt;br /&gt;&lt;br /&gt;  islogclose();&lt;br /&gt;&lt;br /&gt;  exit( 0 );&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;note that the transaction processing logic will lock all records&lt;br /&gt;that are changed within the transaction for the duration of the&lt;br /&gt;transaction.  in some instances it pays to keep the transaction&lt;br /&gt;cycle as short as possible to allow other processes access to&lt;br /&gt;these records.&lt;br /&gt;&lt;br /&gt;note also that those files whose changes are to be erased when&lt;br /&gt;isrollback is called must be opened with mode ISTRANS.  changes&lt;br /&gt;will still be logged for those that are not, but the transaction&lt;br /&gt;processing logic ignores them and will not undo any changes.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;------------------------------------------------------------------&lt;br /&gt;overlapping transactions&lt;br /&gt;------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;as an extension to the cisam standard, and also as a means of&lt;br /&gt;allowing flexible use of transaction processing within multi-&lt;br /&gt;threaded applications, the library provides a mechanism for&lt;br /&gt;handling multiple concurrent (or overlapping) transactions.&lt;br /&gt;&lt;br /&gt;management centers around the use of a callback function provided&lt;br /&gt;by the application.  in order to permit overlapping transactions&lt;br /&gt;you must first call isTxnInit( callback ), where callback is the&lt;br /&gt;name of a routine that will return a short integer value that the&lt;br /&gt;library will use to determine which operations belong to which&lt;br /&gt;transaction.&lt;br /&gt;&lt;br /&gt;in a single threaded application the simplest method is to declare&lt;br /&gt;a variable that is visible to all routines that handle transactions&lt;br /&gt;and to the callback function itself.&lt;br /&gt;&lt;br /&gt;for example, assuming a simple nested transaction operation:&lt;br /&gt;&lt;br /&gt;    static short txnid;&lt;br /&gt;&lt;br /&gt;    txnid = 1;&lt;br /&gt;    isbegin();&lt;br /&gt;    for( account = 0; account &lt; 5; ++account )&lt;br /&gt;      {&lt;br /&gt;      /* update account master files */&lt;br /&gt;      txnid = 2;&lt;br /&gt;      isbegin();&lt;br /&gt;      /* update account files */&lt;br /&gt;      iscommit() or isrollback();&lt;br /&gt;      txnid = 1;&lt;br /&gt;      }&lt;br /&gt;    iscommit() or isrollback();&lt;br /&gt;    &lt;br /&gt;   &lt;br /&gt;in a multi-threaded application, assuming the intention is to&lt;br /&gt;allow atomic transactions within individual threads, you would&lt;br /&gt;have the callback routine return the thread id value.&lt;br /&gt;&lt;br /&gt;NOTE: isrecover is NOT threadsafe and should only be used under&lt;br /&gt;      single threaded circumstances, or at very least only when&lt;br /&gt;      there are no other threads working on isam files.&lt;br /&gt;&lt;br /&gt;NOTE: when implementing transaction processing in a client/server&lt;br /&gt;      environment the logfile MUST be opened as:&lt;br /&gt;       isLogOpen/islogopen( &quot;//ip/path/logname&quot; );&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------  &lt;br /&gt;Worldwide Copyright (c) Byte Designs Ltd (2009)&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;
 </content>
 </entry>
<entry>
<title type='text'>threadsafe    </title>
<id>threadsafe____</id>
<updated>2009-10-13T20:19:10.902-07:00</updated>
<link href='http://isam.ca/products/disam/d7/refs.html#threadsafe____'/>
<content type='html'>
 threadsafe                                                    &lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;this feature owes it&apos;s existence to Callum Gibson in australia because&lt;br /&gt;without his Expertise and Advice it would never have been completed.&lt;br /&gt;----------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;support for multi-threading is provided on two levels.  the base level&lt;br /&gt;implementation consists of a parallel collection of isam function calls&lt;br /&gt;that operate on file descriptor structures (as opposed to the usual&lt;br /&gt;integer file handles) and, other than requiring that you do not open&lt;br /&gt;the same file more than once in any one process, is fully multi-thread&lt;br /&gt;compatible without the requirement for critical section handling.&lt;br /&gt;&lt;br /&gt;the second level option provides full cisam standard compatibility&lt;br /&gt;and operates on the standard integer based file handles and associated&lt;br /&gt;file descriptor table.  this option provides critical section (mutex)&lt;br /&gt;handling for protection of the descriptor table and logic to provide&lt;br /&gt;appropriate handling for duplicate opens on the same file within the&lt;br /&gt;same process.  the mutex requirement impacts on the efficiency of the&lt;br /&gt;library, but allows the use of the standard interface without losing&lt;br /&gt;functionality.  there are two exceptions.&lt;br /&gt;&lt;br /&gt;the four global variables - isrecnum, isreclen, iserrno and iserrio&lt;br /&gt;are present and maintained, but should not be considered reliable.&lt;br /&gt;instead you should use the following function call equivalents:&lt;br /&gt;&lt;br /&gt;long *isrecnum( int isfd );&lt;br /&gt;int *isreclen( int isfd );&lt;br /&gt;int *iserrno( int isfd );&lt;br /&gt;int *iserrio( int isfd );&lt;br /&gt;&lt;br /&gt;note that these functions return pointers rather than values.  this&lt;br /&gt;allows the application to both enquire and set the value, as in the&lt;br /&gt;following examples:&lt;br /&gt;&lt;br /&gt;if( *is_errno(isfd) == ENOREC ) /* record not found */&lt;br /&gt;&lt;br /&gt;*is_recnum(isfd) = saved_record_number;&lt;br /&gt;&lt;br /&gt;the other exception applies to building variable length files.  the&lt;br /&gt;standard isbuild call requires the use of a global isreclen value,&lt;br /&gt;which is not threadsafe.  isvbuild covers this problem by taking&lt;br /&gt;the maximum record length as an additional argument:&lt;br /&gt;&lt;br /&gt;isvbuild( char *name, int fixlen, int maxlen, IsKdsc *key, int mode );&lt;br /&gt;&lt;br /&gt;NOTE: when using second level support you must call isThreaded()&lt;br /&gt;      from your root thread before starting any isam threads - this&lt;br /&gt;      will initialise the master mutex lock.&lt;br /&gt;&lt;br /&gt;NOTE: at no time, under any circumstances, should the application&lt;br /&gt;      allow more than one thread to operate on an individual isam&lt;br /&gt;      file handle at any given time.&lt;br /&gt;&lt;br /&gt;NOTE: isCleanup and iscleanup are inherently not threadsafe - they&lt;br /&gt;      should only ever be called by the root thread after all isam&lt;br /&gt;      handling threads have terminated.&lt;br /&gt;&lt;br /&gt;NOTE: the transaction processing module is still not threadsafe.&lt;br /&gt;      we apologise for the inconvenience and hope to have a&lt;br /&gt;      solution in the near future.&lt;br /&gt;&lt;br /&gt;NOTE: second level threadsafe under os2/warp is only marginally&lt;br /&gt;      supported.  there are a number of limitations imposed by the&lt;br /&gt;      fact that os2 only provides one critical section lock per&lt;br /&gt;      thread.  at time of writing the library will occasionally&lt;br /&gt;      deadlock under heavy use.  we are researching a solution to&lt;br /&gt;      this problem but at the same time are hoping that ibm will&lt;br /&gt;      improve threaded support before it becomes an issue.  if you&lt;br /&gt;      require second level threadsafe operation under os2 please&lt;br /&gt;      stand up and be counted by contacting the support department.&lt;br /&gt;      &lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;installation&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;in order to make use of the base level implementation, the only thing&lt;br /&gt;you need to do is to compile a library with the ISADMIN feature turned&lt;br /&gt;off.  this is because the administration functions make use of global&lt;br /&gt;tables which would not be safe in a non-mutexed environment.  use of&lt;br /&gt;this implementation implies that you will be making base level calls&lt;br /&gt;(as detailed in base.ref) and do not intend to allow your applications&lt;br /&gt;to open the same file more than once.&lt;br /&gt;&lt;br /&gt;to build a second level library you will need to turn the ISADMIN&lt;br /&gt;feature on, and make a choice from the four options currently given&lt;br /&gt;in isconfig.h as to which ISTHREADED flavour your target will use.&lt;br /&gt;so far we have covered SunOS, Solaris, NT and OS2(unstable).&lt;br /&gt;we hope to add support for MIT pthreads and the win32 threading&lt;br /&gt;extensions soon, and would be most interested to hear from anyone&lt;br /&gt;who would be willing to advise on, or help to test these.&lt;br /&gt;&lt;br /&gt;if your thread handling library uses a different series of calls than&lt;br /&gt;those covered, you might wish to take a look at isthread.h, since the&lt;br /&gt;porting procedure is relatively simple.  in all cases we will be glad&lt;br /&gt;to offer advice in exchange for the opportunity to add more platforms&lt;br /&gt;to the list of those supported.&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------  &lt;br /&gt;Worldwide Copyright (c) Byte Designs Ltd (2009)&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;
 </content>
 </entry>
<entry>
<title type='text'>bench test source</title>
<id>bench_test_source</id>
<updated>2009-10-13T20:18:30.013-07:00</updated>
<link href='http://isam.ca/products/disam/d7/refs.html#bench_test_source'/>
<content type='html'>
 bench test source&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;the test directory contains four stand-alone executables which you&lt;br /&gt;may find useful for reliability or performance testing, or as a&lt;br /&gt;sample of the standard wrapper interface usage.&lt;br /&gt;&lt;br /&gt;all three depend on bench.h and bench.c in the same directory.&lt;br /&gt;&lt;br /&gt;auto.c      essentially a loose collection of calls that will build,&lt;br /&gt;            add and delete indexes, write, read and delete pseudo&lt;br /&gt;            random data records, and check the results.  useful for&lt;br /&gt;            testing the integrity of your compiled library.  the&lt;br /&gt;            standard auto run is 500 records, but this can be&lt;br /&gt;            changed by specifying a different count on the command&lt;br /&gt;            line.&lt;br /&gt;            &lt;br /&gt;lock.c      test record locking - will build and populate a sample&lt;br /&gt;            data file (if not found in current directory) and then&lt;br /&gt;            loop through the data, locking a sequential subset of&lt;br /&gt;            the records.&lt;br /&gt;&lt;br /&gt;mult.c      cyclic add/update/delete test intended for checking the&lt;br /&gt;            index locking and multi-user features.&lt;br /&gt;            &lt;br /&gt;user.c      an undocumented and simplistic command line interactive            &lt;br /&gt;            test engine used to verify specific operations.  it is a&lt;br /&gt;            long way from complete yet, but might prove useful if&lt;br /&gt;            you are able to figure it out.  the support department&lt;br /&gt;            may ask you to run it as a means of checking that your&lt;br /&gt;            compiled library is operating correctly.&lt;br /&gt;            &lt;br /&gt;            user now includes the ability to make system calls (sys)&lt;br /&gt;            and can run simple scripts (run).&lt;br /&gt;            &lt;br /&gt;auto and mult will use varlen data if -v is passed on the command&lt;br /&gt;line, and will add compression to same if -vc is used.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------  &lt;br /&gt;Worldwide Copyright (c) Byte Designs Ltd (2009)&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;
 </content>
 </entry>
<entry>
<title type='text'>status variables</title>
<id>Question6</id>
<updated>2009-10-13T20:17:46.360-07:00</updated>
<link href='http://isam.ca/products/disam/d7/refs.html#Question6'/>
<content type='html'>
 status variables&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;cisam implements a bank of four char fields named isstat1 through&lt;br /&gt;isstat4, primarily for use by isam based COBOL programs.&lt;br /&gt;&lt;br /&gt;they are declared and initialised in the wrapper library, but the&lt;br /&gt;code makes no attempt to set or modify the values.&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;Worldwide Copyright (c) Byte Designs Ltd (2009)&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;
 </content>
 </entry>
<entry>
<title type='text'>DISAMv7.0 schema manipulation routines</title>
<id>DISAMv70_schema_manipulation_ro</id>
<updated>2009-10-13T20:17:07.975-07:00</updated>
<link href='http://isam.ca/products/disam/d7/refs.html#DISAMv70_schema_manipulation_ro'/>
<content type='html'>
 DISAMv7.0 schema manipulation routines&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;int isStSchema( IsFile *isam, char *loadfile )&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;store schema definitions from loadfile to the isam file&lt;br /&gt;&lt;br /&gt;isam	isam file descriptor&lt;br /&gt;loadfile file containing a schema layout or a file containing a list&lt;br /&gt;         of schema layout filenames&lt;br /&gt;&lt;br /&gt;if there are multiple record definitions such as is the case with C&lt;br /&gt;union usage in record definitions, loadfile can be a file with the&lt;br /&gt;names of the different schema layout files&lt;br /&gt;&lt;br /&gt;if loadfile is a schema layout DISAM/DB expects the word &apos;structure&apos;&lt;br /&gt;to precede the actual layout, for example:&lt;br /&gt;&lt;br /&gt;structure&lt;br /&gt; field1   	type	format	length&lt;br /&gt; field2&lt;br /&gt;  .&lt;br /&gt;  .&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;int isLdSchema( IsFile *isam, char *path )&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;load schema definitions stored in the isam file to flat files in&lt;br /&gt;path&lt;br /&gt;&lt;br /&gt;isam	isam file descriptor&lt;br /&gt;path	path to place schema layout definitions stored in isam file&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;int isDpSchema( IsFile *isam )&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;dump any schema layouts stored in isam file to stdout&lt;br /&gt;&lt;br /&gt;isam	isam file descriptor&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;int isRmSchema( IsFile *isam )&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;remove any schema layouts stored in isam file&lt;br /&gt;&lt;br /&gt;isam	isam file descriptor&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;Worldwide Copyright (c) Byte Designs Ltd (2009)&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;
 </content>
 </entry>
<entry>
<title type='text'>auto file corruption repair</title>
<id>auto_file_corruption_repair</id>
<updated>2009-10-13T20:16:01.434-07:00</updated>
<link href='http://isam.ca/products/disam/d7/refs.html#auto_file_corruption_repair'/>
<content type='html'>
 auto file corruption repair&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;index and data file corruptions can occurr if a running process is&lt;br /&gt;aborted mid-stream or if a system failure occurs.&lt;br /&gt;&lt;br /&gt;often running dcheck -b or dpack after such a failure can be time&lt;br /&gt;consuming if the effected files are large, not to mention dcheck or dpack&lt;br /&gt;must be run manually for each isam file, first to determine the file &lt;br /&gt;status and then to repair any corruptions.&lt;br /&gt;&lt;br /&gt;by setting ISREPAIR to 1 in isconfig.h prior to compiling the library,&lt;br /&gt;Disam will maintain data record images of records being updated,&lt;br /&gt;for the duration of the update. if the update concludes successfully&lt;br /&gt;the image is removed from the file system, however if a system failure&lt;br /&gt;occurs the data image remains on the file system and Disam uses these&lt;br /&gt;images to check and repair the effected index/data records.&lt;br /&gt;&lt;br /&gt;this removes the need to rebuild the entire isam file manually, which&lt;br /&gt;can be time consuming.&lt;br /&gt;&lt;br /&gt;to enable the auto repair facility:&lt;br /&gt;&lt;br /&gt;    set ISREPAIR to 1 in isconfig.h prior to compiling the Disam&lt;br /&gt;    library&lt;br /&gt;&lt;br /&gt;    set the repair file path in isport.h - see #define reppath&lt;br /&gt;&lt;br /&gt;    this tells Disam where to store the data record image files&lt;br /&gt;    these files are named as: &lt;processid&gt;.rep and are of the format&lt;br /&gt;&lt;br /&gt;      short int - isam filename/path length&lt;br /&gt;      short int - data image length&lt;br /&gt;      long int  - data record number&lt;br /&gt;      char string - isam filename/path&lt;br /&gt;      char string - isam data record image&lt;br /&gt;&lt;br /&gt;after a system failure all corrupted isam files will be automatically&lt;br /&gt;repaired simply by ensuring a call to isStartup() - base, or isstartup()&lt;br /&gt;- wrap, is included in the application&apos;s main startup program prior&lt;br /&gt;to opening any isam files.  since only one call to isStartUp()/isstartup()&lt;br /&gt;is enforced, and since absolutely no isam files should be opened or already&lt;br /&gt;open at the time isStartUp()/isstartup() is called the application should&lt;br /&gt;ensure that only one application routine performs the startup/repair.&lt;br /&gt;&lt;br /&gt;the following restrictions apply:&lt;br /&gt;&lt;br /&gt;     i) at no time should isstartup() be called if other processes&lt;br /&gt;        are accessing or have open any isam files&lt;br /&gt;&lt;br /&gt;    ii) only one process should call istartup() immediately after&lt;br /&gt;        the system has recovered&lt;br /&gt;&lt;br /&gt;   iii) at no time should the .rep files be manually removed, unless&lt;br /&gt;        dcheck -b or dpack is used in place of calling isstartup()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------  &lt;br /&gt;Worldwide Copyright (c) Byte Designs Ltd (2009)&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;
 </content>
 </entry>
<entry>
<title type='text'>pure indexes</title>
<id>pure_indexes</id>
<updated>2009-10-13T20:15:40.505-07:00</updated>
<link href='http://isam.ca/products/disam/d7/refs.html#pure_indexes'/>
<content type='html'>
 pure indexes&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;pure index files provide a method of managing key information without&lt;br /&gt;the overheads required for full data handling.  they offer advantages&lt;br /&gt;in speed and storage requirements, but are necessarily limited in&lt;br /&gt;other ways.&lt;br /&gt;&lt;br /&gt;both isBuild and isbuild will create pure index files when passed a&lt;br /&gt;value of zero for the record length.  the result is a single .idx&lt;br /&gt;system file - no .dat is created.&lt;br /&gt;&lt;br /&gt;pure index files consist of the primary index only - you may not add&lt;br /&gt;secondary indexes.&lt;br /&gt;&lt;br /&gt;only the fields pointed to by the key description will be stored and&lt;br /&gt;available for retrieval.&lt;br /&gt;&lt;br /&gt;the current value of isrecnum will be stored on writes and updates&lt;br /&gt;and will be returned on read. since the global isrecnum normally &lt;br /&gt;contains the data record number, in the case of pure index files where&lt;br /&gt;there are no data records, the following pure idx iswrite will inherit&lt;br /&gt;whatever the current isrecnum value is. to allow for the user application &lt;br /&gt;setting isrecnum, or to allow the current value to be herited set ISPURE&lt;br /&gt;in isconfig.h to 0, this is the current default setting.&lt;br /&gt;if the preference is for disam to assign an incremented isrecnum value&lt;br /&gt;prior to iswrite set ISPURE to 1 in isconfig.h&lt;br /&gt;&lt;br /&gt;record locking is not possible, and pure indexes may not be opened in&lt;br /&gt;autolock mode.&lt;br /&gt;&lt;br /&gt;you cannot delete or rewrite by record number.&lt;br /&gt;&lt;br /&gt;pure indexes cannot be rebuilt or repaired if damaged, so should not&lt;br /&gt;be used for critical data.&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------  &lt;br /&gt;Worldwide Copyright (c) Byte Designs Ltd (2009)&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;
 </content>
 </entry>
<entry>
<title type='text'>null key masking</title>
<id>null_key_masking</id>
<updated>2009-10-13T20:14:22.988-07:00</updated>
<link href='http://isam.ca/products/disam/d7/refs.html#null_key_masking'/>
<content type='html'>
 null key masking&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;it is possible to flag indexes such that null keys (those whose value&lt;br /&gt;equates to null) will not be added to the index, and the associated&lt;br /&gt;records will not be accessible via that index,&lt;br /&gt;&lt;br /&gt;the default value used to determine if a given key is null is zero,&lt;br /&gt;but this can be modified by adding the value (left shifted by eight)&lt;br /&gt;to the key type field.&lt;br /&gt;&lt;br /&gt;the following code constructs a null key index in which a character&lt;br /&gt;field containing all spaces will be considered null:&lt;br /&gt;&lt;br /&gt;      key-&gt;k_flags = ISDUPS + NULLKEY;&lt;br /&gt;      key-&gt;k_nparts = 1;&lt;br /&gt;      key-&gt;k_part[0].kp_type = CHARTYPE + ( 32 &lt;&lt; 8 );&lt;br /&gt;      key-&gt;k_part[0].kp_start = 10;       &lt;br /&gt;      key-&gt;k_part[0].kp_leng = 10;&lt;br /&gt;      &lt;br /&gt;null key indexes are not cisam compatible.&lt;br /&gt;&lt;br /&gt;see mask.ref for an alternate method of filtering indexes.&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------  &lt;br /&gt;Worldwide Copyright (c) Byte Designs Ltd (2009)&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;
 </content>
 </entry>
<entry>
<title type='text'>isam file mirroring reference</title>
<id>isam_file_mirroring_reference</id>
<updated>2009-10-13T20:13:48.131-07:00</updated>
<link href='http://isam.ca/products/disam/d7/refs.html#isam_file_mirroring_reference'/>
<content type='html'>
 isam file mirroring reference&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;isam file mirroring works by setting an environment variable BDMIRROR to&lt;br /&gt;the full path of location of the mirror fileset.&lt;br /&gt;&lt;br /&gt;BDMIRROR will mirror to remote destinations if ISCLIENT is set to 1 in&lt;br /&gt;isconfig.h prior to compiling the Disam library. If the mirror files&lt;br /&gt;are on a remote machine the path of BDMIRROR must be prefixed with the&lt;br /&gt;ip of the remote machine such as:&lt;br /&gt;&lt;br /&gt;     BDMIRROR = //209.99.99.9/isamfilepath for unix platforms&lt;br /&gt;&lt;br /&gt;-or-&lt;br /&gt;     BDMIRROR = \\\\209.99.99.9\\isamfilepath for DOS,Win or NT platforms&lt;br /&gt;&lt;br /&gt;The mirror fileset must exist in the BDMIRROR location for mirroring to work.&lt;br /&gt;All disam calls will be duplicated to the locale fileset as well as the mirrored&lt;br /&gt;fileset.&lt;br /&gt;&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;Worldwide Copyright (c) Byte Designs Ltd (2009)&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;
 </content>
 </entry>
<entry>
<title type='text'>index masking</title>
<id>Question5</id>
<updated>2009-10-13T20:13:13.473-07:00</updated>
<link href='http://isam.ca/products/disam/d7/refs.html#Question5'/>
<content type='html'>
 index masking&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;index masking is a mechanism through which the application can control&lt;br /&gt;which indexes a given record will be stored in.  usage is relatively&lt;br /&gt;simple, and best explained by example.&lt;br /&gt;&lt;br /&gt;masked files are created by adding ISMASKED to the mode when calling&lt;br /&gt;isBuild or isbuild, and are opened in the same way.&lt;br /&gt;&lt;br /&gt;the library will return an EBADARG error if a masked file is opened&lt;br /&gt;without ISMASKED in the mode or ISMASKED is added to the open mode&lt;br /&gt;on an unmasked file.&lt;br /&gt;&lt;br /&gt;given a file with three indexes, where a value of 1 represents the&lt;br /&gt;primary, 2 the middle index, and 3 the last, the following call will&lt;br /&gt;add a record to the primary index only:&lt;br /&gt;&lt;br /&gt;issetmask( isfd, ISMASK(2) + ISMASK(3) );&lt;br /&gt;iswrite( isfd, record_data );&lt;br /&gt;&lt;br /&gt;to rewrite a record such that it will be masked in the primary:&lt;br /&gt;&lt;br /&gt;issetmask( isfd, ISMASK(1) );&lt;br /&gt;isrewrite( isfd, record_data );&lt;br /&gt;&lt;br /&gt;where isrewrite could also be isrewcurr or isrewrec.&lt;br /&gt;&lt;br /&gt;the mask value for the current record can be obtained via a call to&lt;br /&gt;&lt;br /&gt;isgetmask( isfd );&lt;br /&gt;&lt;br /&gt;record masks must be set explicitly - if reading through a file with&lt;br /&gt;the intention of adjusting mask values you must call issetmask for&lt;br /&gt;each record you wish to change.&lt;br /&gt;&lt;br /&gt;files built with masking active will allow multiple copies of&lt;br /&gt;identical indexes to be added to the file.  this is to allow the&lt;br /&gt;developer to store different record subsets in separate indexes,&lt;br /&gt;but it is important to note that only the *last* of these indexes&lt;br /&gt;can be accessed via isstart - isindex should be used instead.&lt;br /&gt;&lt;br /&gt;BASE: if using the base ( file descriptor ) calls you should enquire&lt;br /&gt;      and set the mask values directly, rather than using isgetmask&lt;br /&gt;      and issetmask.  for example:&lt;br /&gt;      &lt;br /&gt;if( isam-&gt;mask &amp; ISMASK(1) ) /* current record masked in primary */&lt;br /&gt;&lt;br /&gt;isam-&gt;mask = ISMASK(2) + ISMASK(3); /* mask 2nd and 3rd indexes */&lt;br /&gt;&lt;br /&gt;     &lt;br /&gt;NOTES: masking is a custom extension - files built with ISMASKED are&lt;br /&gt;       not cisam compatible.&lt;br /&gt;&lt;br /&gt;       you should not remove indexes from a masked file once it has&lt;br /&gt;       been populated.&lt;br /&gt;       &lt;br /&gt;       as of version 6.1, the flag in the index header that denotes&lt;br /&gt;       masked files has been changed - you will need to run fixflags&lt;br /&gt;       (in the util directory) to patch older files.&lt;br /&gt;&lt;br /&gt;see nullkeys.ref for an alternate method of filtering indexes.&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------  &lt;br /&gt;Worldwide Copyright (c) Byte Designs Ltd (2009)&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;
 </content>
 </entry>
<entry>
<title type='text'>transparent file links</title>
<id>Question4</id>
<updated>2009-10-13T20:12:21.452-07:00</updated>
<link href='http://isam.ca/products/disam/d7/refs.html#Question4'/>
<content type='html'>
 transparent file links&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;when building, opening, renaming or erasing isam files, the library&lt;br /&gt;will first check for the existence of a .lnk file in the specified&lt;br /&gt;path.  this is a text file that is expected to contain the physical&lt;br /&gt;path for the associated isam file in the first line.  the remainder&lt;br /&gt;of the file contents is ignored.&lt;br /&gt;&lt;br /&gt;for instance, if you create a file called sample.lnk in directory&lt;br /&gt;testdata with &quot;mydata/temp&quot; in the first line, then attempt to open&lt;br /&gt;&quot;testdata/sample&quot;, the library will bypass any existing sample file&lt;br /&gt;in testdata and open mydata/temp instead.&lt;br /&gt;&lt;br /&gt;linking is not recursive - the only place the library will look for&lt;br /&gt;a link is on the original path passed to the associated isam call.&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------  &lt;br /&gt;Worldwide Copyright (c) Byte Designs Ltd (2009)&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;
 </content>
 </entry>
<entry>
<title type='text'>installation</title>
<id>Question2</id>
<updated>2009-10-13T20:10:43.958-07:00</updated>
<link href='http://isam.ca/products/disam/d7/refs.html#Question2'/>
<content type='html'>
 installation&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;the library is split into two sections - the base and the wrapper -&lt;br /&gt;as explained in source.ref.  the base source is found in the base&lt;br /&gt;subdirectory, and the wrapper source in wrap.  all public header&lt;br /&gt;files are in the head directory.&lt;br /&gt;&lt;br /&gt;if you plan to use only the base library then you can ignore both&lt;br /&gt;the wrap directory and head/iswrap.h&lt;br /&gt;&lt;br /&gt;if you are planning to use only the wrapped (cisam standard) calls&lt;br /&gt;then you should probably compile everything into one library and&lt;br /&gt;ignore head/isbase.h&lt;br /&gt;&lt;br /&gt;if you intend to use both flavours, then it might be an idea to&lt;br /&gt;build two separate libraries, but this is optional.&lt;br /&gt;&lt;br /&gt;note that if you plan to use the wrapper calls, or the transaction&lt;br /&gt;processing module, the base library MUST be compiled with ISADMIN&lt;br /&gt;activated.&lt;br /&gt;&lt;br /&gt;before starting you will need to edit isconfig.h and adjust it as&lt;br /&gt;appropriate - refer to configuration below for details.&lt;br /&gt;&lt;br /&gt;NOTE:   some compilers produce unsigned char types as the default.&lt;br /&gt;        this must be changed - at least when compiling the base and&lt;br /&gt;        wrapper modules - all char types must default to signed.&lt;br /&gt;        this inconvenience will be corrected in future releases.&lt;br /&gt;&lt;br /&gt;your compiler may generate a number of warnings to the effect that&lt;br /&gt;certain lines of code have no effect, or that arguments are not used&lt;br /&gt;in some functions.  this is an expected situation and is due to the&lt;br /&gt;fact that turning some options off will result in functions being&lt;br /&gt;nulled by means of empty ifdef declarations in some cases, or replaced&lt;br /&gt;by empty stubs in others.&lt;br /&gt;&lt;br /&gt;the source for the dcheck utility is located in the util directory&lt;br /&gt;and should be linked with the base library to produce an executable.&lt;br /&gt;documentation for same will be found in dcheck.ref.  the same is&lt;br /&gt;true for the dpack and dlist utilities.&lt;br /&gt;&lt;br /&gt;the test directory contains a collection of benchmark utilities,&lt;br /&gt;documented in test.ref&lt;br /&gt;&lt;br /&gt;you will find a generic makefile in the make directory.  to use the&lt;br /&gt;makefile, copy the contents of head, wrap and base into one directory,&lt;br /&gt;edit isconfig.h as explained below, edit the makefile and follow the&lt;br /&gt;comments.&lt;br /&gt;&lt;br /&gt;the makefile should be compatible with most standard unix platforms,&lt;br /&gt;and should also be compatible with a fair number of the more standard&lt;br /&gt;dos, windows and os2 compilers, as well as the gnu make command.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;configuration&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;#define ISADMIN     1                   /* global file administration */&lt;br /&gt;&lt;br /&gt;with this option active, the library will maintain an internal table&lt;br /&gt;of active isam file descriptors, reuse system file handles when more&lt;br /&gt;than one instance of the same isam file is opened, and include the&lt;br /&gt;isCleanUp call amongst the library entry points.  admin is mandatory&lt;br /&gt;when the standard wrapper library or transaction processing are used,&lt;br /&gt;and definitely advisable if you plan to open more than one instance&lt;br /&gt;of the same file at any given time.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#define ISAUDIT     1                   /* 0:off 1:active */&lt;br /&gt;&lt;br /&gt;a value of one includes support for cisam standard audit trail&lt;br /&gt;logging, see audit.ref for details.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#define ISLOGGING   1                   /* 0:none 1:standard */&lt;br /&gt;&lt;br /&gt;a value of one includes support for cisam standard transaction&lt;br /&gt;logging and processing, together with a number of enhancements.&lt;br /&gt;see trans.ref for more details.  NOTE - to use this option you&lt;br /&gt;must activate the ISADMIN feature.  NOTE also that transaction&lt;br /&gt;processing is currently not supported under threads - this will&lt;br /&gt;be resolved in the near future.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#define ISVARIABLE  0                   /* 0:none 1:std 2:pack */&lt;br /&gt;&lt;br /&gt;a value of one includes support for variable length records in the&lt;br /&gt;standard cisam compatible configuration.  a value of two provides&lt;br /&gt;a better hash table algorithm and finer granularity with regard to&lt;br /&gt;the use and reuse of slots in the variable length data storage nodes.&lt;br /&gt;both one and two include support for data compression.  see varlen.ref&lt;br /&gt;for more details.&lt;br /&gt;&lt;br /&gt;#define ISOLDVARLEN 0                  /* 0: new v7.0 format */&lt;br /&gt;                                       /* 1: old disam/c-isam format */&lt;br /&gt;&lt;br /&gt;there was a limitation in the old disam/disam96/c-isam variable length&lt;br /&gt;in that the maximum record number that could be stored in the 3 char bytes&lt;br /&gt;allocated for storing varinfo and continuation node record numbers was &lt;br /&gt;16777216L. this limit has been removed but requires that old files &lt;br /&gt;are converted, see dvlrebld.ref via the dvlrebld utility prior to use.&lt;br /&gt;&lt;br /&gt;#define ISLOCKING   2                  /* 0:none 1:old 2:new 3:lck */&lt;br /&gt;&lt;br /&gt;a value of zero will disable locking entirely, resulting in a single&lt;br /&gt;user version of the library.  locking one enables the original cisam&lt;br /&gt;(prior to version 4) locking algorithm.  locking two is the current&lt;br /&gt;(standard) method used by cisam versions 4 and greater, may also be&lt;br /&gt;faster on some platforms.  locking three is compatible with the dos&lt;br /&gt;&apos;third file&apos; locking method, and is provided to allow &apos;lowest common&lt;br /&gt;denominator&apos; NFS concurrency with dos based applications.  locking&lt;br /&gt;one and three rely on the lockf() system call, and two requires fcntl().&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#define ISDUPLOCKS  1                   /* honour locks in dup opens */&lt;br /&gt;&lt;br /&gt;cisam allows the same file to be opened more than once in EXCLLOCK&lt;br /&gt;mode within the same process.  it also permits the same record to&lt;br /&gt;be locked more than one under different filehandles within the same&lt;br /&gt;process, not to mention that it is also legal to erase a file that&lt;br /&gt;is already open in the current process, after which point any data&lt;br /&gt;written to the file will evaporate.  set this to zero for cisam&lt;br /&gt;compatible operation, but please be careful..&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#define ISDECLARE   1                   /* include prototypes */&lt;br /&gt;&lt;br /&gt;if non zero then full ansi standard function prototyping is enabled.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#define ISDATAVOID  0                   /* void data pointers */&lt;br /&gt;&lt;br /&gt;cisam insists that all record pointers passed must be char type.&lt;br /&gt;if ISDATAVOID is set to one, they will be declared as type void&lt;br /&gt;which, under some compilers, will allow you to pass anything with-&lt;br /&gt;out warnings.  this feature is compiler dependent.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#define ISCUSTOM  0                     /* custom key types */&lt;br /&gt;&lt;br /&gt;this option allows the addition of custom key types - refer to&lt;br /&gt;custkeys.ref for more details.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#define ISBERKELY 0			/* 0:memcpy() 1:bcopy() */&lt;br /&gt;&lt;br /&gt;a value of one uses the berkely memory handling functions bcopy()&lt;br /&gt;and bcmp() and covers for the absence of memset() internally.  a&lt;br /&gt;value of zero uses the default memcpy(), memcmp() and memset()&lt;br /&gt;calls.&lt;br /&gt;&lt;br /&gt;#define ISLONGID  0                     /* allows for long pids */&lt;br /&gt;&lt;br /&gt;a value of 1 will override the C-ISAM / X/OPEN spec that forces&lt;br /&gt;short integer values to be stored in the transaction processing logfile&lt;br /&gt;and audit trail file for pids and uids. WARNING: do not set to 1 &lt;br /&gt;if you are expecting C-ISAM/X/OPEN concurrency or file compatibility&lt;br /&gt;or if the process ids returned from the systems getpid() function are&lt;br /&gt;short values.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#define ISIDXBLK    1024                /* default index block size */&lt;br /&gt;&lt;br /&gt;the default index block size to be used when creating isam files.&lt;br /&gt;512 and 1024 are the usual standards.  512 is compatible with older&lt;br /&gt;versions of cisam, while 1024 seems to be most common value, and&lt;br /&gt;is compatible with current cisam files.  1024 will be enforced when&lt;br /&gt;building variable length files, but you can still use other values&lt;br /&gt;for your regular data.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#define ISDUPLEN    4                   /* default duplicate width */&lt;br /&gt;&lt;br /&gt;the width of the field used to store the duplicate sequence numbers&lt;br /&gt;in the index.  a value of 4 will permit approximately 2000 million&lt;br /&gt;identical keys in any given index, while 2 imposes a limit of just&lt;br /&gt;over 32500.  4 is more expensive in terms of disk space, so you may&lt;br /&gt;wish to consider using 2 if this is important and you not intend to&lt;br /&gt;go over the limit.  bear in mind that the limit applies to the max&lt;br /&gt;count of an individual identical key, not to the total number of&lt;br /&gt;duplicates in the index.  4 is compatible with current cisam, 2&lt;br /&gt;with older versions.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#define ISMAXIDX    10                  /* indexes per file */&lt;br /&gt;#define ISMAXPARTS  10                  /* parts per key */&lt;br /&gt;#define ISMAXKEY    128                 /* bytes per key */&lt;br /&gt;&lt;br /&gt;these should be fairly obvious, and refer to the number of indexes&lt;br /&gt;per file, the number of parts per index, and the total allowable byte&lt;br /&gt;count per index key.  the value of ISMAXPARTS is also available via&lt;br /&gt;the standard NPARTS define.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#define ISMAXBUF    20                  /* buffers per index */&lt;br /&gt;&lt;br /&gt;this is actually a slight misnomer in that the root node is always&lt;br /&gt;buffered, so the resultant number of memory allocations will actually&lt;br /&gt;be one more than the number you specify here.  one important caveat&lt;br /&gt;applies - you must specify a value that is at least twice the expected&lt;br /&gt;depth of the largest expected index tree. **Note: should you encounter&lt;br /&gt;an ISFATAL error: fatal isam error iscomp.c(68) the value of ISMAXBUF&lt;br /&gt;should be increased and the entire library recompiled before attempting&lt;br /&gt;to continue. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#define ISERRBASE   100                 /* start error codes at */&lt;br /&gt;&lt;br /&gt;the library generated iserrno values usually start at 100.  on&lt;br /&gt;some systems this conflicts with system generated errno values.&lt;br /&gt;you can use this define to change the start point.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#define ISTHREADED 0			/* threadsafe handling */&lt;br /&gt;&lt;br /&gt;please refer the thread.ref for details if you plan to use this.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;Worldwide Copyright (c) Byte Designs Ltd (2009)&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;
 </content>
 </entry>
<entry>
<title type='text'>user info</title>
<id>Question1</id>
<updated>2009-10-13T20:09:56.219-07:00</updated>
<link href='http://isam.ca/products/disam/d7/refs.html#Question1'/>
<content type='html'>
 user info&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;two functions&lt;br /&gt;&lt;br /&gt;int isUserInfo( struct IsamFile *isam, int mode, char *pad );&lt;br /&gt;int isuserinfo( int isfd, int mode, char *pad );&lt;br /&gt;&lt;br /&gt;where pad is a character array of size USERINFOSIZE.&lt;br /&gt;&lt;br /&gt;USERINFOSIZE is fixed at ten bytes and should not be changed.&lt;br /&gt;&lt;br /&gt;allow the application to store a fixed length ten byte info pad&lt;br /&gt;in the index header of any isam file.&lt;br /&gt;&lt;br /&gt;mode has two possible values&lt;br /&gt;&lt;br /&gt;ISINPUT     load pad from index header&lt;br /&gt;ISOUTPUT    write pad to index header&lt;br /&gt;&lt;br /&gt;these ten bytes are freely available to any application system&lt;br /&gt;that requires the ability to store additional information about&lt;br /&gt;a given isam file.&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------  &lt;br /&gt;Worldwide Copyright (c) Byte Designs Ltd (2009)&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;
 </content>
 </entry>
<entry>
<title type='text'>DISAM History, Version 7</title>
<id>DISAM_Version_7_History</id>
<updated>2009-10-13T20:08:27.248-07:00</updated>
<link href='http://isam.ca/products/disam/d7/refs.html#DISAM_Version_7_History'/>
<content type='html'>
 jan, 2009 - offical release of DISAM v7.0 new to this release&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;isopen.c, isbuild.c, isvarlen.c, isvarlen.h and isconfig.h - changes to &lt;br /&gt;variable length idx file format to allow for &gt; 16777216 record limit when&lt;br /&gt;storing record numbers in 3 char bytes for varinfo and continuation node &lt;br /&gt;pointers. isconfig.h setting ISOLDVARLEN 1 or any non 0 ISCISAM setting&lt;br /&gt;will maintain old disam/c-isam variable length file format compatibility.&lt;br /&gt;ISCISAM 0 and ISOLDVARLEN 0 ensures new format. new format requires that&lt;br /&gt;dvlrebld( see dvlrebld.ref ) be run on existing variable length files.&lt;br /&gt;&lt;br /&gt;stdextra.c - schema/record layout support - new wrap functions&lt;br /&gt; load schema from isamfile to path/filename&lt;br /&gt;    ISD1 int ISD2 isldschema( int isfd, char *path )&lt;br /&gt; dump schema from isamfile to stdout&lt;br /&gt;    ISD1 int ISD2 isdpschema( int isfd )&lt;br /&gt; store schema from loadfile to isamfile&lt;br /&gt;    ISD1 int ISD2 isstschema( int isfd, char *loadfile )&lt;br /&gt; remove schema from isamfile&lt;br /&gt;    ISD1 int ISD2 isrmschema( int isfd )&lt;br /&gt;&lt;br /&gt;isschema.c - schema record layout support - new base functions&lt;br /&gt; load schema from isamfile to path/filename&lt;br /&gt;    ISD1 int ISD2 isLdSchema( IsFile *isam, char *path )&lt;br /&gt; dump schema from isamfile to stdout&lt;br /&gt;    ISD1 int ISD2 isDpSchema( isFile *isam )&lt;br /&gt; store schema from loadfile to isamfile&lt;br /&gt;    ISD1 int ISD2 isStSchema( IsFile *isam, char *loadfile )&lt;br /&gt; remove schema from isamfile&lt;br /&gt;    ISD1 int ISD2 isRmSchema( IsFile *isam )&lt;br /&gt;* see read/schema.ref for function details and schema/ReadMe for sample programs&lt;br /&gt;&lt;br /&gt;dreport.c - new schema related isam data reporting utility.&lt;br /&gt;&lt;br /&gt;record number limit changed from LONG_MAX to ULONG_MAX value&lt;br /&gt;&lt;br /&gt;client/server capabilities incorporated into standard DISAM. for a free limited single client server program please contact ByteDesigns.&lt;br /&gt;-----------------------------------------------------------------------------&lt;br /&gt;
 </content>
 </entry>
<entry>
<title type='text'>upgrading from old disam</title>
<id>upgrading_from_old_disam</id>
<updated>2009-10-13T20:07:06.812-07:00</updated>
<link href='http://isam.ca/products/disam/d7/refs.html#upgrading_from_old_disam'/>
<content type='html'>
 upgrading from old disam&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;the process of upgrading from older versions of disam should be as&lt;br /&gt;simple as relinking with the new library, but there are a few things&lt;br /&gt;that are different, and may need addressing.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;the header file&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;the standard header file as distributed is named iswrap.h to avoid&lt;br /&gt;confusion with older versions and to differentiate from the alternate&lt;br /&gt;interface header, which is called isbase.h&lt;br /&gt;&lt;br /&gt;the simplest procedure is to replace the contents of your original&lt;br /&gt;disam.h with a copy of iswrap.h&lt;br /&gt;&lt;br /&gt;alternatively you might wish to create a new copy of disam.h which&lt;br /&gt;does nothing more than include either iswrap.h or a renamed copy of&lt;br /&gt;your old disam (or cisam) header file.  this would permit you to&lt;br /&gt;easily switch back and forth until you are comfortable with the new&lt;br /&gt;library.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;the trouble with isfdmap&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;the old disam library used an array of pointers, called isfdmap, to&lt;br /&gt;manage it&apos;s table of open files.  the new library uses an internally&lt;br /&gt;manipulated dynamic array that is not quite as easy to get to, and&lt;br /&gt;the associated file descriptor structure has changed significantly.&lt;br /&gt;&lt;br /&gt;analogs for the more common values are now available via the&lt;br /&gt;common dictionary access routines described in wrap.ref&lt;br /&gt;&lt;br /&gt;please let support know if anything important has been left out.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;virtual file open handling (ISVIRTUAL define in old isport.h)&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;older versions of disam included a compile time option for&lt;br /&gt;virtual file handling support.  this was activated by means&lt;br /&gt;of the ISVIRTUAL define in isport.h&lt;br /&gt;&lt;br /&gt;it was designed to allow the library to bypass the system&lt;br /&gt;file handle limit by swapping out (closing) inactive system&lt;br /&gt;handles to make room for new opens.&lt;br /&gt;&lt;br /&gt;because it is not possible to retain locks on closed system&lt;br /&gt;handles, this feature introduced a bug that created problems&lt;br /&gt;with index access concurrency, sometimes resulting in index&lt;br /&gt;corruption.&lt;br /&gt;&lt;br /&gt;at time of writing there appears to be no practical solution&lt;br /&gt;to this problem, and virtual file handling support has been&lt;br /&gt;discontinued in the current release.&lt;br /&gt;&lt;br /&gt;the current library provides an alternative solution (although&lt;br /&gt;not as extensive) via duplicate open handling.  this feature,&lt;br /&gt;active by default, allows the library to multiplex the system&lt;br /&gt;handles used to access multiple opens on the same isam file.&lt;br /&gt;&lt;br /&gt;in other words - you can open the same isam file as often as&lt;br /&gt;you wish without the need for additional system handles.&lt;br /&gt;&lt;br /&gt;while this does not cover instances where the application&lt;br /&gt;needs to access large numbers of different isam files, it&lt;br /&gt;should be of value under the circumstances denoted.&lt;br /&gt;&lt;br /&gt;no specific configuration is needed to access this feature,&lt;br /&gt;as it is an integral part of standard operation.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;isindex( int isfd, int idx, int locate );&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;the idx argument has been changed.  under old disam, a value of zero&lt;br /&gt;was used to select the primary index, and a value equal to the max&lt;br /&gt;number of active indexes was used to select natural order.&lt;br /&gt;&lt;br /&gt;the new library uses a value of zero to denote natural order, and&lt;br /&gt;the active index count starts at one.&lt;br /&gt;&lt;br /&gt;if you prefer the original functionality, please refer to the pre-&lt;br /&gt;processor directive within the islocate code in stdread.c&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;ispop( int isfd, int idx, long rec );&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;the idx argument has been changed.  under old disam, a value of zero&lt;br /&gt;was used to select the primary index, and a value equal to the max&lt;br /&gt;number of active indexes was used to select natural order.&lt;br /&gt;&lt;br /&gt;the new library uses a value of zero to denote natural order, and&lt;br /&gt;the active index count starts at one.&lt;br /&gt;&lt;br /&gt;if you prefer the original functionality, please refer to the pre-&lt;br /&gt;processor directive within the ispop code in stdread.c&lt;br /&gt;&lt;br /&gt;if you change ispop functionality you should make the same change&lt;br /&gt;in ispush.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;ispush( int isfd, int *idx, long *rec );&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;since the new library no longer supports the isfdmap array, this call&lt;br /&gt;has been added to load the current index and record numbers for later&lt;br /&gt;use by ispop.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;isclone( int isfd, char *name );&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;you can no longer specify the mode of the new file, nor list the&lt;br /&gt;indexes to be copied.  if this is a problem to you please let the&lt;br /&gt;support department know - the option was dropped because it was felt&lt;br /&gt;that it had limited use and the associated varargs processing caused&lt;br /&gt;an amount of difficulty in porting.&lt;br /&gt;&lt;br /&gt;the current version copies all indexes by default, and the open mode&lt;br /&gt;of the returned handle will be the same as for the original file.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;iscopy( int isfd, char *name );&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;iscopy no longer requires that you pass a buffer to assist in the&lt;br /&gt;copying process, and the extraneous flags argument has been dropped&lt;br /&gt;because it was never used.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;isgetmode( int isfd, int *mode );&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;this routine loads the open mode value into the mode pointer passed&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;ISAUTOLOCK behaviour&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;Disam by default release automatic record locks only on a subsequent&lt;br /&gt;read. For older D-ISAM v3.x behaviour set isconfig.h D3XAUTOLOCK &lt;br /&gt;to 1 to enable automatic release on read, update or delete&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;Worldwide Copyright (c) Byte Designs Ltd (2009)&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;
 </content>
 </entry>
<entry>
<title type='text'>upgrading from cisam</title>
<id>upgrading_from_cisam</id>
<updated>2009-10-13T20:07:00.788-07:00</updated>
<link href='http://isam.ca/products/disam/d7/refs.html#upgrading_from_cisam'/>
<content type='html'>
 upgrading from cisam &lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;the process of upgrading from cisam should be as simple as relinking&lt;br /&gt;with the new library, but there are a few things that you should know&lt;br /&gt;about.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;the header file&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;isam.h is cisam&apos;s standard header file, ours is called iswrap.h&lt;br /&gt;&lt;br /&gt;there are three basic alternatives:&lt;br /&gt;&lt;br /&gt;1. modify your application code to include iswrap.h&lt;br /&gt;&lt;br /&gt;2. replace the contents of isam.h with a copy of iswrap.h&lt;br /&gt;&lt;br /&gt;3. create a new copy of isam.h which does nothing more than include&lt;br /&gt;   either iswrap.h or a renamed copy of isam.h.  this would permit&lt;br /&gt;   you to easily switch back and forth until you are comfortable with&lt;br /&gt;   the new library.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;what happens when you change the current key on rewrites&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;the best way to explain this is by example.  assume you have a file&lt;br /&gt;containing the following records: AAA, BBB, CCC, EEE, and that the&lt;br /&gt;current index is based on these values.&lt;br /&gt;&lt;br /&gt;under cisam, if AAA was the current record and you were to change&lt;br /&gt;it&apos;s contents to DDD and rewrite, an isread or isstart with a mode&lt;br /&gt;of ISNEXT would set the current to EEE.&lt;br /&gt;&lt;br /&gt;this can be somewhat problematic if you are doing a read next loop&lt;br /&gt;through your file, so we have arbitrarily adjusted this behaviour&lt;br /&gt;to ensure that the next record found will follow the current as set&lt;br /&gt;BEFORE the rewrite.&lt;br /&gt;&lt;br /&gt;this means that, given the above example, BBB would become current&lt;br /&gt;on an isread or isstart with a mode of ISNEXT.&lt;br /&gt;&lt;br /&gt;the same (in reverse) is true when reading backwards through the&lt;br /&gt;file with a mode if ISPREV.&lt;br /&gt;&lt;br /&gt;we currently consider this behaviour to be an enhancement over the&lt;br /&gt;cisam standard, but would be happy to provide true cisam operation&lt;br /&gt;if anyone should ask for it.  please contact the support department&lt;br /&gt;if this is important to you.&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;cisam autolock / nowait &lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;for cisam compatible nowait on open and automatic record locks set&lt;br /&gt;C7NOWAIT to 1 in isconfig.h&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;cisam version 5.0 through 7.1 locking concurrency&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;for cisam version 5.0 through 7.1 locking concurrency when running&lt;br /&gt;against cisam executables set C7LOCKING to 1 in isconfig.h.&lt;br /&gt;keep in mind that exectuables compiled with C7LOCKING set to 1&lt;br /&gt;will no longer run concurrent with executables compiled for standard&lt;br /&gt;disam locking.&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;cisam version 7.2x locking concurrency&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;same as above, except C7LOCKING should be set to 2&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;Worldwide Copyright (c) Byte Designs Ltd (2009)&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;
 </content>
 </entry>
<entry>
<title type='text'>base library reference</title>
<id>base_library_reference</id>
<updated>2009-10-13T20:06:52.571-07:00</updated>
<link href='http://isam.ca/products/disam/d7/refs.html#base_library_reference'/>
<content type='html'>
 base library reference&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;the library provides two separate interface methods.  the base code&lt;br /&gt;uses allocated file descriptors ( similar to fopen/fwrite etc ) to&lt;br /&gt;manage isam files, and it will be this interface that is described&lt;br /&gt;here.  the differences between the base and the wrapper interfaces&lt;br /&gt;is covered in wrap.ref&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;primary details&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;all modules which make base library calls should include isbase.h&lt;br /&gt;&lt;br /&gt;in all of the following, isfd will be used to refer to an open isam&lt;br /&gt;file descriptor, as returned by isOpen or isBuild, and declared as:&lt;br /&gt;&lt;br /&gt;struct IsamFile *isfd;          /* the formal way */&lt;br /&gt;IsFile *isfd;                   /* typedef shortcut */&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;return values and result indicators&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;with the exception of isBuild, isOpen and a few others, the base will&lt;br /&gt;return a boolean ISTRUE or ISFALSE.  ISTRUE and ISFALSE are defined&lt;br /&gt;in the isbase.h header as 1 and 0 respectively.&lt;br /&gt;&lt;br /&gt;when ISFALSE is returned you will find the system or isam error code&lt;br /&gt;in isfd-&gt;iserrno, where isfd is an open file descriptor.  isam error&lt;br /&gt;codes start at 100 (refer to ISERRBASE in install.ref if you need to&lt;br /&gt;change this) and are listed under error codes below.   system error&lt;br /&gt;codes have their usual values for the target system.&lt;br /&gt;&lt;br /&gt;if iserrno is less than 100 (ie a system error) isfd-&gt;iserrio will&lt;br /&gt;provide a little more detail as to where and why, as listed under&lt;br /&gt;errio codes below.&lt;br /&gt;&lt;br /&gt;in situations where no file descriptor is available, such as when&lt;br /&gt;isBuild or isOpen fail, or after isClose, isErase or isRename, the&lt;br /&gt;call will return the error code in the global errno variable.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;IsFile *isBuild( char *name, int dlen, int mlen, IsKdsc *key, int mode );&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;name:    	[path]name of file to be created&lt;br /&gt;dlen:    	length of data record in bytes&lt;br /&gt;mlen:    	if ISVARLEN then max record length else ignored&lt;br /&gt;key:     	primary index description, see isam indexes&lt;br /&gt;mode:    	see open modes&lt;br /&gt;return:  	allocated file descriptor or NULL&lt;br /&gt;&lt;br /&gt;note:    if successful, isBuild will return an isam file descriptor&lt;br /&gt;        open in the specified mode and ready for use.&lt;br /&gt;        &lt;br /&gt;        a NULL pointer is returned on failure and the error code will&lt;br /&gt;        be found in the global errno variable.&lt;br /&gt;        &lt;br /&gt;        refer to varlen.ref for more details regarding ISVARLEN        &lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;IsFile *isOpen( char *name, int mode );&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;name:    [path]name of an existing isam file&lt;br /&gt;mode:    see open modes&lt;br /&gt;return:  allocated file descriptor or NULL&lt;br /&gt;&lt;br /&gt;note:    the file name must be specified without the .dat or .idx&lt;br /&gt;        extension, and must be less than 251 bytes in length.&lt;br /&gt;&lt;br /&gt;        the current index will be set to the primary.&lt;br /&gt;&lt;br /&gt;        a NULL pointer is returned on failure and the error code will&lt;br /&gt;        be found in the global errno variable.&lt;br /&gt;        &lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;int isCleanUp( void )&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;note:    this routine will close all currently open isam files and&lt;br /&gt;        release all allocated global memory.&lt;br /&gt;        &lt;br /&gt;        only available if the base library was compiled with the&lt;br /&gt;        ISADMIN feature activated.&lt;br /&gt;        &lt;br /&gt;        &lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;IsFile *isLockCheck( IsFile *isfd, int mode );&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;isfd:    isam file descriptor&lt;br /&gt;flag:    0: off 1:on&lt;br /&gt;&lt;br /&gt;note:    a flag value of 1 will cause the library to fail on&lt;br /&gt;        update or delete if the record in question has not&lt;br /&gt;        been successfully locked prior to the operation.  the&lt;br /&gt;        iserrno value returned in this instance is ENOCURR.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;IsFile *isSetMode( IsFile *isfd, int mode );&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;isfd:    isam file descriptor&lt;br /&gt;mode:    either ISMANULOCK or ISAUTOLOCK&lt;br /&gt;&lt;br /&gt;note:    this routine can be used to switch the designated file between manual and automatic locking modes.&lt;br /&gt;        &lt;br /&gt;        when switching from automatic to manual, the current record,&lt;br /&gt;        if locked, will be released. &lt;br /&gt;        &lt;br /&gt;        future plans include the ability to switch to/from exclusive&lt;br /&gt;        lock as well, but at present an attempt to do so will result&lt;br /&gt;        in an EBADARG error.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;IsFile *isClose( IsFile *isfd );&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;isfd:    isam file descriptor&lt;br /&gt;&lt;br /&gt;note:    isClose drops all locks and releases all allocated memory.&lt;br /&gt;&lt;br /&gt;        isClose will return FALSE on failure and the error code will&lt;br /&gt;        be found in the global errno variable.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;int isAddIndex( IsFile *isfd, IsKdsc *key );&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;isfd:    isam file descriptor&lt;br /&gt;key:     description of secondary index to add, see isam indexes&lt;br /&gt;&lt;br /&gt;note:    when adding an index to a populated file, isAddIndex will&lt;br /&gt;        load the new index with keys for all the existing data&lt;br /&gt;        records.  in the case of larger files this could take a&lt;br /&gt;        while..&lt;br /&gt;        &lt;br /&gt;        isAddIndex will attempt to place an exclusive lock on&lt;br /&gt;        the isam file for the duration of the update (assuming&lt;br /&gt;        you have not done so already) and will fail if any other&lt;br /&gt;        process already has the file open.&lt;br /&gt;        &lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;int isDelIndex( IsFile *isfd, IsKdsc *key );&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;isfd:    isam file descriptor&lt;br /&gt;key:     description of secondary index to delete, see isam indexes&lt;br /&gt;&lt;br /&gt;note:    when deleting an index from a populated file, isDelIndex will&lt;br /&gt;        purge the accumulated keys.  in the case of larger files this&lt;br /&gt;        could take a while, but will be significantly faster than the&lt;br /&gt;        isAddIndex call.&lt;br /&gt;        &lt;br /&gt;        isDelIndex will attempt to place an exclusive lock on&lt;br /&gt;        the isam file for the duration of the update (assuming&lt;br /&gt;        you have not done so already) and will fail if any other&lt;br /&gt;        process already has the file open.&lt;br /&gt;        &lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;IsFile *isCluster( IsFile *isfd, IsKdsc *key );&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;isfd:    isam file descriptor&lt;br /&gt;key:     description of index to cluster on&lt;br /&gt;&lt;br /&gt;note:    the file must be open in exclusive mode&lt;br /&gt;&lt;br /&gt;        this routine makes use of a temporary file, created in the&lt;br /&gt;        same directory as the original.&lt;br /&gt;        &lt;br /&gt;        all active data records will be transferred to the temp file&lt;br /&gt;        in the index order specified, and all indexes will be packed&lt;br /&gt;        as efficiently as possible.&lt;br /&gt;        &lt;br /&gt;        if successful, isCluster will return a new file descriptor,&lt;br /&gt;        opened in the same format as the original, which will be&lt;br /&gt;        abandoned.  a NULL pointer will be returned on error, and&lt;br /&gt;        the original descriptor and file will be left intact.&lt;br /&gt;        &lt;br /&gt;        be warned that this call may take some time to run if the&lt;br /&gt;        file in question is large.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;int isErase( char *name );&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;name:    [path]name of an existing isam file to be physically removed.&lt;br /&gt;&lt;br /&gt;note:    isErase will not remove files that are currently in use by&lt;br /&gt;        other processes.&lt;br /&gt;        &lt;br /&gt;        the error code will be found in errno on failure.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;int isRename( char *old, char *new );&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;old:     original [path]name of an existing isam file&lt;br /&gt;new:     new [path]name of isam file&lt;br /&gt;&lt;br /&gt;note:    isRename will not rename files that are currently in use by other processes.&lt;br /&gt;        &lt;br /&gt;        isRename can be used to move an isam file from one directory&lt;br /&gt;        to another, but not to a different drive or device.&lt;br /&gt;        &lt;br /&gt;        the error code will be found in errno on failure.&lt;br /&gt;        &lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;int isStart( IsFile *isfd, IsKdsc *kdsc, int len, char *data, int mode );&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;isfd:    isam file descriptor&lt;br /&gt;kdsc:    description of index to be selected or NULL to retain the current index&lt;br /&gt;len:     partial length of key, or 0 for full&lt;br /&gt;data:    data record pointer if needed for search mode, or NULL&lt;br /&gt;mode:    see search modes&lt;br /&gt;&lt;br /&gt;note:    this routine has multiple purposes.&lt;br /&gt;&lt;br /&gt;        if kdsc is passed then the index described will become current.&lt;br /&gt;        &lt;br /&gt;        if length is non zero then isStart will set a partial key&lt;br /&gt;        length for the selected index, and will only consider the&lt;br /&gt;        first len bytes of the key during subsequent searches.  this&lt;br /&gt;        will remain in effect until the next isStart call.&lt;br /&gt;        &lt;br /&gt;        the selected location in the index will be flagged as a start&lt;br /&gt;        point, which means that the next call to isRead, if made with&lt;br /&gt;        a search mode of ISNEXT or ISPREV, will return the current&lt;br /&gt;        record, rather than the actual next or previous.  this is often&lt;br /&gt;        useful for initialising next or previous read loops.&lt;br /&gt;        &lt;br /&gt;        after a successful isStart call, isfd-&gt;isrecnum will be set to&lt;br /&gt;        the current record number.&lt;br /&gt;        &lt;br /&gt;        &lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;int isRead( IsFile *isfd, char *data, int mode );&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;isfd:    isam file descriptor&lt;br /&gt;data:    pointer to data buffer to be loaded&lt;br /&gt;mode:    search mode plus optional lock mode&lt;br /&gt;&lt;br /&gt;note:    if successful isfd-&gt;isrecnum will be set to the current record&lt;br /&gt;        number.&lt;br /&gt;&lt;br /&gt;        when isRead is called with ISLOCK, and the record requested&lt;br /&gt;        is currently locked by another process, isRead will return&lt;br /&gt;        ISFALSE with an iserrno value of ELOCKED but will still have&lt;br /&gt;        read the requested record into the data buffer.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;int isIndex( IsFile *isfd, int index );&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;isfd:    isam file descriptor&lt;br /&gt;index:   index number to select&lt;br /&gt;&lt;br /&gt;note:    isIndex is used to select indexes by number.  if index is&lt;br /&gt;        zero then natural order will be selected, otherwise indexes&lt;br /&gt;        are numbered starting at one for the primary index.&lt;br /&gt;        &lt;br /&gt;        isIndex retains a current record pointer for each index.&lt;br /&gt;        after selection the current pointer will be at the record&lt;br /&gt;        selected when the index was last used.&lt;br /&gt;        &lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;int isGoto( IsFile *isfd, long recnum );&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;isfd:    isam file descriptor&lt;br /&gt;recnum:  an existing active record number&lt;br /&gt;&lt;br /&gt;note:    this call will locate the specified record in the current&lt;br /&gt;        index, making it the current index location.&lt;br /&gt;        &lt;br /&gt;        if successful, the specified record image will be found in&lt;br /&gt;        isam-&gt;data.&lt;br /&gt;        &lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;int isData( IsFile *isfd, char *data, long recnum );&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;isfd:    isam file descriptor&lt;br /&gt;data:    pointer to data buffer to be loaded&lt;br /&gt;recnum:  an existing active record number&lt;br /&gt;&lt;br /&gt;note:    isData performs a direct read on the data file, and does not&lt;br /&gt;        disturb the current index pointer, and does not check for&lt;br /&gt;        record locks.  it will return ENOREC if the record requested&lt;br /&gt;        does not exist or has been deleted.&lt;br /&gt;        &lt;br /&gt;        isData is provided primarily as a means of accessing data&lt;br /&gt;        records in as an efficient a manner as possible.&lt;br /&gt;        &lt;br /&gt;        &lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;int isWrite( IsFile *isfd, char *data );&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;isfd:    isam file descriptor&lt;br /&gt;data:    pointer to data record to be written&lt;br /&gt;&lt;br /&gt;note:    if successful this call will add the data record to the data&lt;br /&gt;        file and create an appropriate key in all indexes.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;int isWrLock( IsFile *isfd, char *data );&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;note:    as for isWrite, but the resultant data record will be locked&lt;br /&gt;        on successful return.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;int isWrCurr( IsFile *isfd, char *data );&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;note:    as for isWrite, but the current pointer in the current index&lt;br /&gt;        will be set to the record just written.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;int isDelete( IsFile *isfd, char *data );&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;isfd:    isam file descriptor&lt;br /&gt;data:    data record to be deleted&lt;br /&gt;&lt;br /&gt;note:    the record image passed is expected to contain enough data&lt;br /&gt;        to cover the fields required by the primary index.&lt;br /&gt;        &lt;br /&gt;        if the primary index allows duplicates this call will fail,&lt;br /&gt;        since isDelete has no means of determining exactly which&lt;br /&gt;        record you are referring to.&lt;br /&gt;        &lt;br /&gt;        the original data image can be found in isfd-&gt;data on return.&lt;br /&gt;        &lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;int isDelCurr( IsFile *isfd );&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;isfd:    isam file descriptor&lt;br /&gt;&lt;br /&gt;note:    this call will delete the currently selected record.&lt;br /&gt;        &lt;br /&gt;        the original data image can be found in isfd-&gt;data on return.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;int isDelRec( IsFile *isfd, long recnum );&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;isfd:    isam file descriptor&lt;br /&gt;recnum:  record number to be deleted&lt;br /&gt;&lt;br /&gt;note:    the original data image can be found in isfd-&gt;data on return.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;int isRewrite( IsFile *isfd, char *data );&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;isfd:    isam file descriptor&lt;br /&gt;data:    data image to be updated&lt;br /&gt;&lt;br /&gt;note:    the record to be updated is determined by the contents of&lt;br /&gt;        the primary index fields as found in the data image passed.&lt;br /&gt;        &lt;br /&gt;        if the primary index allows duplicates this call will fail.&lt;br /&gt;        &lt;br /&gt;        the original data image can be found in isfd-&gt;data on return.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;int isRewCurr( IsFile *isfd, char *data );&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;isfd:    isam file descriptor&lt;br /&gt;data:    data record to be updated - the contents of the current record in the data file will be replaced with the image passed.&lt;br /&gt;&lt;br /&gt;note:    the original data image can be found in isfd-&gt;data on return&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;int isRewRec( IsFile *isfd, long recnum, char *data );&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;isfd:    isam file descriptor&lt;br /&gt;recnum:  record number to be replaced&lt;br /&gt;data:    data image with which recnum is to be replaced.&lt;br /&gt;&lt;br /&gt;note:    the original data image can be found in isfd-&gt;data on return&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;int isRewNxt( IsFile *isfd, char *data );&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;isfd:    isam file descriptor&lt;br /&gt;data:    data record to be updated - the contents of the current record in the data file will be replaced with the image passed.&lt;br /&gt;&lt;br /&gt;note:    isRewNxt first sets the current pointer to the next record in&lt;br /&gt;        the current index before updating the original current record.&lt;br /&gt;        &lt;br /&gt;        it is useful in situations where the update would place the&lt;br /&gt;        new record between the original current and next keys in the&lt;br /&gt;        index.&lt;br /&gt;        &lt;br /&gt;        on successful return the application can then read current to&lt;br /&gt;        obtain the record that was next in the sequence before the&lt;br /&gt;        update was performed.&lt;br /&gt;        &lt;br /&gt;        an error code of EENDFILE on an unsuccessful return indicates&lt;br /&gt;        that the update was successful and isRewNxt has reached the&lt;br /&gt;        end of the file.  any other error code indicates a failure&lt;br /&gt;        in the update operation.&lt;br /&gt;        &lt;br /&gt;        the original data image can be found in isfd-&gt;data on return&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;int isLock( IsFile *isfd );&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;isfd:    isam file descriptor&lt;br /&gt;&lt;br /&gt;note:    this call will lock all records in the file against update&lt;br /&gt;        by any process other than the current, or return ELOCKED if&lt;br /&gt;        this is not possible.&lt;br /&gt;        &lt;br /&gt;        &lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;int isUnLock( IsFile *isfd );&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;isfd:    isam file descriptor&lt;br /&gt;&lt;br /&gt;note:    reverses the action of isLock&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;int isRelease( IsFile *isfd );&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;isfd:    isam file descriptor&lt;br /&gt;&lt;br /&gt;note:    this call will release any records that have been manually&lt;br /&gt;        or automatically locked by the current process.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;int isRelRec( IsFile *isfd, long recnum );&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;isfd:    isam file descriptor&lt;br /&gt;recnum:  record number to be unlocked&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;int isRelCurr( IsFile *isfd );&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;isfd:    isam file descriptor&lt;br /&gt;&lt;br /&gt;note:    unlock the currently selected record&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;int isSetUnique( IsFile *isfd, long value );&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;isfd:    isam file descriptor&lt;br /&gt;value:   new unique value starting point&lt;br /&gt;&lt;br /&gt;note:    this will set the value returned by the next call to isUniqueID.&lt;br /&gt;        &lt;br /&gt;        &lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;int isUniqueId( IsFile *isfd, long *value );&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;isfd:    isam file descriptor&lt;br /&gt;value:   pointer to variable to receive value&lt;br /&gt;&lt;br /&gt;note:    the value returned is guaranteed unique for the current file.&lt;br /&gt;        &lt;br /&gt;        &lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;int isIndexInfo( IsFile *isfd, IsKdsc *kdsc, int idx );&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;isfd:    isam file descriptor&lt;br /&gt;kdsc:    pointer to dictinfo or key description structure&lt;br /&gt;idx:     zero for dictinfo, otherwise index number&lt;br /&gt;&lt;br /&gt;note:    this call serves two somewhat different purposes.&lt;br /&gt;&lt;br /&gt;        if idx is zero, then it&apos;s actually expecting you to pass&lt;br /&gt;        a pointer to a dictinfo structure, which will then be&lt;br /&gt;        loaded with information about the current file.  refer to&lt;br /&gt;        isIsamInfo below for a somewhat cleaner method.&lt;br /&gt;        &lt;br /&gt;        if idx is non zero then isIndexInfo will return the specified&lt;br /&gt;        key description, where a value of 1 represents the primary,&lt;br /&gt;        followed by each successive index in the file.&lt;br /&gt;        &lt;br /&gt;        &lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;int isIsamInfo( IsFile *isfd, struct dictinfo *dict );&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;isfd:    isam file descriptor&lt;br /&gt;dict:    pointer to dictinfo structure&lt;br /&gt;&lt;br /&gt;note:    this call will return information about the specified file&lt;br /&gt;        in the structure passed.  the values available are:&lt;br /&gt;        &lt;br /&gt;        short di_nkeys;       /* number of indexes */&lt;br /&gt;        short di_recsize;     /* data record length */&lt;br /&gt;        short di_idxsize;     /* index record block size */&lt;br /&gt;        long  di_nrecords;    /* current record count */&lt;br /&gt;        &lt;br /&gt;  &lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;int isCheckData( IsFile *isfd );&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;isfd:    isam file descriptor&lt;br /&gt;&lt;br /&gt;note:    this routine checks the data file and data file free list for&lt;br /&gt;        errors, and will return a value with the following bits set&lt;br /&gt;        in accordance with it&apos;s findings:&lt;br /&gt;&lt;br /&gt;        IC_DATREAD      0               /* data file read error */&lt;br /&gt;        IC_BADDATA      1               /* data record corrupt */&lt;br /&gt;        IC_DATFREE      2               /* data free list is corrupt */&lt;br /&gt;&lt;br /&gt;        if the return value is zero then no errors were detected.&lt;br /&gt;        &lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;int isCheckIndex( IsFile *isfd, int idx );&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;isfd:    isam file descriptor&lt;br /&gt;int:     key id number, where 1 represents the primary&lt;br /&gt;&lt;br /&gt;note:    this routine checks the specified index for errors, and will&lt;br /&gt;        return a value with the following bits set in accordance with&lt;br /&gt;        it&apos;s findings:&lt;br /&gt;&lt;br /&gt;        IC_IDXREAD      3               /* index file read error */&lt;br /&gt;        IC_ORDER        4               /* key out of order */&lt;br /&gt;        IC_COUNT        5               /* index count mismatch */&lt;br /&gt;        IC_BADMAGIC     6               /* bad index node magic number */&lt;br /&gt;&lt;br /&gt;        if the return value is zero then no errors were detected.&lt;br /&gt;        &lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;int isCheckVarlen( IsFile *isam, struct isVarStat *stats );&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;isfd:    isam file descriptor&lt;br /&gt;stats:   variable length statistics structure, defined in ischeck.h, or NULL to ignore same.&lt;br /&gt;&lt;br /&gt;note:    this routine checks the variable length storage system for&lt;br /&gt;        errors, and will return a value with the following bits set&lt;br /&gt;        in accordance with it&apos;s findings:&lt;br /&gt;        &lt;br /&gt;        IC_VLMISFILE    12              /* node misfiled in hash table */&lt;br /&gt;        IC_VLHASHLINK   13              /* mangled link in hash list */&lt;br /&gt;        IC_VLMISSING    14              /* nodes missing or unaccounted */&lt;br /&gt;        IC_VLBADDATA    15              /* data length mismatch */&lt;br /&gt;        &lt;br /&gt;        it will also optionally load the following fields in stats:&lt;br /&gt;  &lt;br /&gt;        hashcount;      /* number of nodes held in hashtable */&lt;br /&gt;        hashspace;      /* total bytes free space in same */&lt;br /&gt;        fullcount;      /* number of nodes not in hashtable */&lt;br /&gt;        fullspace;      /* total (unusable) space in same */&lt;br /&gt;        filecount;      /* total number of storage nodes in use */&lt;br /&gt;        filespace;      /* total free space for the file */&lt;br /&gt;        &lt;br /&gt;  &lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;machine independent data&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;the library includes the following series of calls to provide a means&lt;br /&gt;of generating data that will be transportable to different machines.&lt;br /&gt;use of these is only required if you require such portability, since&lt;br /&gt;the library will accept native formats without complaint.&lt;br /&gt;&lt;br /&gt;int ldInt( char *pad );&lt;br /&gt;int stInt( int value, char *pad );&lt;br /&gt;long ldLong( char *pad );&lt;br /&gt;int stLong( long value, char *pad );&lt;br /&gt;int stChar( char *pad, char *str, int len );&lt;br /&gt;int ldChar( char *pad, int len, char *str );&lt;br /&gt;double ldFloat( char *pad );&lt;br /&gt;int stFloat( double value, char *pad );&lt;br /&gt;double ldDbl( char *pad );&lt;br /&gt;int stDbl( double value, char *pad );&lt;br /&gt;int stFltNull( double value, char *pad, short *null );&lt;br /&gt;double ldFltNull( char *pad, short *null );&lt;br /&gt;int stDblNull( double value, char *pad, short *null );&lt;br /&gt;double ldDblNull( char *pad, short *null );&lt;br /&gt;&lt;br /&gt;in all of the above, st identifies calls that will place a value in&lt;br /&gt;the specified location, which can then be retrieved by the matching&lt;br /&gt;ld call.  the null suffix calls will load the variable passed (by&lt;br /&gt;address) in the last parameter with a boolean ISTRUE if the associated&lt;br /&gt;value is zero, or ISFALSE if not.&lt;br /&gt;&lt;br /&gt;all pads referred to should be the size of the associated data type,&lt;br /&gt;with the exception of ldInt/stInt, which refer to a two byte integer,&lt;br /&gt;regardless of the native word size.&lt;br /&gt;&lt;br /&gt;note that the float and double calls do not perform any actual data&lt;br /&gt;conversion, and are provided as a means of avoiding data alignment&lt;br /&gt;problems.  the int and long calls will perform byte order reversal&lt;br /&gt;(sometimes referred to as swabbing) on platforms where the least&lt;br /&gt;significant byte is found at the beginning of the field.&lt;br /&gt;&lt;br /&gt;note also that ldint and stint operate on short (2 byte) integers,&lt;br /&gt;although the value and return are passed in the natural word size.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;isam indexes&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;        &lt;br /&gt;isam indexes are defined/described by means of the keydesc structure.&lt;br /&gt;&lt;br /&gt;the following is an example of the basic procedure, and describes an&lt;br /&gt;index that allows duplicates, has full compression, and consists of&lt;br /&gt;two fields - a machine independent integer taken from the first two&lt;br /&gt;bytes of the record, and a character string from the seventh through&lt;br /&gt;sixteenth bytes.&lt;br /&gt;&lt;br /&gt;struct keydesc key;&lt;br /&gt;&lt;br /&gt;key.k_flags = ISDUPS+ISCOMPRESS;        /* see index flags */&lt;br /&gt;key.k_nparts = 2;                       /* number of fields involved */&lt;br /&gt;key.k_part[0].kp_start = 0;             /* offset in data record */&lt;br /&gt;key.k_part[0].kp_leng = INTSIZE;        /* length */&lt;br /&gt;key.k_part[0].kp_type = INTTYPE;        /* type */&lt;br /&gt;key.k_part[1].kp_start = 7;             /* offset in data record */&lt;br /&gt;key.k_part[1].kp_leng = 10 * CHARSIZE;  /* length */&lt;br /&gt;key.k_part[1].kp_type = CHARTYPE;       /* type */&lt;br /&gt;&lt;br /&gt;this structure is then passed to isBuild, isAddIndex, or isStart.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;index flag values - these apply to the index as a whole&lt;br /&gt;&lt;br /&gt;ISNODUPS        no duplicates permitted&lt;br /&gt;ISDUPS          duplicates permitted&lt;br /&gt;DCOMPRESS       compress duplicates&lt;br /&gt;LCOMPRESS       leading compression&lt;br /&gt;TCOMPRESS       trailing space compression&lt;br /&gt;COMPRESS        full compression&lt;br /&gt;TNULL		compress on nulls in TCOMPRESS&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;individual index component/part/field types&lt;br /&gt;&lt;br /&gt;CHARTYPE        0     array of bytes/characters&lt;br /&gt;INTTYPE         1     two byte (short) integer&lt;br /&gt;LONGTYPE        2     four byte (long) integer&lt;br /&gt;DOUBLETYPE      3     ieee double floating point&lt;br /&gt;FLOATTYPE       4     ieee single floating point&lt;br /&gt;MINTTYPE        5     machine (native) short&lt;br /&gt;MLONGTYPE       6     machine (native) long&lt;br /&gt;&lt;br /&gt;ISDESC          0x80  add to individual parts for descending order&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;it is generally advisable to provide some callable means of loading&lt;br /&gt;your key descriptions into a keydesc structure, or to provide some&lt;br /&gt;other means of easy access, since they will be needed for selecting&lt;br /&gt;indexes via isStart.&lt;br /&gt;&lt;br /&gt;you will also need to exercise caution when using CHARTYPE fields&lt;br /&gt;as the library does not recognise null terminated strings.  in other&lt;br /&gt;words, if you&apos;re referring to a 10 byte wide character field, and it&lt;br /&gt;contains a seven byte string, a null terminator and 2 garbage bytes&lt;br /&gt;following the null, the library will build a key 10 bytes in length&lt;br /&gt;that includes the null and trailing garbage.  this key might prove&lt;br /&gt;difficult to locate later..&lt;br /&gt;&lt;br /&gt;the officially approved solution is to use the included stchar() and&lt;br /&gt;ldchar() calls, which will pad the string passed with spaces on store&lt;br /&gt;and replace the null terminator on load.&lt;br /&gt;&lt;br /&gt;note also that trailing compression operates on strings of trailing&lt;br /&gt;spaces, so the fairly common practice of padding the remainder of&lt;br /&gt;the field with nulls could result in inefficient operation where&lt;br /&gt;trailing compression is expected.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;open modes&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;        &lt;br /&gt;there are two different groups of open modes used by the isOpen and&lt;br /&gt;isBuild calls.  the first group describes the operations which the&lt;br /&gt;current process will be allowed to perform, while the latter controls&lt;br /&gt;what forms of external access will be permitted.  you must chose one&lt;br /&gt;from each list.&lt;br /&gt;&lt;br /&gt;ISINPUT     open file for reading only&lt;br /&gt;ISOUTPUT    open file for writing only&lt;br /&gt;ISINOUT     open file for both reading and writing&lt;br /&gt;ISSYNCWR    all writes flushed to disk before return&lt;br /&gt;      &lt;br /&gt;ISMANULOCK  record locks placed manually&lt;br /&gt;ISAUTOLOCK  record locks placed automatically on read&lt;br /&gt;ISEXCLLOCK  exclusive access to index and data&lt;br /&gt;ISRDONLY    read only - no locking&lt;br /&gt;&lt;br /&gt;ISVARLEN    variable length records - see varlen.ref&lt;br /&gt;ISVARCMP    RLE compressed varlen data&lt;br /&gt;ISNOCARE    open either fixed or variable length&lt;br /&gt;&lt;br /&gt;ISMASKED    index masking option - see mask.ref&lt;br /&gt;&lt;br /&gt;ISTRANS     transaction processing - see trans.ref&lt;br /&gt;ISNOLOG     disable logging - see trans.ref&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;NOTE: ISSYNCWR is only active for systems that permit O_SYNC in the&lt;br /&gt;      file open call.  this precludes most DOS flavoured systems.&lt;br /&gt;    &lt;br /&gt;     &lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;search modes&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;all isRead operations act on the currently selected index.&lt;br /&gt;&lt;br /&gt;ISFIRST     select the first record in the index&lt;br /&gt;ISLAST      select the last record in the index&lt;br /&gt;&lt;br /&gt;ISEQUAL     search for and return the first exact match, or error&lt;br /&gt;ISGTEQ      search for first exact match, or next greater&lt;br /&gt;ISGREAT     search for the next greatest key in the index&lt;br /&gt;&lt;br /&gt;ISNEXT      skip to the next key in the index&lt;br /&gt;ISPREV      skip to the previous key in the index&lt;br /&gt;ISCURR      reread the current location.&lt;br /&gt;&lt;br /&gt;note        ISNEXT and ISPREV behave differently when used in isRead&lt;br /&gt;            immediately after in isStart call in that they will return&lt;br /&gt;            the current rather than the next/previous record.&lt;br /&gt;            &lt;br /&gt;            this is a feature, not a bug.  the intention is to allow&lt;br /&gt;            isStart to function as an initialisation call preceding&lt;br /&gt;            a read next/previous loop, as in the following:&lt;br /&gt;            &lt;br /&gt;            isStart( isfd, &amp;secondary_index, 0, NULL, ISFIRST );&lt;br /&gt;            while( isRead( isfd, data_pointer, ISNEXT ) )&lt;br /&gt;              display_data( data_pointer );&lt;br /&gt;              &lt;br /&gt;            the above will read the contents of isfd from the top in&lt;br /&gt;            secondary_index order.&lt;br /&gt;           &lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;lock modes&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;these are added to the search mode in isRead to lock or wait for the&lt;br /&gt;release of the selected record.&lt;br /&gt;&lt;br /&gt;ISLOCK      lock the selected record against external update&lt;br /&gt;ISWAIT      wait until the selected record has been released&lt;br /&gt;ISLCKW      wait for and unlock the selected record&lt;br /&gt;&lt;br /&gt;ISLOCK will return an ELOCKED error if the selected record has been&lt;br /&gt;locked, but will still return the selected record image.  this allows&lt;br /&gt;the process to read an externally locked record, but warns that updates&lt;br /&gt;will not be permitted.&lt;br /&gt;&lt;br /&gt;ISWAIT and ISLCKW do no deadlock processing, and will wait forever, so&lt;br /&gt;applications should be coded appropriately.&lt;br /&gt;&lt;br /&gt;the isLock, isUnLock, isRelease, isRelRec and isRelCurr group of&lt;br /&gt;functions provide further control over record locking, and you can&lt;br /&gt;also use ISEXCLLOCK to lock other processes out of a file completely.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;error codes&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;in addition to the standard operating system error codes, the library&lt;br /&gt;will return the following values in isfd-&gt;iserrno where appropriate.&lt;br /&gt;&lt;br /&gt;EDUPL     100   illegal duplicate&lt;br /&gt;ENOTOPEN  101   file not open&lt;br /&gt;EBADARG   102   illegal argument&lt;br /&gt;EBADKEY   103   illegal key description&lt;br /&gt;EBADFILE  105   isam file is corrupt&lt;br /&gt;ENOTEXCL  106   can&apos;t get exclusive access&lt;br /&gt;ELOCKED   107   record is locked&lt;br /&gt;EKEXISTS  108   index already defined&lt;br /&gt;EENDFILE  110   start or end file reached&lt;br /&gt;ENOREC    111   record not found&lt;br /&gt;ENOCURR   112   no current record&lt;br /&gt;EFLOCKED  113   file is locked&lt;br /&gt;EFNAME    114   file name is too long&lt;br /&gt;EBADMEM   116   can&apos;t allocate memory&lt;br /&gt;ENOPRIM   127   no primary key&lt;br /&gt;&lt;br /&gt;when the library returns a system error code it will also load&lt;br /&gt;isfd-&gt;iserrio with the sum of the following two groups of values:&lt;br /&gt;&lt;br /&gt;IO_IDX    0x01  index file&lt;br /&gt;IO_DAT    0x02  data file&lt;br /&gt;&lt;br /&gt;IO_OPEN   0x10  while opening&lt;br /&gt;IO_CREA   0x20  while creating&lt;br /&gt;IO_SEEK   0x30  while seeking&lt;br /&gt;IO_READ   0x40  while reading&lt;br /&gt;IO_WRIT   0x50  while writing&lt;br /&gt;IO_LOCK   0x60  while locking&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------  &lt;br /&gt;Worldwide Copyright (c) Byte Designs Ltd (2009)&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;
 </content>
 </entry>
<entry>
<title type='text'>answers to frequently asked questions</title>
<id>answers_to_frequently_asked_que</id>
<updated>2009-10-13T20:06:40.290-07:00</updated>
<link href='http://isam.ca/products/disam/d7/refs.html#answers_to_frequently_asked_que'/>
<content type='html'>
 answers to frequently asked questions&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;Q: i&apos;m sure i have compiled the library properly, and i am sure i&lt;br /&gt;   have the right linker commands, but i keep getting unresolved&lt;br /&gt;   references to base library (isUppperCase) functions..&lt;br /&gt;&lt;br /&gt;A: if you&apos;re linking wrapper (islowercase) calls then it is possible&lt;br /&gt;   your linker resolves references canonically - in a single pass&lt;br /&gt;   through the listed libraries.  linker objects should be listed&lt;br /&gt;   in order of precedence - object module(s), wrapper lib, base lib.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Q: everything appears to compile normally, but i sometimes get&lt;br /&gt;   &quot;FATAL iscomp.c(55)&quot; when trying to read or update my files&lt;br /&gt;   &lt;br /&gt;A: your compiler is probably defaulting char types to unsigned -&lt;br /&gt;   you will need to set your compiler to produce signed char types&lt;br /&gt;   by default, and rebuild the library.&lt;br /&gt;&lt;br /&gt;   &lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;Worldwide Copyright (c) Byte Designs Ltd (2009)&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;
 </content>
 </entry>
<entry>
<title type='text'>suggestions, pitfalls and defenses</title>
<id>suggestions_pitfalls_and_defens</id>
<updated>2009-10-13T20:06:31.970-07:00</updated>
<link href='http://isam.ca/products/disam/d7/refs.html#suggestions_pitfalls_and_defens'/>
<content type='html'>
 suggestions, pitfalls and defenses&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;long duplicate chains&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;if you are using keys that will result in a large number of duplicate&lt;br /&gt;records, you should be warned that deletes and rewrites within these&lt;br /&gt;can become painfully slow.  this is due to the fact that, when you&lt;br /&gt;request an update or delete, the library is forced to start at the&lt;br /&gt;beginning of the chain and read sequentially through each looking&lt;br /&gt;for the record number you are referring to.&lt;br /&gt;&lt;br /&gt;the isam standard does not currently appear to offer a solution to&lt;br /&gt;this problem, but if anyone has any suggestions you can be sure we&apos;ll&lt;br /&gt;be interested.&lt;br /&gt;&lt;br /&gt;if this is a concern, specifically during long update runs that will&lt;br /&gt;be doing a large amount of duplicate key changes, you might wish to&lt;br /&gt;consider deleting the offending indexes before you start, and adding&lt;br /&gt;them again after the run is complete.  this is potentially dangerous,&lt;br /&gt;of course, but the advantages will be significantly faster processing&lt;br /&gt;times and better balanced trees on completion.&lt;br /&gt;&lt;br /&gt;long duplicate chains are not a problem when writing or reading, since&lt;br /&gt;writes get tacked onto the end of the chain, and reads are sequential&lt;br /&gt;by definition.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;duplicate open files&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;isam allows you to open the same file many times within a given&lt;br /&gt;process.  cisam and older disam also allowed some rather dangerous&lt;br /&gt;operations on these files.  for instance:&lt;br /&gt;&lt;br /&gt;fd = build file&lt;br /&gt;erase file&lt;br /&gt;write records to fd&lt;br /&gt;close file&lt;br /&gt;&lt;br /&gt;none of the above will return any errors, but you won&apos;t be able&lt;br /&gt;to open the file again because it has been erased from the file&lt;br /&gt;system - everything written has been discarded.&lt;br /&gt;&lt;br /&gt;the ISDUPLOCKS option in isconfig.h, when set to a value of one,&lt;br /&gt;will prevent the library from erasing or renaming files which are&lt;br /&gt;already open in the current process.&lt;br /&gt;&lt;br /&gt;when ISDUPLOCKS is zero this will not be enforced, and it is up to&lt;br /&gt;the application to apply the appropriate degree of caution.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------  &lt;br /&gt;COMPRESS/LCOMPRESS/TCOMPRESS  &lt;br /&gt;&lt;br /&gt;ISKCOMP 0&lt;br /&gt;due to fixed index file format specifications, a single char is used&lt;br /&gt;to store the number of leading compressed bytes and another to store&lt;br /&gt;the number of trailing compressed bytes. this forces a limitation&lt;br /&gt;of 255 bytes ( max unsigned char ) for compressed key size,&lt;br /&gt;regardless of ISMAXKEY setting to ensure full compression of all&lt;br /&gt;trailing spaces or nulls for TCOMPRESS, and all leading duplicate&lt;br /&gt;characters for LCOMPRESS.&lt;br /&gt;&lt;br /&gt;ISKCOMP 1&lt;br /&gt;allows compressed key sizes larger than 255 bytes, but will only&lt;br /&gt;permit partial compression on leading and trailing characters.&lt;br /&gt;a maximum of 255 leading duplicate characters, and 255 trailing &lt;br /&gt;spaces or nulls will be compressed.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------  &lt;br /&gt;Worldwide Copyright (c) Byte Designs Ltd (2009)&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;
 </content>
 </entry>
<entry>
<title type='text'>audit trail mechanism</title>
<id>audit_trail_mechanism</id>
<updated>2009-10-13T20:06:24.073-07:00</updated>
<link href='http://isam.ca/products/disam/d7/refs.html#audit_trail_mechanism'/>
<content type='html'>
 audit trail mechanism&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;ISAUDIT settings in isconfig.h&lt;br /&gt;&lt;br /&gt;   0 - no audit functionality&lt;br /&gt;   1 - audit writes, updates and deletes&lt;br /&gt;   2 - audit writes only&lt;br /&gt;   3 - audit deletes only&lt;br /&gt;   4 - audit updates only&lt;br /&gt;   5 - audit writes and deletes&lt;br /&gt;   6 - audit writes and updates&lt;br /&gt;   7 - audit deletes and updates&lt;br /&gt; &lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;int isAudit( IsFile *isfd, char *pad, int mode );&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;isfd    isam file descriptor&lt;br /&gt;pad     pointer to pad, usage dependent on mode&lt;br /&gt;mode    operation mode, see below&lt;br /&gt;&lt;br /&gt;note    mode is one of the following:&lt;br /&gt;&lt;br /&gt;        AUDSTART        start recording&lt;br /&gt;        AUDSTOP         stop recording&lt;br /&gt;        AUDSETNAME      name and path of audit file&lt;br /&gt;        AUDGETNAME      return current name and path&lt;br /&gt;        AUDINFO         recording status&lt;br /&gt;        &lt;br /&gt;        start and stop do not refer to pad, setname and getname will&lt;br /&gt;        store and retrieve (respectively) a null terminated string&lt;br /&gt;        from or to pad.  audinfo will set the first byte of pad to&lt;br /&gt;        a value of zero (stopped) or one (active).&lt;br /&gt;        &lt;br /&gt;        there are a couple of obvious caveats:&lt;br /&gt;        &lt;br /&gt;        do not start recording until you have set a file name.&lt;br /&gt;        be careful not to use the same audit file for more than&lt;br /&gt;        one file.&lt;br /&gt;        the filename cannot be longer than 64 characters.&lt;br /&gt;        &lt;br /&gt;        isAudit generally returns an EBADARG error if you do some-&lt;br /&gt;        thing wrong.&lt;br /&gt;        &lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;installation&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;audit trail support is activated by setting ISAUDIT to a value of 1&lt;br /&gt;in isconfig.h before compiling the library.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;notes and caveats&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;the audit trail is essentially a more streamlined alternative to the&lt;br /&gt;full featured transaction processing option.  only updates to the file&lt;br /&gt;are tracked, and the processing overhead is less.  while there is no&lt;br /&gt;harm in having both options active in your library at the same time,&lt;br /&gt;it would be somewhat redundant to have both in use on the same file.&lt;br /&gt;&lt;br /&gt;two things to be aware of:&lt;br /&gt;&lt;br /&gt;the audit trail impacts the overall efficiency of the library - if&lt;br /&gt;you do not plan to use it, you would probably be best advised to leave&lt;br /&gt;it inactive.&lt;br /&gt;&lt;br /&gt;once a file has been designated as having an audit trail, and even if&lt;br /&gt;the trail is currently in the inactive state (AUDSTOP&apos;ed), updates to&lt;br /&gt;the file will be slower because the design (not our fault, talk to the&lt;br /&gt;cisam people) requires that the status be checked each time the file&lt;br /&gt;is updated by another process.  this is only the case when the file is&lt;br /&gt;open by multiple processes.&lt;br /&gt;&lt;br /&gt;this information presented mostly for reference - the actual impact&lt;br /&gt;is reportedly quite minimal under all platforms tested.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;the format of the audit trail consists of a header record followed by&lt;br /&gt;a data image, repeated sequentially.  in the case of variable length&lt;br /&gt;files, an additional 2 bytes are included to give the record length.&lt;br /&gt;all values are stored in machine independent (ldint/ldlong) format.&lt;br /&gt;&lt;br /&gt;struct audhead                          /* audit record header format */&lt;br /&gt;  {&lt;br /&gt;  char au_type[2];                      /* record type (aa/dd/rr/ww) */&lt;br /&gt;  char au_time[4];                      /* date and time */&lt;br /&gt;  char au_procid[2];                    /* process id */&lt;br /&gt;  char au_userid[2];                    /* user id */&lt;br /&gt;  char au_recnum[4];                    /* record number */&lt;br /&gt;  char au_reclen[2];                    /* record length if variable */&lt;br /&gt;  };&lt;br /&gt;&lt;br /&gt;#define AUDHEADSIZE     14              /* audit header length */&lt;br /&gt;#define VAUDHEADSIZE    16              /* if variable length */&lt;br /&gt;&lt;br /&gt;type codes are translated as follows:&lt;br /&gt;&lt;br /&gt;aa - record added to file&lt;br /&gt;dd - record deleted from file&lt;br /&gt;rr - record image before rewriting&lt;br /&gt;ww - record image after rewriting&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------  &lt;br /&gt;Worldwide Copyright (c) Byte Designs Ltd (2009)&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;
 </content>
 </entry>
<entry>
<title type='text'>large files - 64bit implementation</title>
<id>large_files_-_64bit_implementat</id>
<updated>2009-10-13T20:06:19.384-07:00</updated>
<link href='http://isam.ca/products/disam/d7/refs.html#large_files_-_64bit_implementat'/>
<content type='html'>
 large files - 64bit implementation&lt;br /&gt;---------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt; as of version 6.12 we have attempted to implement 64bit support for&lt;br /&gt; large files. todate most unix platforms as well as NT are supported. &lt;br /&gt; as more systems develop 64bit capability we will add the same support for&lt;br /&gt; disam. we have attempted to make switching to 64bit support as&lt;br /&gt; simple as setting a compile time flag..ISHUGE found in isconfig.h. you&lt;br /&gt; may need to redefine the ISHUGE related settings for OFFT and UOFFT,&lt;br /&gt; depending on how your OS handles large file support and lseek offsets.&lt;br /&gt; second level support can be found in isbase.h where platform specific&lt;br /&gt; functions such as lseek64 are defined. &lt;br /&gt;&lt;br /&gt; please let us know if you require 64bit functionality for your platform,&lt;br /&gt; or if you successfully manage to get 64bit working on any platform not&lt;br /&gt; currently setup.&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------------&lt;br /&gt;Worldwide Copyright (c) Byte Designs Ltd (2009)&lt;br /&gt;---------------------------------------------------------------------------&lt;br /&gt;
 </content>
 </entry>
<entry>
<title type='text'>custom key types</title>
<id>custom_key_types</id>
<updated>2009-10-13T20:06:11.688-07:00</updated>
<link href='http://isam.ca/products/disam/d7/refs.html#custom_key_types'/>
<content type='html'>
 custom key types&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;the following steps are required to add your own custom keys:&lt;br /&gt;&lt;br /&gt;set ISCUSTOM to 1 in isconfig.h&lt;br /&gt;&lt;br /&gt;set ISCUSTKEYS to 1 in base/iscustom.h, and add defines for the key&lt;br /&gt;type(s) and size(s) you require.&lt;br /&gt;&lt;br /&gt;add a case for each key type to the switch statement in isCustCmp()&lt;br /&gt;in base/iscustom.c.  each case should set retc to a negative value&lt;br /&gt;if key one is less than key two, positive if greater, and zero if&lt;br /&gt;equal.&lt;br /&gt;&lt;br /&gt;remove the sample key types unless you need them.&lt;br /&gt;&lt;br /&gt;include iscustom in your makefile.&lt;br /&gt;&lt;br /&gt;NOTE: be careful, if/when applying updates, that you do not overwrite&lt;br /&gt;      any changes you have made to the base files.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------  &lt;br /&gt;Worldwide Copyright (c) Byte Designs Ltd (2009)&lt;br /&gt;---------------------------------------------------------------------
 </content>
 </entry>
<entry>
<title type='text'>design concepts</title>
<id>design_concepts</id>
<updated>2009-10-13T20:05:59.520-07:00</updated>
<link href='http://isam.ca/products/disam/d7/refs.html#design_concepts'/>
<content type='html'>
 design concepts&lt;br /&gt;----------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;in order to facilitate thread safe programming, the core library has&lt;br /&gt;been developed to use isam file descriptor structures, rather than&lt;br /&gt;the standard integral handle concept.  the external function calls&lt;br /&gt;are named after the original function names, but use capital letters&lt;br /&gt;to keep them separate, as in isOpen rather than isopen.  the status&lt;br /&gt;and information globals, such is iserrno and iserrio, have been&lt;br /&gt;eliminated, and each file descriptor now carries it&apos;s own copy. &lt;br /&gt;  &lt;br /&gt;the standard (lower case) calls are provided as an optional wrapper&lt;br /&gt;layer which maintains a dictionary of descriptors to allow mapping&lt;br /&gt;via the standard integer file handles.  it also defines and passes&lt;br /&gt;the standard global variables.&lt;br /&gt;&lt;br /&gt;----------------------------------------------------------------------&lt;br /&gt;conventions&lt;br /&gt;----------------------------------------------------------------------&lt;br /&gt; &lt;br /&gt;all public library function names start with &apos;is&apos; and use capital&lt;br /&gt;letters to distinguish keywords.&lt;br /&gt;  &lt;br /&gt;all structure definitions and typedefs start with a capital letter,&lt;br /&gt;and use the same capitalisation rules to distinguish keywords.&lt;br /&gt;  &lt;br /&gt;the posix standard system calls are wrapped in functions prefixed&lt;br /&gt;by is and an underscore.&lt;br /&gt;  &lt;br /&gt;local support routines in each module are named in lowercase.&lt;br /&gt;&lt;br /&gt;macro definitions are all capitals.&lt;br /&gt;  &lt;br /&gt;virtually all entry and internal functions return TRUE on success&lt;br /&gt;and FALSE on failure.  TRUE is defined as 1, FALSE is 0.&lt;br /&gt;  &lt;br /&gt; &lt;br /&gt;----------------------------------------------------------------------&lt;br /&gt;buffering&lt;br /&gt;----------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;the tree node buffering system operates by handing node images which&lt;br /&gt;are no longer part of the current path to a storage mechanism.  each&lt;br /&gt;index carries it&apos;s own path list and storage array.&lt;br /&gt;&lt;br /&gt;a single linked list holds the current path and facilitates traversal&lt;br /&gt;without having to move data around.  the node description structures,&lt;br /&gt;which contain current status information and a copy of the node disk&lt;br /&gt;image, are are passed to and from the path list and the buffer array&lt;br /&gt;as pointers.&lt;br /&gt;  &lt;br /&gt;the buffer cache is currently optimised on a last in first out basis.&lt;br /&gt;it might be worthwhile to consider optimising this further by giving&lt;br /&gt;a degree of precedence to nodes from lower levels in the tree, on the&lt;br /&gt;assumption that these will take more hits.&lt;br /&gt;  &lt;br /&gt;buffers are flagged invalid whenever the index file header transaction&lt;br /&gt;count has been changed by another process, and will be refreshed as&lt;br /&gt;required.&lt;br /&gt;  &lt;br /&gt;at some point in the future, at the cost of cisam concurrency, it may&lt;br /&gt;be worthwhile to consider designing a more detailed currency control&lt;br /&gt;which would maintain separate transaction counts for each index, and&lt;br /&gt;perhaps additional counts for the index and data free lists, variable&lt;br /&gt;length storage space, and so on.&lt;br /&gt;  &lt;br /&gt;the same buffering system provides a failsafe error recovery method&lt;br /&gt;in which updated node images are flagged invalid on error, which then&lt;br /&gt;results in a forced refresh before the image can be used again.  this&lt;br /&gt;method allows for optimistic updates, eliminating the need to check&lt;br /&gt;first before embarking on potentially illegal updates.  see error&lt;br /&gt;handling below for more details.&lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;----------------------------------------------------------------------&lt;br /&gt;uncompressed (flat) versus compressed indexes&lt;br /&gt;----------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;for the dual purpose of keeping the code cleaner and to improve&lt;br /&gt;performance, the index handling routines are split into separate&lt;br /&gt;functions where the associated handling is markedly different.&lt;br /&gt;&lt;br /&gt;flat indexes, in general, can be operated on mathematically, lend&lt;br /&gt;themselves to shell searches, and permit the current key value to&lt;br /&gt;be a simple pointer into the node image.&lt;br /&gt;&lt;br /&gt;compressed indexes require that each node be searched in a linear&lt;br /&gt;fashion, building the key image in an allocated buffer en route,&lt;br /&gt;and generally require a fair amount more processing to operate.&lt;br /&gt;&lt;br /&gt;the index handing and manipulation modules - isnode, isgrow and&lt;br /&gt;isprune - all adhere to this standard.  the decision as to which&lt;br /&gt;handling method to apply is made at the top level, eliminating the&lt;br /&gt;need for myriad if-then-else tests during processing.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;----------------------------------------------------------------------&lt;br /&gt;error handling&lt;br /&gt;----------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;the new library deals with errors via setjmp/longjmp.  each external&lt;br /&gt;entry point is responsible for initialising a jump buffer and mode&lt;br /&gt;flag in the file descriptor.  when an error is detected the thread&lt;br /&gt;is passed to an error handling routine which sets the error codes&lt;br /&gt;and drops the index locks before returning control the entry call.&lt;br /&gt;&lt;br /&gt;the error handling routine is also responsible for clearing the&lt;br /&gt;update buffers when triggered in write mode.&lt;br /&gt;&lt;br /&gt;the nature of setjmp/longjmp means that it appears to the calling&lt;br /&gt;function as if the ISFAIL call, made initially to initialise the&lt;br /&gt;jump buffer, had returned TRUE.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------  &lt;br /&gt;Worldwide Copyright (c) Byte Designs Ltd (2009)&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;
 </content>
 </entry>
<entry>
<title type='text'>disam client/server reference</title>
<id>disam_clientserver_reference</id>
<updated>2009-10-13T20:05:50.103-07:00</updated>
<link href='http://isam.ca/products/disam/d7/refs.html#disam_clientserver_reference'/>
<content type='html'>
 disam client/server reference&lt;br /&gt;------------------------------------------------------------------------------&lt;br /&gt;to access isam filesets on remote machines set ISCLIENT in isconfig.h to 1&lt;br /&gt;prior to compiling the Disam library. link your application code on the&lt;br /&gt;client to the Disam library as well as to the platforms socket library/&lt;br /&gt;libraries (SCO-libsocket.a, SUN-libsocket.a and libnsl.a, NT-wsock32.lib).&lt;br /&gt;before executing the application you must start the server program,&lt;br /&gt;risamsrv on your server machine. this program may be run in foreground or &lt;br /&gt;back ground mode. risamsrv - listens for requests from the client and &lt;br /&gt;excutes the isam calls passed from the client program on the isam files&lt;br /&gt;on the server machine.&lt;br /&gt;&lt;br /&gt;** important: the risamsrv executable expects ISMAXPARTS in isconfig.h&lt;br /&gt;to be set to the default setting of 20. If you&apos;ve compiled your client&lt;br /&gt;Disam library with a setting other than 20..please contact Byte Designs&lt;br /&gt;so we may customize risamsrv to suit your client library configuration.&lt;br /&gt;--------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;there are two ways to let disam know where the remote files exist:&lt;br /&gt;&lt;br /&gt;     i) specify the ip of the remote machine as well as the full path&lt;br /&gt;        of the filename when opening the isam fileset.&lt;br /&gt;&lt;br /&gt;        e.g. strcpy( filename, &quot;//209.99.99.9/isampath/testfile&quot; );&lt;br /&gt;             fd = isopen( filename, ISINOUT + ISMANULOCK );&lt;br /&gt;&lt;br /&gt; -or-&lt;br /&gt;&lt;br /&gt;   ii) set the environment variable on the client machine to the ip address&lt;br /&gt;       of the server machine where the isam files reside:&lt;br /&gt;&lt;br /&gt;      RISAMHOST = 209.99.99.9&lt;br /&gt;&lt;br /&gt;Disam determines if a fileset is local or remote by checking for the prefix&lt;br /&gt;of &quot;//&quot; on unix or &quot;\\\\&quot; on dos, win, nt in the filename. if mutiple slashes&lt;br /&gt;prefix a filename without an ip address..Disam expects RISAMHOST to be set.&lt;br /&gt;if no multiple slashes prefix a filename/path Disam defaults to local path/&lt;br /&gt;filename.&lt;br /&gt;&lt;br /&gt;as well as the standard group of isam calls, Disam also support remote&lt;br /&gt;system calls such as open/sopen, read, write, lseek etc..these are called&lt;br /&gt;be prefixing the call with r for example rread()/rwrite().&lt;br /&gt;&lt;br /&gt;Disam client/server code defaults the remote port number to 5002. If this&lt;br /&gt;port number is already in use you may bypass the default by setting the &lt;br /&gt;environment variable RISAMPORT to the port number you wish to use.&lt;br /&gt;&lt;br /&gt;------------------------------------------------------------------------------&lt;br /&gt;Worldwide Copyright (c) Byte Designs Ltd (2009)&lt;br /&gt;------------------------------------------------------------------------------&lt;br /&gt;
 </content>
 </entry>
<entry>
<title type='text'>dcheck</title>
<id>dcheck</id>
<updated>2009-10-13T20:05:41.734-07:00</updated>
<link href='http://isam.ca/products/disam/d7/refs.html#dcheck'/>
<content type='html'>
 dcheck&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;dcheck - isam file integrity check/repair utility&lt;br /&gt;&lt;br /&gt;usage - dcheck [-hifbB] &lt;isamfile&gt; [...]&lt;br /&gt;&lt;br /&gt;options - h - display isam header information only&lt;br /&gt;          i - just check indexes, ignore data file&lt;br /&gt;          f - fix corrupt indexes&lt;br /&gt;          b - rebuild all indexes&lt;br /&gt;          B - rebuild specific index&lt;br /&gt;&lt;br /&gt;the option string, preceded by a dash, can be placed anywhere on the&lt;br /&gt;command line.  all options must be specified in one string, and all&lt;br /&gt;options apply to all files specified.&lt;br /&gt;&lt;br /&gt;the -B option is a little different.  it can be specified multiple&lt;br /&gt;times, and each occurance must be followed by an index number.  a&lt;br /&gt;value of 1 denotes the primary index, 2 the next, etc.  you cannot&lt;br /&gt;specify -B on multiple files.&lt;br /&gt;&lt;br /&gt;dcheck is not interactive, and will ask no questions, so it can be&lt;br /&gt;safely used in batch and script files without operator intervention.&lt;br /&gt;&lt;br /&gt;dcheck has been designed to run co-operatively ( unless -f or -b&lt;br /&gt;specified ) on files in active use, but note that other processes&lt;br /&gt;will be blocked for the duration of some of the check cycles.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------  &lt;br /&gt;Worldwide Copyright (c) Byte Designs Ltd (2009)&lt;br /&gt;---------------------------------------------------------------------
 </content>
 </entry>
<entry>
<title type='text'>dpack</title>
<id>dpack</id>
<updated>2009-10-13T20:05:34.629-07:00</updated>
<link href='http://isam.ca/products/disam/d7/refs.html#dpack'/>
<content type='html'>
 dpack&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;dpack - isam file pack/rebuild utility&lt;br /&gt;&lt;br /&gt;usage - dpack &lt;isamfile&gt; [...]&lt;br /&gt;&lt;br /&gt;dpack takes a list of one or more isam files and will rebuild each&lt;br /&gt;in turn.  it works by building a temporary copy of the original file&lt;br /&gt;and copying all active data records to it, then deleting the original&lt;br /&gt;and renaming the working copy.&lt;br /&gt;&lt;br /&gt;the temporary file is created in the same directory as the original&lt;br /&gt;and is named dpnnnnn, where nnnnn is the current process id.&lt;br /&gt;&lt;br /&gt;you must ensure that you have write permission on the data directory&lt;br /&gt;and that there is enough room for dpack to build the working copy.&lt;br /&gt;&lt;br /&gt;dpack will fail if it cannot obtain an exclusive lock on the file.&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------  &lt;br /&gt;Worldwide Copyright (c) Byte Designs Ltd (2009)&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;
 </content>
 </entry>
<entry>
<title type='text'>dreport (new)</title>
<id>dreport_new</id>
<updated>2009-10-13T20:05:28.005-07:00</updated>
<link href='http://isam.ca/products/disam/d7/refs.html#dreport_new'/>
<content type='html'>
 dreport&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;dreport - create .xml, .csv or .txt output from isam data&lt;br /&gt;&lt;br /&gt;usage - dreport &lt;inputxmlfile&gt; &lt;outputfile noextension&gt;&lt;br /&gt;&lt;br /&gt;dreport takes an .xml format input file that provides the report details,&lt;br /&gt;see export/samples directory for sample input files, and produces output based&lt;br /&gt;on the input file specifications. dreport allows for isam file cross reference,&lt;br /&gt;and filtering of data.&lt;br /&gt;&lt;br /&gt;sample tests provided in the export directory.&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------  &lt;br /&gt;Worldwide Copyright (c) Byte Designs Ltd (2009)&lt;br /&gt;---------------------------------------------------------------------
 </content>
 </entry>
<entry>
<title type='text'>dschema (new)</title>
<id>dschema_new</id>
<updated>2009-10-13T20:05:19.981-07:00</updated>
<link href='http://isam.ca/products/disam/d7/refs.html#dschema_new'/>
<content type='html'>
 dschema&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;dschema - utility to load, store or dump schema file to/from isam file&lt;br /&gt;&lt;br /&gt;usage - dschema [-dDSr] &lt;isamfile&gt;&lt;br /&gt; where  d - dump schema layout from isamfile to stdout&lt;br /&gt;        D&lt;path&gt; - dump schema layout to path&lt;br /&gt;        S&lt;schemafile&gt; - store schemafile to isamfile&lt;br /&gt;        r - remove schema layout from isamfile&lt;br /&gt;&lt;br /&gt;dschema can be used to store a schema layout for an isam file to the isam file&lt;br /&gt;where it can be used to report on data from the isamfile via dreport or simply&lt;br /&gt;as a reference to the layout of the isamfile.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------  &lt;br /&gt;Worldwide Copyright (c) Byte Designs Ltd (2009)&lt;br /&gt;---------------------------------------------------------------------
 </content>
 </entry>
<entry>
<title type='text'>isread filtering</title>
<id>Question</id>
<updated>2009-10-13T20:05:12.306-07:00</updated>
<link href='http://isam.ca/products/disam/d7/refs.html#Question'/>
<content type='html'>
 isread filtering&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;this feature is currently only available in the wrapper - please let&lt;br /&gt;the support department know if this is a problem to you.&lt;br /&gt;&lt;br /&gt;the isfilter() call provides a means of externally controlling which&lt;br /&gt;records are accessible via isread().  originally developed inhouse as&lt;br /&gt;a means of avoiding the work involved in updating inflexible older&lt;br /&gt;application code, it allows the programmer to register a routine that&lt;br /&gt;will be called, on a per file basis, to check if each record located&lt;br /&gt;by isread() is valid.&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;isfilter( int isfd, int ( *filter )() );&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;isfd    isam file handle&lt;br /&gt;filter  application defined filter routine&lt;br /&gt;&lt;br /&gt;note    once a filter routine has been registered, it will be called&lt;br /&gt;        automatically each time isread() locates a record().&lt;br /&gt;        &lt;br /&gt;        pass a NULL pointer for filter to deactivate.&lt;br /&gt;        &lt;br /&gt;---------------------------------------------------------------------        &lt;br /&gt;&lt;br /&gt;the application filter routine should be declared as:&lt;br /&gt;&lt;br /&gt;int myfilter( int isfd, char *data, int mode );&lt;br /&gt;&lt;br /&gt;isfd    the associated isam file handle&lt;br /&gt;data    data record pointer as passed to isread()&lt;br /&gt;mode    the mode parameter passed to isread()&lt;br /&gt;&lt;br /&gt;if the filter routine returns a value of one, then isread() will&lt;br /&gt;return the record found.&lt;br /&gt;&lt;br /&gt;if the filter routine sets iserrno and returns a value of zero,&lt;br /&gt;then isread() will return the specified error to the application.&lt;br /&gt;&lt;br /&gt;if iserrno is not set, and the read mode is one of those listed&lt;br /&gt;below, isread() will attempt to read the next record as shown&lt;br /&gt;and, if successful, will call the filter routine again.&lt;br /&gt;&lt;br /&gt;ISFIRST     read next&lt;br /&gt;ISLAST      read previous&lt;br /&gt;ISNEXT      read next&lt;br /&gt;ISPREV      read previous&lt;br /&gt;ISGREAT     read greater&lt;br /&gt;ISGTEQ      read greater  &lt;br /&gt;&lt;br /&gt;isread() will return ENOREC if the original mode was either ISCURR&lt;br /&gt;or ISEQUAL.&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;Worldwide Copyright (c) Byte Designs Ltd (2009)&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;
 </content>
 </entry>
<entry>
<title type='text'>dsplit</title>
<id>dsplit</id>
<updated>2009-10-13T20:02:45.960-07:00</updated>
<link href='http://isam.ca/products/disam/d7/refs.html#dsplit'/>
<content type='html'>
 dsplit&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;dpack - isam file split utility&lt;br /&gt;&lt;br /&gt;usage - dsplit &lt;isamfile&gt; [...]&lt;br /&gt;&lt;br /&gt;dpack takes an isam file and will split the original file into two&lt;br /&gt;smaller isamfiles, each with the same name as the original for the&lt;br /&gt;prefix but with a 1 and 2 appended to the original name.&lt;br /&gt;it works by building two temporary copies of the original file&lt;br /&gt;and copying half the active data records into filename1 and the&lt;br /&gt;second half into filename2. dsplit can be compiled to delete the &lt;br /&gt;original fileset by adding a #define REMOVE to the code before compiling.&lt;br /&gt;&lt;br /&gt;the temporary files are created in the same directory as the original.&lt;br /&gt;&lt;br /&gt;you must ensure that you have write permission on the data directory&lt;br /&gt;and that there is enough room for dpack to build the working copies.&lt;br /&gt;&lt;br /&gt;dpack will fail if it cannot obtain an exclusive lock on the file.&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------  &lt;br /&gt;Worldwide Copyright (c) Byte Designs Ltd (2009)&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;
 </content>
 </entry>
<entry>
<title type='text'>dvlrebld (new)</title>
<id>dvlrebld</id>
<updated>2009-10-13T20:02:36.016-07:00</updated>
<link href='http://isam.ca/products/disam/d7/refs.html#dvlrebld'/>
<content type='html'>
 dvlrebld&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;dvlrebld - variable length isam file conversion utility&lt;br /&gt;           specifically for converting variable length isam files from&lt;br /&gt;           old disam/c-isam standard to new disam v7.0 format - expects&lt;br /&gt;           ISOLDVARLEN to be set to 0 in isconfig.h prior to compiling library&lt;br /&gt;           and this utility.&lt;br /&gt;&lt;br /&gt;usage - dvlrebld &lt;isamfile&gt; &lt;br /&gt;&lt;br /&gt;dvlrebld converts old disam/c-isam format variable length files to the new&lt;br /&gt;variable length format now used by disam. this new format overcomes the old&lt;br /&gt;record number limit of 16777216L previously imposed on varinfo and continuation&lt;br /&gt;node pointers when being stored in 3 character bytes.&lt;br /&gt;&lt;br /&gt;the temporary file is created in the same directory as the original&lt;br /&gt;and is named dpnnnnn, where nnnnn is the current process id.&lt;br /&gt;&lt;br /&gt;you must ensure that you have write permission on the data directory&lt;br /&gt;and that there is enough room for dvlrebld to build the working copy.&lt;br /&gt;&lt;br /&gt;dvlrebld will fail if it cannot obtain an exclusive lock on the file.&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------  &lt;br /&gt;Worldwide Copyright (c) Byte Designs Ltd (2009)&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;
 </content>
 </entry>
<entry>
<title type='text'>isconfig.h ISEXTENDED configuration setting</title>
<id>isconfigh_ISEXTENDED_configurat</id>
<updated>2009-10-13T20:02:28.781-07:00</updated>
<link href='http://isam.ca/products/disam/d7/refs.html#isconfigh_ISEXTENDED_configurat'/>
<content type='html'>
 isconfig.h ISEXTENDED configuration setting&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;defining ISEXTENDED to 1 will ensure the global ispid will&lt;br /&gt;hold the id of the process blocking the lock attempt by the calling&lt;br /&gt;process - ISLOCKING 2 only.&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;Worldwide Copyright (c) Byte Designs Ltd (2009)&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;
 </content>
 </entry>
<entry>
<title type='text'>dstats</title>
<id>dstats</id>
<updated>2009-10-13T19:59:35.771-07:00</updated>
<link href='http://isam.ca/products/disam/d7/refs.html#dstats'/>
<content type='html'>
 dstats&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;dstats - report library statistics - expiration date, compilation date&lt;br /&gt;                                     and client limit&lt;br /&gt;usage - dstats&lt;br /&gt;&lt;br /&gt;dlist makes use of the isLibInfo() or islibinfo() functions to load&lt;br /&gt;and report some library statistics. dstats is only useful if it is&lt;br /&gt;recompiled and relinked when ever the library is recompiled, to ensure&lt;br /&gt;that the statistics reported are current.&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------  &lt;br /&gt;Worldwide Copyright (c) Byte Designs Ltd (2009)&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;
 </content>
 </entry>

</feed>

