int main() { Connection conn; DbRetVal rv = conn.open("root", "manager"); if (rv != OK) return 1; DatabaseManagerImpl *dbMgr = (DatabaseManagerImpl*) conn.getDatabaseManager(); if (dbMgr == NULL) { printf("Auth failed\n"); return 2;} int ret =0, rc =0; if (createTable(dbMgr, "t1") != 0 ) { ret = 3; } #ifdef WITHINDEX if (createIndex(dbMgr, "t1","f1", "idx1") != 0 ) { ret = 4; } #endif rv = conn.startTransaction(); if (rv != OK) ret = 5; rc = insertTuple(dbMgr, conn, "t1", 10); if (rc != 10) ret = 6; conn.commit(); rv = conn.startTransaction(); if (rv != OK) ret = 5; rc = selectTuple(dbMgr, conn, "t1", 10); if (rc != 10) ret = 6; printf("Before commit\n"); dbMgr->printDebugLockInfo(); conn.commit(); printf("After commit\n"); dbMgr->printDebugLockInfo(); dropTable(dbMgr, "t1"); conn.close(); return ret; }
void API_Delete(Table tbl, list<Condition> &clist) { int flag = 0; if (clist.empty())flag = 1; list<Condition> Have_Index_Condition; list<Condition> No_Index_Condition; list<Condition>::iterator it; string IndexNameList[100]; int Attribute_Size[100]; int i=0; for(it=clist.begin();it!=clist.end();it++){ Attribute_Size[i] = tbl.getAttr(it->compare_attr).attr_len; IndexNameList[i++] = tbl.getAttrIndex(it->compare_attr); if(!IndexNameList[i-1].empty()&&it->compare_type!=NOT_EQUAL){ Have_Index_Condition.push_back(*it); } else{ i--; No_Index_Condition.push_back(*it); } } i=0; vector<int> finalOfstList; vector<int> tempOfstList; vector<int>::iterator endOfList; for(it=Have_Index_Condition.begin();it!=Have_Index_Condition.end();it++){ if (it == Have_Index_Condition.begin()){ Index_Select_Position(*it, IndexNameList[i], finalOfstList, Attribute_Size[i], tbl.getAttr((*it).compare_attr).attr_type); i++; } else{ Index_Select_Position(*it,IndexNameList[i],tempOfstList,Attribute_Size[i],tbl.getAttr((*it).compare_attr).attr_type); i++; sort(finalOfstList.begin(), finalOfstList.end()); sort(tempOfstList.begin(), tempOfstList.end()); endOfList = set_intersection(finalOfstList.begin(), finalOfstList.end(), tempOfstList.begin(), tempOfstList.end(), finalOfstList.begin()); finalOfstList.resize(endOfList - finalOfstList.begin()); sort(finalOfstList.begin(), finalOfstList.end()); finalOfstList.erase(unique(finalOfstList.begin(), finalOfstList.end()), finalOfstList.end()); } if(finalOfstList.empty()){ cout << "Query OK, 0 rows affected." << endl; return; } } Tuple selectTuple(tbl.getTableName()); if (flag)finalOfstList.push_back(0);//clist为空 else if (Have_Index_Condition.empty())finalOfstList.push_back(1);//clist不为空,且无索引信息 else if (finalOfstList.empty())finalOfstList.push_back(2);//正常,但是索引找到的list为空 else finalOfstList.push_back(3);//正常 int deleteNum=selectTuple.Delete(finalOfstList, No_Index_Condition); cout << "Query OK, "<< deleteNum <<" rows affected." << endl; }
void API_Select(Table tbl,list<Condition> &clist) { if (!tbl.isTableExist()){ //表不存在 throw Table_Index_Error("table", tbl.getTableName()); } int flag=0; if (clist.empty())flag = 1; list<Condition> Have_Index_Condition; list<Condition> No_Index_Condition; list<Condition>::iterator it; string IndexNameList[100]; int Attribute_Size[100]; int i=0; for(it=clist.begin();it!=clist.end();it++){ Attribute_Size[i] = tbl.getAttr(it->compare_attr).attr_len; IndexNameList[i++] = tbl.getAttrIndex(it->compare_attr); if(!IndexNameList[i-1].empty()&&it->compare_type!=NOT_EQUAL){ Have_Index_Condition.push_back(*it); } else{ i--; No_Index_Condition.push_back(*it); } } i=0; vector<int> finalOfstList; vector<int> tempOfstList; vector<int> temp2; vector<int>::iterator endOfList; for(it=Have_Index_Condition.begin();it!=Have_Index_Condition.end();it++){ if (it == Have_Index_Condition.begin()){ //cout << IndexNameList[i] << ' ' << Attribute_Size[i] << ' ' << tbl.getAttr((*it).compare_attr).attr_type << endl; Index_Select_Position(*it, IndexNameList[i], finalOfstList, Attribute_Size[i], tbl.getAttr((*it).compare_attr).attr_type); //Index_Select_Position(*it, IndexNameList[i], tempOfstList, Attribute_Size[i], tbl.getAttr((*it).compare_attr).attr_type); i++; } else{ cout << IndexNameList[i] << ' ' << Attribute_Size[i] << ' ' << tbl.getAttr((*it).compare_attr).attr_type << endl; Index_Select_Position(*it, IndexNameList[i], tempOfstList, Attribute_Size[i], tbl.getAttr((*it).compare_attr).attr_type); i++; sort(finalOfstList.begin(), finalOfstList.end()); sort(tempOfstList.begin(), tempOfstList.end()); endOfList = set_intersection(finalOfstList.begin(), finalOfstList.end(), tempOfstList.begin(), tempOfstList.end(), finalOfstList.begin()); finalOfstList.resize(endOfList - finalOfstList.begin()); sort(finalOfstList.begin(), finalOfstList.end()); finalOfstList.erase(unique(finalOfstList.begin(), finalOfstList.end()), finalOfstList.end()); } if (finalOfstList.empty()){ cout << "Empty set." << endl; return; } Block::flush_all_blocks(); } Tuple selectTuple(tbl.getTableName()); if (flag)finalOfstList.push_back(0);//clist为空 else if (Have_Index_Condition.empty())finalOfstList.push_back(1);//clist不为空,且无索引信息 else if (finalOfstList.empty())finalOfstList.push_back(2);//正常,但是索引找到的list为空 else finalOfstList.push_back(3);//正常 selectTuple.Select(finalOfstList,No_Index_Condition); selectTuple.printSelectResult(); }