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); }
void CatalogManager::insertTable(TableInfo table) { CatalogPage page; BufferManager buffer; int i,j; string s; if (tableExisted(table.tableName)) { printf("Failed to create table %s. Table already existed.\n",table.tableName.c_str()); return; } for (i=0; i<table.attrNum-1; i++) for (j=i+1; j<table.attrNum; j++) if (table.attrName[i]==table.attrName[j]) { printf("Failed to create table %s. Attributes with the same name have been found.\n",table.tableName.c_str()); return; } if (table.primaryKey=="") table.primaryKeyLoc=-1; else { for (i=0; i<table.attrNum; i++) if (table.attrName[i]==table.primaryKey) { table.primaryKeyLoc=i; table.attrUnique[i]='Y'; } } page.tableName = table.tableName; page.pageData[0] = (char)table.attrNum; page.pageData[1] = (char)table.primaryKeyLoc; for (i=0; i<table.attrNum; i++) { page.writeAttr(i*100+2, table.attrName[i]); page.writeAttr(i*100+22, table.attrType[i]); // page.writeAttr(i*100+42, table.attrIndex[i]); page.pageData[i*100+62] = table.attrUnique[i]; *(int*)(page.pageData+(i*100+82)) = 0; //该属性上的索引总数,初始为0 } buffer.writePage(page); printf("Created table %s successfully!\n",table.tableName.c_str()); if (table.primaryKeyLoc>=0) { printf("Trying to build index on primary key automatelly...\n"); insertIndex(table.tableName, table.attrName[table.primaryKeyLoc], table.tableName+table.attrName[table.primaryKeyLoc]); } }
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()); } }
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; }
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; } }
void BPTreeNode::writeNodeRawData() { BufferManager bufferManager; bufferManager.writePage(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()); } }