ubase 第5部分答案Word下载.docx
《ubase 第5部分答案Word下载.docx》由会员分享,可在线阅读,更多相关《ubase 第5部分答案Word下载.docx(19页珍藏版)》请在冰豆网上搜索。
![ubase 第5部分答案Word下载.docx](https://file1.bdocx.com/fileroot1/2023-2/5/50c7732b-68ce-4d61-877d-6a8d5d84d6f1/50c7732b-68ce-4d61-877d-6a8d5d84d6f11.gif)
"
DoingQU_Select"
<
endl;
Statusstatus;
AttrDesc*attrs,attrDesc;
inti,offset=0;
attrs=newAttrDesc[projCnt];
//属性的转换
for(i=0;
i<
projCnt;
i++)//创建投影列表
{
status=attrCat->
getInfo(projNames[i].relName,projNames[i].attrName,attrs[i]);
if(status!
=OK)returnstatus;
offset+=attrs[i].attrLen;
}
if(attr->
relName!
=NULL)
attrCat->
getInfo(attr->
relName,attr->
attrName,attrDesc);
else
{
strcpy(attrDesc.relName,projNames[0].relName);
attrDesc.attrOffset=0;
attrDesc.attrLen=0;
attrDesc.attrType=int(STRING);
attrValue=NULL;
}
//调用ScanSelect()查找
if((status=ScanSelect(result,projCnt,attrs,&
attrDesc,op,attrValue,offset))!
delete[]attrs;
returnOK;
}
result,constintprojCnt,constAttrDescprojNames[],
constAttrDesc*attrDesc,constOperatorop,constchar*filter,constintreclen)
DoingHeapFileScanSelectionusingScanSelect()"
HeapFileScan*hfs;
InsertFileScan*ifs;
char*record;
RIDrid1,rid2;
Recordrec1,rec2;
hfs=newHeapFileScan(attrDesc->
relName,status);
//对文件扫描(原表)
if(attrDesc->
attrType==INTEGER){
intintv;
intv=atoi(filter);
//atoi()将char*转换成整型hfs->
startScan(attrDesc->
attrOffset,attrDesc->
attrLen,INTEGER,(char*)(&
intv),op);
}
attrType==STRING){
hfs->
attrLen,STRING,filter,op);
attrType==FLOAT){
floatfloatv;
floatv=(float)atof(filter);
//atof()将char*转换成浮点型
attrLen,FLOAT,(char*)(&
floatv),op);
//插入result表
ifs=newInsertFileScan(result,status);
//创建插入临时表的指针
while((status=hfs->
scanNext(rid1))!
=FILEEOF)
hfs->
getRecord(rec1);
offset=0;
record=newchar[reclen];
//暂存临时表的记录
for(i=0;
i++)
memcpy(&
record[offset],(char*)rec1.data+projNames[i].attrOffset,projNames[i].attrLen);
offset+=projNames[i].attrLen;
rec2.data=record;
rec2.length=reclen;
if((status=ifs->
insertRecord(rec2,rid2))!
delete[]record;
//delete[]record;
deletehfs;
deleteifs;
2、insert.C
/*Insertsarecordintothespecifiedrelation.
*Returns:
*OKonsuccess
*anerrorcodeotherwise
*/
/*将给定的数据作为记录插入关系,属性的值由参数attrList提供,用户提供的字段和值的列表可以为任意顺序,插入前你必须按AttrCat中的顺序对其重新排序,一可以用memcpy函数将他们按合适的偏移量拷贝到一个临时数组,然后调用insertRecord方法。
如果属性值不全,禁止插入,因为UBase尚未实现NULL。
constStatusQU_Insert(conststring&
relation,constintattrCnt,constattrInfoattrList[])
{Statusstatus;
InsertFileScan*ifs;
Recordrec;
RIDrid;
RelDescrd;
AttrDescad;
inti;
relCat->
getInfo(relation,rd);
//得到属性个数
if(rd.attrCnt!
=attrCnt)
{printf("
Error:
attributenumbermismatch\n"
);
rec.length=0;
attrCnt;
getInfo(attrList[i].relName,attrList[i].attrName,ad);
rec.length+=ad.attrLen;
record=newchar[rec.length];
//暂时存放记录
if((status=attrCat->
getInfo(attrList[i].relName,attrList[i].attrName,ad))!
=OK)
{printf("
returnstatus;
record[ad.attrOffset],(char*)attrList[i].attrValue,ad.attrLen);
rec.data=record;
ifs=newInsertFileScan(relation,status);
insertRecord(rec,rid))!
=OK)returnstatus;
delete[]record;
printf("
\n1recordinserted!
\n"
3、select.C
result,constintprojCnt,constAttrDescprojNames[],constAttrDesc*attrDesc,
constOperatorop,constchar*filter,constintreclen);
/*Selectsrecordsfromthespecifiedrelation.
/*选择是通过带过滤条件的堆文件扫描(HeapFileScan)实现的。
投影列表由参数projCnt和projNames指定,在每一条记录加入结果表时就要完成投影处理。
过滤条件中的常量总是通过attrValue以字符形式出现,你可以用atoi()函数将char*转换为整型,用atof()将char*转换为符点型,如果attr参数为NULL,意味着执行无条件的扫描。
result,constintprojCnt,constattrInfoprojNames[],constattrInfo*attr,
constOperatorop,constchar*attrValue)
attrCat->
{strcpy(attrDesc.relName,projNames[0].relName);
constAttrDesc*attrDesc,constOperatorop,constchar*filter,constintreclen)
if(attrDesc.attrType=INTEGER){
//atoi()将char*转换成整型
if(attrDesc.attrType=STRING){
if(attrDesc.attrType=FLOAT){
//atof()将char*转换成浮点型
{
4、Update.C
/*Deletesrecordsfromaspecifiedrelation.
constStatusQU_Update(conststring&
relation,constintattrCnt,constattrInfoattrList[],
conststring&
attrName,constOperatorop,constDatatypetype,
constchar*attrValue)
{
RelDescrecord1;
AttrDescrecord2;
AttrDesc*attrs;
intrelationattrCnt;
intattrCntlen=0;
char*updatedata;
intintval,intval1;
floatflval,flval1;
Recordrec;
HeapFileScan*hfs;
intrecnum=0;
//checkthevalidofrelation;
status=relCat->
getInfo(relation,record1);
if(status!
=OK)returnstatus;
//checkthevaliadofattrlist;
在属性列表中找到相应的字段
for(inti=0;
i<
attrCnt;
i++)
{if((status=attrCat->
getInfo(relation,attrList[i].attrName,record2))!
=OK)
returnstatus;
//countattrNameoftherelation
if((attrCat->
getRelInfo(relation,relationattrCnt,attrs))!
=OK)returnstatus;
;
if((status=attrCat->
getInfo(relation,attrName,record2))!
=OK)
delete[]attrs;
for(inti=0;
relationattrCnt;
i++)
attrCntlen=attrCntlen+attrs[i].attrLen;
updatedata=newchar[attrCntlen];
for(inti=0;
attrCntlen;
i++)updatedata[i]=-1;
hfs=newHeapFileScan(relation,status);
delete[]updatedata;
if(type==INTEGER)
intval=atoi(attrValue);
startScan(record2.attrOffset,record2.attrLen,(Datatype)record2.attrType,(char*)&
intval,op);
if(type==FLOAT)
{flval=(float)atof(attrValue);
startScan(record2.attrOffset,record2.attrLen,(Datatype)record2.attrType,(char*)&
flval,op);
if(type==STRING)
startScan(record2.attrOffset,record2.attrLen,(Datatype)record2.attrType,attrValue,op);
//扫描记录并更新记录的值
while(hfs->
scanNext(rid)!
=FILEEOF)
getRecord(rec);
memcpy(updatedata,rec.data,rec.length);
for(intj=0;
j<
j++)
if(strcmp(attrs[i].attrName,attrList[j].attrName)==0)
if(attrs[i].attrType==INTEGER)
intval1=atoi((char*)attrList[j].attrValue);
memcpy(updatedata+attrs[i].attrOffset,&
intval1,attrs[i].attrLen);
if(attrs[i].attrType==FLOAT)
flval1=(float)atof((char*)attrList[j].attrValue);
flval1,attrs[i].attrLen);
if(attrs[i].attrType==STRING)
memcpy(updatedata+a