- 浏览: 4605549 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
x70740692:
我也是舆情系统苦逼难做
网络舆情信息分析系统——(1) -
勇气魄力:
啥啊!没什么信息
ArcGIS for Server 10.1智能支持云的架构(上) -
迟来的风:
很不错,值得学习,非常感谢您给了我们这么好的资源
最新 跟我学spring3 电子书下载 -
linfanne:
哭了, 有一个地方写错了, 跟了2个多小时代码才找到原因& ...
Spring MVC+Freemarker+Javascript的多语言(国际化i18n/本地化)和主题(Theme)实现 -
linfanne:
无数的鲜花,多语言暂时不考虑,多主题刚好用到,我一般都不回帖, ...
Spring MVC+Freemarker+Javascript的多语言(国际化i18n/本地化)和主题(Theme)实现
我完成的一个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(<ime);
p=localtime(<ime);
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;
}
相关推荐
dbms c实现数据库课程设计,分享一下
jchjks hcshcjksh jckhskj hskjhxjks
设计并实现一个DBMS原型系统,可以接受基本的SQL语句,对其进行词法分析、语法分析,然后解释执行SQL语句,完成对数据库文件的相应操作,实现DBMS的基本功能。
使用java Swing写的GUI程序,基本实现了DBMS的最基本的功能,并支持sql语句。Version2 可同时支持Mysql和sqlSever
基于B+树实现的小型数据库,实现了增删改查,并发控制等常用命令
数据库课程设计---选择一种高级语言实现一个简单的DBMS
一个小型数据库 DBMS用C++开发,能实现增删改查等基本功能
用C ++ 实现数据库完整性限制。完整性限制语法可以类似SQL DDL中的要求。完整性功能可以选择(如主键完整,外键完整,空值,引用完整,自定义完整等等)。 实现的语句: 建表及Load表记录的语句 ...
oracle dbms_lob
课程设计时写的数据库,实现了大部分操作,建删改查,并发控制等,还有当时写的时候的设计文档
数据库课程设计-一个简单的DBMS系统2 数据库课程设计-一个简单的DBMS系统2
数据库原理课程的课程作业。模拟出DBMS的环境。包括一系列的建表删表等操作,对表的操作,对记录(元组)的操作,记录之间、表之间的逻辑操作等。界面友好。代码与大家共享了,使用的时候里面都有说明。
数据库课程设计-一个简单的DBMS系统1 数据库课程设计-一个简单的DBMS系统1
Oracle DOM编程 文档,有要的没 Start from toc.htm DBMS_XMLDOM DBMS_XMLPARSER DBMS_XMLQUERY
简单的dbms_stats操作,简单的dbms_stats操作简单的dbms_stats操作
一个简单的dbms系统,在dos下运行! 一个简单的dbms系统,在dos下运行!
数据库系列实验 数据库实验 - 实验一 认识DBMS
一.实验名称 关系数据库SQL语言的使用-DBMS操作、表数据定义.
本文档是DBMS开发实战的需求文档第一草稿,目的是对即将开发的DBMS提出最初的需求框架。本文档不是最终文档,在发布后会经历两次阶段性改进,再形成两篇文档草稿,最终,根据三篇文档草稿,提出最终需求,形成最终...
DBMS历史及发展趋势,全面诠释了未来DBMS的发展状况