Exemple #1
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());
	}
}
Exemple #2
0
Index::~Index(){
	BufferManager* bm = BufferManager::getInstance();
	bm->write(fileName, 0, this->last);	
	if (root != NULL)
		bm->write(fileName, this->root->getAddr());
	else
		bm->write(fileName, -1);
	bm->write(fileName, (int)holes.size());
	std::list<int>::iterator itr;
	for (itr=holes.begin(); itr!=holes.end(); itr++){				
		bm->write(fileName, *itr);
	}	
	std::map<int, Node*>::iterator nodeItr;
	for (nodeItr=nodes.begin(); nodeItr!=nodes.end(); nodeItr++){
		delete nodeItr->second;
	}
}
Exemple #3
0
Node* Index::newNode(){
	int n;
	Node* ret;	
	if (holes.empty()){
		last += Block::BLOCK_SIZE;
		n = last;
	} else {
		n = holes.front();
		holes.pop_front();
	}
	BufferManager* bm = BufferManager::getInstance();
	unsigned char* buf = new unsigned char[Block::BLOCK_SIZE];
	bm->write(this->getFileName(), n, Block::BLOCK_SIZE, buf); // write block
	bm->write(this->getFileName(), n, -1); // set parent to -1
	bm->write(this->getFileName(), 0);// set keynum
	bm->write(this->getFileName(), 0);// set noninternal
	delete[] buf;
	ret = new Node(this, n);
	nodes.insert(std::map<int, Node*>::value_type(n, ret));
	return ret;
}