Do NOT EVER EVER EVER use DmQueryRecord on NVFS.
Do not EVER EVER EVER listen to people who tell you to do so, they are
either not familiar with NVFS, or lucky enough to not use or test on
any of earlier NVFS devices.
On all but the latest NVFS devices this can and WILL Cause random
crashes in low-memory situations

see my post to this very thread at "Wed, Jun 18, 2008 at 9:23 AM" for
specifics as to why.


----
Best Regards,
Dmitry Grinberg
(847) 226 9295


On Tue, Jun 24, 2008 at 4:42 PM, Eduardo Orea <[EMAIL PROTECTED]> wrote:
> I hope this helps.
>
> For read-only use DmQueryRecord()
>
> RecordStruct getRecord ( UInt16 index )
> {
> MemHandle memH;
> MemPtr memP;
> RecordStruct record;
> memH = (MemHandle) DmQueryRecord (dbP, index);
> memP = MemHandleLock (memH);
> MemMove (&record, ((RecordStruct*)memP), sizeof(RecordStruct));
> MemHandleUnlock (memH);
> return record;
> }
>
>
> For read-write or overwrite use DmGetRecord() and DmReleaseRecord().
>
> void setRecord ( RecordStruct record, UInt16 index )
> {
> MemHandle memH;
> MemPtr memP;
> memH = DmGetRecord (dbP, indice);
> memP = MemHandleLock (memH);
> DmWrite (memP, 0, &record, sizeof(RecordStruct));
> MemHandleUnlock (memH);
> DmReleaseRecord(dbP, index, true);
> }
>
>
> Good Luck.
>
> Eduardo Orea.
>
>
> "griffariff" <[EMAIL PROTECTED]> escribió en el mensaje
> news:[EMAIL PROTECTED]
>> Thanks for that. I did not see any info on WHICH creator ID to use
>> in the documentation. I inserted the generic 'STRT' for the sake of
>> example, but I did not have 'psys' in my actual code. I switched my
>> code to use 'psys' and that seems to work on my TX that I use for
>> testing.
>>
>> I still haven't quite figured out the DmGetRecord DmReleaseRecord
>> thing yet. I thought I was on the right track because it was
>> working in Simulator 5.4. Yesterday I tried it on my TX and it was
>> a crash fest. Here is the code in the original daVinci API:
>> extern Err GetRecord(DmOpenRef db, UInt16 recordNum, void *item)
>> {
>>    void *src;
>>    void *recordH;
>>                              //Get the record from the database
>>    recordH = DmQueryRecord(db, recordNum);
>>    src = MemHandleLock(recordH);
>>    if (src == NULL) return dmErrIndexOutOfRange;
>>                              //Unpack the record
>>    UnpackRecord(db, item, src);
>>    MemHandleUnlock(recordH);
>>    return 0;
>> }
>>
>> I changed it to:
>> extern Err GetRecord(DmOpenRef db, UInt16 recordNum, void *item)
>> {
>>    void *src;
>>    void *recordH;
>>    UInt32 value = 0;
>>    Err error = errNone;
>>
>>    UInt8 highest;
>>    UInt32 count;
>>    UInt32 busy;
>>
>>    //these lines were added
>>    error = FtrGet('psys',sysFtrNumDmAutoBackup, &value);
>>    if (error == 0)
>>    {
>> error = DmSyncDatabase(db);
>> if (error != errNone)
>>     ErrAlert(error);
>>    }
>>    else if (error == ftrErrNoSuchFeature)
>> gBigBadError = error;
>>                              //Get the record from the database
>>    //recordH = DmQueryRecord(db, recordNum);// - this line was replaced by
>> the following
>>    recordH = DmGetRecord(db, recordNum);
>>    src = MemHandleLock(recordH);
>>    if (src == NULL) return dmErrIndexOutOfRange;
>>                              //Unpack the record
>>    UnpackRecord(db, item, src);
>>    MemHandleUnlock(recordH);
>>
>>    DmGetDatabaseLockState (db, &highest, &count, &busy);
>>    if (busy > 0)
>>    {
>>    DmReleaseRecord(db, recordNum, true);
>>    error = DmSyncDatabase(db);
>>    }
>>    return 0;
>> }
>>
>> I noticed that calling DmReleaseRecord when a record is not busy causes
>> the TX to crash (reset) hence the DmGetDatabaseLockState call. Am I on the
>> right track? Why does MemHandleUnlock seem to clear the busy count?
>>
>
>
>
> --
> For information on using the ACCESS Developer Forums, or to unsubscribe, 
> please see http://www.access-company.com/developers/forums/
>

-- 
For information on using the ACCESS Developer Forums, or to unsubscribe, please 
see http://www.access-company.com/developers/forums/

Reply via email to