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


}
Example #10
0
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;
}
Example #11
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 #12
0
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;
}
Example #13
0
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;
}
Example #14
0
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;
}
Example #15
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;
}
Example #16
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 #17
0
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;

}
Example #18
0
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;
    }
}
Example #19
0
void BPTreeNode::readNodeRawData() {
    BufferManager bufferManager;
    bufferManager.readPage(nodePage);
}
Example #20
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());
    }
}