📄 dbcontrol.cpp
字号:
int weizhi1 = -1;
int i = 0;
while(i < len)
{
if(strcmp(word[i].mark, "f") == 0){
ptFrom = i;
}
else if(strcmp(word[i].mark, "w") == 0){
ptWhere = i;
}
if(ptWhere != -1 && strcmp(word[i].name, ".") == 0)
isLink = i;
i++;
}
off1 = ptFrom - 1; //获得属性组长度
off2 = ptWhere - ptFrom - 1;//获得表组长度
off3 = len - 1 - ptWhere ;//获得条件组的长度
//#######################################################################
////////////////////////////////////////
///////select * from table;
////////////////////////////////////////
if(strcmp(word[1].name, "*") == 0 && ptWhere == -1){
show(str, word, len);
return 0;
}
/////////////////////////////////////////
//#######################################################################
//#######################################################################
/////////////////////////////////////////
//////select [属性组] from [表组] where [条件组]; //最多支持两个条件
/////////////////////////////////////////
if(ptWhere == -1)
{
//##################################################
//启动计时器
CRunTimer a;
START_TIMER(a)
//##################################################
char filename[20];
Data data;
IndexForCiDian index;
memset(filename, 0, 20);
memset(&data, 0, sizeof(Data));
memset(&index, 0, sizeof(IndexForCiDian));
fstream f,file;
f.open("SearchResult.txt", ios::out);
f.close();
f.open("SearchResult.txt", ios::in | ios::out | ios::app);
i = 1;
int j = 0, k = 0;
char tableName[20];
while(i < off1)
{
memset(tableName, 0, 20);
/////组装表名
while(strcmp(word[i].name, ".") != 0)
{
strcat(tableName, word[i].name);
i++;
}
//组装完毕.
char temp[20];
memset(temp, 0, 20);
strcpy(temp, tableName);
strcpy(index.name, tableName);
if((weizhi1 = getIndexFromCiDian(index, data, word[i+1].name)) == -1){
AfxMessageBox("属性名称错误!");
return false;
}
//文件中转
fstream ta;
ta.open("temp", ios::out);
char ch;
f.seekg(0, ios::beg);
while(f.read(&ch, 1))
{
ta.write(&ch,1);
}
ta.close();
f.close();
f.open("SearchResult.txt",ios::out);
f.close();
f.open("SearchResult.txt", ios::in | ios::out);
ta.open("temp",ios::in);
int biaotou;
int isKongXiang = 1;
biaotou = 0;
k = 0;
while(ReadTable(tableName, k, data))
{
j = 0;
isKongXiang = 1;
while(ta.read(&ch,1) && ch != '\n')
{
isKongXiang = 0;
f.write(&ch, 1);
}
if(isKongXiang == 1){
char kongxiang[ITEM_LEN];
memset(kongxiang, 0, ITEM_LEN);
f.write(kongxiang, ITEM_LEN);
isKongXiang = 0;
}
// while(j < data.pDataArray_len)用来显示所有的属性,与下句选其一
j = weizhi1;
{
if(biaotou == 0){
biaotou = 1;
char tou[ITEM_LEN];
memset(tou, 0, ITEM_LEN);
strcpy(tou, word[i-1].name);
strcat(tou, ".");
strcat(tou, word[i+1].name);
f.write(tou, ITEM_LEN);
k = -1;
}
else
f.write(data.pDataArray[j].name, ITEM_LEN);
j++;
}
f<<endl;
f.flush();
memset(&data, 0, sizeof(Data));
memset(tableName, 0, 20);
strcpy(tableName, temp);
k++;
}
if(strcmp(word[i].name,".") == 0)
i++;
i++;
if(strcmp(word[i].name,",") == 0)
i++;
}
f.close();
//###################################
//停止计时器
END_TIMER(a)
a.GetTime();
//#####################################
system("type.bat SearchResult");//显示
return true;
}
//#######################################################################
//#######################################################################
//选择select * from t where a = [ext1] 值 [ext2] and B=[ext1] 值 [ext2]........;
///SearchResult为查询结果队列
if(ptWhere != -1 && isLink == -1)//查询情况 非多关系连接
{
//##################################################
//启动计时器
CRunTimer a;
START_TIMER(a)
//##################################################
int weizhi1 = -1;//如果成功找到该表中的属性,则weizhi为该属性的顺序索引号码。weizhi =[0..n-1]
int ext1 = 0;//用于扩展''的形式,进行补位操作
int ext2 = 0;
int flag = 0;//FLAG = 0时打开.tab文件,并全文拷贝到SearchResult中.为1时直接打开SearchResult操作
IndexForCiDian index;
Data data;
int savePtWhere = ptWhere;
while(savePtWhere < ptWhere + off3)
{
memset(&data, 0, sizeof(Data));
memset(&index, 0, sizeof(IndexForCiDian));
index.indexType = TABLE;
strcpy(index.name, word[ptFrom + 1].name);
ext1 = ext2 = 0;
weizhi1 = -1;
if(strcmp(word[savePtWhere + 3].name, "'") == 0)
{
ext1 = 1;
ext2 = 1;
}
//对SQL中是否含有'标志进行置位。分别代表2个可能出现'的位置。
if((weizhi1 = getIndexFromCiDian(index, data, word[savePtWhere + 1].name)) != -1)
{//如果本函数不返回-1,则index,data对象被已经初始化。
char filename[20];
char temp[ITEM_LEN];
long saveOffset = -1;
long fileLen = 0;
long recordCount = 0;
long recordLen = 0;
char ch;
memset(filename, 0, 20);
memset(temp, 0, ITEM_LEN);
if(flag == 0){//既SearchResult目前为空表,用.tab全表进行初始化
strcpy(filename, word[ptFrom + 1].name);
strcat(filename, ".tab");//生成要查询的数据表的表名。word[1].name.tab
fstream fff1,fff2;
fff1.open("SearchResult.txt", ios::out);
fff2.open(filename, ios::in);
fff2.seekg(10 + 2, ios::beg);
while(fff2.read(&ch,1))
fff1.write(&ch,1);
fff1.close();
fff2.close();
flag = 1;
}
//////
memset(filename, 0, 20);
strcpy(filename, "SearchResult.txt");
////////
fstream readDataFile;
readDataFile.open(filename, ios::in | ios::out | ios::nocreate);
readDataFile.seekg(0, ios::end);
fileLen = readDataFile.tellg();
recordLen = NAME_LEN + data.pDataArray_len * (ITEM_LEN + 1);//不包括回车
recordCount = (fileLen) / (recordLen + 2);//包括回车
readDataFile.seekg(0, ios::beg);//将指针置于正文,跳过表头信息。
int j = 0;//用于辅助指针点位记录项位置。j=[0,recordLen]
fstream f;
f.open("temp",ios::out);
while(1)
{
saveOffset = readDataFile.tellg();//记录记录项的起始地址。
readDataFile.seekg(NAME_LEN, ios::cur);
readDataFile.seekg(weizhi1 * (ITEM_LEN + 1), ios::cur);//指针调到where后的属性
readDataFile.read(temp, ITEM_LEN);//读取当前记录的属性值
if(strcmp(temp, word[savePtWhere + 3 + ext1].name) == 0)//判断如果是where后的属性指定的值
{
readDataFile.seekg(saveOffset, ios::beg);
int jk = 0;
while(readDataFile.read(&ch,1) && ch != '\n'){
f.write(&ch, 1);
jk++;
}
f<<endl;
}
readDataFile.seekg(saveOffset + recordLen + 2, ios::beg);
j++;
if(j >= recordCount)
break;
}
readDataFile.close();
f.close();
f.open("temp", ios::in);
readDataFile.open("SearchResult.txt", ios::out);
while(f.read(&ch,1))
readDataFile.write(&ch,1);
readDataFile.close();
f.close();
//###################################
//停止计时器
END_TIMER(a)
a.GetTime();
//#####################################
system("type.bat SearchResult");
}
else
AfxMessageBox("该表或属性不存在!");
savePtWhere = savePtWhere + 4 + ext1 + ext2;
}//全选择查询结果
if(strcmp(word[1].name, "*") != 0)//说明是投影
{
fstream f1,f2,file;
char ch;
f1.open("SearchResult.txt",ios::in);
f2.open("temp", ios::out);
while(f1.read(&ch,1))
f2.write(&ch,1);
f1.close();
f2.close();
char filename[20];
Data data;
IndexForCiDian index;
memset(filename, 0, 20);
memset(&data, 0, sizeof(Data));
memset(&index, 0, sizeof(IndexForCiDian));
f1.open("SearchResult.txt", ios::out);
f1.close();
f1.open("SearchResult.txt", ios::in);
i = 1;
int k = 0;
char tableName[20];
while(i < off1)
{
memset(tableName, 0, 20);
/////组装表名
while(strcmp(word[i].name, ".") != 0)
{
strcat(tableName, word[i].name);
i++;
}
//组装完毕.
char temp[20];
memset(temp, 0, 20);
strcpy(temp, tableName);
strcpy(index.name, tableName);
if((weizhi1 = getIndexFromCiDian(index, data, word[i+1].name)) == -1){
AfxMessageBox("属性名称错误!");
return false;
}
f2.open("temp",ios::in);
file.open("temp1", ios::out);//中转文件
while(f2.read(&ch, 1))
{
file.write(&ch, 1);
}
file.close();
f2.close();
f1.close();
f1.open("SearchResult.txt", ios::in | ios::out | ios::app);
file.open("temp1", ios::in);
f2.open("temp",ios::in);
int biaotou;
biaotou = 0;
k = 0;
long saveOff = 0;//每行数据的起始地址
while(f2.read(&ch,1))
{
f2.seekg(-1, ios::cur);
saveOff = f2.tellg();
f2.seekg(saveOff + 40 + weizhi1 * (ITEM_LEN + 1),ios::beg);
while(f2.read(&ch,1) && ch != ';')
f1.write(&ch,1);
f1<<endl;
while(f2.read(&ch,1) && ch != '\n')
NULL;
}
f2.close();
f1.close();
if(strcmp(word[i].name,".") == 0)
i++;
i++;
if(strcmp(word[i].name,",") == 0)
i++;
}
//###################################
//停止计时器
END_TIMER(a)
a.GetTime();
//#####################################
system("type.bat SearchResult");//显示
}
return true;
}
//#######################################################################
//#######################################################################
if(ptWhere != -1 && isLink != -1)
{
//##################################################
//启动计时器
CRunTimer a;
START_TIMER(a)
//##################################################
char filename1[20], filename2[20];
char shuxingName1[20],shuxingName2[20];
int weizhi1 = -1, weizhi2 = -1;
Data data1,data2;
IndexForCiDian index1,index2;
memset(filename1, 0, 20);
memset(filename2, 0, 20);
memset(shuxingName1, 0, 20);
memset(shuxingName2, 0, 20);
memset(&data1, 0, sizeof(Data));
memset(&data2, 0, sizeof(Data));
memset(&index1, 0, sizeof(IndexForCiDian));
memset(&index2, 0, sizeof(IndexForCiDian));
//打开第一个表
memset(filename1, 0, 20);
strcpy(filename1, word[ptWhere + 1].name);
strcpy(shuxingName1, word[ptWhere + 3].name);
strcpy(index1.name, filename1);
weizhi1 = -1;
if((weizhi1 = getIndexFromCiDian(index1, data1, shuxingName1)) == -1){
AfxMessageBox("属性1名称错误!");
return false;
}
memset(filename2, 0, 20);
strcpy(filename2, word[ptWhere + 5].name);
strcpy(shuxingName2, word[ptWhere + 7].name);
strcpy(index2.name, filename2);
weizhi2 = -1;
if((weizhi2 = getIndexFromCiDian(index2, data2, shuxingName2)) == -1){
AfxMessageBox("属性2名称错误!");
return false;
}
fstream f1;
f1.open("SearchResult.txt", ios::out );
f1.close();//结果文件清空
f1.open("SearchResult.txt", ios::in | ios::out | ios::app);
int k1, k2;
k1 = 0;
k2 = 0;
char tmpfile1[20],tmpfile2[20];
memset(tmpfile1, 0, 20);
memset(tmpfile2, 0, 20);
strcpy(tmpfile1, filename1);
strcpy(tmpfile2, filename2);
while(ReadTable(filename1, k1, data1))
{
k2 = 0;
while(ReadTable(filename2, k2, data2))
{
if(strcmp(data1.pDataArray[weizhi1].name, data2.pDataArray[weizhi2].name) == 0)
{
int m;
for(m = 0; m < data1.pDataArray_len; m++)
{
f1.write(data1.pDataArray[m].name, ITEM_LEN);
f1.write(";", 1);
}
f1<<"||";//表一内容结束
for(m = 0; m < data2.pDataArray_len; m++)
{
if(m == weizhi2)
continue;
else
{
f1.write(data2.pDataArray[m].name, ITEM_LEN);
f1.write(";", 1);
}
}
f1<<endl;
}
memset(filename2, 0, 20);
strcpy(filename2, tmpfile2);
k2++;
}
memset(filename2, 0, 20);
strcpy(filename2, tmpfile2);
memset(filename1, 0, 20);
strcpy(filename1, tmpfile1);
k1++;
}
f1.close();
//打开第二个表
//选择合适结果写入SearchResult
//###################################
//停止计时器
END_TIMER(a)
a.GetTime();
//#####################################
system("type.bat SearchResult");
return true;
}
else
return false;
}
int CDBControl::InsertIntoValue(CString strCmd, Word word[], int len)
{
IndexForCiDian index;
memset(&index, 0, sizeof(IndexForCiDian));
char ch[10];
memset(ch, 0, 10);
long offset = -1;
int failFlag = 0;
strcpy(index.name, word[2].name);
index.indexType = TABLE;
if((offset = findInIndexFile(index)) == -1){
CString str;
str.Format(" %s 不存在!", word[2].name);
AfxMessageBox(str);
return false;
}
fstream file;
char buff[200];
char temp[20];
memset(temp, 0, 20);
strcpy(temp, word[2].name);
strcat(temp, ".tab");
int count = -1;
file.open(temp, ios::in);
if(!file.fail()){
file.read(buff, 10);
count = atoi(buff);
}
else
failFlag = 1;
file.close();
file.clear();
file.open(temp, ios::out | ios::in | ios::app);
int i = 5;
int com = 0;//数据项数计数
while(1)
{
memset(buff, 0, 200);
while(strcmp(word[i].name, ",") != 0 && strcmp(word[i].name, ")") != 0)
{
strcat(buff, word[i].name);
i++;
}
if(file.fail())
AfxMessageBox("文件读取失败!");
com = com + 1;
if(strcmp(word[i].name, ")") == 0)
break;
i++;
}
if(count != com && failFlag != 1 && count != -1){//数据属性个数不符的处理
CString tempS;
tempS.Format("插入操作失败! %s有%d个属性项.", word[2].name, count);
AfxMessageBox(tempS);
return false;
}
file.clear();
file.seekg(0,ios::beg);
char tableName[NAME_LEN];
memset(tableName, 0, NAME_LEN);
strcpy(tableName, word[2].name);
long index_start = -1, index_end = -1;
index_start = file.tellg();//获取索引开始位置
file.write(tableName, NAME_LEN);
i = 5;//复位指针
while(1)
{
memset(buff, 0, 200);
while(strcmp(word[i].name, ",") != 0 && strcmp(word[i].name, ")") != 0)
//用while的目的是可以处理带引号的'string'和不带引号的数字两种不同情况。
{
if(strcmp(word[i].name, "'") != 0)
strcat(buff, word[i].name);
i++;
}
file.write(buff, ITEM_LEN);//////此语句要求每个数据项最大为19个字节
file.write(";", FENHAO_LEN);//分号作为项目的分隔符
if(file.fail())
AfxMessageBox("文件读取失败!");
if(strcmp(word[i].name, ")") == 0)
break;
i++;
}
index_end = file.tellg();
file<<endl;
file.close();
// AfxMessageBox("操作成功!");
//插入索引
AddRecordIndex(tableName, index_start, word[5].name); //目前索引只能是第一个属性
return false;
}
int CDBControl::ReadFromCiDian(const IndexForCiDian &index, Data &data)
{
fstream file;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -