📄 create_index.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 + -