📄 script_command.cpp
字号:
#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 + -