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
4 changes: 2 additions & 2 deletions DBMS/DBMS/fileManage.cpp
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
#include "fileManage.h"
#include "data_utility.h"

void FileManage::writePageToFile(int pageid, dbPage pagedata, char* filename){
void FileManage::writePageToFile(int pageid, dbPage* pagedata, char* filename){
FILE* originfilestream;
FILE* updatefilestream;
char* writedata = dataUtility::data_to_char<dbPage>(pagedata);
char* writedata = dataUtility::data_to_char<dbPage>(*pagedata);
const char* updatefilename = "newfile.txt";
originfilestream = fopen(filename,"r");
updatefilestream = fopen(updatefilename, "w+");
Expand Down
2 changes: 1 addition & 1 deletion DBMS/DBMS/fileManage.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

class FileManage {
public:
static void writePageToFile(int pageid, dbPage pageinfo, char* filename);
static void writePageToFile(int pageid, dbPage* pageinfo, char* filename);
static void readPageFromFile(int pageid, dbPage* pageinfo, char* filename);
static int createFileFolder(char* filefoldername);
static int deleteFileFolder(char* filefoldername);
Expand Down
9 changes: 8 additions & 1 deletion DBMS/DBMS/globalVariable.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,14 @@ typedef unsigned int UINT;
typedef unsigned short USRT;
typedef unsigned char BYTE;

#define PAGE_SIZE 8192-sizeof(pageHeader)
#define DB_PGSIZE 8192 // size of page
#define DB_PGSIZE_USRT DB_PGSIZE/(sizeof (USRT)) // count in short
#define DB_MAX_BUFFER_SIZE 1000 // the size of maximum buffer page
#define DB_MAX_FILE_NUM ((1<<8*(sizeof (USRT)))-1)
#define DB_DEFAULT_FILE_SIZE 1048576 //(1024*1024)
#define DB_MAX_TABLE_NUM 1024

#define PAGE_SIZE DB_PGSIZE-sizeof(pageHeader)
#define INT_TYPE 0
#define DOUBLE_TYPE 1
#define FLOAT_TYPE 2
Expand Down
29 changes: 20 additions & 9 deletions DBMS/DBMS/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,27 @@

int main()
{
// test buffer jjjjj
FileBuffer* fb = new FileBuffer(12);
Node *p1 = new Node("aaa", 1), *p2 = new Node("bbb", 2);
fb -> insert(p1);
fb -> insert(p2);
Node *p3 = fb -> find(1);
if (p3) cout << p3 -> data << endl;
// test buffer
FileBuffer* fb = new FileBuffer();
Node *p1 = new Node(new dbPage("Jason"))
, *p2 = new Node(new dbPage("Alexia"));
fb -> insert(rowID(0,1), p1);
fb -> insert(rowID(0,2), p2);
Node *p3 = fb -> find(rowID(0,1));
if (p3) cout << p3 -> page -> data << endl;
p3 = fb->find(rowID(0,2));
if (p3) cout << p3 -> page -> data;
fb -> remove();
p3 = fb -> find(1);
if (!p3) cout << "null" << endl;
if(p3 = fb->find(rowID(0,2)))
cout << p3->page->data << " still here" << endl;
else
cout << " is gone" << endl;
p3 = fb -> find(rowID(0,1));
if (p3)
cout << p3->page->data << " still here" << endl;
else
cout << "Jason is gone" << endl;


// test file read or write by page
DBStorage testdb("studentManage", 0, 1);
Expand Down
60 changes: 24 additions & 36 deletions DBMS/DBMS/node.cpp
Original file line number Diff line number Diff line change
@@ -1,51 +1,39 @@
#include "node.h"

FileBuffer::FileBuffer(int max){
head = new Node();
pointer = new Node();
head -> next = pointer;
pointer -> pre = head;

maxPage = max;
usedPage = 0;
FileBuffer::FileBuffer(){
numPage = 0;
}

Node* FileBuffer::remove(){
if (!usedPage) return NULL;

Node* cur = pointer -> pre;
(cur -> pre) -> next = pointer;
pointer -> pre = cur -> pre;

if (cur -> dirty) {
//FileManage::writePageToFile(cur -> pageid, cur -> data, filename);
if (!numPage) return NULL;

map<rowID, Node*>::iterator it = bufmap.end();
Node* bufPage = (--it)->second;

if ( bufPage->dirty ) {
//FileManage::writePageToFile(it->first.first, bufPage -> page
// , bufPage->page->header.fileId );
}
bufmap.erase(cur -> pageid);
usedPage--;
return cur;

bufmap.erase(it);
numPage--;
return bufPage;
}

void FileBuffer::insert(Node* cur){
if ( usedPage == maxPage ) {
void FileBuffer::insert(rowID id, Node* buffer){
if ( numPage == DB_MAX_BUFFER_SIZE ) {
cout << "buffer is full" << endl;
remove();
insert(cur);
return;
}
bufmap[id] = buffer;
numPage++;
}

cur -> next = head -> next;
cur -> pre = head;
head -> next = cur;
(cur -> next) -> pre = cur;

bufmap.insert(map<int, Node*>::value_type(cur -> pageid, cur));
usedPage++;
Node* FileBuffer::find(rowID id){
map<rowID, Node*>::iterator it = bufmap.find(id);
return (it==bufmap.end())?NULL:it->second;
}

Node* FileBuffer::find(int pageid){
Node* cur = NULL;
map<int, Node*>::iterator it = bufmap.find(pageid);
if(it != bufmap.end())
cur = it ->second;
return cur;
Node* FileBuffer::find(UINT FileID, UINT PageID){
return find(pair<UINT,UINT>(FileID,PageID));
}
31 changes: 12 additions & 19 deletions DBMS/DBMS/node.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,40 +9,33 @@

using namespace std;

typedef pair<UINT,UINT> rowID;

class FileBuffer;
struct Node{
char* data;
int pageid;
bool dirty;
Node* next;
Node* pre;
dbPage* page;
Node(){
data = NULL;
pageid = 0;
dirty = false;
next = NULL;
pre = NULL;
page = NULL;
}
Node(char* _data, int _pageid) : data(_data), pageid(_pageid){
Node(dbPage* _page) : page(_page){
dirty = false;
next = NULL;
pre = NULL;
}
};


//���ÿ���ļ�һ������
class FileBuffer{
Node *head, *pointer;
char* filename;
int maxPage;
int usedPage;
map<int, Node*> bufmap; //�ܹ�����pageid�����ҵ�Node
public:
FileBuffer(int max);
FileBuffer();
Node* remove(); //�Ӷ��е�β��ɾ��������map��ɾ����usepagenum --
void insert(Node* cur); //������ף�����map��usepagenum ++
Node* find(int pageid); //���ڣ����ؽڵ㣻���򣬷���NULL
void insert(rowID id, Node* buffer); //������ף�����map��usepagenum ++
Node* find(rowID id); //���ڣ����ؽڵ㣻���򣬷���NULL
Node* find(UINT FileID, UINT PageID);
private:
int numPage;
map<rowID, Node*> bufmap; //�ܹ�����rowid�����ҵ�Node
};


Expand Down
6 changes: 5 additions & 1 deletion DBMS/DBMS/pageManage.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,11 @@ class dbPage {
pageHeader header;
char data[PAGE_SIZE];
dbPage() {
memset(data, 0, PAGE_SIZE);
memset(data, '/0', PAGE_SIZE);
}
dbPage(char* src){
memset(data, '/0', PAGE_SIZE);
strcpy(data,src);
}
};

Expand Down
2 changes: 1 addition & 1 deletion DBMS/DBMS/recordManage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ void DBStorage::createTable(char* filename, char* databasename, attr tableinfo)

memcpy(test.data, attrdata, sizeof(tableinfo));

FileManage::writePageToFile(test.header.pageId, test, path);
FileManage::writePageToFile(test.header.pageId, &test, path);
this->filenum++;

dbPage* result = new dbPage();
Expand Down