1 Star 0 Fork 0

收拾旧河山/ extmem-c-database-query-processing

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
extmem.c 3.80 KB
一键复制 编辑 原始数据 按行查看 历史
收拾旧河山 提交于 2022-12-26 20:38 +08:00 . done
/*
* extmem.c
* Zhaonian Zou
* Harbin Institute of Technology
* Jun 22, 2011
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "extmem.h"
// 初始化缓冲区 返回指向该缓冲区的地址
Buffer *initBuffer(size_t bufSize, size_t blkSize, Buffer *buf)
{
int i;
buf->numIO = 0;
buf->bufSize = bufSize;
buf->blkSize = blkSize;
buf->numAllBlk = bufSize / (blkSize + 1);
buf->numFreeBlk = buf->numAllBlk;
buf->data = (unsigned char*)malloc(bufSize * sizeof(unsigned char));
if (!buf->data)
{
perror("Buffer Initialization Failed!\n");
return NULL;
}
memset(buf->data, 0, bufSize * sizeof(unsigned char));
return buf;
}
// 释放缓冲区buf占用的内存空间
void freeBuffer(Buffer *buf)
{
free(buf->data);
}
// 在缓冲区 buf 中申请一个新的块。若申请成功,则返回该块的起始地址
unsigned char *getNewBlockInBuffer(Buffer *buf)
{
unsigned char *blkPtr;
if (buf->numFreeBlk == 0)
{
perror("Buffer is full!\n");
return NULL;
}
blkPtr = buf->data;
// 遍历缓冲区寻找下一个可用块
while (blkPtr < buf->data + (buf->blkSize + 1) * buf->numAllBlk)
{
if (*blkPtr == BLOCK_AVAILABLE)
break;
else
blkPtr += buf->blkSize + 1;
}
*blkPtr = BLOCK_UNAVAILABLE;
buf->numFreeBlk--;
return blkPtr + 1;
}
// 解除块blk对缓冲区内存的占用,即将 blk 占据的内存区域标记为可用
void freeBlockInBuffer(unsigned char *blk, Buffer *buf)
{
*(blk - 1) = BLOCK_AVAILABLE;
buf->numFreeBlk++;
}
// 从磁盘上删除地址为 addr 的磁盘块内的数据
int dropBlockOnDisk(unsigned int addr)
{
char filename[40];
sprintf(filename, "data/%d.blk", addr);
// 删除这个文件
if (remove(filename) == -1)
{
perror("Dropping Block Fails!\n");
return -1;
}
return 0;
}
// 将磁盘上地址为 addr 的磁盘块读入缓冲区 buf。若读取成功,则返回缓冲区内该块的地址
unsigned char *readBlockFromDisk(unsigned int addr, Buffer *buf)
{
char filename[40];
unsigned char *blkPtr, *bytePtr;
char ch;
if (buf->numFreeBlk == 0)
{
perror("Buffer Overflows!\n");
return NULL;
}
blkPtr = buf->data;
// 遍历buf找到一个空闲块
while (blkPtr < buf->data + (buf->blkSize + 1) * buf->numAllBlk)
{
if (*blkPtr == BLOCK_AVAILABLE)
break;
else
blkPtr += buf->blkSize + 1;
}
// 打开文件
sprintf(filename, "data/%d.blk", addr);
FILE *fp = fopen(filename, "r");
if (!fp)
{
printf("addr: %d\n", addr);
perror("Reading Block Failed!\n");
return NULL;
}
*blkPtr = BLOCK_UNAVAILABLE;
blkPtr++;
bytePtr = blkPtr;
// 将对应的内容读入这个缓存块
while (bytePtr < blkPtr + buf->blkSize)
{
ch = fgetc(fp);
*bytePtr = ch;
bytePtr++;
}
fclose(fp);
buf->numFreeBlk--;
buf->numIO++;
return blkPtr;
}
// 将缓冲区buf内的块blk写入磁盘上地址为addr的磁盘块
int writeBlockToDisk(unsigned char *blkPtr, unsigned int addr, Buffer *buf)
{
char filename[40];
unsigned char *bytePtr;
// 打开这个文件
sprintf(filename, "data/%d.blk", addr);
// 已存在的文件将内容清空,只允许写
FILE *fp = fopen(filename, "w");
if (!fp)
{
perror("Writing Block Failed!\n");
return -1;
}
// 将信息写入
for (bytePtr = blkPtr; bytePtr < blkPtr + buf->blkSize; bytePtr++)
fputc((int)(*bytePtr), fp);
fclose(fp);
*(blkPtr - 1) = BLOCK_AVAILABLE;//重新将块置为可用,特别要注意这里
buf->numFreeBlk++;
buf->numIO++;
return 0;
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/Hmount/extmem-c-database-query-processing.git
git@gitee.com:Hmount/extmem-c-database-query-processing.git
Hmount
extmem-c-database-query-processing
extmem-c-database-query-processing
master

搜索帮助