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

📄 insert_into.cpp

📁 小型数据库源代码较多
💻 CPP
字号:

#include "min.h"

void sql::insert_into( )
{
	int length;
	int i, j, k;
	char ft = '*';
	string s_into;
	try
	{
		cin >> s_into;
		if ( s_into != "into" )
			throw 1;
//**********************************
		cin >> filename;

		//表是否存在
		Table* t;
		t = tabexist();
		if ( !t )
		{
			throw 2;
		}	
		
		 page = readtable();
		 length=strlen(buf[page]);


		cin >> command;
		if( strcmp( command, "values" ) )
			throw 1;
		char a;
		cin >> a;
		if( a!='(' )
			throw 1;	  

		//按列检查
		ostrstream out( &buf[page][strlen(buf[page])], sbf-strlen(buf[page]) );
		for( i = 0; i < 32; i++ )
		{
			istrstream iin( buf[page], sbf );
			for( j=i; j; j-- )
				iin.ignore(10000,'\t');			
			string key;//属性名+类型+特性			
			char type;//属性类型
			char att;//属性特性

			iin >> key;

			if( key=="&")
					break;

			type = key.at ( key.size()-2 );
			att = key.at ( key.size()-1 );

			int per; //属性的长度+1;
			iin >> per;			
			if( type == '$' ) //char
			{
				char value[257];
				//检查类型
				char value0;
				cin >>value0;
				if( value0 != '\'' )
					throw 5;
				int m=0;
				cin >> value[m];
				while (value[m]!=','&&value[m]!=')')
				{
					m++;
					cin >>value[m];
				}
				if( value[m-1]!='\'')
					throw 11;
				value[m-1]='\0'; 		
				//检查长度
				if( strlen(value) >= per )
					throw 5;
			
				//检查特性						 
				if(att!='n')
					 for(k=0;k<t->next->num;k++)//******************
					 {
						 iin.ignore(1000, '\n');
						 for( j=i; j; j-- )
						 iin.ignore(10000,'\t');
						 string sfile;
						 iin >> sfile;
						 if(!sfile.compare(value))
						 {
							 if(att=='p')
								 throw 6;
							 if(att=='u')
								 throw 7;
						 }
					 }
				out << value <<'\t';
			}
			
			else if( type == '#' ) //int
			{
				int value = -99999;
				cin >> value;
				//检查类型
				char rubbish;
				if ( value==-99999 )
				{
					throw 5;
				}
				cin >> rubbish;//','
				if ( rubbish!=','&&rubbish!=')')
					throw 5;							
				//检查特性						 
				if(att!='n')
					 for(k=0;k<t->next->num;k++) //*******************
					 {
						 iin.ignore(1000, '\n');
						 for( j=i; j; j-- )
						 iin.ignore(10000,'\t');
						 int ifile;
						 iin >> ifile;
						 if(value==ifile)
						 {
							 if(att=='p')
								 throw 6;
							 if(att=='u')
								 throw 7;
						 }
					 }
				out << value << '\t';
			}
		}
		out << '\0';
		buf[page][strlen(buf[page])-1] = '\n';
		cin>>ft;
		if( ft!=';' )
			throw 4;

		t->next->num++;
		modify_index( t->next);
		modify [page] = 1;		//********************8
		 //***********************

		cout << "对表<" + filename + ">插入记录成功!" << endl;
	    Log("对表<" + filename + ">插入记录成功!");//pp
	}
				
					
	catch( int i )
	{
		switch ( i )
		{
			case 1: cout << "语法错误!" << endl;
					break;
			case 2: cout <<filename<<"表不存在!" << endl;
					break;
			case 3: cout << "无法打开表文件!" << endl;
					break;
			case 4: cout << "参数个数不匹配!"<< endl;
					break;
			case 5: cout << "类型不匹配(包括字符串过长)!" << endl;
					break;
			case 6: cout << "违反主键的唯一性!" << endl;
					break;
			case 7: cout << "违反unique属性的唯一性!" << endl;
					break;
			case 10:cout << "无法打开数据字典!" << endl;
					break;
			case 11:cout << "类型不匹配(包括字符串过长)!" << endl;
					break;
		}
		
		  if ( i!=1&&i!=2&&i!=3 )
		{
				int current_length = strlen(buf[page]);
		for( int l=length; l<=current_length; l++ )
				buf[page][l] = '\0';//回滚。。
		} 
		
		
		
		Log("对表<" + filename + ">插入记录失败!");//pp
		
		char a[50];
		cin.getline(a,50);
			
	}

}

⌨️ 快捷键说明

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