コード例 #1
0
ファイル: CatalogManager.cpp プロジェクト: jxwufan/MiniSQL
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());
    }
}
コード例 #2
0
ファイル: CatalogManager.cpp プロジェクト: jxwufan/MiniSQL
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());
    }
}