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

📄 dbcontrol.cpp

📁 数据库模拟程序 实现控制台命令词法分析
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	int weizhi1 = -1;
	int i = 0;
	while(i < len)
	{
		if(strcmp(word[i].mark, "f") == 0){
			ptFrom = i;
		}
		else if(strcmp(word[i].mark, "w") == 0){
			ptWhere = i;
		}
		if(ptWhere != -1 && strcmp(word[i].name, ".") == 0)
			isLink = i;
		i++;
	}
	off1 = ptFrom - 1;		  //获得属性组长度
	off2 = ptWhere - ptFrom - 1;//获得表组长度
	off3 = len - 1 - ptWhere ;//获得条件组的长度
	
	//#######################################################################
	////////////////////////////////////////
	///////select * from table;
	////////////////////////////////////////
	if(strcmp(word[1].name, "*") == 0 && ptWhere == -1){
		show(str, word, len);
		return 0;
	}
	/////////////////////////////////////////
	//#######################################################################

	//#######################################################################
	/////////////////////////////////////////
	//////select [属性组] from [表组] where [条件组]; //最多支持两个条件
	/////////////////////////////////////////
	if(ptWhere == -1)
	{	
		//##################################################
		//启动计时器
		CRunTimer a;
		START_TIMER(a)
		//##################################################
			
		char filename[20];
		Data data;
		IndexForCiDian index;
		memset(filename, 0, 20);
		memset(&data, 0, sizeof(Data));
		memset(&index, 0, sizeof(IndexForCiDian));
		
		fstream f,file;
		f.open("SearchResult.txt", ios::out);
		f.close();
		f.open("SearchResult.txt", ios::in | ios::out | ios::app);
		i = 1;
		int j = 0, k = 0;
		char tableName[20];
		while(i < off1)
		{
			memset(tableName, 0, 20);
			
			/////组装表名
			while(strcmp(word[i].name, ".") != 0)
			{
				strcat(tableName, word[i].name);
				i++;
			}
			//组装完毕.
			
			
			char temp[20];
			memset(temp, 0, 20);
			strcpy(temp, tableName);
			
			strcpy(index.name, tableName);
			if((weizhi1 = getIndexFromCiDian(index, data, word[i+1].name)) == -1){
				AfxMessageBox("属性名称错误!");
				return false;
			}
			
			//文件中转
			fstream ta;
			ta.open("temp", ios::out);
			char ch;
			f.seekg(0, ios::beg);
			
			
			while(f.read(&ch, 1))
			{
				ta.write(&ch,1);
			}
			ta.close();
			f.close();
			f.open("SearchResult.txt",ios::out);
			f.close();
			f.open("SearchResult.txt", ios::in | ios::out);
			ta.open("temp",ios::in);
			
			int biaotou;
			int isKongXiang = 1;
			biaotou = 0;
			k = 0;
			while(ReadTable(tableName, k, data))
			{
				j = 0;
				
				isKongXiang = 1;
				while(ta.read(&ch,1) && ch != '\n')
				{
					isKongXiang = 0;
					f.write(&ch, 1);
				}
				if(isKongXiang == 1){
					char kongxiang[ITEM_LEN];
					memset(kongxiang, 0, ITEM_LEN);
					f.write(kongxiang, ITEM_LEN);
					isKongXiang = 0;
				}
				
				//		while(j < data.pDataArray_len)用来显示所有的属性,与下句选其一
				j = weizhi1;
				{
					if(biaotou == 0){
						biaotou = 1;
						char tou[ITEM_LEN];
						memset(tou, 0, ITEM_LEN);
						strcpy(tou, word[i-1].name);
						strcat(tou, ".");
						strcat(tou, word[i+1].name);
						f.write(tou, ITEM_LEN);
						k = -1;
					}
					else
						f.write(data.pDataArray[j].name, ITEM_LEN);
					j++;
				}
				f<<endl;
				f.flush();
				
				memset(&data, 0, sizeof(Data));
				memset(tableName, 0, 20);	
				strcpy(tableName, temp); 
				k++;
			}
			
			if(strcmp(word[i].name,".") == 0)
				i++;
			i++;
			if(strcmp(word[i].name,",") == 0)
				i++;
		}
		f.close();
		
		//###################################
		//停止计时器
		END_TIMER(a)
		a.GetTime();
		//#####################################

		system("type.bat SearchResult");//显示
		return true;
	}
	//#######################################################################


	//#######################################################################
	//选择select * from t where a = [ext1] 值 [ext2] and B=[ext1] 值 [ext2]........;
	///SearchResult为查询结果队列
	if(ptWhere != -1 && isLink == -1)//查询情况 非多关系连接
	{
		//##################################################
		//启动计时器
		CRunTimer a;
		START_TIMER(a)
		//##################################################

		int weizhi1 = -1;//如果成功找到该表中的属性,则weizhi为该属性的顺序索引号码。weizhi =[0..n-1]
		int ext1 = 0;//用于扩展''的形式,进行补位操作
		int ext2 = 0;
		int flag = 0;//FLAG = 0时打开.tab文件,并全文拷贝到SearchResult中.为1时直接打开SearchResult操作
		IndexForCiDian index;
		Data data;
		int savePtWhere = ptWhere;
		
		while(savePtWhere < ptWhere + off3)
		{
			memset(&data, 0, sizeof(Data));
			memset(&index, 0, sizeof(IndexForCiDian));
			index.indexType = TABLE;
			strcpy(index.name, word[ptFrom + 1].name);
			
			ext1 = ext2 = 0;
			weizhi1 = -1;
			if(strcmp(word[savePtWhere + 3].name, "'") == 0)
			{
				ext1 = 1;
				ext2 = 1;
			}
			//对SQL中是否含有'标志进行置位。分别代表2个可能出现'的位置。
			
			
			if((weizhi1 = getIndexFromCiDian(index, data, word[savePtWhere + 1].name)) != -1)
			{//如果本函数不返回-1,则index,data对象被已经初始化。
				
				char filename[20];
				char temp[ITEM_LEN];
				long saveOffset = -1;
				long fileLen = 0;
				long recordCount = 0;
				long recordLen = 0;
				char ch;
				
				memset(filename, 0, 20);
				memset(temp, 0, ITEM_LEN);
				
				if(flag == 0){//既SearchResult目前为空表,用.tab全表进行初始化 
					strcpy(filename, word[ptFrom + 1].name);
					strcat(filename, ".tab");//生成要查询的数据表的表名。word[1].name.tab
					fstream fff1,fff2;
					fff1.open("SearchResult.txt", ios::out);
					fff2.open(filename, ios::in);
					fff2.seekg(10 + 2, ios::beg);
					while(fff2.read(&ch,1))
						fff1.write(&ch,1);
					fff1.close();
					fff2.close();
					flag = 1;
				}
				
				//////
				memset(filename, 0, 20);
				strcpy(filename, "SearchResult.txt");
				////////
				
				fstream readDataFile;
				readDataFile.open(filename, ios::in | ios::out | ios::nocreate);
				readDataFile.seekg(0, ios::end);
				fileLen = readDataFile.tellg();
				recordLen = NAME_LEN  + data.pDataArray_len * (ITEM_LEN + 1);//不包括回车
				recordCount = (fileLen) / (recordLen + 2);//包括回车
				
				readDataFile.seekg(0, ios::beg);//将指针置于正文,跳过表头信息。
				
				int j = 0;//用于辅助指针点位记录项位置。j=[0,recordLen]
				
				fstream f;
				f.open("temp",ios::out);
				
				while(1)
				{
					saveOffset = readDataFile.tellg();//记录记录项的起始地址。
					readDataFile.seekg(NAME_LEN, ios::cur);
					readDataFile.seekg(weizhi1 * (ITEM_LEN + 1), ios::cur);//指针调到where后的属性
					readDataFile.read(temp, ITEM_LEN);//读取当前记录的属性值
					
					if(strcmp(temp, word[savePtWhere + 3 + ext1].name) == 0)//判断如果是where后的属性指定的值
					{
						readDataFile.seekg(saveOffset, ios::beg);
						int jk = 0;
						while(readDataFile.read(&ch,1) && ch != '\n'){
							f.write(&ch, 1);
							jk++;
						}
						f<<endl;
					}
					readDataFile.seekg(saveOffset + recordLen + 2, ios::beg);
					j++;
					if(j >= recordCount)
						break;
				}
				readDataFile.close();
				f.close();
				
				f.open("temp", ios::in);
				readDataFile.open("SearchResult.txt", ios::out);
				while(f.read(&ch,1))
					readDataFile.write(&ch,1);
				readDataFile.close();
				f.close();
				
				//###################################
				//停止计时器
				END_TIMER(a)
				a.GetTime();
				//#####################################

				system("type.bat SearchResult");
			}
			else
				AfxMessageBox("该表或属性不存在!");
			savePtWhere = savePtWhere + 4 + ext1 + ext2;
		}//全选择查询结果
		
		if(strcmp(word[1].name, "*") != 0)//说明是投影
		{
			fstream f1,f2,file;
			char ch;
			f1.open("SearchResult.txt",ios::in);
			f2.open("temp", ios::out);
			while(f1.read(&ch,1))
				f2.write(&ch,1);
			f1.close();
			f2.close();
			
			char filename[20];
			Data data;
			IndexForCiDian index;
			memset(filename, 0, 20);
			memset(&data, 0, sizeof(Data));
			memset(&index, 0, sizeof(IndexForCiDian));
			
			f1.open("SearchResult.txt", ios::out);
			f1.close();
			f1.open("SearchResult.txt", ios::in);
			i = 1;
			int  k = 0;
			char tableName[20];
			while(i < off1)
			{
				memset(tableName, 0, 20);
				
				/////组装表名
				while(strcmp(word[i].name, ".") != 0)
				{
					strcat(tableName, word[i].name);
					i++;
				}
				//组装完毕.
				
				
				char temp[20];
				memset(temp, 0, 20);
				strcpy(temp, tableName);
				
				strcpy(index.name, tableName);
				if((weizhi1 = getIndexFromCiDian(index, data, word[i+1].name)) == -1){
					AfxMessageBox("属性名称错误!");
					return false;
				}
				
				
				f2.open("temp",ios::in);
				file.open("temp1", ios::out);//中转文件
				while(f2.read(&ch, 1))
				{
					file.write(&ch, 1);
				}
				file.close();
				f2.close();
				
				f1.close();
				f1.open("SearchResult.txt", ios::in | ios::out | ios::app);
				file.open("temp1", ios::in);
				f2.open("temp",ios::in);
				
				int biaotou;
				biaotou = 0;
				k = 0;
				long saveOff = 0;//每行数据的起始地址
				
				while(f2.read(&ch,1))
				{
					f2.seekg(-1, ios::cur);
					saveOff = f2.tellg();
					f2.seekg(saveOff + 40 + weizhi1 * (ITEM_LEN + 1),ios::beg);
					while(f2.read(&ch,1) && ch != ';')
						f1.write(&ch,1);
					f1<<endl;
					while(f2.read(&ch,1) && ch != '\n')
						NULL;
				}
				f2.close();
				f1.close();
				
				
				if(strcmp(word[i].name,".") == 0)
					i++;
				i++;
				if(strcmp(word[i].name,",") == 0)
					i++;
			}
			//###################################
			//停止计时器
			END_TIMER(a)
			a.GetTime();
			//#####################################
			
			system("type.bat SearchResult");//显示
		}
		return true;
	}
	//#######################################################################

	//#######################################################################
	if(ptWhere != -1 && isLink != -1)
	{
		//##################################################
		//启动计时器
		CRunTimer a;
		START_TIMER(a)
		//##################################################

		char filename1[20], filename2[20];
		char shuxingName1[20],shuxingName2[20];
		
		int weizhi1 = -1, weizhi2 = -1;
	
		Data data1,data2;
		IndexForCiDian index1,index2;
		memset(filename1, 0, 20);
		memset(filename2, 0, 20);
		memset(shuxingName1, 0, 20);
		memset(shuxingName2, 0, 20);
		memset(&data1, 0, sizeof(Data));
		memset(&data2, 0, sizeof(Data));
		memset(&index1, 0, sizeof(IndexForCiDian));
		memset(&index2, 0, sizeof(IndexForCiDian));
		
		//打开第一个表
		memset(filename1, 0, 20);
		strcpy(filename1, word[ptWhere + 1].name);
		strcpy(shuxingName1, word[ptWhere + 3].name);

		strcpy(index1.name, filename1);
		weizhi1 = -1;
		if((weizhi1 = getIndexFromCiDian(index1, data1, shuxingName1)) == -1){
				AfxMessageBox("属性1名称错误!");
				return false;
		}

		memset(filename2, 0, 20);
		strcpy(filename2, word[ptWhere + 5].name);
		strcpy(shuxingName2, word[ptWhere + 7].name);

		strcpy(index2.name, filename2);
		weizhi2 = -1;
		if((weizhi2 = getIndexFromCiDian(index2, data2, shuxingName2)) == -1){
			AfxMessageBox("属性2名称错误!");
			return false;
		}

		fstream f1;
		f1.open("SearchResult.txt", ios::out );
		f1.close();//结果文件清空
		f1.open("SearchResult.txt", ios::in | ios::out | ios::app);

		int k1, k2;
		k1 = 0;
		k2 = 0;
		char tmpfile1[20],tmpfile2[20];
		memset(tmpfile1, 0, 20);
		memset(tmpfile2, 0, 20);

		strcpy(tmpfile1, filename1);
		strcpy(tmpfile2, filename2);
		while(ReadTable(filename1, k1, data1))
		{
			k2 = 0;
			while(ReadTable(filename2, k2, data2))
			{
				if(strcmp(data1.pDataArray[weizhi1].name, data2.pDataArray[weizhi2].name) == 0)
				{
					int m;
					for(m = 0; m < data1.pDataArray_len; m++)
					{
						f1.write(data1.pDataArray[m].name, ITEM_LEN);
						f1.write(";", 1);
					}
					f1<<"||";//表一内容结束

					for(m = 0; m < data2.pDataArray_len; m++)
					{
						if(m == weizhi2)
							continue;
						else
						{
							f1.write(data2.pDataArray[m].name, ITEM_LEN);
							f1.write(";", 1);
						}
					}
					f1<<endl;
				}
				memset(filename2, 0, 20);
				strcpy(filename2, tmpfile2);
				k2++;
			}
			memset(filename2, 0, 20);
			strcpy(filename2, tmpfile2);
			memset(filename1, 0, 20);
			strcpy(filename1, tmpfile1);
			k1++;
		}
		f1.close();
		//打开第二个表
		//选择合适结果写入SearchResult

		//###################################
		//停止计时器
		END_TIMER(a)
		a.GetTime();
		//#####################################

		system("type.bat SearchResult");
		return true;
	}	
	else
		return false;
}

int CDBControl::InsertIntoValue(CString strCmd, Word word[], int len)
{
	IndexForCiDian index;
	memset(&index, 0, sizeof(IndexForCiDian));
	
	char ch[10];
	memset(ch, 0, 10);
		
	long offset = -1;
	int failFlag = 0;

	strcpy(index.name, word[2].name);
	index.indexType = TABLE;
	
	if((offset = findInIndexFile(index)) == -1){
		CString str;
		str.Format(" %s 不存在!", word[2].name);
		AfxMessageBox(str);
		return false;
	}

	fstream file;
	char buff[200];
	char temp[20];
	memset(temp, 0, 20);
	strcpy(temp, word[2].name);
	strcat(temp, ".tab");
	
	int count = -1;
	file.open(temp, ios::in);
	if(!file.fail()){
		file.read(buff, 10);
		count = atoi(buff);
	}
	else
		failFlag = 1;
	file.close();

	file.clear();
	file.open(temp, ios::out | ios::in | ios::app);

	int i = 5;
	int com = 0;//数据项数计数
	while(1)
	{
		memset(buff, 0, 200);
		while(strcmp(word[i].name, ",") != 0 && strcmp(word[i].name, ")") != 0)
		{
			strcat(buff, word[i].name);
			i++;
		}

		if(file.fail())
			AfxMessageBox("文件读取失败!");
		com = com + 1;
		if(strcmp(word[i].name, ")") == 0)
			break;
		i++;
	}

	
	if(count != com && failFlag != 1 && count != -1){//数据属性个数不符的处理
		CString tempS;
		tempS.Format("插入操作失败! %s有%d个属性项.", word[2].name, count);
		AfxMessageBox(tempS);
		return false;
	}
	
	file.clear();
	file.seekg(0,ios::beg);
	char tableName[NAME_LEN];
	memset(tableName, 0, NAME_LEN);
	strcpy(tableName, word[2].name);

	long index_start = -1, index_end = -1;
	index_start = file.tellg();//获取索引开始位置

	file.write(tableName, NAME_LEN);
	i = 5;//复位指针

	
	
	while(1)
	{
		memset(buff, 0, 200);
		while(strcmp(word[i].name, ",") != 0 && strcmp(word[i].name, ")") != 0)
			//用while的目的是可以处理带引号的'string'和不带引号的数字两种不同情况。
		{
			if(strcmp(word[i].name, "'") != 0)
				strcat(buff, word[i].name);
			i++;
		}
		
		file.write(buff, ITEM_LEN);//////此语句要求每个数据项最大为19个字节
		file.write(";", FENHAO_LEN);//分号作为项目的分隔符
		if(file.fail())
			AfxMessageBox("文件读取失败!");

		if(strcmp(word[i].name, ")") == 0)
			break;
		i++;
	}
	index_end = file.tellg();
	
	file<<endl;
	file.close();
//	AfxMessageBox("操作成功!");

	//插入索引
	AddRecordIndex(tableName, index_start, word[5].name); //目前索引只能是第一个属性
	return false;
}

int CDBControl::ReadFromCiDian(const IndexForCiDian &index, Data &data)
{
	fstream file;

⌨️ 快捷键说明

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