Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 29 additions & 15 deletions DBMS/DBMS/bufferManage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@ FileBuffer::~FileBuffer(){
}
}

int FileBuffer::size(){
return bufmap.size();
}

void FileBuffer::pop(){
if (!numPage) return;

Expand All @@ -18,10 +22,11 @@ void FileBuffer::pop(){

if ( bufPage->dirty ) {
//need amendments after finishing SysObject (linking fileID and file name)
//FileManage::writePageToFile(it->first.first, bufPage -> page, bufPage->page->header.fileId );
FileManage::writePageToFile(it->first.first, bufPage -> page, TESTTABLEPATH );
//FileManage::writePageToFile(it->first.second, bufPage -> page, bufPage->page->header.fileId );
FileManage::writePageToFile(it->first.second, bufPage->page, TESTTABLEPATH );
}

delete bufPage->page;
bufmap.erase(it);
numPage--;
}
Expand All @@ -44,17 +49,18 @@ void FileBuffer::flush(){
}
}

Node* FileBuffer::find(rowID id){
Node* FileBuffer::findPage(rowID id){
map<rowID, Node*>::iterator it = bufmap.find(id);
return (it==bufmap.end())?NULL:it->second;
}

Node* FileBuffer::find(int FileID, int PageID){
return find(pair<int,int>(FileID,PageID));
Node* FileBuffer::findPage(int FileID, int PageID){
return findPage(pair<int,int>(FileID,PageID));
}

Node* FileBuffer::readPage(int pageId, char* path){
Node* pageNode = find(TESTFILEID, pageId);
//need amendments after finishing SysObject (linking fileID and file name)
Node* pageNode = findPage(TESTFILEID, pageId);
if( pageNode ){
return pageNode;
}
Expand All @@ -68,7 +74,7 @@ Node* FileBuffer::readPage(int pageId, char* path){
}

Node* newNode = new Node(newPage);
push(pair<UINT,UINT>(header->fileId,header->pageId),newNode);
push(pair<int,int>(header->fileId,header->pageId),newNode);
return newNode;
}

Expand All @@ -86,20 +92,21 @@ void FileBuffer::insertData(char* tablename, recordEntry record) {
char* path = TESTTABLEPATH;
Node* attrPage = readPage(0,path), *dataPage;
int fileid = attrPage->page->header.fileId;
attr* tableAttr = (attr*)(attrPage->page->data);
tableAttr* tableAttribute = (tableAttr*)(attrPage->page->data);
int pageid = 1;

while(true) {
if (tableAttr->pagenum <= pageid){
if (tableAttribute->pagenum <= pageid){
dataPage = new Node();
dataPage->dirty = true;
dataPage->page = new dbPage();
dataPage->page->header.pageId = pageid; //���������=.=
dataPage->page->header.fileId = fileid;
dataPage->page->header.firstFreeOffset = 0;
dataPage->page->header.freeCount = PAGE_SIZE;
push(fileid, pageid, dataPage);

tableAttr->pagenum++;
tableAttribute->pagenum++;
attrPage->dirty = true;
break;
} else {
Expand All @@ -112,7 +119,6 @@ void FileBuffer::insertData(char* tablename, recordEntry record) {
}
}
}
cout << dataPage->page->header.firstFreeOffset << endl;
char* data = new char[record.length];
data = record.getRecord(&record);

Expand All @@ -121,9 +127,10 @@ void FileBuffer::insertData(char* tablename, recordEntry record) {
dataUtility::bytefillbyte(dataPage->page->data, data, dataPage->page->header.firstFreeOffset, record.length);
dataPage->page->header.freeCount -= record.length;
if (firstoffset == -1) {
dataPage->page->header.firstFreeOffset = PAGE_SIZE - dataPage->page->header.freeCount;
if (dataPage->page->header.freeCount < record.length)
dataPage->page->header.firstFreeOffset = -1;
else
dataPage->page->header.firstFreeOffset = PAGE_SIZE - dataPage->page->header.freeCount;
} else {
dataPage->page->header.firstFreeOffset = firstoffset;
}
Expand All @@ -139,23 +146,30 @@ void FileBuffer::deleteData(char* tablename, int pageid, int offset, int recordl
//char* path = getTablePath(tablename); need amendments after finishing SysObject (linking fileID and file name)
char* path = TESTTABLEPATH;
Node* dataPage = readPage(pageid, path);
if( dataPage == NULL ){
cout << "************Error in reading page with pageID: " << pageid << " and Action aborted**************" << endl;
return;
}
int firstOffset = dataPage->page->header.firstFreeOffset;
if( firstOffset == -1 ){ //Full page
dataPage->page->header.firstFreeOffset = offset;
} else {
if( firstOffset < offset ){ //Handle linked list sequence
int linkedOffset;
do{
while ( firstOffset < offset && firstOffset != -1 ){
char* srcTemp = dataUtility::getbyte(dataPage->page->data, firstOffset+recordlength-sizeof(int), sizeof(int));
linkedOffset = firstOffset;
firstOffset = dataUtility::char2int(srcTemp);
delete[] srcTemp;
} while ( firstOffset < offset && firstOffset != -1 );
};
char *offsetChar = dataUtility::data_to_char<int>(offset);
dataUtility::bytefillbyte(dataPage->page->data, offsetChar, linkedOffset+recordlength-sizeof(int), sizeof(int));
delete[] offsetChar;
} else { //Removed data become first free slot
dataPage->page->header.firstFreeOffset = offset;
if( firstOffset == PAGE_SIZE - dataPage->page->header.freeCount ){
firstOffset = -1;
}
}
char *offsetChar = dataUtility::data_to_char<int>(firstOffset);
dataUtility::bytefillbyte(dataPage->page->data, offsetChar, offset+recordlength-sizeof(int), sizeof(int));
Expand All @@ -166,10 +180,10 @@ void FileBuffer::deleteData(char* tablename, int pageid, int offset, int recordl
cout << " after update firstoffset is : " << dataPage->page->header.firstFreeOffset << endl;
}


void FileBuffer::updateData(char* tablename, int pageid, int offset, recordEntry record) {
//char* path = getTablePath(tablename); need amendments after finishing SysObject (linking fileID and file name)
char*path = TESTTABLEPATH;
Node* dataPage = readPage(pageid, path);
dataUtility::bytefillbyte(dataPage->page->data, record.getRecord(&record), offset, record.length);
dataPage->dirty = true;
}
6 changes: 4 additions & 2 deletions DBMS/DBMS/bufferManage.h
Original file line number Diff line number Diff line change
Expand Up @@ -73,16 +73,18 @@ class FileBuffer{
public:
FileBuffer();
~FileBuffer();
int size();
void pop();
void push(rowID id, Node* buffer);
void push(int FileID, int PageID, Node* buffer);
void flush();
Node* find(rowID id);
Node* find(int FileID, int PageID);
Node* findPage(rowID id);
Node* findPage(int FileID, int PageID);
Node* readPage(int pageId, char* path);
void insertData(char* tablename, recordEntry record);
void deleteData(char* tablename, int pageid, int offset, int recordlength);
void updateData(char* tablename, int pageid, int offset, recordEntry record);
void searchData(char* tablename);
private:
int numPage;
map<rowID, Node*> bufmap;
Expand Down
40 changes: 20 additions & 20 deletions DBMS/DBMS/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,29 +7,29 @@ int main()
// test buffer
FileBuffer fb;
DBStorage testdb("studentManage", 0, 1);
attr tableAttr(3);
tableAttr tableAttribute(3);

tableAttr.coltype[0] = 0;
tableAttr.coltype[1] = 5;
tableAttr.coltype[2] = 5;
tableAttribute.coltype[0] = 0;
tableAttribute.coltype[1] = 5;
tableAttribute.coltype[2] = 5;

tableAttr.collen[0] = 4; //int(10) 10 is the max show length
tableAttr.collen[1] = 100;
tableAttr.collen[2] = 3;
tableAttribute.collen[0] = 4; //int(10) 10 is the max show length
tableAttribute.collen[1] = 100;
tableAttribute.collen[2] = 3;

tableAttr.colname[0] = "id";
tableAttr.colname[1] = "name";
tableAttr.colname[2] = "nation";
tableAttribute.colname[0] = "id";
tableAttribute.colname[1] = "name";
tableAttribute.colname[2] = "nation";

tableAttr.colIsNull[0] = false;
tableAttr.colIsNull[1] = false;
tableAttr.colIsNull[2] = true;
tableAttribute.colIsNull[0] = false;
tableAttribute.colIsNull[1] = false;
tableAttribute.colIsNull[2] = true;

tableAttr.primaryId = 0;
tableAttr.pagenum = 1;
testdb.createTable("studentinfo", "studentManage", tableAttr);
tableAttribute.primaryId = 0;
tableAttribute.pagenum = 1;
testdb.createTable("studentinfo", "studentManage", tableAttribute);

recordEntry onedata(3, tableAttr.collen);
recordEntry onedata(3, tableAttribute.collen);
onedata.isdeleted = 0;
onedata.isNull[0] = 0;
onedata.isNull[1] = 0;
Expand All @@ -43,15 +43,15 @@ int main()
cout << onedata.item[2] << endl;

// test data from insert to delete
for(int i = 0; i < 50; i++) {
for(int i = 0; i < 80; i++) {
cout << "first insert index data: " << i <<endl;
fb.insertData("studentinfo", onedata);
}
fb.flush();
testdb.printFreeList("studentinfo", 1, 115);
for (int i = 0; i < 20; i++) {
for (int i = 0; i < 30 ; i++) {
cout << " delete index data: " << i << endl;
testdb.deleteData("studentinfo", 1, 115*i*2, 115);
fb.deleteData("studentinfo", 1, 115*i*2, 115);
}
fb.flush();
testdb.printFreeList("studentinfo", 1, 115);
Expand Down
38 changes: 19 additions & 19 deletions DBMS/DBMS/pageManage.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,25 @@
#include <string.h>
using namespace std;

class tableAttr{
public:
int num;
int primaryId;
int pagenum;
string *colname;
int* coltype; //0-int 1-double 2-float 3-char 4-string 5-varchar 6-boolean
int* collen;
bool* colIsNull;
tableAttr(int num_v){
num = num_v;
pagenum = 0; //first attr page is also a count
colname = new string[num];
coltype = new int[num];
collen = new int[num];
colIsNull = new bool[num];
};
};

class pageHeader {
public:
int pageId;
Expand All @@ -28,23 +47,4 @@ class dbPage {
strcpy(data,src);
}
};

class attr{
public:
int num;
int primaryId;
int pagenum;
string *colname;
int* coltype; //0-int 1-double 2-float 3-char 4-string 5-varchar 6-boolean
int* collen;
bool* colIsNull;
attr(int num_v){
num = num_v;
pagenum = 0; //first attr page is also a count
colname = new string[num];
coltype = new int[num];
collen = new int[num];
colIsNull = new bool[num];
};
};
#endif
Loading