Example #1
0
void BANDB::openDB(char* dbName, char* logName) {
	// Start buffer and log managers
	bm->start(dbName);
	lm->start(logName);
	// Now the log manager has done all txnTable rebuilding and
	// all redo work, so we can rollback incomplete Txns
	for (int i = 0; i < 255; i++) {
		TxnRecord rec = lm->txnTable.records[i];
		if (rec.transID != 0) {
			// For all the transactions
			if (rec.state == 3) {
				// If it is committed but not ended, write the end record
				lm->writeEndRecord(rec.transID);
			}
			else if (rec.state != 5) {
				// Otherwise, if it is not an ended Txn, its a looser
				rollbackWork(rec.transID);
				lm->writeEndRecord(rec.transID);
			}
		}
	}
	// Harden All Pages
	bm->pageOut(0);
	bm->pageOut(1);
}
Example #2
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 #3
0
void BPlusTree::deleteEntry(int key) {

    BufferManager *bm = BufferManager::getInstance();

    //lookup till the required node
    TreeNode* c = root;
    while( c->isLeaf() ) {
        int sKey = -1;
        int finalKey = -1;
        for(int i=0; i<(c->getTotalPairs()); i++){
            sKey=c->getKey(i);
            if(sKey>key){
                finalKey=i;
                break;
            }
        }
        if(finalKey==-1) {
            int m=c->getTotalPairs();
            
            c = new TreeNode(bm->pinPage(dbName, c->getRid(m)));
        }
        else
            c = new TreeNode(bm->pinPage(dbName, c->getRid(finalKey)));
    }

    deleteFromNode(c, key);

}
MergeJoin::~MergeJoin()
{
  bool enable = false;
  BufferManager * bm = BufferManager::getInstance();

  Settings::get("partition-materialization", enable);

  for (int i = 0; i < N_BRANCHES; i++)
    {
      delete m_layout[i];
      delete m_child[i];
      delete m_tsr[i];
      bm->deallocate(m_inBuffer[i]);
    }
  
  for (int i = 0; i < NCHILD_TUPLES; i++)
    {
      delete [] m_tuple[i].m_data;
      if (enable)
	delete m_tuple[i].schema();
    }

  bm->deallocate(m_buffer);
  delete [] m_data;
  delete m_tsw;

  std::for_each(m_merge_stack.begin(), m_merge_stack.end(), free);
}
Example #5
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 #6
0
bool RenderDevice::bindBuffers(RenderBatch* renderable)
{
    BufferManager* buffers = activeContext->bufferManager;
    GeometryBuffer* gb = renderable->getGeometryBuffer().get();

    VertexBuffer* vb = buffers->getVertexBuffer(gb).get();
    IndexBuffer* ib = buffers->getIndexBuffer(gb).get();
    
    if( !vb ) return false;

    if( !vb->isBuilt() || gb->needsRebuild )
    {
        // If the vertex buffer is not built yet, then we build it.
        renderBackend->buildVertexBuffer(vb);
    }

    renderBackend->bindVertexBuffer(vb);

    // If there is no index buffer associated with the geometry, we are done.
    if( !ib ) goto done;

    renderBackend->bindIndexBuffer(ib);
    
    if( !ib->isBuilt || gb->needsRebuild )
    {
        // If the index buffer is not built, we also need to build it.
        renderBackend->buildIndexBuffer(ib);
    }

done:

    gb->needsRebuild = false;
    return true;
}
 // Buffering methods
 Buffer * AtomRenderableManager::getBuffer(unsigned int renderFormat, unsigned int tag, unsigned int mode, unsigned int verticesRequired)
 {
     if (bufferManagers[renderFormat][tag].find(mode) == bufferManagers[renderFormat][tag].end())
         bufferManagers[renderFormat][tag][mode] = new BufferManager();
     BufferManager * bufferManager = bufferManagers[renderFormat][tag][mode];
     return bufferManager->getBuffer(verticesRequired);
 }
Example #8
0
char* BANDB::read(int transID, int key) {
	int pageIndex = bm->findKey(key);
	if (pageIndex == -1) { return ""; }

	Record* rec = bm->locateRecord(pageIndex, key);
	return rec->readData();
}
BufferMapper* DisplayPlane::mapBuffer(DataBuffer *buffer)
{
    BufferManager *bm = Hwcomposer::getInstance().getBufferManager();

    // invalidate buffer cache  if cache is full
    if ((int)mDataBuffers.size() >= mCacheCapacity) {
        invalidateBufferCache();
    }

    BufferMapper *mapper = bm->map(*buffer);
    if (!mapper) {
        ELOGTRACE("failed to map buffer");
        return NULL;
    }

    // add it to data buffers
    ssize_t index = mDataBuffers.add(buffer->getKey(), mapper);
    if (index < 0) {
        ELOGTRACE("failed to add mapper");
        bm->unmap(mapper);
        return NULL;
    }

    return mapper;
}
Example #10
0
Block::Block(WickyFile* wf, int index){
	this->wf = wf;
	this->index = index;
	this->start = index * BLOCK_SIZE;
	this->mem = new unsigned char[BLOCK_SIZE];			
	BufferManager* bm = BufferManager::getInstance();	
	bm->readDisk(wf, start, BLOCK_SIZE, mem);
}
Example #11
0
bool CatalogManager::tableExisted(string tableName)
{
    BufferManager buffer;
    
    if (buffer.tableCatalogFileIsExist(tableName))
        return 1;
    else
        return 0;
}
Example #12
0
	//--------------------------------------------------------------------------------------------------------------
	SkyBox::~SkyBox()
	{
		BufferManager* pBufMgr = BufferManager::GetSingletonPtr();

		//释放顶点声明及顶点缓存
		pBufMgr->DelVertexDeclaration( mpVD );
		pBufMgr->DelVertexBuffer( mpPositionVB );
		pBufMgr->DelVertexBuffer( mpTexcoordVB );
	}
Example #13
0
Table::~Table()
{
	RecordPage page;
	page.pageIndex = 1;
	page.tableName = TableName;
	bm.readPage(page);
	page.writenext(head);
	bm.writePage(page);
}
Example #14
0
Index::Index(std::string name, std::string type, int keyLen){
	this->debug = false;
	this->d = false;
	this->name = name;
	this->type = type;
	this->keyLen = keyLen;
	this->maxKeyNum = (Block::BLOCK_SIZE - 12) / (keyLen + 4) - 3;
	this->fileName = "index-" + name + ".wk";
	BufferManager* bm = BufferManager::getInstance();
	if (bm->isFileExists(fileName)){
		bm->read(fileName, 0, &(this->last));//last block
		int m, x;
		bm->read(fileName, &m); //root		
		if (m != -1) {
			this->root = new Node(this, m);			
		} else 
			this->root = NULL;
		bm->read(fileName, 8, &m);
		for (int i=0; i<m; i++){
			bm->read(fileName, &x);
			(this->holes).push_back(x);
		}
	} else {
		this->last = 0;
		this->root = NULL;
		bm->write(fileName, 0, this->last);
		bm->write(fileName, -1);
		bm->write(fileName, (int)holes.size());
	}
}
Example #15
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 #16
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 #17
0
int
CatalogManager::new_table_def(Node* node)
{
	Node *tablePtr = cm_catNodeMgr.newCopyDataNode(node);
	tablePtr->leftSon = cm_catRoot->leftSon;
	cm_catRoot->leftSon = tablePtr;
	++cm_catRoot->numval;

	Node *insertPtr = node->leftSon;
	Node *columnPtr = nullptr;
	int columnCount = 0;
	while (insertPtr != nullptr)
	{
		columnPtr = cm_catNodeMgr.newCopyDataNode(insertPtr);
		if (insertPtr->rightSon != nullptr)
		{
			columnPtr->rightSon = cm_catNodeMgr.newCopyDataNode(insertPtr->rightSon);
		}
		columnPtr->leftSon = tablePtr->rightSon;
		tablePtr->rightSon = columnPtr;
		insertPtr = insertPtr->leftSon;
		++columnCount;
	}

	// build file
	string tmpStr(node->strval);
	tmpStr += ".db";
	BufferManager* bufmgr = BufferManager::getInstance();
	bufmgr->createFile(tmpStr.c_str());
	Pager* page = bufmgr->getPager(tmpStr.c_str());
	unsigned char* block = bufmgr->newblock(page, BUFFER_FLAG_DIRTY);

	int* blockData 		= (int*)(block+16*sizeof(char));
	int* blockVarType 	= blockData + 5;
	int* blockVarLen 	= blockVarType + columnCount;

	strncpy((char*)block, "MINISQL v0.01", 16*sizeof(char));
	blockData[0] = 1;
	blockData[1] = 0;
	blockData[2] = 0;
	blockData[3] = sizeof(char)*16+sizeof(int)*(5+2*columnCount);
	blockData[4] = columnCount;

	insertPtr = node->leftSon;
	for (int i = columnCount-1; i >=0 ; --i)
	{
		blockVarType[i] = insertPtr->operation;
		blockVarLen[i]  = (insertPtr->operation == VAL_CHAR)? insertPtr->numval: 4;
		insertPtr = insertPtr->leftSon;
	}

	return 0;
}
Example #18
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 #19
0
bool RenderDevice::unbindBuffers(RenderBatch* renderable)
{
    BufferManager* buffers = activeContext->bufferManager;
    const GeometryBuffer* gb = renderable->getGeometryBuffer().get();
    
    VertexBuffer* vb = buffers->getVertexBuffer(gb).get();
    if( !vb ) return false;
    
    renderBackend->unbindVertexBuffer(vb);

    IndexBuffer* ib = buffers->getIndexBuffer(gb).get();
    if( ib ) renderBackend->unbindIndexBuffer(ib);

    return true;
}
Example #20
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 #21
0
void BANDB::createDB(char* dbName, char* logName) {
	// Create db and log files, start buffer and log managers
	fm->create(dbName);
	fm->create(logName);
	bm->start(dbName);
	lm->start(logName);
}
void DisplayPlane::invalidateBufferCache()
{
    BufferManager *bm = Hwcomposer::getInstance().getBufferManager();
    BufferMapper* mapper;

    RETURN_VOID_IF_NOT_INIT();

    for (size_t i = 0; i < mDataBuffers.size(); i++) {
        mapper = mDataBuffers.valueAt(i);
        bm->unmap(mapper);
    }

    mDataBuffers.clear();
    // reset current buffer
    mCurrentDataBuffer = 0;
}
Example #23
0
bool BANDB::remove(int transID, int key) {
	int pageIndex = bm->findKey(key);
	if (pageIndex == -1) { return false; }
	int pageNum = bm->getNumAtIndex(pageIndex);

	Record* oldRecP = bm->locateRecord(pageIndex, key);
	Record oldRec = *oldRecP;
	char* oldData = (char*) &oldRec;

	char empty[16] = {};
	for (int i = 0; i < 16; i++) { empty[i] = 0; }

	bool result = bm->removeRecord(pageIndex, key);
	lm->writeWriteRecord(transID, pageNum, oldData, empty);
	return result;
}
Example #24
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 #25
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;
}
void DisplayPlane::updateActiveBuffers(BufferMapper *mapper)
{
    BufferManager *bm = Hwcomposer::getInstance().getBufferManager();

    // unmap the first entry (oldest buffer)
    if (mActiveBuffers.size() >= MIN_DATA_BUFFER_COUNT) {
        BufferMapper *oldest = mActiveBuffers.itemAt(0);
        bm->unmap(oldest);
        mActiveBuffers.removeAt(0);
    }

    // queue it to active buffers
    if (!isActiveBuffer(mapper)) {
        mapper->incRef();
        mActiveBuffers.push_back(mapper);
    }
}
Example #27
0
bool BANDB::write(int transID, int key, char* data) {
	int pageIndex = bm->findKey(key);
	if (pageIndex == -1) { pageIndex = bm->findKey(0); }
	if (pageIndex == -1) { return false; }
	int pageNum = bm->getNumAtIndex(pageIndex);

	Record* oldRecP = bm->locateRecord(pageIndex, key);
	Record oldRec = *oldRecP;
	char* oldData = (char*) &oldRec;

	Record newRec = Record(key, data);
	char* newData = (char*) &newRec;

	bool result = bm->insertRecord(pageIndex, key, data);
	lm->writeWriteRecord(transID, pageNum, oldData, newData);
	return result;
}
Example #28
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;
}
void DisplayPlane::invalidateActiveBuffers()
{
    BufferManager *bm = Hwcomposer::getInstance().getBufferManager();
    BufferMapper* mapper;

    RETURN_VOID_IF_NOT_INIT();

    VLOGTRACE("invalidating active buffers");

    for (size_t i = 0; i < mActiveBuffers.size(); i++) {
        mapper = mActiveBuffers.itemAt(i);
        // unmap it
        bm->unmap(mapper);
    }

    // clear recorded data buffers
    mActiveBuffers.clear();
}
Example #30
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;
}