git-svn-id: https://svn.code.sf.net/p/flaim/code/trunk@466 0109f412-320b-0410-ab79-c3e0c5ffbbe6
102 lines
2.7 KiB
C++
102 lines
2.7 KiB
C++
//------------------------------------------------------------------------------
|
|
// Desc: Insert and delete keys in an index B-Tree.
|
|
//
|
|
// Tabs: 3
|
|
//
|
|
// Copyright (c) 1991-2006 Novell, Inc. All Rights Reserved.
|
|
//
|
|
// This program is free software; you can redistribute it and/or
|
|
// modify it under the terms of version 2 of the GNU General Public
|
|
// License as published by the Free Software Foundation.
|
|
//
|
|
// This program is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with this program; if not, contact Novell, Inc.
|
|
//
|
|
// To contact Novell about this file by physical or electronic mail,
|
|
// you may find current contact information at www.novell.com
|
|
//
|
|
// $Id: fsrefupd.cpp 3114 2006-01-19 13:22:45 -0700 (Thu, 19 Jan 2006) dsanders $
|
|
//------------------------------------------------------------------------------
|
|
|
|
#include "flaimsys.h"
|
|
|
|
/***************************************************************************
|
|
Desc: Update (add or delete) a single reference
|
|
*****************************************************************************/
|
|
RCODE F_Db::refUpdate(
|
|
LFILE * pLFile,
|
|
IXD * pIxd,
|
|
KREF_ENTRY * pKrefEntry,
|
|
FLMBOOL bNormalUpdate)
|
|
{
|
|
RCODE rc = NE_XFLM_OK;
|
|
F_Btree * pbtree = NULL;
|
|
IXKeyCompare compareObject;
|
|
|
|
// Get a btree
|
|
|
|
if (RC_BAD( rc = gv_XFlmSysData.pBtPool->btpReserveBtree( &pbtree)))
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
flmAssert( pLFile->uiRootBlk);
|
|
|
|
compareObject.setIxInfo( this, pIxd);
|
|
if (bNormalUpdate && pKrefEntry->bDelete)
|
|
{
|
|
compareObject.setOldNodeList( m_pOldNodeList);
|
|
}
|
|
if( RC_BAD( rc = pbtree->btOpen( this, pLFile,
|
|
(pIxd->uiFlags & IXD_ABS_POS) ? TRUE : FALSE,
|
|
(pIxd->pFirstData) ? TRUE : FALSE, &compareObject)))
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
if (!pKrefEntry->bDelete)
|
|
{
|
|
pbtree->btResetBtree();
|
|
if( RC_BAD( rc = pbtree->btInsertEntry(
|
|
(FLMBYTE *)&pKrefEntry [1], pKrefEntry->ui16KeyLen,
|
|
pKrefEntry->uiDataLen
|
|
? ((FLMBYTE *)(&pKrefEntry [1])) + 1 + pKrefEntry->ui16KeyLen
|
|
: NULL,
|
|
pKrefEntry->uiDataLen, TRUE, TRUE)))
|
|
{
|
|
goto Exit;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
pbtree->btResetBtree();
|
|
if (RC_BAD( rc = pbtree->btRemoveEntry(
|
|
(FLMBYTE *)&pKrefEntry [1], pKrefEntry->ui16KeyLen)))
|
|
{
|
|
if (rc == NE_XFLM_NOT_FOUND)
|
|
{
|
|
// Already been deleted, ignore the error condition and go on.
|
|
|
|
RC_UNEXPECTED_ASSERT( rc);
|
|
rc = NE_XFLM_OK;
|
|
}
|
|
|
|
goto Exit;
|
|
}
|
|
}
|
|
|
|
Exit:
|
|
|
|
if (pbtree)
|
|
{
|
|
gv_XFlmSysData.pBtPool->btpReturnBtree( &pbtree);
|
|
}
|
|
|
|
return( rc);
|
|
}
|