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