void CatalogManager::dropTable(string tableName) { if (!tableExisted(tableName)) { printf("Table does not exist!\n"); } else { BufferManager buffer; IndexCatalogPage indexPage; int n,nn,i,x,k; string s, attrName; indexPage.pageIndex=1; buffer.readPage(indexPage); n=*(int*)indexPage.pageData; nn=n; i=1; k=0; while (i<=n) //开始逐条检查,删除这张表上所有的索引 { x=indexPage.readPrevDel(i); if (x==0) //如果当前条未被删除 { s=indexPage.readTableName(i); if (s==tableName) //如果是这张表的索引,删掉 { k++; //k用来记录删除了多少条索引 indexPage.deleteIndex(i); attrName=indexPage.readAttrName(i); BufferManager bm; string filePath=bm.indexFilePath(tableName, attrName); if (bm.indexFileIsExist(tableName, attrName)) bm.deleteIndexFile(tableName, attrName); } } else //如果当前条已被删除,则最后一条位置后移 n++; i++; } indexPage.pageIndex=1; //记录索引信息首页的索引总数也需要改 buffer.readPage(indexPage); *(int*)indexPage.pageData=nn-k; buffer.writePage(indexPage); buffer.deleteTableCatalogFile(tableName); //删除当前表的文件 buffer.deleteTableFile(tableName); //删除当前表的record文件 printf("Dropped table %s successfully!\n",tableName.c_str()); } }
int CatalogManager::attrType(string tableName, string attrName) { int i,j,num; string s=""; CatalogPage page; BufferManager buffer; page.tableName = tableName; buffer.readPage(page); num = (int)page.pageData[0]; for (i=0; i<num; i++) if (page.readAttrName(i) == attrName) s = page.readAttrType(i); if (s == "") return 0; else if (s == "int") return 1; else if (s == "float") return 2; else { j=0; for (i=5; s[i]!=')'; i++) j = j*10+s[i]-'0'; return j+2; } }
vector<PageIndexType> Table::scanNotEqual(int attrnum, Attribute attribute) { vector<PageIndexType> result; PageIndexType i = head; while (i != UNDEFINEED_PAGE_NUM) { RecordPage page; page.tableName = TableName; page.pageIndex = i; bm.readPage(page); Tuple tuple; tuple.page = page; tuple.createlist(TableName); tuple.ParseFromRawData(); if (tuple.list[attrnum] != attribute) result.push_back(i); i = page.readnext(); } return result; }
string CatalogManager::indexLocation(string indexName) { BufferManager buffer; IndexCatalogPage indexPage; int n,i,k,x; string s,ans; ans=""; indexPage.pageIndex=1; buffer.readPage(indexPage); n=*(int*)indexPage.pageData; i=1; k=0; while (i<=n) //开始逐条检查,看看这个索引名有没有 { x=indexPage.readPrevDel(i); if (x==0) //如果当前条未被删除 { s=indexPage.readIndexName(i); if (s==indexName) //如果找到了 { ans=indexPage.readTableName(i)+" "+indexPage.readAttrName(i); return ans; } } else //如果当前条已被删除,则最后一条位置后移 n++; i++; } return ""; }
vector<pair<Attribute, PageIndexType>> Table::getAll(int attrnum) { vector<pair<Attribute, PageIndexType>> result; PageIndexType i = head; while(i != UNDEFINEED_PAGE_NUM) { RecordPage page; page.tableName = TableName; page.pageIndex = i; bm.readPage(page); Tuple tuple; tuple.page = page; tuple.createlist(TableName); tuple.ParseFromRawData(); pair<Attribute, PageIndexType> p; p.first = tuple.list[attrnum]; p.second = i; result.push_back(p); i = page.readnext(); } return result; }
Table::~Table() { RecordPage page; page.pageIndex = 1; page.tableName = TableName; bm.readPage(page); page.writenext(head); bm.writePage(page); }
void Table::deleteTuple(PageIndexType index) { RecordPage page; page.pageIndex = index; page.tableName = TableName; bm.readPage(page); PageIndexType next = page.readnext(); PageIndexType before = page.readbefore(); if (before == 1) { head = next; } if(next == UNDEFINEED_PAGE_NUM) { RecordPage beforepage; beforepage.pageIndex = before; beforepage.tableName = TableName; bm.readPage(beforepage); beforepage.writenext(UNDEFINEED_PAGE_NUM); bm.writePage(beforepage); } else { RecordPage nextpage; nextpage.pageIndex = next; nextpage.tableName = TableName; bm.readPage(nextpage); RecordPage beforepage; beforepage.pageIndex = before; beforepage.tableName = TableName; bm.readPage(beforepage); beforepage.writenext(nextpage.pageIndex); nextpage.writebefore(beforepage.pageIndex); bm.writePage(beforepage); bm.writePage(nextpage); } bm.deallocatePage(page); }
string CatalogManager::primaryKey(string tableName) { CatalogPage page; BufferManager buffer; page.tableName = tableName; buffer.readPage(page); if ((int)page.pageData[1]==-1) return ""; else return page.readAttrName((int)page.pageData[1]); }
Table::Table(string name) { TableName = name; RecordPage page; page.pageIndex = 1; page.tableName = name; bm.readPage(page); head = page.readnext(); if(head == 0) head = UNDEFINEED_PAGE_NUM; }
vector<Attribute> Table::getTupleAtPage(PageIndexType num) { RecordPage page; page.tableName = TableName; page.pageIndex = num; bm.readPage(page); Tuple tuple; tuple.page = page; tuple.createlist(TableName); tuple.ParseFromRawData(); return tuple.list; }
bool CatalogManager::insertIndex(string tableName, string attrName, string indexName) { IndexCatalogPage indexPage; if (indexExisted(indexName)) { printf("Failed to insert index %s. Index name already existed!\n", indexName.c_str()); return 0; } else if (!tableExisted(tableName)) { printf("Failed to insert index %s. Table %s does not exist!\n", indexName.c_str(),tableName.c_str()); return 0; } else if (!attrExisted(tableName, attrName)) { printf("Failed to insert index %s. Attribute %s on Table %s does not exist!\n", indexName.c_str(), attrName.c_str(),tableName.c_str()); return 0; } else if (!attrUnique(tableName, attrName)) { printf("Failed to insert index %s. Attribute %s on Table %s is not unique!\n", indexName.c_str(), attrName.c_str(),tableName.c_str()); return 0; } else { indexPage.writeIndex(tableName, attrName, indexName); BufferManager buffer; CatalogPage catalog; int num,i; catalog.tableName = tableName; buffer.readPage(catalog); num = (int)catalog.pageData[0]; for (i=0; i<num; i++) if (catalog.readAttrName(i) == attrName) { catalog.modifyAttrIndexNum(i,1); buffer.writePage(catalog); break; } printf("Inserted index %s(Attribute %s on Table %s) successfully!\n", indexName.c_str(), attrName.c_str(),tableName.c_str()); return 1; } }
vector<PageIndexType> Table::getAll() { vector<PageIndexType> result; PageIndexType i = head; while (i != UNDEFINEED_PAGE_NUM) { result.push_back(i); RecordPage page; page.tableName = TableName; page.pageIndex = i; bm.readPage(page); i = page.readnext(); } return result; }
int CatalogManager::indexNum(string tableName, string attrName) { CatalogPage catalog; BufferManager buffer; int num,i,x=-1; catalog.tableName = tableName; buffer.readPage(catalog); num = (int)catalog.pageData[0]; for (i=0; i<num; i++) if (catalog.readAttrName(i) == attrName) { x = catalog.readAttrIndexNum(i); return x; } return x; }
bool CatalogManager::attrUnique(string tableName, string attrName) { int i,num; char c = '\0'; CatalogPage page; BufferManager buffer; page.tableName = tableName; buffer.readPage(page); num = (int)page.pageData[0]; for (i=0; i<num; i++) if (page.readAttrName(i) == attrName) c = page.readAttrUnique(i); if (c=='Y') return 1; else return 0; }
vector<Attribute> CatalogManager::tableInformation(string tableName) { int i,j,num; string s; vector<Attribute> table; Attribute attr; CatalogPage catalog; BufferManager buffer; catalog.pageIndex=1; catalog.tableName=tableName; buffer.readPage(catalog); num=(int)catalog.pageData[0]; table.clear(); for (i=0; i<num; i++) { attr.attrName=catalog.readAttrName(i); j=attrType(tableName, attr.attrName); if (j==1) { attr.type = AttributeType::INT; attr.length = sizeof(int); } else if (j==2) { attr.type = AttributeType::FLOAT; attr.length = sizeof(float); } else { attr.type = AttributeType::CHAR; attr.length = j-2; } table.push_back(attr); } return table; }
PageIndexType Table::insertTuple(vector<Attribute> list) { Tuple tuple; tuple.list = list; tuple.createPage(TableName); tuple.page.writebefore(1); tuple.page.writenext(head); if(head != UNDEFINEED_PAGE_NUM) { RecordPage page; page.pageIndex = head; page.tableName = TableName; bm.readPage(page); page.writebefore(tuple.page.pageIndex); bm.writePage(page); } head = tuple.page.pageIndex; tuple.convertToRawData(); bm.writePage(tuple.page); return tuple.page.pageIndex; }
void Table::printinfo(PageIndexType index) { RecordPage page; page.pageIndex = index; page.tableName = TableName; bm.readPage(page); Tuple tuple; tuple.page = page; tuple.createlist(TableName); tuple.ParseFromRawData(); for(int i = 0; i < tuple.list.size(); i++) { switch(tuple.list[i].type) { case AttributeType::CHAR: for (int j = 0; j < tuple.list[i].length; j++) cout << tuple.list[i].chardata[j]; break; case AttributeType::FLOAT: printf("%.2f", tuple.list[i].floatdata); break; case AttributeType::INT: cout << tuple.list[i].intdata; break; case AttributeType::UNDEFINED:; default: cout << "Type error!" ; break; } cout << "\t\t\t"; } cout << endl; }
bool CatalogManager::attrExisted(string tableName, string attrName) { if (!tableExisted(tableName)) { printf("Failed to find Attribute %s on Table %s. Table %s does not existed.", attrName.c_str(),tableName.c_str(),tableName.c_str()); return 0; } else { CatalogPage page; BufferManager buffer; int num,i; page.tableName = tableName; buffer.readPage(page); num = (int)page.pageData[0]; for (i=0; i<num; i++) if (page.readAttrName(i) == attrName) return 1; return 0; } }
void BPTreeNode::readNodeRawData() { BufferManager bufferManager; bufferManager.readPage(nodePage); }
void CatalogManager::deleteIndex(string indexName) { if (!indexExisted(indexName)) //如果没有这个索引 { printf("Failed to delete index %s. Index does not existed.\n", indexName.c_str()); return; } else //有这个索引 { BufferManager buffer; CatalogPage catalog; IndexCatalogPage indexPage; string s,tableName,attrName; int i,num,n,x; s=indexLocation(indexName); //找到这个索引 tableName=""; //分割字符串 attrName=""; i=0; while (s[i]!=' ') { tableName=tableName+s[i]; i++; } while (s[i]==' ') i++; while (s[i]!=0) { attrName=attrName+s[i]; i++; } printf("#%s# @%s@ *%s*\n",indexName.c_str(), tableName.c_str(), attrName.c_str()); printf("~%s~\n",primaryKey(tableName).c_str()); if (indexName == tableName+attrName && primaryKey(tableName) == attrName) { printf("Failed to delete index %s. Default index on primary key cannot be deleted.\n",indexName.c_str()); return; } indexPage.pageIndex=1; buffer.readPage(indexPage); n=*(int*)indexPage.pageData; i=1; while (i<=n) //开始在indexCatalogPage里逐条检查,删除这个索引 { x=indexPage.readPrevDel(i); if (x==0) //如果当前条未被删除 { s=indexPage.readIndexName(i); if (s==indexName) //如果找到要删的这条索引 { indexPage.deleteIndex(i); //删掉它 break; } } else //如果当前条已被删除,则最后一条位置后移 n++; i++; } buffer.writePage(indexPage); catalog.tableName = tableName; //在catalogPage里面的对应属性上修改索引总数 buffer.readPage(catalog); num = (int)catalog.pageData[0]; for (i=0; i<num; i++) { if (catalog.readAttrName(i) == attrName) { catalog.modifyAttrIndexNum(i,-1); buffer.writePage(catalog); if (catalog.readAttrIndexNum(i)==0) { BufferManager bm; string filePath=bm.indexFilePath(tableName, attrName); if (bm.indexFileIsExist(tableName, attrName)) bm.deleteIndexFile(tableName, attrName); } break; } } printf("Deleted index %s successfully!\n",indexName.c_str()); } }