예제 #1
0
void VnodeCacher::add(Vnode* directory, const string& name, Vnode* entry)
{
    if (directory->type != Vnode::DIRECTORY) return;

    DirectoriesMap::iterator it = directories_->find(directory);
    EntriesMap* entries;
    if (it == directories_->end())
    {
        entries = new EntriesMap;
        directories_->insert(vpair(directory, entries));
    }
    else
    {
        entries = (*it).second;
    }

    EntriesMap::iterator eit = entries->find(name);
    if (eit != entries->end())
    {
        monapi_fatal("already exists vnode <%s>\n", name.c_str());
    }

    entries->insert(spair(name, entry));
    return;
}
예제 #2
0
VnodeCacher::~VnodeCacher()
{
    Vnodes vnodes;
    // enumrate all Vnodes
    for (DirectoriesMap::const_iterator it = directories_->begin(); it != directories_->end(); ++it)
    {
        vnodes.push_back((*it).first);

        EntriesMap* entries = (*it).second;
        for (EntriesMap::iterator i = entries->begin(); i != entries->end(); i++)
        {
            vnodes.push_back((*i).second);
        }
        delete entries;
    }
    // enumrate unique Vnodes
    sort(vnodes.begin(), vnodes.end());
    Vnodes::iterator v = unique(vnodes.begin(), vnodes.end());
    vnodes.erase(v ,vnodes.end());
    for (Vnodes::const_iterator it = vnodes.begin(); it != vnodes.end(); ++it)
    {
        Vnode* v = (*it);
        // todo. v->fs will be destroyed before coming this line.
//        v->fs->destroy_vnode(v);
    }
    delete directories_;
}
예제 #3
0
  Accumulator* PivotTable::getAccumulatorForKeyAndEntry(const char* key, const char* entryKey)
  {
    //std::cout << "Key " << key << std::endl;
    Container::const_iterator finder = mDocumentMap.find(key);
    EntriesMap* entries = 0;
    if (finder == mDocumentMap.end())
    {
      entries = new EntriesMap();
#ifndef NO_GOOGLE_HASH
      entries->set_empty_key(0);
#endif
      size_t theSize = strlen(key);
      char* newKey = new char[theSize];
      newKey[0] = '\0';
      strcpy(newKey, key);
      mDocumentMap[newKey] = entries;
    } else {
      entries = finder->second;
    }
      
    EntriesMap::const_iterator finderEntry = entries->find(entryKey);
    Accumulator* result = 0;
    if (finderEntry == entries->end())
    {
      result = new Accumulator();
      entries->insert(std::make_pair(entryKey,result));
    } else  
        result = finderEntry->second;
    return result;
  }
예제 #4
0
void VnodeCacher::enumCaches(Vnode* directory, std::vector<std::string>& caches)
{
    DirectoriesMap::iterator it = directories_->find(directory);
    if (it == directories_->end()) {
        return;
    }
    EntriesMap* entries = it->second;
    for (EntriesMap::const_iterator eit = entries->begin(); eit != entries->end(); ++eit) {
        caches.push_back(eit->first);
    }
}
예제 #5
0
void VnodeCacher::remove(Vnode* directory, const string& name)
{
    ASSERT(directory->type == Vnode::DIRECTORY);
    DirectoriesMap::iterator it = directories_->find(directory);
    EntriesMap* entries;
    if (it == directories_->end()) {
        return;
    } else {
        entries = (*it).second;
    }
    entries->erase(name);
    return;
}
예제 #6
0
Vnode* VnodeCacher::lookup(Vnode* directory, const string& name)
{
    if (directory->type != Vnode::DIRECTORY) return NULL;
    DirectoriesMap::iterator it = directories_->find(directory);
    EntriesMap* entries;
    if (it == directories_->end())
    {
        return NULL;
    }
    else
    {
        entries = (*it).second;
    }
    EntriesMap::iterator eit = entries->find(name);
    return eit == entries->end() ? NULL : (*eit).second;
}
예제 #7
0
 void PivotTable::cleanup()
 {
   EntriesMap* entries = 0;
   for (Container::iterator iter = mDocumentMap.begin(); iter != mDocumentMap.end(); ++iter)
   {
     entries = iter->second;
     for (EntriesMap::iterator theIterEntries = entries->begin(); theIterEntries != entries->end(); ++theIterEntries)
     {
       if (theIterEntries->second)
       {
         delete theIterEntries->second;
         theIterEntries->second = 0;
       }
     }
     delete entries;
     delete[] iter->first;
     iter->second = 0;
   }
 }