📄 catalog.c
字号:
#include "catalog.h"RelCatalog::RelCatalog(Status &status) : HeapFile(RELCATNAME, status){// nothing needed}const Status RelCatalog::getInfo(const string & relation, RelDesc &record){ if (relation.empty()) return BADCATPARM; Status status; Record rec; RID rid; HeapFileScan *ifs ; ifs = new HeapFileScan( RELCATNAME, status) ; if (status != OK) return status ; ifs->startScan( 0, relation.length(), STRING, relation.c_str(), EQ) ; if(ifs->scanNext(rid) == OK){ if ((status = getRecord( rid, rec)) != OK){ delete ifs ; return status ; } memcpy( &record, rec.data, rec.length) ; delete ifs ; return OK ; } delete ifs ; return RELNOTFOUND ;}const Status RelCatalog::addInfo(RelDesc & record){ RID rid; InsertFileScan* ifs; Status status; Record rec ; string myrelName ; RelDesc myrec ; ifs = new InsertFileScan( RELCATNAME, status) ; if (status != OK) return status ; myrelName.append(record.relName) ; if ((status = getInfo( myrelName, myrec )) == OK){ delete ifs ; return RELEXISTS ; } rec.data = &record ; rec.length = sizeof(RelDesc) ; if ((status = ifs->insertRecord( rec, rid)) != OK){ delete ifs ; return status ; } delete ifs ; return OK ;}const Status RelCatalog::removeInfo(const string & relation){ Status status; RID rid; HeapFileScan* hfs; if (relation.empty()) return BADCATPARM; hfs = new HeapFileScan( RELCATNAME, status) ; if (status != OK) return status ; hfs->startScan( 0, relation.length(), STRING, relation.c_str(), EQ) ; if((status = hfs->scanNext(rid)) == OK){ if ((status = hfs->deleteRecord()) != OK){ delete hfs ; return status ; } delete hfs ; return OK ; } delete hfs ; return RELNOTFOUND ;}RelCatalog::~RelCatalog(){// nothing needed}AttrCatalog::AttrCatalog(Status &status) : HeapFile(ATTRCATNAME, status){// nothing needed}const Status AttrCatalog::getInfo(const string & relation, const string & attrName, AttrDesc &record){ Status status; RID rid; Record rec; HeapFileScan* hfs; hfs = new HeapFileScan( ATTRCATNAME, status) ; if (status != OK) return status ; hfs->startScan( 0, relation.length(), STRING, relation.c_str(), EQ) ; while ((status = hfs->scanNext(rid)) != FILEEOF){ if ((status = hfs->getRecord(rec)) != OK){ delete hfs ; return status ; } memcpy( &record, rec.data, rec.length) ; if (strncmp ( record.attrName,attrName.c_str(), attrName.length()) == 0){ delete hfs ; return OK ; } } delete hfs ; return ATTRNOTFOUND ;}const Status AttrCatalog::addInfo(AttrDesc & record){ RID rid; InsertFileScan* ifs; Status status; Record rec ; string myattr, myrel ; AttrDesc myads ; ifs = new InsertFileScan( ATTRCATNAME, status) ; if (status != OK) return status ; myrel.append(record.relName) ; myattr.append(record.attrName) ; if ((status = getInfo( myrel, myattr, myads)) == OK){ delete ifs ; return DUPLATTR ; } rec.data = &record ; rec.length = sizeof(AttrDesc) ; if ((status = ifs->insertRecord( rec, rid)) != OK){ delete ifs ; return status ; } delete ifs ; return OK ;}const Status AttrCatalog::removeInfo(const string & relation, const string & attrName){ Status status; Record rec; RID rid; AttrDesc record; RelDesc relrec ; HeapFileScan* hfs; if (relation.empty() || attrName.empty()) return BADCATPARM; hfs = new HeapFileScan ( ATTRCATNAME, status) ; if (status != OK) return status ; if((status = relCat->getInfo( relation, relrec)) != OK){ delete hfs ; return status ; } hfs->startScan( 0, relation.length(), STRING, relation.c_str(), EQ) ; while((status = hfs->scanNext(rid)) != FILEEOF){ if ((status = hfs->getRecord(rec)) != OK){ delete hfs ; return status ; } memcpy( &record, rec.data, rec.length) ; if (strncmp(record.attrName, attrName.c_str(), attrName.length()) == 0){ hfs->deleteRecord() ; delete hfs ; return OK ; } } delete hfs ; return ATTRNOTFOUND ;}const Status AttrCatalog::getRelInfo(const string & relation, int &attrCnt, AttrDesc *&attrs){ Status status; RID rid; Record rec; HeapFileScan* hfs; int i ; if (relation.empty()) return BADCATPARM; hfs = new HeapFileScan( ATTRCATNAME, status) ; if (status != OK) return status ; i = 0 ; hfs->startScan( 0, relation.length(), STRING, relation.c_str(), EQ) ; while((status = hfs->scanNext(rid)) != FILEEOF){ i++ ; } attrs = new AttrDesc[i] ; hfs = new HeapFileScan( ATTRCATNAME, status) ; if (status != OK) return status ; hfs->startScan( 0, relation.length(), STRING, relation.c_str(), EQ) ; i = 0 ; while(hfs->scanNext(rid) != FILEEOF){ hfs->getRecord(rec) ; memcpy( &attrs[i], rec.data, rec.length) ; i++ ; } attrCnt = i ; delete hfs ; return OK ;}AttrCatalog::~AttrCatalog(){// nothing needed}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -