From 25a6b23a0eb145d89a7439b2ab77feb0bba2b9b5 Mon Sep 17 00:00:00 2001 From: gzwongkk Date: Tue, 30 Dec 2014 04:19:31 +0800 Subject: [PATCH] memory --- DBMS/DBMS/fileManage.cpp | 4 +-- DBMS/DBMS/fileManage.h | 2 +- DBMS/DBMS/globalVariable.h | 9 +++++- DBMS/DBMS/main.cpp | 29 ++++++++++++------ DBMS/DBMS/node.cpp | 60 +++++++++++++++----------------------- DBMS/DBMS/node.h | 31 ++++++++------------ DBMS/DBMS/pageManage.h | 6 +++- DBMS/DBMS/recordManage.cpp | 2 +- 8 files changed, 73 insertions(+), 70 deletions(-) diff --git a/DBMS/DBMS/fileManage.cpp b/DBMS/DBMS/fileManage.cpp index 65e7717..e60d791 100644 --- a/DBMS/DBMS/fileManage.cpp +++ b/DBMS/DBMS/fileManage.cpp @@ -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(pagedata); + char* writedata = dataUtility::data_to_char(*pagedata); const char* updatefilename = "newfile.txt"; originfilestream = fopen(filename,"r"); updatefilestream = fopen(updatefilename, "w+"); diff --git a/DBMS/DBMS/fileManage.h b/DBMS/DBMS/fileManage.h index 9d50ef6..3ef0eac 100644 --- a/DBMS/DBMS/fileManage.h +++ b/DBMS/DBMS/fileManage.h @@ -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); diff --git a/DBMS/DBMS/globalVariable.h b/DBMS/DBMS/globalVariable.h index 419fe00..69b52e0 100644 --- a/DBMS/DBMS/globalVariable.h +++ b/DBMS/DBMS/globalVariable.h @@ -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 diff --git a/DBMS/DBMS/main.cpp b/DBMS/DBMS/main.cpp index 9e4f0de..fff5bda 100644 --- a/DBMS/DBMS/main.cpp +++ b/DBMS/DBMS/main.cpp @@ -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); diff --git a/DBMS/DBMS/node.cpp b/DBMS/DBMS/node.cpp index b367098..d4b4a78 100644 --- a/DBMS/DBMS/node.cpp +++ b/DBMS/DBMS/node.cpp @@ -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::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::value_type(cur -> pageid, cur)); - usedPage++; +Node* FileBuffer::find(rowID id){ + map::iterator it = bufmap.find(id); + return (it==bufmap.end())?NULL:it->second; } -Node* FileBuffer::find(int pageid){ - Node* cur = NULL; - map::iterator it = bufmap.find(pageid); - if(it != bufmap.end()) - cur = it ->second; - return cur; +Node* FileBuffer::find(UINT FileID, UINT PageID){ + return find(pair(FileID,PageID)); } \ No newline at end of file diff --git a/DBMS/DBMS/node.h b/DBMS/DBMS/node.h index ba12495..0eb8dba 100644 --- a/DBMS/DBMS/node.h +++ b/DBMS/DBMS/node.h @@ -9,40 +9,33 @@ using namespace std; +typedef pair 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 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 bufmap; //能够根据rowid快速找到Node }; diff --git a/DBMS/DBMS/pageManage.h b/DBMS/DBMS/pageManage.h index 32e89ec..8d3df40 100644 --- a/DBMS/DBMS/pageManage.h +++ b/DBMS/DBMS/pageManage.h @@ -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); } }; diff --git a/DBMS/DBMS/recordManage.cpp b/DBMS/DBMS/recordManage.cpp index 3d47426..135445b 100644 --- a/DBMS/DBMS/recordManage.cpp +++ b/DBMS/DBMS/recordManage.cpp @@ -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();