#include "logstore.h" #include "logiterators.h" ///////////////////////////////////////////////////////////////////// // tree iterator implementation ///////////////////////////////////////////////////////////////////// template void diskTreeIterator::init_iterators(TUPLE * key1, TUPLE * key2) { assert(!key2); // unimplemented if(tree_.size == INVALID_SIZE) { lsmIterator_ = NULL; } else { if(key1) { lsmIterator_ = diskTreeComponentIterator::openAt(-1, tree_, key1->key(), key1->keylen()); } else { lsmIterator_ = diskTreeComponentIterator::open(-1, tree_); } } } template diskTreeIterator::diskTreeIterator(recordid tree) : tree_(tree) { init_iterators(NULL,NULL); init_helper(NULL); } template diskTreeIterator::diskTreeIterator(recordid tree, TUPLE& key) : tree_(tree) { init_iterators(&key,NULL); init_helper(&key); } template diskTreeIterator::diskTreeIterator(diskTreeComponent *tree) : tree_(tree ? tree->get_root_rec() : NULLRID) { init_iterators(NULL, NULL); init_helper(NULL); } template diskTreeIterator::diskTreeIterator(diskTreeComponent *tree, TUPLE& key) : tree_(tree ? tree->get_root_rec() : NULLRID) { init_iterators(&key,NULL); init_helper(&key); } template diskTreeIterator::~diskTreeIterator() { if(lsmIterator_) diskTreeComponentIterator::close(-1, lsmIterator_); if(curr_page!=NULL) { delete curr_page; curr_page = 0; } } template void diskTreeIterator::init_helper(TUPLE* key1) { if(!lsmIterator_) { DEBUG("treeIterator:\t__error__ init_helper():\tnull lsmIterator_"); curr_page = 0; dp_itr = 0; } else { if(diskTreeComponentIterator::next(-1, lsmIterator_) == 0) { DEBUG("diskTreeIterator:\t__error__ init_helper():\tlogtreeIteratr::next returned 0." ); curr_page = 0; dp_itr = 0; } else { pageid_t * pid_tmp; pageid_t ** hack = &pid_tmp; diskTreeComponentIterator::value(-1,lsmIterator_,(byte**)hack); curr_pageid = *pid_tmp; curr_page = new DataPage(-1, curr_pageid); DEBUG("opening datapage iterator %lld at key %s\n.", curr_pageid, key1 ? (char*)key1->key() : "NULL"); dp_itr = new DPITR_T(curr_page, key1); } } } template TUPLE * diskTreeIterator::getnext() { if(!this->lsmIterator_) { return NULL; } if(dp_itr == 0) return 0; TUPLE* readTuple = dp_itr->getnext(); if(!readTuple) { delete dp_itr; dp_itr = 0; delete curr_page; curr_page = 0; if(diskTreeComponentIterator::next(-1,lsmIterator_)) { pageid_t *pid_tmp; pageid_t **hack = &pid_tmp; diskTreeComponentIterator::value(-1,lsmIterator_,(byte**)hack); curr_pageid = *pid_tmp; curr_page = new DataPage(-1, curr_pageid); DEBUG("opening datapage iterator %lld at beginning\n.", curr_pageid); dp_itr = new DPITR_T(curr_page->begin()); readTuple = dp_itr->getnext(); assert(readTuple); } // else readTuple is null. We're done. } return readTuple; } template class diskTreeIterator; template class changingMemTreeIterator;