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()); } }
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; } }
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; }