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

📄 create_table.cpp

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

#include "min.h"

void sql::create_table(  )
{
	try
	{
		Table* t ;
		cin >> filename; //获取表名
		Table* table = new Table;
		table->name = filename;
		table->num = 0;
		//表是否存在
		t = tabexist();
		if ( t )
		{
			delete table;
			throw 3;
		}		
		cin >> 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();
			cin >> name[i];//输入属性名
			if( name[i] == ");")
			{
				if( i!=0 )
					throw 4;
				else
					//T = 1;//*****************************
					break;
			}// end <name[i]==");"
			else 
			{
				cin >> type[0];
				for (int ti=1; (type[ti-1] != ' ' && type[ti-1] != ',' && type[ti-1] != '('); ti++)
				{
					type[ti+1] = '\0';
					cin >> type[ti];
				}
				if ( name[i]=="primary" && !strcmp(type,"key(") )//输入的为primary key
				{
					name[i].erase();
					char p[30];
					string key;
					gets(p);
					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;
					}							
					//char b[2] = {'\0','\0'};/****************************
					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] = '$';
						cin >> n[i];
						if( n[i] > 255 )
							throw 2;
						char unique[20];
						gets( unique );
						b[i][1] = 'n';
						if ( strstr(unique, "unique") )
							b[i][1] = 'u';						
					}//type is char
					else					
						throw 8;
					n[i]++;//把'\t'分隔符也算进去;
					//name[i].append(b,2);//***************************
					i++;//属性数加一;
				}//一个属性输入结束	
			}//一个属性或主键设置结束
		}//结束for。
	
/**********************
	//把数据输入文件;
		if( T )
/**********************8*/
		string end;
		if( i!=0 )	
			cin >> end;
		else
		{
			name[0].erase ();
			end = ");";
		}					
		if( end!=");" )		
			throw 9;
			
		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];
		gets(u);//无实际意义,只是去掉命令输入中的回车;
		cout << "创建表: <" << filename << "> 成功!" << endl;
        
		Log("创建表: <" + filename + "> 成功!");//pp
		
		// 页面替换	
		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;
		
		
		    Log("创建表: <" + filename + "> 失败!");
		
		}
		char a[50];
		cin.getline( a, 50 );

	}
	
}


	

⌨️ 快捷键说明

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