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

📄 create_index.cpp

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

#include "min.h"

void sql::create_index(  )
{
	string scomm[6];
	for( int i = 0; i < 6; i++ )
		cin >> scomm[i];
/*-----------ch11---------------*/
	
	try
	{
		//语法分析
		if( scomm[1] != "on" || scomm[3] != "(" || scomm[5] != ");" )
			throw 1;
		//检查表,属性及唯一性,索引是否存在
		index = scomm[0].data();
		filename = scomm[2].data();	
		colname = scomm[4].data();
		Table*  table = tabexist();
		if( !table )
			throw 2;
		table = table->next;
		int num = table->num;
		int cth=-1;
		Col* col = colexist ( table, cth );
		if ( !col )
			throw 4;
		if ( col->att == 'n')
			throw 6;
		if ( col->indexname.compare(""))
			throw 5;
		//读入表文件
		page =  readtable ();			
		istrstream inb(buf[page],sbf);

		inb.ignore(1000,'\n');
		int thn;
		int head = 0 ;
		ostrstream out( subbuf,subsbf );

		
		if ( col->type=='#' ) //属性为int
				{
					int idx = 0;
					while (num-- )
					{
						for ( ; head<=strlen(buf[page]) ; head++)
						if( buf[page][head]=='\n' )
							break;
						head++;
						for ( thn=cth; thn; thn-- )
							inb.ignore(1000,'\t' );
						string c_idx;
						inb >> c_idx;
						while ( c_idx.at(0)=='*' )
						{
							inb.ignore(1000,'\n');
							for ( thn=cth; thn; thn-- )
								inb.ignore(1000,'\t' );							
							inb >> c_idx;
							for ( ; head<=strlen(buf[page]) ; head++)
								if( buf[page][head]=='\n' )
									break;
							head++;
						}
						for ( int p=0; p<c_idx.size(); p++ )
							idx = idx*10 + c_idx.at(p) - '0';

						out << idx << ' ' << head << '\t';
						idx = 0;
						inb.ignore(1000,'\n');
					}		
				}
				else//属性为char;
				{
					char ind[256];
					while ( num-- )
					{			
						for ( ; head <= strlen(buf[page]) ; head++)
							if( buf[page][head]=='\n' )
								break;
						head++;
						for ( thn=cth; thn; thn-- )
							inb.ignore(1000,'\t' ); 	
						inb >> ind;
						while ( ind[0]=='*' )
						{
							inb.ignore(1000,'\n');
							for ( thn=cth; thn; thn-- )
								inb.ignore(1000,'\t' );
/*---------ch---------*/		inb >> ind;
							for ( ; head<=strlen(buf[page]) ; head++)
								if( buf[page][head]=='\n' )
									break;
							head++;
						}
						out << ind << ' ' << head << '\t';
						for ( int k=0; k<256; k++ )
							ind[k] = '\0';
						inb.ignore(1000,'\n');					
					}			
				}     


		out << '\0';
		
		//创建索引文件
		fstream file;
		fileload = filename+"_"+index+".idx";
		file.open( fileload.c_str(),ios::out | ios::trunc | ios::binary );
		if( !file )
			throw 7;
		file.write(subbuf, strlen(subbuf));
		//写到dir_file里面去
		col->indexname = index;
	    cout<<"创建索引<"+index+">成功!" << endl;
		Log("创建索引<"+index+">成功!"); 
	
	}

	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 << "非唯一性列!" << endl;
					break;
			case 7: cout << "无法建立索引文件!" << endl;
					break;		
		  
		   
		}
		char a[50];
		cin.getline( a, 50 );
	    	Log("创建索引失败!");
	}
}

⌨️ 快捷键说明

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