迷你搜索引擎用C语言,自己写的一个迷你数据库 开源...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

BOOL CMyMiniDataBase::InitializeSelecet(READDATA *lpReadData)

{

EnterCriticalSection(&cs);

ZeroMemory(lpReadData,sizeof(READDATA));

DWORD dwFileSize = GetFileSize(hFile,NULL);

try

{

if(dwFileSize == NULL)

throw 1;

//得到数据库有多少记录.

lpReadData->dwCountRecord = dwFileSize/sizeof(COUNTINFORMATION);

lpReadData->hFileMappingObject=CreateFileMapping(hFile,

NULL,PAGE_READWRITE,0,dwFileSize,NULL);

if(lpReadData->hFileMappingObject == NULL)

throw 1;

lpReadData->pAddress=MapViewOfFile(lpReadData->hFileMappingObject,FILE_MAP_READ|FILE_MAP_WRITE,0,0,0);

if(lpReadData->pAddress==NULL)

throw 1;

}

catch(...)

{

LeaveCriticalSection(&cs);

return FALSE;

}

LeaveCriticalSection(&cs);

return TRUE;

}

BOOL CMyMiniDataBase::ReadFirstData(READDATA *lpReadData)

{

return InitializeSelecet(lpReadData);

}

BOOL CMyMiniDataBase::ReadNextData(LPCOUNTINFORMATION cfm,READDATA *lpReadData)

{

if(lpReadData->dwIndex >= lpReadData->dwCountRecord)

return FALSE;

CHAR *szBytePoint = (CHAR *)lpReadData->pAddress;

szBytePoint+=lpReadData->dwIndex*sizeof(COUNTINFORMATION);

CopyMemory(cfm,szBytePoint,sizeof(COUNTINFORMATION));

lpReadData->dwIndex++;

return TRUE;

}

BOOL CMyMiniDataBase::CloseReadData(READDATA *lpReadData)

{

if(lpReadData->hFileMappingObject != NULL)

CloseHandle(lpReadData->hFileMappingObject);

if(lpReadData->pAddress!=NULL)

UnmapViewOfFile(lpReadData->pAddress);

return TRUE;

}

BOOL CMyMiniDataBase::DeleteData(LPCOUNTINFORMATION cfm)

{

EnterCriticalSection(&cs);

BOOL bResult = FALSE;

DWORD nFileSize = GetFileSize(hFile,NULL);

if(nFileSize == NULL)

{

LeaveCriticalSection(&cs);

return bResult;

}

HANDLE hFileMappingObject = CreateFileMapping(hFile,

NULL,PAGE_READWRITE,0,nFileSize,NULL);

PVOID pAddress = MapViewOfFile(hFileMappingObject,FILE_MAP_READ|FILE_MAP_WRITE,0,0,0);

LPSTR szBytePoint = (LPSTR)pAddress;

WORD nStrSize = sizeof(COUNTINFORMATION);

DWORD nCount = nFileSize/nStrSize;

DWORD dwOffset = 0;

LPCOUNTINFORMATION lpSource;

for (DWORD i=0;i

{

lpSource = (LPCOUNTINFORMATION)szBytePoint;

if(stricmp(lpSource->MacAddress,cfm->MacAddress)==0)

{

if(stricmp(lpSource->SoftWareName,cfm->SoftWareName)==0)

{

bResult = TRUE;

dwOffset = i * nStrSize;

break;

}

}

szBytePoint+=nStrSize;

}

if(bResult)

{

//先判断是否是最后一个记录..

if((nFileSize-dwOffset)==nStrSize)

{

UnmapViewOfFile(pAddress);

CloseHandle(hFileMappingObject);

SetFilePointer(hFile,-nStrSize,NULL,FILE_END);

SetEndOfFile(hFile);//截断文件

}

else

{

//数据全部右移 nStrSize

LPCOUNTINFORMATION MovePoint=(LPCOUNTINFORMATION)((CHAR *)(pAddress) + dwOffset);//内存偏移

szBytePoint+=nStrSize;

DWORD nSurplus = nCount-i-1;

for (DWORD n=0;n

{

CopyMemory(MovePoint,szBytePoint,nStrSize);

MovePoint+=nStrSize;

szBytePoint+=nStrSize;

}

FlushViewOfFile(pAddress,nFileSize);

UnmapViewOfFile(pAddress);

CloseHandle(hFileMappingObject);

SetFilePointer(hFile,-nStrSize,NULL,FILE_END);

SetEndOfFile(hFile);//截断文件

}

}

LeaveCriticalSection(&cs);

return bResult;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值