⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 executor.cpp

📁 our homework big project
💻 CPP
📖 第 1 页 / 共 3 页
字号:
////////////////////////////////////////////////////////////////////////////
//
//
//
//
////////////////////////////////////////////////////////////////////////////


#include "Executor.h"
//#include "stdafx.h"

 


//extern map<string,TokenValue> TokenMap;

//执行函数CteatTable的定义
string ExCreateTable::ExecuteSQL(int line)
{
	
	string path="data\\";
	string fullCataName = path+m_ACTresult.m_catahead.tname+".cata";
	string fullRecdName = path+m_ACTresult.m_catahead.tname+".recd";
	ifstream fin;
    
	//测试表是否已经存在
	fin.open(fullCataName.c_str(),ios::in|ios::binary);
	if(fin.is_open())
	{	
		fin.close();
		throw  ErrorPos(ID_ERROR_EXISTTABLE,line);
	}
	fin.close();
	
	//用于测试建表语句中是否有重复属性定义
	set<string> s_tmp;
	for(int j=0; j<m_ACTresult.m_catahead.number; j++)
		s_tmp.insert(m_ACTresult.m_cata[j].attrName);
	
	if(s_tmp.size() != m_ACTresult.m_cata.size())
	{
		throw ErrorPos(ID_ERROR_SAMEATTR,line);								//属性重复
	}
	
	ofstream fout(fullCataName.c_str(),ios::out|ios::binary);
	
	if(!fout.is_open())
	{
		//int error=GetLastError();
		throw ErrorPos(ID_ERROR_EXCREATETABLE,line);						//建表失败
	}
	
	fout.write((char *)&(m_ACTresult.m_catahead),sizeof CatalogHead);		//写入文件头
	
	for(int i=0; i<m_ACTresult.m_catahead.number; i++)
	{
		
		fout.write((char *)& (m_ACTresult.m_cata[i]),sizeof CatalogFile);	//写入各个属性
		//AfxMessageBox(m_ACTresult.m_cata[i].attrName.c_str());
	}
	fout.close();
	
	int numOfRecord=0;
	int firstBlank=-1;
	
	fout.open(fullRecdName.c_str(),ios::out|ios::binary);
	if(!fout.is_open())
	{
		throw ErrorPos(ID_ERROR_EXCREATETABLE,line);						//建表失败
	}
	
	fout.write((char *)&numOfRecord,sizeof(int));
	fout.write((char *)&firstBlank,sizeof(int));
	fout.close();

	
	for( int k=0; k<m_ACTresult.m_catahead.number; k++)
	{
		
		if(m_ACTresult.m_cata[k].primaryFlag == 1)
		{ 
			string tmp("");
			tmp = tmp+m_ACTresult.m_cata[k].attrName+" on "+m_ACTresult.m_catahead.tname+"("+m_ACTresult.m_cata[k].attrName+")"+";";
			vector<string> v_tmp;
			SplitString a(tmp);
			a.SplitWords(v_tmp);
			AnCreateIndex antmp(v_tmp);
			antmp.AnalyseSQL(0,line);
			ExCreateIndex extmp(antmp);
			extmp.ExecuteSQL(line);
			break;
		}
	}
	return string("*****表被成功创建!*****");
}



string ExCreateIndex::ExecuteSQL(int line)
{
	ifstream fin;
	string path="data\\";
	string fullCataName = path+m_ACIresult.m_tableName+".cata";
	CatalogHead head;
	CatalogFile attr;
	
	fin.open(fullCataName.c_str(),ios::in|ios::binary);
	if(!fin.is_open())
	{	
		throw  ErrorPos(ID_ERROR_NOEXISTTABLE,line);				//表不存在
	}
	
	fin.read((char *)&head,sizeof(head));
	for( int i=0; i<head.number; i++)
	{
		fin.read((char *)&attr,sizeof(attr));
		if(attr.attrName == m_ACIresult.m_attrName && attr.uniqueFlag == 1)
		{
			break;
		}
	}
	if(i==head.number)
	{
		throw ErrorPos(ID_ERROR_EXCREATEINDEX,line);			//不能创建索引(找不到索引项)
	}
	int attrID = i;
	
	string fullIndexName = m_ACIresult.m_indexName;
							
	ifstream ffin(fullIndexName.c_str(),ios::in|ios::binary);
	if(ffin.is_open())
	{
		ffin.close();
		throw ErrorPos(ID_ERROR_EXSITINDEX,line);				//索引已经建立
	}
	ffin.close();
	
	switch(attr.typeFlag)
	{
	case 0:
		{
			Node<char *> char_node;
			RecordManager recd(m_ACIresult.m_tableName);
			for(int i=0; i<recd.GetRecordAmount(); i++)
			{
				if(recd.GetRecordHead(i).m_valid==true)
				{
					char *tmp=new char[attr.size];
					recd.RecordAtrrIO(*tmp,i,attrID,'i',attr.size);
					char_node.Insert_node(tmp,i);
					//delete []tmp;
				}
			}
			char_node.Index(fullIndexName,'c');
			break;
		}
			
	
	case 1:
		{
			Node<int> int_node;
			RecordManager recd(m_ACIresult.m_tableName);
			for(int i=0; i<recd.GetRecordAmount(); i++)
			{
				if(recd.GetRecordHead(i).m_valid==true)
				{
					int tmp;
					recd.RecordAtrrIO(tmp,i,attrID,'i',4);
					int_node.Insert_node(tmp,i);
				}
				
			}
			int_node.Index(fullIndexName,1);
			break;
		}
			

	case 2:
		{
			Node<float> float_node;
			RecordManager recd(m_ACIresult.m_tableName);
			for(int i=0; i<recd.GetRecordAmount(); i++)
			{
				if(recd.GetRecordHead(i).m_valid==true)
				{
					float tmp;
					recd.RecordAtrrIO(tmp,i,attrID,'i',4);
					float_node.Insert_node(tmp,i);
				}
			}
			float_node.Index(fullIndexName,1.0f);
			break;
		}
	}
	fin.close();
	return string("****索引被成功创建!****");
}




string ExDropTable::ExecuteSQL(int line)
{
	string path="data\\";
	string fullCataName = path+m_ADTresult.m_tableName+".cata";
	string fullRecdName = path+m_ADTresult.m_tableName+".recd";
	CatalogHead chead;
	CatalogFile cfile;
	ifstream fin(fullCataName.c_str(),ios::in|ios::binary);

	if(!fin.is_open())
	{
		throw ErrorPos(ID_ERROR_NOEXISTTABLE,line);
	}
	fin.seekg(0,ios::beg);
	fin.read((char *)&chead,sizeof(chead));
	for(int i=0; i<chead.number; i++)
	{
		fin.read((char *)&cfile,sizeof(cfile));
		if(cfile.primaryFlag==1)
		{
			CFile::Remove(string("data\\"+string(cfile.attrName)+".indx").c_str());
			break;
		}
			
	}
	fin.close();

	CFile::Remove(fullCataName.c_str());
	CFile::Remove(fullRecdName.c_str());
	//	AfxMessageBox("hello");
	return string("*****表被成功删除!*****");
}


string ExDropIndex::ExecuteSQL(int line)
{
	string path="data\\";
	string fullIndexName = path+m_ADIresult.m_indexName+".indx";
	ifstream fin(fullIndexName.c_str(),ios::in|ios::binary);
	if(!fin.is_open())
	{
		fin.close();
		throw ErrorPos(ID_ERROR_NOEXSITINDEX,line);
	}
	fin.close();
	
	CFile::Remove(fullIndexName.c_str());

	return string("*****索引被成功删除!******");
}


string ExInsertValues::ExecuteSQL(int line)
{
	string path="data\\";
	string fullCataName=path+m_AIVresult.m_tableName+".cata";

	CatalogHead headtmp;
	CatalogFile filetmp;

	ifstream ffin;
	ffin.open(fullCataName.c_str(),ios::in|ios::binary);
	if(!ffin.is_open())
	{
		ffin.close();
		throw ErrorPos(ID_ERROR_NOEXISTTABLE,line);				//待插入的表不存在
	}
	
	ffin.read((char *)&headtmp, sizeof CatalogHead);
	if(m_AIVresult.m_values.size() != headtmp.number)
	{
		ffin.close();
		throw ErrorPos(ID_ERROR_NOMATCH,line);					//属性数目不匹配
	}
	
	for(int j=0; j<headtmp.number; j++)
	{
		ffin.read((char *)&filetmp,sizeof CatalogFile);
		if(filetmp.typeFlag == 0 && m_AIVresult.m_values[j][0] != '\'')
		{
			//AfxMessageBox(m_AIVresult.m_values[j].c_str()); 
			
			throw ErrorPos(ID_ERROR_NOMATCH,line);				//属性不匹配
		}
		else if(filetmp.typeFlag == 0 && m_AIVresult.m_values[j][0]=='\'')
		{
			if(m_AIVresult.m_values[j].size() >= filetmp.size)
				throw ErrorPos(ID_ERROR_INSERTOVERSIZE,line);    //插入项超过最大字符数	
		}
		else if(filetmp.typeFlag == 1)
		{
			for(int i=0; i<m_AIVresult.m_values[j].size(); i++)
				if(!isdigit(m_AIVresult.m_values[j][i])&&m_AIVresult.m_values[j][i]!='-')
					throw ErrorPos(ID_ERROR_NOMATCH,line);		//插入项含有非法字符
		}
		else
		{
			for(int i=0; i<m_AIVresult.m_values[j].size(); i++)
				if(!isdigit(m_AIVresult.m_values[j][i]) && m_AIVresult.m_values[j][i]!='.'&&m_AIVresult.m_values[j][i]!='-')
					throw ErrorPos(ID_ERROR_NOMATCH,line);		//插入项含有非法字符
		}
	}
	ffin.close();
	
	RecordManager recd(m_AIVresult.m_tableName);
	int recordID=recd.GetFirstBlank();
	
	if(recordID == -1)
	{
		recordID = recd.GetRecordAmount();
		recd.WriteRecord(recordID,m_AIVresult.m_values,line);
	}
	else
	{ 
		recd.WriteRecord(recordID,m_AIVresult.m_values,line);
	}

	
	return string("*****成功插入 1 条记录!*****");
}





string ExDeleteValues::ExecuteSQL(int line)
{
	string myString("");
	fstream cataIn;
	CatalogFile cataFile;
	bool nameFlag=false;						//属性名是否相等的标志
	int attrAmount;						//属性个数	
	int i,j,k;							//循环计数变量
	int no;

	int itemp=0;
	float ftemp=0.0;
	

	vector <string> attrName;			//属性名容器
	vector <char> attrType;				//属性类型
	vector <char> attrPrim;				//属性的unique属性
	vector <int> attrSize;				//属性大小

	set <int> bpresult;
	set <int> result;			//结果集合
    set <int> :: const_iterator iter;

	string cataPath("data\\");
	cataPath+=m_ADTresult.m_tableName;
	cataPath+=".cata";
	cataIn.open((cataPath).c_str(), ios::in | ios::binary); //打开日志文件
	
	if(!cataIn.is_open())
	{
		throw ErrorPos(ID_ERROR_NOEXISTTABLE,line);
	}
	
	cataIn.seekg(16,ios::beg);
	cataIn.read((char *)&attrAmount,sizeof(int));	//获取记录属性个数
													//读指针定位到第一条记录(跳过头信息)



	for(i=0; i<attrAmount; i++)						//读出各属性值到响应容器
													
	{
         cataIn.read((char*)&cataFile, sizeof(cataFile));
			 attrName.push_back(cataFile.attrName);
		 attrPrim.push_back(cataFile.primaryFlag );
		 attrType.push_back(cataFile.typeFlag);
		 attrSize.push_back(cataFile.size);
	}

	

	RecordManager record(m_ADTresult.m_tableName); 

	
	RecordHead validHead;

	int max=record.GetRecordAmount()  ;
	bool max0=true;							  //是否0条记录
	int ident=0;

	vector<int> recordNum;
	
	for(j=0,i=0;i<max;i++)
	{		
		validHead=record.GetRecordHead(i);
		if(validHead.m_valid)
		{
			max0=false;
			recordNum.push_back(i);
            result.insert(i);
			
			for(;record.GetRecordHead(i).m_nextRecordID !=-1;)
			{
				result.insert(record.GetRecordHead(i).m_nextRecordID);
				recordNum.push_back (record.GetRecordHead(i).m_nextRecordID);

				i=record.GetRecordHead(i).m_nextRecordID;
				j++;
			}
			max=j+1;
			  break;
			
		}

	}


	if(max0)
		return "*****共有 0 条记录被成功删除!*****";


	
		for(i=0; i<m_ADTresult.m_attr.size(); i++)			//where中判断条件个数循环
		{
			
			for(j=0; j<attrName.size(); j++)			//属性个数循环
			{
				if(m_ADTresult.m_attr[i]==attrName[j])
				{
					nameFlag=true;
					if(attrPrim[j]==1)                  //属性主码,连b+树
					{
						string op =	m_ADTresult.m_opcode[i];
												
						switch(attrType[j])
						{ 
						case 0:
							{
							Node <char*> treeNode;
							treeNode.Buildtree(attrName[j],'d');
							char *str=const_cast<char *>(m_ADTresult.m_attrvalue[i].c_str());
								
									
								if(op=="=")
								{
									no=treeNode.Eqsearch(str)[0];
									if(no!=-1)
									{
									bpresult.insert(no);
									recordNum[ident++]=no;
									}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -