// index_catalog_entry.h
/**
* Copyright (C) 2013 10gen Inc.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License, version 3,
* as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see .
*
* As a special exception, the copyright holders give permission to link the
* code of portions of this program with the OpenSSL library under certain
* conditions as described in each individual source file and distribute
* linked combinations including the program with the OpenSSL library. You
* must comply with the GNU Affero General Public License in all respects for
* all of the code used other than as permitted herein. If you modify file(s)
* with this exception, you may extend this exception to your version of the
* file(s), but you are not obligated to do so. If you do not wish to do so,
* delete this exception statement from your version. If you delete this
* exception statement from all source files in the program, then also delete
* it in the license file.
*/
#pragma once
#include
#include "mongo/base/owned_pointer_vector.h"
#include "mongo/bson/ordering.h"
#include "mongo/db/diskloc.h"
namespace mongo {
class CollectionCatalogEntry;
class CollectionInfoCache;
class HeadManager;
class IndexAccessMethod;
class IndexDescriptor;
class OperationContext;
class IndexCatalogEntry {
MONGO_DISALLOW_COPYING( IndexCatalogEntry );
public:
IndexCatalogEntry( const StringData& ns,
CollectionCatalogEntry* collection, // not owned
IndexDescriptor* descriptor, // ownership passes to me
CollectionInfoCache* infoCache ); // not owned, optional
~IndexCatalogEntry();
const string& ns() const { return _ns; }
void init( IndexAccessMethod* accessMethod );
IndexDescriptor* descriptor() { return _descriptor; }
const IndexDescriptor* descriptor() const { return _descriptor; }
IndexAccessMethod* accessMethod() { return _accessMethod; }
const IndexAccessMethod* accessMethod() const { return _accessMethod; }
const Ordering& ordering() const { return _ordering; }
/// ---------------------
const DiskLoc& head() const;
void setHead( OperationContext* txn, DiskLoc newHead );
void setIsReady( bool newIsReady );
HeadManager* headManager() const { return _headManager; }
// --
bool isMultikey() const;
void setMultikey( OperationContext* txn );
// if this ready is ready for queries
bool isReady() const;
private:
bool _catalogIsReady() const;
DiskLoc _catalogHead() const;
bool _catalogIsMultikey() const;
// -----
string _ns;
CollectionCatalogEntry* _collection; // not owned here
IndexDescriptor* _descriptor; // owned here
CollectionInfoCache* _infoCache; // not owned here
IndexAccessMethod* _accessMethod; // owned here
// Owned here.
HeadManager* _headManager;
// cached stuff
Ordering _ordering; // TODO: this might be b-tree specific
bool _isReady; // cache of NamespaceDetails info
DiskLoc _head; // cache of IndexDetails
bool _isMultikey; // cache of NamespaceDetails info
};
class IndexCatalogEntryContainer {
public:
typedef std::vector::const_iterator const_iterator;
typedef std::vector::const_iterator iterator;
const_iterator begin() const { return _entries.vector().begin(); }
const_iterator end() const { return _entries.vector().end(); }
iterator begin() { return _entries.vector().begin(); }
iterator end() { return _entries.vector().end(); }
// TODO: these have to be SUPER SUPER FAST
// maybe even some pointer trickery is in order
const IndexCatalogEntry* find( const IndexDescriptor* desc ) const;
IndexCatalogEntry* find( const IndexDescriptor* desc );
IndexCatalogEntry* find( const std::string& name );
unsigned size() const { return _entries.size(); }
// -----------------
bool remove( const IndexDescriptor* desc );
// pass ownership to EntryContainer
void add( IndexCatalogEntry* entry ) { _entries.mutableVector().push_back( entry ); }
private:
OwnedPointerVector _entries;
};
}