CLASS objContact PUBLIC: local IsOpen, LockTimeout, errmsg, db local age, city, fname, homephone, lname, state, street, workphone local zip METHOD New( ) ::IsOpen = 0 ::errmsg = "" ::LockTimeout = 2 ::db = 0 ::Init( ) return( 1 ) END METHOD Init( ) ::age = 0 ::city = "" ::fname = "" ::homephone = "" ::lname = "" ::state = "" ::street = "" ::workphone = "" ::zip = "" return( 1 ) END ACCESS dbFileName return( 'c:\fgl\data\contacts.db' ) END ACCESS dbIndexName return( 'c:\fgl\data\contacts.dx' ) END METHOD create( ) local db_struct = { { "fname", "C", 30, 0 }, { "lname", "C", 40, 0 }, { "street", "C", 60, 0 }, { "city", "C", 30, 0 }, { "state", "C", 2, 0 }, { "zip", "C", 10, 0 }, { "workphone", "C", 10, 0 }, { "homephone", "C", 10, 0 }, { "age", "N", 3, 0 } } return( dbcreate( ::dbFileName, db_struct ) ) END METHOD open( ) if ( ::IsOpen ) ::IsOpen++ return( 1 ) end if ( ! fileExists( ::dbFileName ) ) ::create( ) end ::IsOpen = 1 ::db = dbuse( ::dbFileName, "objContact", 1 ) if ( ! fileExists( ::dbIndexName ) ) (::db)->dbCreateIndex( ::dbIndexName, "upper( field->lname + field->fname )", 0 ) end (::db)->dbOpenIndex( ::dbIndexName ) return( 1 ) END METHOD close( ) if ( ::IsOpen == 1 ) (::db)->dbClose( ) end ::IsOpen-- return( 1 ) END METHOD seek( item ) (::db)->dbSeek( upper( item ) ) return( (::db)->dbFound( ) ) END METHOD reindex( ) return( (::db)->dbReindex( ) ) END METHOD get( ) ::age = (::db)->age ::city = alltrim( (::db)->city ) ::fname = alltrim( (::db)->fname ) ::homephone = alltrim( (::db)->homephone ) ::lname = alltrim( (::db)->lname ) ::state = alltrim( (::db)->state ) ::street = alltrim( (::db)->street ) ::workphone = alltrim( (::db)->workphone ) ::zip = alltrim( (::db)->zip ) return( 1 ) END METHOD put( ) (::db)->age = ::age (::db)->city = ::city (::db)->fname = ::fname (::db)->homephone = ::homephone (::db)->lname = ::lname (::db)->state = ::state (::db)->street = ::street (::db)->workphone = ::workphone (::db)->zip = ::zip return( 1 ) END METHOD validate( ) return( 1 ) END METHOD CreateNewRecord( key ) if ( ! ::validate( ) ) return( 0 ) end ::open( ) if ( ::seek( key ) ) ::errmsg = "Record (" + key + ") already exists!" ::close( ) return( 0 ) end (::db)->dbAppend( ) ::put( ) ::unlock( ) ::close( ) return( 1 ) END METHOD GetRecord( key ) ::open( ) ::init( ) if ( ! ::seek( key ) ) ::errmsg = "Unable to locate record (" + key + ")" ::close( ) return( 0 ) end ::get( ) ::close( ) return( 1 ) END METHOD SetRecord( key ) if ( ! ::validate( ) ) return( 0 ) end ::open( ) if ( ! ::seek( key ) ) ::errmsg = "Unable to locate record (" + key + ")" ::close( ) return( 0 ) end if ( ::rlock( ) ) ::put( ) ::unlock( ) end ::close( ) return( 1 ) END METHOD dbOrder( val ) (::db)->dbOrder( val ) END METHOD dbGoto( val ) (::db)->dbGoto( val ) END METHOD dbGoTop( ) (::db)->dbGoTop( ) END METHOD dbGoBottom( ) (::db)->dbGoBottom( ) END METHOD dbEOF( ) return( (::db)->dbEOF( ) ) END METHOD dbBOF( ) return( (::db)->dbBOF( ) ) END METHOD dbseek( id ) return( ::seek( id ) ) END METHOD dbSkip( index ) if ( type( index ) == 'N' ) (::db)->dbSkip( index ) else (::db)->dbSkip( ) end return( 1 ) END METHOD rlock( ) local EndTime if ( ! ::IsOpen ) ::errmsg = 'Database must be open to lock record' return( 0 ) end EndTime = seconds( ) + ::LockTimeout while ( ! (::db)->dbRLock( ) ) if ( ( seconds( ) > EndTime ) || ( ( seconds( ) + ::LockTimeout ) < EndTime ) ) ::errmsg ='Unable to lock database record' return( 0 ) end end return( 1 ) END METHOD unlock( ) if ( ! ::IsOpen ) ::errmsg = 'Database must be open to unlock record' return( 0 ) end (::db)->dbUnLock( ) return( 1 ) END END