1、 Doing QU_Select endl; Status status; AttrDesc *attrs,attrDesc; int i,offset=0; attrs=new AttrDesc projCnt; /属性的转换 for(i=0;igetInfo(projNamesi.relName,projNamesi.attrName,attrsi); if(status!=OK) return status; offset+=attrsi.attrLen; if(attr-relName!=NULL) attrCat-getInfo(attr-relName,attr-attrName,
2、attrDesc); else strcpy(attrDesc.relName,projNames0.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; return OK; result, const int projCnt, cons
3、t AttrDesc projNames,const AttrDesc *attrDesc, const Operator op, const char *filter, const int reclen)Doing HeapFileScan Selection using ScanSelect() HeapFileScan *hfs; InsertFileScan *ifs; char *record; RID rid1,rid2; Record rec1,rec2; hfs=new HeapFileScan(attrDesc-relName,status); /对文件扫描(原表) if(a
4、ttrDesc-attrType=INTEGER) int intv; intv=atoi(filter); /atoi()将char* 转换成整型 hfs-startScan(attrDesc-attrOffset,attrDesc-attrLen,INTEGER,(char*)(&intv),op); attrType=STRING) hfs-attrLen,STRING,filter,op);attrType=FLOAT) float floatv; floatv=(float)atof(filter); /atof()将char* 转换成浮点型attrLen,FLOAT,(char*)
5、(&floatv),op); /插入result表 ifs=new InsertFileScan(result,status); /创建插入临时表的指针 while(status=hfs-scanNext(rid1)!=FILEEOF) hfs-getRecord(rec1); offset=0; record=new charreclen; /暂存临时表的记录 for(i=0;i+) memcpy(&recordoffset,(char*)rec1.data+projNamesi.attrOffset,projNamesi.attrLen); offset+=projNamesi.attrL
6、en; rec2.data=record; rec2.length=reclen; if(status=ifs-insertRecord(rec2,rid2)! delete record; /delete record; delete hfs; delete ifs;2、insert.C/ * Inserts a record into the specified relation. * Returns: * OK on success * an error code otherwise */*将给定的数据作为记录插入关系,属性的值由参数attrList提供,用户提供的字段和值的列表可以为任
7、意顺序,插入前你必须按AttrCat中的顺序对其重新排序,一可以用memcpy函数将他们按合适的偏移量拷贝到一个临时数组,然后调用insertRecord方法。如果属性值不全,禁止插入,因为UBase尚未实现NULL。const Status QU_Insert(const string & relation, const int attrCnt, const attrInfo attrList) Status status; InsertFileScan * ifs; Record rec; RID rid; RelDesc rd; AttrDesc ad; int i; relCat-ge
8、tInfo(relation,rd); /得到属性个数 if(rd.attrCnt!=attrCnt) printf(Error: attribute number mismatchn); rec.length=0;attrCnt;getInfo(attrListi.relName,attrListi.attrName,ad); rec.length+=ad.attrLen; record=new char rec.length; /暂时存放记录 if(status=attrCat-getInfo(attrListi.relName,attrListi.attrName,ad)!=OK) pr
9、intf( return status;recordad.attrOffset,(char*)attrListi.attrValue,ad.attrLen); rec.data=record; ifs=new InsertFileScan(relation,status);insertRecord(rec,rid)!=OK)return status; delete record; printf(n1 record inserted!n3、select.C result, const int projCnt, const AttrDesc projNames,const AttrDesc *a
10、ttrDesc, const Operator op, const char *filter, const int reclen);/* Selects records from the specified relation. /* 选择是通过带过滤条件的堆文件扫描(HeapFileScan)实现的。投影列表由参数projCnt和projNames指定,在每一条记录加入 结果表时就要完成投影处理。过滤条件中的常量总是通过attrValue以字符形式出现,你可以用atoi() 函数将char*转换为整型,用atof()将char*转换为符点型, 如果attr参数为 NULL,意味着执行无条件的扫
11、描。 result, const int projCnt, const attrInfo projNames,const attrInfo *attr, const Operator op, const char *attrValue) attrCat- strcpy(attrDesc.relName,projNames0.relName); const AttrDesc *attrDesc, const Operator op, const char *filter, const int reclen) if(attrDesc.attrType=INTEGER) /atoi()将char*
12、转换成整型 if(attrDesc.attrType=STRING) if(attrDesc.attrType=FLOAT) /atof()将char* 转换成浮点型 4、Update.C/* Deletes records from a specified relation.const Status QU_Update(const string & relation, const int attrCnt, const attrInfo attrList, const string & attrName, const Operator op, const Datatype type, cons
13、t char *attrValue) RelDesc record1; AttrDesc record2; AttrDesc *attrs ; int relationattrCnt; int attrCntlen=0; char *updatedata ; int intval,intval1 ; float flval,flval1 ; Record rec ; HeapFileScan *hfs ; int recnum = 0 ; / check the valid of relation; status = relCat-getInfo( relation,record1) ; if
14、 (status != OK) return status ; / check the valiad of attrlist;在属性列表中找到相应的字段 for( int i = 0; i getInfo( relation, attrListi.attrName, record2) != OK) return status ; / count attrName of the relation if (attrCat-getRelInfo( relation, relationattrCnt, attrs)!=OK) return status ; if (status = attrCat-g
15、etInfo( relation, attrName, record2) != OK) delete attrs ; for ( int i = 0; relationattrCnt; i+) attrCntlen = attrCntlen + attrsi.attrLen ; updatedata = new charattrCntlen ; for (int i = 0; attrCntlen ; i+) updatedatai = -1; hfs = new HeapFileScan( relation, status) ; delete updatedata ; if (type =
16、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)st
17、artScan( record2.attrOffset, record2.attrLen,(Datatype)record2.attrType, attrValue, op) ; /扫描记录并更新记录的值 while(hfs-scanNext(rid)!= FILEEOF)getRecord(rec) ; memcpy( updatedata, rec.data, rec.length) ; for (int j = 0; j j+) if (strcmp(attrsi.attrName, attrListj.attrName) = 0) if (attrsi.attrType = INTEGER) intval1 = atoi(char *)attrListj.attrValue) ; memcpy( updatedata + attrsi.attrOffset, &intval1, attrsi.attrLen) ; if (attrsi.attrType = FLOAT) flval1 = (float)atof(char *)attrListj.attrValue) ;flval1, attrsi.attrLen) ; if (attrsi.attrType = STRING) memcpy( updatedata + a
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1