From b2e881234b44efc061c5cdb365eb5d906ef36ecc Mon Sep 17 00:00:00 2001 From: Alexia23 Date: Mon, 12 Jan 2015 16:24:31 +0800 Subject: [PATCH] select join part function and judge undeleted record --- DBMS/DBMS/dbManage.cpp | 120 +++++++++++++++++++++++++++++++----- DBMS/DBMS/dbManage.h | 3 + DBMS/DBMS/orderDB/publisher | Bin 8192 -> 8192 bytes DBMS/DBMS/wq_parser.cpp | 2 +- doc/problems.txt | 1 + 5 files changed, 109 insertions(+), 17 deletions(-) diff --git a/DBMS/DBMS/dbManage.cpp b/DBMS/DBMS/dbManage.cpp index e758640..977cc24 100644 --- a/DBMS/DBMS/dbManage.cpp +++ b/DBMS/DBMS/dbManage.cpp @@ -128,6 +128,8 @@ bool DBManager::updateRecord(string tableName,BYTE **Value,string *colName,BYTE int t = PAGE_SIZE; for (TYPE_OFFSET offset = 0 ; offset < (t/recordLength); offset++){ //cout << "offset " << offset << endl; + if (!checkRecordAvaliable(tableName, offset, pageid)) + continue; updateFlag = true; for (int i = 0; i < condCnt; i++) { if (op[i] == SET) @@ -184,6 +186,54 @@ bool DBManager::updateRecord(string tableName,BYTE **Value,string *colName,BYTE return true; } +vector DBManager::getFindRecord(string tableName,BYTE **Value,string *colName, BYTE *type, BYTE *len,BYTE *op, BYTE condCnt){ + vector res; + SysObject* table = sysManager.findTable(tableName); + if (table == NULL) + return res; + TYPE_ID pageid = 0; + Node* dataPage = readPage(table->id, pageid); + TYPE_OFFSET recordLength = sysManager.getRecordLength(tableName); + bool printFlag = true; + SysColumn* col; + while (dataPage != NULL && pageid < TABLE_MAX_FILE_SIZE) { + int t = PAGE_SIZE; + for (TYPE_OFFSET offset = 0 ; offset < (t/recordLength); offset++){ + printFlag = true; + for (int i = 0; i < condCnt; i++) { + if (!checkTableColumn(tableName,colName[i])) { + printFlag = false; + break; + } + col = getTableColumn(tableName, colName[i]); + if(col->xtype == INT_TYPE){ + int data = dataUtility::char_to_data(dataPage->page->data+offset*recordLength+col->index); + int comdata = atoi((char*)Value[i]); + if (!dataUtility::intOptint(data, op[i], comdata)){ + printFlag = false; + break; + } + } + else if(col->xtype == VARCHAR_TYPE){ + string data(dataUtility::getbyte(dataPage->page->data,offset*recordLength+col->index,col->length)); + string comData(dataUtility::getbyte((char*)Value[i], 0, (int)len[i])); + if (!dataUtility::stringOptstring(data, op[i], comData)){ + printFlag = false; + break; + } + } + } + if (printFlag == true) { + cout << "select onedata pageid: " << pageid << "offset: " << offset << endl; + if (checkRecordAvaliable(tableName, offset, pageid)) + res.push_back(getRecord(tableName, offset, pageid)); + } + } + pageid++; + dataPage = readPage(table->id, pageid); + } + return res; +}; vector DBManager::findRecord(string tableName,BYTE **Value,string *colName, BYTE *type, BYTE *len,BYTE *op, BYTE condCnt, string *showColName, int showNum){ vector res; SysObject* table = sysManager.findTable(tableName); @@ -203,6 +253,8 @@ vector DBManager::findRecord(string tableName,BYTE **Value,string int t = PAGE_SIZE; for (TYPE_OFFSET offset = 0 ; offset < (t/recordLength); offset++){ //cout << "offset " << offset << endl; + if (!checkRecordAvaliable(tableName, offset, pageid)) + continue; printFlag = true; for (int i = 0; i < condCnt; i++) { if (!checkTableColumn(tableName,colName[i])) { @@ -256,6 +308,8 @@ bool DBManager::deleteRecord(string tableName,BYTE **Value,string *colName,BYTE int t = PAGE_SIZE; for (TYPE_OFFSET offset = 0 ; offset < (t/recordLength); offset++){ //cout << "offset " << offset << endl; + if (!checkRecordAvaliable(tableName, offset, pageid)) + continue; deleteFlag = true; for (int i = 0; i < condCnt; i++) { if (!checkTableColumn(tableName,colName[i])) { @@ -299,23 +353,41 @@ string *DBManager::getColName(string tableName, USRT &colNum){ return &(column->name); } -vector findRecord(string tableName,BYTE **Value,string *colName, BYTE *type, BYTE *len,BYTE *op, BYTE condCnt){ - vector result; - return result; -} -void DBManager::printRecord(string tableName,BYTE colnum,string *colName,TYPE_OFFSET offset, TYPE_ID pageid){ +RecordEntry* DBManager::getRecord(string tableName, TYPE_OFFSET offset, TYPE_ID pageid) { + RecordEntry* res = new RecordEntry[1]; + vector syscolumns; SysObject* table = sysManager.findTable(tableName); if(table == NULL) - return; + return res; TYPE_OFFSET recordLength = sysManager.getRecordLength(tableName); if( offset >= PAGE_SIZE / recordLength){ - return; + return res; } - vector column; - for(BYTE i = 0 ; i < colnum; i++){ - column.push_back(sysManager.findColumn(colName[i], tableName)); + Node* dataPage = readPage(table->id, pageid); + + if (checkRecordAvaliable(tableName, offset, pageid)) { + syscolumns = sysManager.getTableAttr(tableName); + res->length = new BYTE[syscolumns.size()]; + res->item = new BYTE*[syscolumns.size()]; + for (int i = 0; i < syscolumns.size(); i++) { + //int data = dataUtility::char_to_data(dataPage->page->data+offset*recordLength+col->index); + res->length[i]=syscolumns[i]->length; + res->item[i] = new BYTE[syscolumns[i]->length]; + dataUtility::bytefillbyte((char*)(res->item[i]), (BYTE*)(dataPage->page->data+offset*recordLength+syscolumns[i]->index), 0, res->length[i]); + } } + return res; +} +bool DBManager::checkRecordAvaliable(string tableName, TYPE_OFFSET offset, TYPE_ID pageid) { + SysObject* table = sysManager.findTable(tableName); + if(table == NULL) + return false; + TYPE_OFFSET recordLength = sysManager.getRecordLength(tableName); + if( offset >= PAGE_SIZE / recordLength){ + return false; + } + Node* dataPage = readPage(table->id, pageid); TYPE_OFFSET freeOffset = dataPage->page->header.firstFreeOffset; @@ -328,19 +400,35 @@ void DBManager::printRecord(string tableName,BYTE colnum,string *colName,TYPE_OF //Deleted linked list ends before the selected item, check for initialized value TYPE_OFFSET realFreeCount = dataPage->page->header.freeCount - deletedItem * recordLength; if( PAGE_SIZE - realFreeCount <= offset*recordLength ){ //offset is not valid since it is still in default state - cout << "Record " << offset+1 << " in Page " << pageid << " has not been used." << endl; - return; + //cout << "Record " << offset+1 << " in Page " << pageid << " has not been used." << endl; + return false; } } else if(freeOffset == offset*recordLength){//item is deleted or first free if( PAGE_SIZE - dataPage->page->header.freeCount == freeOffset ){ //offset is not valid since it is still in default state - cout << "Record " << offset+1 << " in Page " << pageid << " has not been used." << endl; - return; + //cout << "Record " << offset+1 << " in Page " << pageid << " has not been used." << endl; + return false; } - cout << "Record " << offset+1 << " in Page " << pageid << " has been deleted." << endl; + //cout << "Record " << offset+1 << " in Page " << pageid << " has been deleted." << endl; + return false; + } + return true; +} +void DBManager::printRecord(string tableName,BYTE colnum,string *colName,TYPE_OFFSET offset, TYPE_ID pageid){ + if (checkRecordAvaliable(tableName, offset, pageid) == false) + return; + SysObject* table = sysManager.findTable(tableName); + if(table == NULL) + return; + TYPE_OFFSET recordLength = sysManager.getRecordLength(tableName); + if( offset >= PAGE_SIZE / recordLength){ return; } - + vector column; + for(BYTE i = 0 ; i < colnum; i++){ + column.push_back(sysManager.findColumn(colName[i], tableName)); + } + Node* dataPage = readPage(table->id, pageid); cout << "------- Record " << offset+1 << " in Page " << pageid << " -------" << endl; int i = 1; diff --git a/DBMS/DBMS/dbManage.h b/DBMS/DBMS/dbManage.h index 98c76c3..6fb0c0d 100644 --- a/DBMS/DBMS/dbManage.h +++ b/DBMS/DBMS/dbManage.h @@ -25,9 +25,12 @@ class DBManager{ //Data retrieval string *getColName(string tableName,USRT &colNum); vector findRecord(string tableName,BYTE **Value,string *colName, BYTE *type, BYTE *len,BYTE *op, BYTE condCnt, string *showColName, int showNum); + vector getFindRecord(string tableName,BYTE **Value,string *colName, BYTE *type, BYTE *len,BYTE *op, BYTE condCnt); void combine(vector &result, const vector &A, const vector &B, BYTE colA,BYTE colB,BYTE tarAIndex); //print + RecordEntry* getRecord(string tableName, TYPE_OFFSET offset, TYPE_ID pageid); + bool checkRecordAvaliable(string tableName, TYPE_OFFSET offset, TYPE_ID pageid); void printRecord(string tableName,BYTE colnum,string *colName,TYPE_OFFSET offset,TYPE_ID pageid); void printDatabase(); void printTable(string tableName); diff --git a/DBMS/DBMS/orderDB/publisher b/DBMS/DBMS/orderDB/publisher index e6cd90d9f80d0acea29e3bd53740941899a60bb1..f30b807ccff6fff5a176db4cbe68d5e979c54c61 100644 GIT binary patch delta 54 zcmZp0XmH?Q0D}(si5z)C4;UC$wlOj=pCEy+wP&0(0>k;X+VFJW^M;|W;+c}E>N diff --git a/DBMS/DBMS/wq_parser.cpp b/DBMS/DBMS/wq_parser.cpp index d984b26..a075094 100644 --- a/DBMS/DBMS/wq_parser.cpp +++ b/DBMS/DBMS/wq_parser.cpp @@ -33,7 +33,7 @@ void parser::BatchSqlInFile(char* filename) { vector res; while(true) { fgets(command, 1000,fin); - cout << command << endl; + //cout << command << endl; splitStr(command, &res); //semicolon has deleted if (res.size() > 0 && res[res.size()-1].at(res[res.size()-1].length()-1) == ';') { diff --git a/doc/problems.txt b/doc/problems.txt index 8308221..8387f99 100644 --- a/doc/problems.txt +++ b/doc/problems.txt @@ -31,6 +31,7 @@ fopen最后一行读取两次http://blog.163.com/chen_dawn/blog/static/112506320 ----------------------- 删除数据那里还是有问题,如果你插入很多数据,然后重复删除一个位置的数据,delete small函数会卡死 【出现这个问题,我把db删掉,没法重现问题】 +检查条件竟然是所有的数据【也是跪了cry!】 突然想到int的存储:atoi需要修改,已经修改