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

📄 script_command.cpp

📁 小型数据库源代码较多
💻 CPP
📖 第 1 页 / 共 3 页
字号:
#include "min.h"


void sql::create_table(ifstream& in  )
{
	try
	{
		Table* t ;
		in >> filename; //获取表名
		Table* table = new Table;
		table->name = filename;
		table->num = 0;
		//表是否存在
		t = tabexist();
		if ( t )
		{
			delete table;
			throw 3;
		}		
		in >> command; //输入"("
		if(strcmp(command, "("))
		throw 1;
		string name[33];
		char b[33][2] = {'\0','\0'};//****************************
		int n[32];
		char type[200];
		for ( int j = 0; j < 200; j++ )
			type[j] = '\0';		
		for( int i = 0; i < 33; )
		{
			name[i].erase();
			in >> name[i];//输入属性名
			if( name[i] == ");")
			{
				if( i!=0 )
					throw 4;
				else
					//T = 1;//*****************************
					break;
			}// end <name[i]==");"
			else 
			{
				in >> type[0];
				for (int ti=1; (type[ti-1] != ' ' && type[ti-1] != ',' && type[ti-1] != '('); ti++)
				{
					type[ti+1] = '\0';
					in >> type[ti];
				}
				if ( name[i]=="primary" && !strcmp(type,"key(") )//输入的为primary key
				{
					name[i].erase();
					char p[30];
					string key;
				//	gets(p);
					in.getline(p,30);
					for ( int k=0; p[k]!='\0'; k++ )
						if( !(p[k]<'A' || p[k]>'z' || (p[k]>'Z'&&p[k]<'a')) )
							key.append(&p[k],1);
						int si;
           				for ( k=1,si=0; si<i; si++ )
						{
							k = name[si].compare( key );//********************						
							if ( k==0 )
								break;						
						}
						if ( k!=0 )
							throw 5;
						key = filename +'_' + key + ".idx " ;
							fstream file(key.c_str(),ios::trunc|ios::out);
							if( file.fail())
								throw 10;
							file.close();
							
			          		b[si][1] = 'p' ; //********************
							break;
					
				}//primary key 结束;
				else
				{
					if( i==32 )
						throw 6;
					else 
					{
						int cm = 1;
						for( int z=0; z<i; z++ )
						{
							cm = name[z].compare(name[i]); //******************
							if(cm==0)
								break;
						}
						if(cm==0)
							throw 7;
					}							
					
					if ( strstr(type, "int") )
					{
						b[i][0] = '#';
						n[i] = 2;
						b[i][1] = 'n';
						if ( strstr(type, "unique") )
							b[i][1] = 'u';							
					}
					else if ( strstr(type, "char"))
					{
						b[i][0] = '$';
						in >> n[i];
						if( n[i] > 255 )
							throw 2;
						char unique[20];
				//		gets( unique );
						in.getline(unique,20);
						b[i][1] = 'n';
						if ( strstr(unique, "unique") )
							b[i][1] = 'u';						
					}//type is char
					else					
						throw 8;
					n[i]++;//把'\t'分隔符也算进去;
					
					i++;//属性数加一;
				}//一个属性输入结束	
			}//一个属性或主键设置结束
		}//结束for。
	
/**********************
	//把数据输入文件;
		if( T )
/**********************8*/
		string end;
		if( i!=0 )	
			in >> end;
		else
		{
			name[0].erase ();
			end = ");";
		}					
		if( end!=");" )		
			throw 9;
			//	T=0;//********************
		

		table->col = i;
		Col* col;
		table->collist = new Col;
		col = table->collist;
		for(  j = 0; j < table->col ; j++ )
		{
			col->next = new Col;
			col = col->next;
			col->name = name[j] ;
			col->type = b[j][0];	
			col->att = b[j][1];			
			col->len = n[j];
			col->indexname.erase();
			if( col->att == 'p')
				col->indexname = col->name;		
		}
		col->next = NULL;
		table->next = tablehead ->next;
		tablehead->next = table;
		//把信息写入数据字典(内存中) 
		
		char u[9];
	
		in.getline(u,9);
		cout << "创建表: <" << filename << "> 成功!" << endl;
        Log("创建表: <" + filename + "> 成功!");
		
		// 页面替换	
		for( page = 0; page < 3; page++)
			buff[page]++;
		for( page = 0; page < 3; page++)
			if(buff[page]==3)
				break;
		if( modify[page] )
			writefile(page);
		
		for( j = 0; j < sbf ; j++)
			buf[page][j] = '\0';								
		buff[page] = 0;
		modify[page] = 1;
		bufname[page] = filename;
		bufname[page].append(".dtb");
		
		

		//写入buffe
		ostrstream out(buf[page],sbf);
		for(  j=0; !(name[j].empty()); j++ )
		{
			out << name[j] << b[j][0] <<b[j][1] << " " << n[j] << '\t';
		}
		out << '&' << '\n' ;
	}

	catch( int i )
	{
		switch ( i )
		{
			case 1: cout << "语法错误!" << endl;
					break;
			case 2: cout << "属性过长!" << endl;
					break;
			case 3: cout << "表已存在!" << endl;
					break;
			case 4: cout << "没有设设置主键!" << endl;
					break;
			case 5: cout << "主键定义中无效的列名!" << endl;
					break;
			case 6: cout << "超过了32个属性;请检查!" << endl;
					break;
			case 7: cout << "该属性已存在!" << endl;
					break;
			case 8: cout << "无效的数据类型!" << endl;
					break;
			case 9: cout << "主键已输入,命令没有结束!" << endl;
					break;
			case 10: cout << "无法建立索引文件!"<< endl;
					break;
		
		
		    
	       }

	        char ft;
		    in>>ft;
         	while(ft!=';')
			   in >> ft;
	        Log("创建表: <" + filename + "> 失败!");
	
	}
	
}


	

	
	
	
       





	


void sql::drop_table(ifstream& in )
{
		
	try{	
		in >> command;
		filename.erase();
		for(int i=0; command[i]!=';'&&command[i]!='\0'; i++)
			filename+=command[i];
	   	Table* t = tabexist();
		if ( t==NULL )
			throw 2;

		// 文件是否在缓存中		
//////////////////////////////////////////////////////pp		
		string temp=filename;
//////////////////////////////////////////////////////pp		
		filename.append(".dtb");
		for( page = 0; page < 3; page++)
		if(!filename.compare(bufname[page]))
			break;
	
		//文件在缓存中
		if ( page != 3 )
		{
			for( int j=0; j<sbf ; j++)
				buf[page][j] = '\0';
			for( j = 0; j < 3; j++)
				if( buff[j] > buff[page] ) 
					buff[j]--;
			buff[page] = 2;//////////////////////////////////////
			modify[page] = 0;
			bufname[page].erase();
		}

		//删表
		Table* table = t->next;
		t->next = table->next;
		Col* col;
		Col* tempc;
		col = table->collist;
		for(; col->next; )
		{
			tempc = col;
			col = col->next;
			if ( col->indexname.compare(""))
			{
				char del[50] = "del ";
				string indexname;
				indexname = table->name + "_"+ col->indexname + ".idx";
				strcat( del,indexname.c_str());		
				system ( del );
			}
			delete tempc;						
		}
		delete col;
		delete table;
		char del[50] = "del ";
		strcat( del,filename.c_str());		
///////////////////////////////////////////////////////////		
		ifstream test(filename.c_str());
        if(!test)
		{	
			cout<<"表 <"+temp+"> 已删除!"<<endl;
			Log("表 <"+temp+"> 已删除!");
			return;
		}
////////////////////////////////////////////////////////////
		test.close();
		system ( del );
        cout<<"表 <"+temp+"> 已删除!"<<endl;
        Log("表 <"+temp+"> 已删除!");
	}
        	catch ( int i )
		{
			switch(i)
			{
			case 1:	cout << "语法错误!" << endl;
					break;
			case 2:	cout << "表不存在!" << endl;
					break;
			}

            char ft;
		    in>>ft;
         	while(ft!=';')
			   in >> ft;
			
			Log("删除表失败!");
			
			
		}



}

		

	










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

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


		char values[7];
		values[6]='\0';
		for(int p=0;p<6;p++)
			in>>values[p];

		if( strcmp(values, "values" ) )
		    throw 1;
		 char a;
		in >> 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); //sbf );
			for( j=i; j; j-- )
				iin.ignore(1000,'\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;
				in >>value0;
				if( value0 != '\'' )
					throw 5;
				int m=0;
				in >> value[m];
				while (value[m]!=','&&value[m]!=')')
				{
					m++;
					in >>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;
				in >> value;
				//检查类型

⌨️ 快捷键说明

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