Beispiel #1
0
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;
}
Beispiel #2
0
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;
}
Beispiel #3
0
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();
}