Issues fixed in the 4/13 build:
-------------------------------

In BStatement::execute(BCursor &answer), check to make certain that a
Table Handle is returned from the query before attaching the BCursor
to the Table Handle.

Changed line 1106 of BCURSOR.CPP:

   strncpy(idxName, ".MDX", DBIMAXNAMELEN);

 to

   strncat(idxName, ".MDX", DBIMAXNAMELEN);

Changes line 3477 of BCURSOR.CPP
(BCursor::searchIndex(PXSearchMode mode, int fldCnt, ...)):

   (pBYTE) va_arg(ap, DATE));

  to:

   (pBYTE) &Date);

Changes line 3491 of BCURSOR.CPP
(BCursor::searchIndex(PXSearchMode mode, int fldCnt, ...)):

    (pBYTE) va_arg(ap, TIME));

  to:

    (pBYTE) &Time);

    (pBYTE) va_arg(ap, TIMESTAMP *));

Changes line 3491 of BCURSOR.CPP
(BCursor::searchIndex(PXSearchMode mode, int fldCnt, ...)):

    (pBYTE) va_arg(ap, TIMESTAMP *));

  to:

    (pBYTE) &TimeStamp);

In BRecord::copyTo(BRecord *destRec) (Line 318):

    if (!_fmemcpy(destRec->recH, recH, iRecBufSize))

  to:

    // custom record may have undefined recH and it is not fatal.
    if (!recH || !destRec->recH || !_fmemcpy(destRec->recH, recH,
                                             iRecBufSize))

In BRecord::copyTo(BRecord *destRec) (Line 391):

    if (!ret)

  to:

    if (ret = DBIERR_NONE)

In BDatabase::getNumPFields(const char *tableName) (Line 2145):

    catch(int i)

  to:

    catch(Retcode i)

In BRecord.h, changed

    BRecord(BCursor *cursor = 0);

  to:

    BRecord(BCursor *cursor = NULL);

In BRecord::detach(), made certain that a valid tabH exists.

In BRecord.cpp, made certain that NULL was used in place of 0
when comparing pointers.

Added BCursor::Undelete();
Added BCursor::packTable(BOOL regenIndexes);
Added BDatabase::packTable(const char *tableName, BOOL regenIndexes);

In fix incorporated in 3/27, made certain that the length was greater than
1 before subtracting 1 (make certain not < 1). Note from 3/27 build:
"Subtract 1 from the length of CHAR and Memo fields to make compatible
with DBF."

Changed text from PXOppErrMsg to not contain the error category and code...
Added cariage return between each line of output from PXOopErrMsg.
Made certain to not call BDE error handling routines if BDE DLLs are not
found or if the BDE has not been initialized.

Issues fixed in the 3/27 build:
-------------------------------

Call BRecord::clear in:

 BRecord::BRecord(BCursor*)
 BRecord::Attach(BCursor *)
 BCursor::getRecord(BRecord *rec)
 BCursor::getRecord(void far *buffer, int size)
 BCursor::getNextRecord(BRecord *rec)
 BCursor::getPreviousRecord(BRecord *rec)
 BCursor::clearRec (BRecord* rec)
 BCursor::clearRec ()

This function is needed when working with records containing
BLOBs.

Changed the following code in BCursor::getPreviousRecord(BRecord*):

//    if (curStatus == atEnd) // old
    if (curStatus == atBegin) // New
    {
        return (lastError = PXERR_INVCURRRECORD);
    }

Added a function:

    PXCursorStatus BCursor::getCurStatus()

    returns atBegin, atRecord, atCrack, or atEnd.

Changed line 120 of BDatabase:

Old:
//  lastError = DbiOpenDatabase(NULL, NULL, openMode, shareMode,
//                              NULL, 0, NULL, NULL, &hDb);

New:
    lastError = DbiOpenDatabase((pCHAR)BDAlias, "STANDARD", openMode,
                                shareMode, NULL, 0, NULL, NULL, &hDb);

Set the curStatus to be atRecord if BRecord::setToBookMark succeeds.

Changed BCursor::getBookMark from:

    Retcode getBookMark(BOOKMARK bookMark);

    to:

    Retcode getBookMark(BOOKMARK& bookMark);

Default to use szPARADOX as the driver type in the following
constructor:

    BDatabase::BDatabase(BEngine *eng,
                         const char *BDDriver,
                         const char *BDAlias,
                         const char *BDPassword,
                         DBIOpenMode openMode,
                         DBIShareMode shareMode)

In BCursor::Clone() - closed the unwanted cursor.

Added the virtual function BCursor::curChange, which gets called
whenever a new record is retreived.

In GetDesc(TABLEHANDLE tabH, int& numFields, FieldDesc far *fldDescs), made
certain to not include the null terminator space as part of the length of the
field - Subtract 1 from the length of CHAR and Memo fields to make compatible
with DBF.
