`
cloudtech
  • 浏览: 4605549 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

我完成的一个DBMS内核源码(可进入嵌入式定制)

 
阅读更多

/*

作者:my2005lb

项目代号:LiuSQL ver 1.0

*/

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<iostream.h>
#include<string.h>
#include<windows.h>
#include<vector>
#include<math.h>

using namespace std;


struct database
{
char cdatabasename[200];
char cpath[200];
char cauthor[50];
char ctime[19];
};
//用于表示数据库头
vector<database> databasehead;

//用于查入数据库配置信息
int insertConfigSys(struct database infor)
{
if(&infor == NULL)
{
printf("要插入的记录不能为空......../n");
return -1;
}

FILE *fp;

if((fp=fopen("configsys.dcy","ab+"))==NULL)
{
printf("读取数据库配置信息失败......../n");
return -1;
}

if(fwrite(&infor,sizeof(database),1,fp)!=1)
{
printf("插入数据库配置信息失败......../n");
return -1;
}

databasehead.push_back(infor);
fclose(fp);
return 0 ;

}
int readConfigSys()
{
FILE *fp;

if((fp=fopen("configsys.dcy","rb"))==NULL)
{
//printf("打开源文件configsys.dcy出错/n");

return -1;
}
printf("***********************************/n");
int i=1;
database buf;
while(!feof(fp))
{
if(fread(&buf,sizeof(database),1,fp))
{
// printf(" %d %s %s %s %s/n",i,buf.cauthor,buf.cdatabasename,buf.cpath,buf.ctime );
//cout<<i<<" "<<buf.name<<" "<<buf.salary<<"/n";
databasehead.push_back(buf);

}
i++;

}
//printf("共找到%d条记录/n",i-2);
//printf("***********************************/n");
fclose(fp);

return 0;
}

int createDatabase(char *databasename)
{
char currentDir[200];
GetCurrentDirectory(199,currentDir);
strcat(currentDir,"//data//");
strcat(currentDir,databasename);

if( CreateDirectory(currentDir,NULL) == 1 )
{
// printf("数据库%s创建成功/n",databasename);
return 1 ;
}
return -1;
}

int dropDatabase(char *databasename)
{
char currentDir[200];
GetCurrentDirectory(199,currentDir);
strcat(currentDir,"//data//");
strcat(currentDir,databasename);

if(RemoveDirectory(currentDir)==1)
{
return 1 ;
}
return 0 ;
}

enum DataType{VARCHAR,LINT,LSINT,IMAGE,TEXT,LFLOAT,LDATE,LTIME,LDATETIME};

typedef struct
{
char fieldname[200];
DataType type;
bool anull;
int length;
int indextype;
}FieldList ;

//用于记录的字段列表
//
vector<FieldList> fieldhead;

int insertFieldStruct(char *tablename,FieldList infor)
{
if(&infor == NULL||tablename ==NULL)
{
printf("要插入的记录不能为空......../n");
return -1;
}

FILE *fp;
char *filename = (char *)malloc(strlen(tablename)+4);
strcpy(filename,tablename);
strcat(filename,".lts");
if((fp=fopen(filename,"ab+"))==NULL)
{
printf("配置字段信息失败......../n");
return -1;
}

if(fwrite(&infor,sizeof(FieldList),1,fp)!=1)
{
printf("插入配置字段信息失败......../n");
return -1;
}

fieldhead.push_back(infor);
fclose(fp);
return 0 ;

}
int readFieldStruct(char *tablename)
{
FILE *fp;
char *filename = (char *)malloc(strlen(tablename)+4);
strcpy(filename,tablename);
strcat(filename,".lst");
if((fp=fopen(filename,"rb"))==NULL)
{
printf("打开源文件%s出错/n",filename);

return -1;
}
printf("***********************************/n");
int i=1;
FieldList buf;
while(!feof(fp))
{
if(fread(&buf,sizeof(FieldList),1,fp))
{
printf(" %d %s %d %d %d /n",i,buf.fieldname ,buf.length,buf.anull ,buf.indextype );
//cout<<i<<" "<<buf.name<<" "<<buf.salary<<"/n";
fieldhead.push_back(buf);

}
i++;

}
printf("共找到%d条记录/n",i-2);
printf("***********************************/n");
fclose(fp);

return 0;
}

struct TableList
{
char ctablename[255];
char ctime[19];
char cauthor[50];
};

//用于保存表的列表
vector<TableList> tablehead;

int insertConfigTable(struct TableList infor)
{
if(&infor == NULL)
{
printf("要插入的记录不能为空......../n");
return -1;
}

FILE *fp;

if((fp=fopen("configtable.dcy","ab+"))==NULL)
{
printf("读取数据库配置信息失败......../n");
return -1;
}

if(fwrite(&infor,sizeof(TableList),1,fp)!=1)
{
printf("插入数据库配置信息失败......../n");
return -1;
}

tablehead.push_back(infor);
fclose(fp);
return 0 ;

}
int readConfigTable()
{
FILE *fp;

if((fp=fopen("configtable.dcy","rb"))==NULL)
{
printf("打开源文件configtable.dcy出错/n");

return -1;
}
printf("***********************************/n");
int i=1;
TableList buf;
while(!feof(fp))
{
if(fread(&buf,sizeof(TableList),1,fp))
{
printf(" %d %s %s %s/n",i,buf.cauthor,buf.ctablename,buf.ctime );
//cout<<i<<" "<<buf.name<<" "<<buf.salary<<"/n";
tablehead.push_back(buf);

}
i++;

}
printf("共找到%d条记录/n",i-2);
printf("***********************************/n");
fclose(fp);

return 0;
}

/*
用于表的创建
*/
int createTable(char *tablename,vector<FieldList> head)
{
//create three files
//then write filedinfor to XXX.lts
//
FILE *fltd,*flid,*flst;//分别表示数据文件,索引文件与结构文件
char *filename1 = (char *)malloc(strlen(tablename)+4);
char *filename2 = (char *)malloc(strlen(tablename)+4);
char *filename3 = (char *)malloc(strlen(tablename)+4);
strcpy(filename1,tablename);
strcat(filename1,".lst");
strcpy(filename2,tablename);
strcat(filename2,".lid");
strcpy(filename3,tablename);
strcat(filename3,".ltd");
if((flst=fopen(filename1,"ab+"))==NULL)
{
printf("配置字段信息失败......../n");
return -1;
}
vector<FieldList>::iterator Datalist;
for(Datalist = head.begin();Datalist!=head.end();Datalist++)
{
fwrite(Datalist,sizeof(FieldList),1,flst);
}
fclose(flst);
if((flid=fopen(filename2,"ab+"))==NULL)
{
printf("配置字段信息失败......../n");
return -1;
}
fclose(flid);
if((fltd=fopen(filename3,"ab+"))==NULL)
{
printf("配置字段信息失败......../n");
return -1;
}
fclose(fltd);

return 1;
}

/*
执行drop table命令 将三张表删除
*/
void dropTable(char *tablename)
{
char *filename1 = (char *)malloc(strlen(tablename)+4);
char *filename2 = (char *)malloc(strlen(tablename)+4);
char *filename3 = (char *)malloc(strlen(tablename)+4);
strcpy(filename1,tablename);
strcat(filename1,".lst");
strcpy(filename2,tablename);
strcat(filename2,".lid");
strcpy(filename3,tablename);
strcat(filename3,".ltd");
remove(filename1);
remove(filename2);
remove(filename3);
}

int alterTable(char *tablename,FieldList *head)
{
return -1;
}

struct DataList
{
char name[50];
char *value;
};

/*
主要进行记录的添加
*/
int insertRecord(char *tablename,vector<FieldList> head,vector<DataList> data)
{
char indexname[50];

vector<FieldList>::iterator Datalist;

for(Datalist = head.begin();Datalist!=head.end();Datalist++)
{
if( Datalist->indextype ==1)
strcpy(indexname,Datalist->fieldname);
}

printf("%s ========/n",indexname);
FILE *fltd ;
char *filename = (char *)malloc(strlen(tablename)+4);
strcpy(filename,tablename);
strcat(filename,".ltd");
if((fltd=fopen(filename,"ab+"))==NULL)
{
printf("配置字段信息失败......../n");
return -1;
}
FILE *flid;
char *filename1 = (char *)malloc(strlen(tablename)+4);
strcpy(filename1,tablename);
strcat(filename1,".lid");
if((flid=fopen(filename1,"ab+"))==NULL)
{
printf("配置字段信息失败......../n");
return -1;
}

vector<DataList>::iterator dlist;
fputc('&',fltd);
long fileposition=ftell(fltd)-1;
fputc('&',flid);
for(dlist = data.begin();dlist!=data.end();dlist++)
{
fputc('&',fltd);
fputs(dlist->value,fltd);
if(strcmp(dlist->name,indexname)==0)
{
fputc('&',flid);
fputs(dlist->value,flid);
fputc('&',flid);
char count[100];
sprintf(count,"%ld",fileposition);
fputs(count,flid);
}
}

fclose(fltd);
fclose(flid);


return 1;
}

struct FieldSet
{
char name[200];
FieldSet *next;
};

struct ResultSet
{
DataList *data;
ResultSet *next;
};

vector<long> selectRecord(char *tablename,char *deletevalue)
{
vector<long> position;
FILE *flid;
char *filename = (char *)malloc(strlen(tablename)+4);
strcpy(filename,tablename);
strcat(filename,".lid");

if((flid=fopen(filename,"rb"))==NULL)
{
printf("配置字段信息失败......../n");
return -1;
}

//printf("start parse ............../n");
char ch = fgetc(flid);
//printf("start parse[%c] ............../n",ch);
while(!feof(flid))
{
char next = fgetc(flid);
if((ch =='&'&&next=='&')&&(ch !='/0'&&next!='/0'))
{
char buf1[255];
char buf2[255];
ch = fgetc(flid);
//printf("start parse[%c] ............../n",ch);
int i = 0;
while(ch !='/0'&&ch!='&')
{
if(ch=='/')
ch = fgetc(flid);
buf1[i++]=ch;
ch = fgetc(flid);
}
buf1[i]='/0';
ch = fgetc(flid);
i = 0 ;
while(ch !='/0'&&ch!='&')
{
if(ch=='/')
ch = fgetc(flid);
buf2[i++]=ch;
if(feof(flid))
break;
ch = fgetc(flid);
}
buf2[i]='/0';
printf("%s | %s/n",buf1,buf2);
if( strcmp(buf1,deletevalue) == 0)
{
position.push_back(atol(buf2));

}

}

}
fclose(flid);

//vector<long> position 中存有数据文件的经结果集中指针。
FILE *fltd;
char *filename1 = (char *)malloc(strlen(tablename)+4);
strcpy(filename1,tablename);
strcat(filename1,".ltd");

if((fltd=fopen(filename1,"rb"))==NULL)
{
printf("配置字段信息失败......../n");
return -1;
}

vector<long>::iterator poshead;
for(poshead = position.begin();poshead = position.end();poshead++)
{

}
return 1;
}

int deleteRecord(char *tablename,char *deletevalue)
{
/*用于删除一条记录,先除去在索引中的记录,然后在除去在数据中的文件
删除只能用主键索引,先用主键查找记录,若找到则同比复制文件。
*/
FILE *flid,*ftlid;
char *filename = (char *)malloc(strlen(tablename)+4);
strcpy(filename,tablename);
strcat(filename,".lid");
char *filename1 = (char *)malloc(strlen(tablename)+5);
strcpy(filename1,tablename);
strcat(filename1,".tlid");
if((flid=fopen(filename,"rb"))==NULL)
{
printf("配置字段信息失败......../n");
return -1;
}
if((ftlid=fopen(filename1,"ab+"))==NULL)
{
printf("配置字段信息失败......../n");
return -1;
}
//printf("start parse ............../n");
char ch = fgetc(flid);
//printf("start parse[%c] ............../n",ch);
while(!feof(flid))
{
char next = fgetc(flid);
if((ch =='&'&&next=='&')&&(ch !='/0'&&next!='/0'))
{
char buf1[255];
char buf2[255];
ch = fgetc(flid);
//printf("start parse[%c] ............../n",ch);
int i = 0;
while(ch !='/0'&&ch!='&')
{
if(ch=='/')
ch = fgetc(flid);
buf1[i++]=ch;
ch = fgetc(flid);
}
buf1[i]='/0';
ch = fgetc(flid);
i = 0 ;
while(ch !='/0'&&ch!='&')
{
if(ch=='/')
ch = fgetc(flid);
buf2[i++]=ch;
if(feof(flid))
break;
ch = fgetc(flid);
}
buf2[i]='/0';
printf("%s | %s/n",buf1,buf2);
if( strcmp(buf1,deletevalue) == 0)
{
if(ch == '&')
fputc('&',ftlid);

while(!feof(flid))
{
fputc(fgetc(flid),ftlid);
}
fclose(flid);
fclose(ftlid);
if(remove(filename)==0)
printf("delete ok ");
if(rename(filename1,filename)==0)
printf("rename ok ");
return 1;
}
fprintf(ftlid,"&&%s&%s",buf1,buf2);
}

}
fclose(flid);
fclose(ftlid);
if(remove(filename)==0)
printf("delete ok ");
if(rename(filename1,filename)==0)
printf("rename ok ");
return 1;
}

//字段信息 fieldset 要修改的信息
//
//
//
int updateRecord(char *tablename,vector<FieldList> fieldset,vector<DataList> data,char *deletevalue)
{
/*用于更新一条记录,先除去在索引中的记录,然后在除去在数据中的文件
更新只能用主键索引,先用主键查找记录,若找到则同比复制文件。
*/
FILE *flid,*ftlid;
char *filename = (char *)malloc(strlen(tablename)+4);
strcpy(filename,tablename);
strcat(filename,".lid");
char *filename1 = (char *)malloc(strlen(tablename)+5);
strcpy(filename1,tablename);
strcat(filename1,".tlid");
if((flid=fopen(filename,"rb"))==NULL)
{
printf("配置字段信息失败......../n");
return -1;
}
if((ftlid=fopen(filename1,"ab+"))==NULL)
{
printf("配置字段信息失败......../n");
return -1;
}
//printf("start parse ............../n");
char ch = fgetc(flid);
//printf("start parse[%c] ............../n",ch);
while(!feof(flid))
{
char next = fgetc(flid);
if((ch =='&'&&next=='&')&&(ch !='/0'&&next!='/0'))
{
char buf1[255];
char buf2[255];
ch = fgetc(flid);
//printf("start parse[%c] ............../n",ch);
int i = 0;
while(ch !='/0'&&ch!='&')
{
if(ch=='/')
ch = fgetc(flid);
buf1[i++]=ch;
ch = fgetc(flid);
}
buf1[i]='/0';
ch = fgetc(flid);
i = 0 ;
while(ch !='/0'&&ch!='&')
{
if(ch=='/')
ch = fgetc(flid);
buf2[i++]=ch;
if(feof(flid))
break;
ch = fgetc(flid);
}
buf2[i]='/0';
printf("%s | %s/n",buf1,buf2);
printf("[buf]:[%s buf1:[%s /n",buf1,buf2);

if( strcmp(buf1,deletevalue) == 0)
{
printf("找到要修改的记录............../n");

if(ch == '&')
fputc('&',ftlid);

while(!feof(flid))
{
fputc(fgetc(flid),ftlid);
}
fclose(flid);
fclose(ftlid);
remove(filename);
//printf("delete ok ");
rename(filename1,filename);
//printf("rename ok ");
long position = atol(buf2);

FILE *fltd ;
char *filename2 = (char *)malloc(strlen(tablename)+4);
strcpy(filename2,tablename);
strcat(filename2,".ltd");
if((fltd=fopen(filename2,"rb"))==NULL)
{
printf("配置字段信息失败......../n");
return -1;
}
fseek(fltd,position,0);

printf("定位的数据信息的位置:%ld /n",position);
//定位数据文件的指针,读取信息,然后在添加
vector<DataList> infor;
char first = fgetc(fltd);
char second = fgetc(fltd);

printf("双字符是:[%c%c]...../n",first,second);

if((first !='/0'&&second!='/0')&&(first =='&'&&second=='&'))
{

first = fgetc(flid);
//printf("start parse[%c] ............../n",ch);


vector<FieldList>::iterator Datalist;

printf("文件的原记录信息......../n");
for(Datalist = fieldset.begin();Datalist!=fieldset.end();Datalist++)
{
char buf[255];
int j = 0;
while(first !='/0'&&first!='&')
{
if(first=='/')
first = fgetc(fltd);
buf[j++]=first;
first = fgetc(fltd);
}
buf[j]='/0';

first = fgetc(fltd);
DataList node;
strcpy(node.name ,Datalist->fieldname);
node.value = (char *)malloc(sizeof(255));
strcpy(node.value , buf);
infor.push_back(node);
printf(" [%s %s /n",node.name,node.value);
}

printf("读取完毕.........../n");

vector<DataList>::iterator datahead;

for(datahead = data.begin();datahead != data.end();datahead++)
{
vector<DataList>::iterator temp;

for(temp = infor.begin();temp != infor.end();temp++)
{
if( strcmp(datahead->name , temp->name ) == 0)
{
strcpy(temp->value,datahead->value);
break ;
}

}

}
fclose(fltd);
insertRecord(tablename,fieldset,infor);
}

return 1;
}
fprintf(ftlid,"&&%s&%s",buf1,buf2);
}

}
fclose(flid);
fclose(ftlid);
remove(filename);
//printf("delete ok ");
rename(filename1,filename);
return 1;

}
/////////////////////////////////////////////////////
//用于解析SQl专用的数据类型
struct FieldNode
{
char message[20];
};
// 用于测试SQL语句的的功能性
vector<FieldNode> testSQL(char *command,int count)
{
vector<FieldNode> sqlhead;

if(command[count] == '/0')
return NULL ;

while(command[count]!='/0')
{
FieldNode temp;
//strcpy(temp.message,"NULL");

int i = 0 ;
while(command[count]!='/0'&&command[count]!=' '&&command[count]!=')'&&command[count]!='('&&command[count]!=',')
{
if( i >= 19 )
{
printf("无法解析的字符 testSQL()中 temp溢出 /n");
return NULL ;
}

if( command[count]=='/')
{
count++;
}
else if(command[count]=='/'')
{
count++;
continue ;
}
temp.message[i++] = command[count++];

}
if(i != 0 )
{
temp.message[i] = '/0' ;
sqlhead.push_back(temp);
}
if(command[count] == '/0')
break;
count++;
}

/*
vector<FieldNode>::iterator phead;
for(phead = sqlhead.begin();phead != sqlhead.end();phead++)
printf("[%s] /n",phead);
*/
return sqlhead;
}
//////////////////////////////////////////////////

//用于测试数据的读入与解析
void parseData()
{
char buf[500]="&&liubing&liu&/&0&password/*&34&34&&liubing&liu&0&password&34&34*&liubing&liu&0&password&34&34*&liubing&liu&0&password&34&34*&liubing&liu&0&password&34&34&&liubing&liu&/&0&password/*&34&34&&liubing&liu&/&0&password/*&34&34&&liubing&liu&/&0&password/*&34&34&&liubing&liu&/&0&password/*&34&34&&liubing&liu&/&0&password/*&34&34&&liubing&liu&/&0&password/*&34&34";
int i =0 ;
int fieldnum = 6;
while(buf[i]!='/0'&&buf[i+1]!='/0'&&(buf[i]=='&'&&buf[i+1]=='&')||(buf[i]=='*'&&buf[i+1]=='&'))
{
bool flag = true;
if(buf[i]=='*'&&buf[i+1]=='&')
flag = false;
i+=2;
for(int num = 0;num<fieldnum;num++)
{
int t =0;
char value[20];
while(buf[i]!='&'&&buf[i]!='*'&&buf[i]!='/0')
{
if(buf[i]=='/')
value[t]=buf[i++];
else
value[t]=buf[i];
i++;
t++;
}
value[t] = '/0';
i++;
printf("fieldnum [%d] ==== [%s] ======/n",num,value);
}
i--;
printf("i====%d===/n [%c%c]",i,buf[i],buf[i+1]);
}

char temp[55]="&&liubing&liu&/&0&password/*&34&34";
printf("count=%s/n",temp);

int count=0;
while(temp)
count++;
printf("count====%d===%s/n",count,temp);

}
/////////////
//用于获取每一个命令
//
int getCommand(char *command,int i,char *firstcommand)
{
int t = 0;

while( command[i]!='/0'&&command[i]!=' ')
{
if(t >= 10)
return -1;
firstcommand[t++] = command[i++];
}
firstcommand[t]='/0';
//printf("command = [%s]/n",command);
//printf("getcommand firstcommand = [%s] /n",firstcommand);
return 1;
}

//用于获取create table命令
//
//
vector<FieldList> parseCreateTableCommand(char *command,int count)
{
//主要是从()内中进行解析
/*
(name varchar(20) primary notnull,....,)

*/
//如果首字符为'('
if(command[count]=='(')
count++;

//如果当前的字符为空则退出
if(command[count] == '/0')
{
printf("parseCreateTableCommand()中command中的首字符为空......./n");
return NULL;
}

//结果向量
vector<FieldList> result =NULL ;

while(command[count]!=')'&&command[count]!='/0')
{

//一条字段信息
while(command[count]!=','&&command[count]!='/0')
{
FieldList temp;//存放字段信息
char buf[21];
int i =0;
while(command[count]!=' '&&command[count]!='/0')
{
if(i>=20)
{
printf("[%d]当前的字段信息出错..../n",count);
return NULL ;
}

if(command[count]==')'||command[count]=='('||command[counti]=='/')
{
count++;
if(command[count]=='/0')
{
printf("[%d]字段信息出错..../n",count);
return NULL ;
}
}

buf[i++] = command[count++];
}
buf[i] = '/0';
count++;
}
}
}
void SQLParse(char *command)
{
if(command == NULL)
return ;

int i = 0;
int t = 0;

char firstcommand[10];
while( command[i]!='/0'&&command[i]!=' ')
{
if(t >= 10)
return ;
firstcommand[t++] = command[i++];
}
firstcommand[t]='/0';


if( strcmp(firstcommand,"show")==0)
{

char *secondcommand = (char *)malloc(sizeof(10));
strcpy(secondcommand,"unkown");
// printf("1 secondcommand = [%s]/n",secondcommand);

int t = 0;

if(command[i]=='/0')
{
printf("不能识别show,请正确输入后面的参数......../n");
return ;
}
getCommand(command,i+1,secondcommand);
// printf("2 secondcommand = [%s]/n",secondcommand);
if(strcmp(secondcommand,"version")==0)
{
printf("Liu SQL version 1.0/n");

}
else if(strcmp(secondcommand,"user")==0)
{
printf("当前用户是:root/n");
}
else if(strcmp(secondcommand,"database")==0)
{
databasehead.clear();
readConfigSys();//读取数据库信息
if(databasehead.empty())
{
printf("当前没有任何数据库/n");
return ;
}
printf("当前所有的数据库为:/n");

vector<database>::iterator pdatabasehead;
for(pdatabasehead = databasehead.begin();pdatabasehead != databasehead.end();pdatabasehead++)
{
printf("%s/n",pdatabasehead->cdatabasename);
}
}
else
{
printf("%s无法识别/n",secondcommand);

}
//free(secondcommand);
return ;
}
else if( strcmp(firstcommand,"use")==0)
{
return ;
}
else if( strcmp(firstcommand,"alter")==0)
{
return ;
}
else if( strcmp(firstcommand,"drop")==0)
{
char *secondcommand = (char *)malloc(sizeof(10));
strcpy(secondcommand,"unkown");
// printf("1 secondcommand = [%s]/n",secondcommand);

int t = 0;

if(command[i]=='/0')
{
printf("不能识别在drop,请正确输入后面的参数......../n");
return ;
}
// getCommand(command,i+1,secondcommand);
vector<FieldNode> test = testSQL(command,i+1);
vector<FieldNode>::iterator ptest;

ptest = test.begin();

if( strcmp(ptest->message,"database") == 0)
{
ptest++;
if(ptest== test.end())
{
printf("database 后面缺少数据库对象的参数......./n");
return ;
}

if( dropDatabase(ptest->message) == 1 )
{
printf("database %s drop successfully..../n",ptest->message);
}
else
printf("drop database %s failed..../n",ptest->message);
return ;
}
else if(strcmp(ptest->message,"table") == 0)
{
ptest++;

if(ptest== test.end())
{
printf("table 后面缺少参数......./n");
return ;
}
dropTable(ptest->message) ;

printf("drop table 执行完毕 ..../n",ptest->message);

}
else
{
printf("drop 后的的%s不可识别...../n",secondcommand);
}
return ;
}
else if( strcmp(firstcommand,"select")==0)
{
return ;
}
else if( strcmp(firstcommand,"update")==0)
{
return ;
}
else if( strcmp(firstcommand,"help")==0)
{
if(command[i]!='/0')
{
printf("help后面有不能识别的字符/n");
return ;
}
printf("欢迎使用Liu SQL数据库管理系统......../n");
return ;
}
else if( strcmp(firstcommand,"exit")==0)
{
if(command[i]!='/0')
{
printf("exit后面有不能识别的字符/n");
return ;
}
printf("要退出应用程序.../n");
exit(0);
return ;
}
else if( strcmp(firstcommand,"insert")==0)
{
return ;
}
else if( strcmp(firstcommand,"delete")==0)
{
return ;
}else if( strcmp(firstcommand,"create")==0)
{
vector<FieldNode> test = testSQL(command,i+1);
vector<FieldNode>::iterator ptest;
ptest = test.begin();

if( strcmp(ptest->message,"database") == 0)
{
ptest++;

if(ptest== test.end())
{
printf("database 后面缺少数据库对象的参数......./n");
return ;
}

if( createDatabase(ptest->message) == 1)
{
printf("数据库[%s]创建成功..../n",ptest->message);
}
else
{
printf("数据库[%s]创建失败..../n",ptest->message);
}
}
else if( strcmp(ptest->message,"table") == 0)
{
ptest++;
if(ptest== test.end())
{
printf("table 后面缺少参数......./n");
return ;
}
}
else
{
printf("create 后面有无法识别的字符,请确认输入....../n");
}

return ;
}
else
{
printf("首字符不识别,请确认您的输入..../n");
return ;
}
}
//================================================================
//函数描述:打印当前时间
//入口参数:无
//返回值: 无
//===============================================================
void PrintCurrentTime()
{
char buf[29];
struct tm *p;
long ltime;
_strtime(buf);
printf("当前时间:/t/t/t/t%s/n", buf);
_strdate(buf);
printf("当前日期:/t/t/t/t%s/n", buf);
time(&ltime);
p=localtime(&ltime);
strftime(buf,29,"%a %d %b %Y %H:%M:%S GMT",p);
printf("服务器启动时间:%s/n",buf);

}
//================================================================
//函数描述:用于大小写转换
//入口参数:要转换的数据
//返回值: 无
//===============================================================
void UpToLower( char *command )
{

int index = 0 ;

char temp = command[index];

while( temp != '/0' )
{
if( temp >='A' && temp <= 'Z' )
command[index] = temp+32 ;

index++ ;
temp = command[index] ;
}

}
//================================================================
//函数描述:用于接收用户数据
//入口参数:无
//返回值: 无
//===============================================================

void InputCommand()
{
char command[1024];
printf("/nLiu SQL://>");
gets( command );

while( true )
{
UpToLower( command );
/*
if( strcmp(command,"help") == 0 )
{
printf("/t 欢迎使用帮助/n");
cout<<"/t help------------帮助"<<endl;
cout<<"/t create------------创建"<<endl;
cout<<"/t insert------------插入"<<endl;
cout<<"/t update------------更新"<<endl;
cout<<"/t drop-------------卸载"<<endl;
cout<<"/t select------------查询"<<endl;
cout<<"/t exit------------退出"<<endl;
}

else if ( strcmp(command,"exit" ) == 0 )
{
printf("正在进行退出处理......./n");
// Sleep( 1000 );
for(int i=0;i<300000000;i++)
{}
printf("正在清空资源......../n");
// Sleep(1000);
for(i=0;i<300000000;i++)
{}
printf("正在关闭应用程序/n");
for(i=0;i<300000000;i++)
{}
// Sleep(1000);
printf("关闭成功/n/n");
exit(0);
return ;
}

else if( strcmp(command,"sql" ) == 0 )
{
printf("/nsql命令://>:");
}

else
{
printf(" 错误的命令 /n ");
}
*/
//printf("command:%s/n",command);
SQLParse(command);
printf("/nLiu SQL://>");
//rcpy(command,"");
gets( command );
//printf("command:%s/n",command);
}

}
//检查是否可以插入记录
//
//
#define MAX_LEN 10

//
//用之于测试一种方法 但没有成功
bool checkInsert(char *tablename,char *value)
{
FILE *flid;
char *filename = (char *)malloc(strlen(tablename)+4);
strcpy(filename,tablename);
strcat(filename,".lid");
if((flid=fopen(filename,"rb"))==NULL)
{
printf("配置字段信息失败......../n");
return false;
}
char *data ;
data = (char *)malloc(MAX_LEN*sizeof(char));
long count = 0;
int row = 1 ;
printf("start file read /n");

while(!feof(flid))
{
if( count>=row*MAX_LEN-2 )
{
data = (char *)realloc(data,MAX_LEN*sizeof(char));
//printf("%s]/n",data);
row++;
}

data[count++]=fgetc(flid);
}
data[count]='/0';


printf("count == [%ld] row = [%d]/n",count,row);
Sleep(2000);
printf("%s/n",data);
free(data);
fclose(flid);
printf("end /n");
return true;
}

// 用于模糊识别算法的实现
bool generalEqual(char *source,char *destnation)
{
bool flag = true;
int i = 0;
int t = 0;
while( source[i]!='/0'&&destnation[t]!='/0')
{
if(source[i]=='_')
{

}
else if(source[i]=='%')
{
if(source[i++] == '/0')
return true ;
else
{
char ch = source[i];
if(ch != '%' &&ch !='_')
{
while(destnation[t]!='/0')
{
if(ch == destnation[t])
{flag = true; break;}
else
flag = false;
t++;
}
return flag ;
}
}
}
else
{
if( source[i]!= destnation[t])
return false;
}
t++;
i++;
}
return flag;
}

/*
一些其他的测试函数 数学函数
*/

double sina(double value)
{
return sin(value);
}

void main()
{
//printf("liuXMLDBMS 已经启动/n");
//printf("my2005lb开发 版权所有/n");
char buf[255];
strcpy(buf," temp 'fewffw/,/ /)/(/'fwfwfw' 'fwfwfwf,fwffwffwfwfw' ()()())(tewokrw)(fewfwfwf)");
//create table liubing(temp varchar(30) notnull,first varchar(20) primary notnull)
//insert into XXXX (name, password ) values('//temp','temp')
//create database liuibng
//insert into XXXX (name, password ) values('/temp','/&temp')
//delete from XXX where xxx = fefwf
// 此处自定义了一些转义字符 若输入 , 空格 & / ' ) ( 要在此之前添加/
vector<FieldNode>::iterator phead;
vector<FieldNode> head = testSQL(buf,0);
for(phead = head.begin();phead != head.end(); phead++)
{
printf("[%s] /n",phead->message);
}

InputCommand();
//dropDatabase("test");
// createDatabase("test");
//parseData();



//deleteRecord("liubing",NULL,NULL);
// remove("liubing.tlid");
//vector<FieldList> fieldhead;
}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics