I'm kind of glad I posted that method since it made me take another look at
it. Turns out there's a much better way to do it. Here's the new
implementation:
Err PktLibGetRecordByID(DmOpenRef dbP, UInt32 id,
PktLibDBRecordPtr recordP, MemHandle *recordH)
{
UInt16 index = 0;
if (DmFindRecordByID(dbP, id, &index) == 0)
return PktLibGetRecord(dbP, index, recordP, recordH);
else
return 1;
}
Boy, that was kind of embarrassing. :-)
"CausticMango" <[EMAIL PROTECTED]> wrote in message
news:77615@palm-dev-forum...
>
> I use UniqueID to link records within the same DB and it works fine (so
> far). I use the following, admittedly inefficient, method to locate a
record
> by it's ID:
>
> /************************************************************
> *
> * FUNCTION: PktLibGetRecordByID
> *
> * DESCRIPTION: Get a record from the Database by its UniqueID
> *
> * PARAMETERS: database pointer - open db pointer
> * uniqueid - localid of record to lock
> * record pointer - pointer structure
> * record - MemHandle to unlock when done
> *
> * RETURNS: ##0 if successful, errorcode if not
> *
> * The record's MemHandle is locked so that the pointer to
> * strings within the record remain pointing to valid chunk
> * versus the record randomly moving. Unlock the MemHandle when
> * PktLibDBRecord is destroyed.
> *
> *************************************************************/
> Err PktLibGetRecordByID(DmOpenRef dbP, UInt32 id,
> PktLibDBRecordPtr recordP, MemHandle *recordH)
> {
> UInt16 index = 0;
> UInt16 num, attr;
> UInt32 rid;
>
> num = DmNumRecords(dbP);
> while (index < num) {
> DmRecordInfo(dbP, index, &attr, &rid, NULL);
> if (id == rid && !(attr & dmRecAttrDelete))
> break;
> index++;
> }
>
> if (index < num)
> return PktLibGetRecord(dbP, index, recordP, recordH);
> else
> return 1;
> }
>
> It MAY be possible to use the memory manager to get a direct handle to the
> record by ID using MemLocalIDToLockedPtr, but I'm not sure, I haven't
tried
> it out.
>
> "Ben A. HiLLeLi" <[EMAIL PROTECTED]> wrote in message
> news:77587@palm-dev-forum...
> >
> > After too much deliberation I've decided on using the PalmOS assigned
> > UniqueID as a "primary key" and as the lookup attribute that will "link"
> two
> > related databases:
> > i.e. AllergyRecord.PatientIDLink=Patient.UniqueID...
> >
> > to get patient referenced in AllergyRecord:
> > DmFindRecordByID(gPatientDB, AllergyRecord.PatientIDLink, &index_out)
> > DmQueryRecord(gPatientDB, index_out)
> > or something like that...
> >
> > I have not invested that much time in the conduit yet and want to know
if
> > there is sample code on importing record UniqueID's and/or the entire
> record
> > headers and using these as attributes in a desktop database... I think
> once
> > I get the UniqueID onto the PC (and into PC Endian) it won't be a
problem
> > assigning as a value to a dbase attribute...
> >
> > SideQ: When working with alphabetically sorted databases, what other
> > efficient methods are there of doing a quick key lookup. Binary Searches
> > would seem rather inefficient for they would require resorting by key,
> then
> > sorting back alphabetically. I'm looking for a backup (insurance :-O) to
> the
> > above method as I've heard experienced Palm developers say "USE the
> > uniqueID, works for me" and "Don't Use uniqueID, it can change and/or
not
> be
> > unique"... I was thinking of a two part key, one part Char: the letter
the
> > name starts with (used only for quicker searches as names can change)
and
> a
> > permanent ID (iterative, last used stored in preferences)... Hopefully
the
> > first method workz (no insurance premiums...missed deadlines)
> >
> > Ben
> > p.s. from what I've read in the documentation (briefly skimmed),
> UniqueID's
> > should stay constant during synchronization using more current versions
of
> > HotSynch... I'm a beginner looking for answers though, do NOT take my
word
> > on it AND/OR/PLEASE correct me...
> >
> >
> >
> >
> >
> >
>
>
>
>
--
For information on using the Palm Developer Forums, or to unsubscribe, please see
http://www.palmos.com/dev/tech/support/forums/