Example #1
0
Table::~Table()
{
	RecordPage page;
	page.pageIndex = 1;
	page.tableName = TableName;
	bm.readPage(page);
	page.writenext(head);
	bm.writePage(page);
}
Example #2
0
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);

}
Example #3
0
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]);
    }
}
Example #4
0
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());
    }
}
Example #5
0
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;
}
Example #6
0
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;
    }
}
Example #7
0
void BPTreeNode::writeNodeRawData() {
    BufferManager bufferManager;
    bufferManager.writePage(nodePage);
}
Example #8
0
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());
    }
}