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
120 changes: 104 additions & 16 deletions DBMS/DBMS/dbManage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -184,6 +186,54 @@ bool DBManager::updateRecord(string tableName,BYTE **Value,string *colName,BYTE
return true;
}

vector<RecordEntry*> DBManager::getFindRecord(string tableName,BYTE **Value,string *colName, BYTE *type, BYTE *len,BYTE *op, BYTE condCnt){
vector<RecordEntry*> 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<int>(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<RecordEntry*> DBManager::findRecord(string tableName,BYTE **Value,string *colName, BYTE *type, BYTE *len,BYTE *op, BYTE condCnt, string *showColName, int showNum){
vector<RecordEntry*> res;
SysObject* table = sysManager.findTable(tableName);
Expand All @@ -203,6 +253,8 @@ vector<RecordEntry*> 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])) {
Expand Down Expand Up @@ -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])) {
Expand Down Expand Up @@ -299,23 +353,41 @@ string *DBManager::getColName(string tableName, USRT &colNum){
return &(column->name);
}

vector<RecordEntry*> findRecord(string tableName,BYTE **Value,string *colName, BYTE *type, BYTE *len,BYTE *op, BYTE condCnt){
vector<RecordEntry*> 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<SysColumn*> 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<SysColumn*> 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<int>(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;
Expand All @@ -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<SysColumn*> 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;
Expand Down
3 changes: 3 additions & 0 deletions DBMS/DBMS/dbManage.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,12 @@ class DBManager{
//Data retrieval
string *getColName(string tableName,USRT &colNum);
vector<RecordEntry*> findRecord(string tableName,BYTE **Value,string *colName, BYTE *type, BYTE *len,BYTE *op, BYTE condCnt, string *showColName, int showNum);
vector<RecordEntry*> getFindRecord(string tableName,BYTE **Value,string *colName, BYTE *type, BYTE *len,BYTE *op, BYTE condCnt);
void combine(vector<RecordEntry*> &result, const vector<RecordEntry*> &A, const vector<RecordEntry*> &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);
Expand Down
Binary file modified DBMS/DBMS/orderDB/publisher
Binary file not shown.
2 changes: 1 addition & 1 deletion DBMS/DBMS/wq_parser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ void parser::BatchSqlInFile(char* filename) {
vector<string> 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) == ';') {
Expand Down
1 change: 1 addition & 0 deletions doc/problems.txt
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ fopen最后一行读取两次http://blog.163.com/chen_dawn/blog/static/112506320
-----------------------
删除数据那里还是有问题,如果你插入很多数据,然后重复删除一个位置的数据,delete small函数会卡死
【出现这个问题,我把db删掉,没法重现问题】
检查条件竟然是所有的数据【也是跪了cry!】
突然想到int的存储:atoi需要修改,已经修改


Expand Down