summaryrefslogtreecommitdiff
path: root/storage/ndb/src/ndbapi/NdbDictionaryImpl.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'storage/ndb/src/ndbapi/NdbDictionaryImpl.hpp')
-rw-r--r--storage/ndb/src/ndbapi/NdbDictionaryImpl.hpp1221
1 files changed, 0 insertions, 1221 deletions
diff --git a/storage/ndb/src/ndbapi/NdbDictionaryImpl.hpp b/storage/ndb/src/ndbapi/NdbDictionaryImpl.hpp
deleted file mode 100644
index e3cf3488ce7..00000000000
--- a/storage/ndb/src/ndbapi/NdbDictionaryImpl.hpp
+++ /dev/null
@@ -1,1221 +0,0 @@
-/* Copyright (c) 2003-2007 MySQL AB
- Use is subject to license terms
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; version 2 of the License.
-
- 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */
-
-#ifndef NdbDictionaryImpl_H
-#define NdbDictionaryImpl_H
-
-#include <ndb_types.h>
-#include <kernel_types.h>
-#include <NdbError.hpp>
-#include <BaseString.hpp>
-#include <Vector.hpp>
-#include <UtilBuffer.hpp>
-#include <NdbDictionary.hpp>
-#include <Bitmask.hpp>
-#include <AttributeList.hpp>
-#include <Ndb.hpp>
-#include "NdbWaiter.hpp"
-#include "DictCache.hpp"
-
-bool
-is_ndb_blob_table(const char* name, Uint32* ptab_id = 0, Uint32* pcol_no = 0);
-bool
-is_ndb_blob_table(const class NdbTableImpl* t);
-
-extern int ndb_dictionary_is_mysqld;
-#define ASSERT_NOT_MYSQLD assert(ndb_dictionary_is_mysqld == 0)
-
-class NdbDictObjectImpl {
-public:
- int m_id;
- Uint32 m_version;
- NdbDictionary::Object::Type m_type;
- NdbDictionary::Object::Status m_status;
-
- bool change();
-
- static NdbDictObjectImpl & getImpl(NdbDictionary::ObjectId & t) {
- return t.m_impl;
- }
- static const NdbDictObjectImpl & getImpl(const NdbDictionary::ObjectId & t){
- return t.m_impl;
- }
-
-protected:
- friend class NdbDictionary::ObjectId;
-
- NdbDictObjectImpl(NdbDictionary::Object::Type type) :
- m_type(type),
- m_status(NdbDictionary::Object::New) {
- m_id = -1;
- }
-};
-
-/**
- * Column
- */
-class NdbColumnImpl : public NdbDictionary::Column {
-public:
- NdbColumnImpl();
- NdbColumnImpl(NdbDictionary::Column &); // This is not a copy constructor
- ~NdbColumnImpl();
- NdbColumnImpl& operator=(const NdbColumnImpl&);
- void init(Type t = Unsigned);
-
- int m_attrId;
- BaseString m_name;
- NdbDictionary::Column::Type m_type;
- int m_precision;
- int m_scale;
- int m_length;
- int m_column_no;
- CHARSET_INFO * m_cs; // not const in MySQL
-
- bool m_pk;
- bool m_distributionKey;
- bool m_nullable;
- bool m_autoIncrement;
- Uint64 m_autoIncrementInitialValue;
- BaseString m_defaultValue;
- NdbTableImpl * m_blobTable;
-
- /**
- * Internal types and sizes, and aggregates
- */
- Uint32 m_attrSize; // element size (size when arraySize==1)
- Uint32 m_arraySize; // length or maxlength+1/2 for Var* types
- Uint32 m_arrayType; // NDB_ARRAYTYPE_FIXED or _VAR
- Uint32 m_storageType; // NDB_STORAGETYPE_MEMORY or _DISK
- /*
- * NdbTableImpl: if m_pk, 0-based index of key in m_attrId order
- * NdbIndexImpl: m_column_no of primary table column
- */
- Uint32 m_keyInfoPos;
- // TODO: use bits in attr desc 2
- bool getInterpretableType() const ;
- bool getCharType() const;
- bool getStringType() const;
- bool getBlobType() const;
-
- /**
- * Equality/assign
- */
- bool equal(const NdbColumnImpl&) const;
-
- static NdbColumnImpl & getImpl(NdbDictionary::Column & t);
- static const NdbColumnImpl & getImpl(const NdbDictionary::Column & t);
- NdbDictionary::Column * m_facade;
-
- static NdbDictionary::Column * create_pseudo(const char *);
-
- // Get total length in bytes, used by NdbOperation
- bool get_var_length(const void* value, Uint32& len) const;
-};
-
-class NdbTableImpl : public NdbDictionary::Table, public NdbDictObjectImpl {
-public:
- NdbTableImpl();
- NdbTableImpl(NdbDictionary::Table &);
- ~NdbTableImpl();
-
- void init();
- int setName(const char * name);
- const char * getName() const;
- void setFragmentCount(Uint32 count);
- Uint32 getFragmentCount() const;
- int setFrm(const void* data, Uint32 len);
- const void * getFrmData() const;
- Uint32 getFrmLength() const;
- int setFragmentData(const void* data, Uint32 len);
- const void * getFragmentData() const;
- Uint32 getFragmentDataLen() const;
- int setTablespaceNames(const void* data, Uint32 len);
- Uint32 getTablespaceNamesLen() const;
- const void * getTablespaceNames() const;
- int setTablespaceData(const void* data, Uint32 len);
- const void * getTablespaceData() const;
- Uint32 getTablespaceDataLen() const;
- int setRangeListData(const void* data, Uint32 len);
- const void * getRangeListData() const;
- Uint32 getRangeListDataLen() const;
-
- const char * getMysqlName() const;
- int updateMysqlName();
-
- int aggregate(NdbError& error);
- int validate(NdbError& error);
-
- Uint32 m_changeMask;
- Uint32 m_primaryTableId;
- BaseString m_internalName;
- BaseString m_externalName;
- BaseString m_mysqlName;
- BaseString m_newExternalName; // Used for alter table
- UtilBuffer m_frm;
- UtilBuffer m_newFrm; // Used for alter table
- UtilBuffer m_ts_name; //Tablespace Names
- UtilBuffer m_new_ts_name; //Tablespace Names
- UtilBuffer m_ts; //TablespaceData
- UtilBuffer m_new_ts; //TablespaceData
- UtilBuffer m_fd; //FragmentData
- UtilBuffer m_new_fd; //FragmentData
- UtilBuffer m_range; //Range Or List Array
- UtilBuffer m_new_range; //Range Or List Array
- NdbDictionary::Object::FragmentType m_fragmentType;
-
- /**
- *
- */
- Uint32 m_columnHashMask;
- Vector<Uint32> m_columnHash;
- Vector<NdbColumnImpl *> m_columns;
- void computeAggregates();
- int buildColumnHash();
-
- /**
- * Fragment info
- */
- Uint32 m_hashValueMask;
- Uint32 m_hashpointerValue;
- Vector<Uint16> m_fragments;
-
- Uint64 m_max_rows;
- Uint64 m_min_rows;
- Uint32 m_default_no_part_flag;
- bool m_linear_flag;
- bool m_logging;
- bool m_temporary;
- bool m_row_gci;
- bool m_row_checksum;
- bool m_force_var_part;
- int m_kvalue;
- int m_minLoadFactor;
- int m_maxLoadFactor;
- Uint16 m_keyLenInWords;
- Uint16 m_fragmentCount;
- Uint8 m_single_user_mode;
-
- NdbIndexImpl * m_index;
- NdbColumnImpl * getColumn(unsigned attrId);
- NdbColumnImpl * getColumn(const char * name);
- const NdbColumnImpl * getColumn(unsigned attrId) const;
- const NdbColumnImpl * getColumn(const char * name) const;
-
- /**
- * Index only stuff
- */
- BaseString m_primaryTable;
- NdbDictionary::Object::Type m_indexType;
-
- /**
- * Aggregates
- */
- Uint8 m_noOfKeys;
- // if all pk = dk then this is zero!
- Uint8 m_noOfDistributionKeys;
- Uint8 m_noOfBlobs;
- Uint8 m_noOfDiskColumns;
- Uint8 m_replicaCount;
-
- /**
- * Equality/assign
- */
- bool equal(const NdbTableImpl&) const;
- int assign(const NdbTableImpl&);
-
- static NdbTableImpl & getImpl(NdbDictionary::Table & t);
- static NdbTableImpl & getImpl(const NdbDictionary::Table & t);
- NdbDictionary::Table * m_facade;
-
- /**
- * Return count
- */
- Uint32 get_nodes(Uint32 hashValue, const Uint16** nodes) const ;
-
- /**
- * Disk stuff
- */
- BaseString m_tablespace_name;
- Uint32 m_tablespace_id;
- Uint32 m_tablespace_version;
-};
-
-class NdbIndexImpl : public NdbDictionary::Index, public NdbDictObjectImpl {
-public:
- NdbIndexImpl();
- NdbIndexImpl(NdbDictionary::Index &);
- ~NdbIndexImpl();
-
- void init();
- int setName(const char * name);
- const char * getName() const;
- int setTable(const char * table);
- const char * getTable() const;
- const NdbTableImpl * getIndexTable() const;
-
- BaseString m_internalName;
- BaseString m_externalName;
- BaseString m_tableName;
- Uint32 m_table_id;
- Uint32 m_table_version;
- Vector<NdbColumnImpl *> m_columns;
- Vector<int> m_key_ids;
-
- bool m_logging;
- bool m_temporary;
-
- NdbTableImpl * m_table;
-
- static NdbIndexImpl & getImpl(NdbDictionary::Index & t);
- static NdbIndexImpl & getImpl(const NdbDictionary::Index & t);
- NdbDictionary::Index * m_facade;
-};
-
-class NdbEventImpl : public NdbDictionary::Event, public NdbDictObjectImpl {
- friend class NdbDictInterface;
- friend class NdbDictionaryImpl;
- friend class NdbEventOperation;
- friend class NdbEventOperationImpl;
- friend class NdbEventBuffer;
- friend class EventBufData_hash;
- friend class NdbBlob;
-public:
- NdbEventImpl();
- NdbEventImpl(NdbDictionary::Event &);
- ~NdbEventImpl();
-
- void init();
- int setName(const char * name);
- const char * getName() const;
- int setTable(const NdbDictionary::Table& table);
- const NdbDictionary::Table * getTable() const;
- int setTable(const char * table);
- const char * getTableName() const;
- void addTableEvent(const NdbDictionary::Event::TableEvent t);
- bool getTableEvent(const NdbDictionary::Event::TableEvent t) const;
- void setDurability(NdbDictionary::Event::EventDurability d);
- NdbDictionary::Event::EventDurability getDurability() const;
- void setReport(NdbDictionary::Event::EventReport r);
- NdbDictionary::Event::EventReport getReport() const;
- int getNoOfEventColumns() const;
- const NdbDictionary::Column * getEventColumn(unsigned no) const;
-
- void print() {
- ndbout_c("NdbEventImpl: id=%d, key=%d",
- m_eventId,
- m_eventKey);
- };
-
- Uint32 m_eventId;
- Uint32 m_eventKey;
- AttributeMask m_attrListBitmask;
- Uint32 m_table_id;
- Uint32 m_table_version;
- BaseString m_name;
- Uint32 mi_type;
- NdbDictionary::Event::EventDurability m_dur;
- NdbDictionary::Event::EventReport m_rep;
- bool m_mergeEvents;
-
- BaseString m_tableName;
- Vector<NdbColumnImpl *> m_columns;
- Vector<unsigned> m_attrIds;
-
- static NdbEventImpl & getImpl(NdbDictionary::Event & t);
- static NdbEventImpl & getImpl(const NdbDictionary::Event & t);
- NdbDictionary::Event * m_facade;
-private:
- NdbTableImpl *m_tableImpl;
- void setTable(NdbTableImpl *tableImpl);
-};
-
-struct NdbFilegroupImpl : public NdbDictObjectImpl {
- NdbFilegroupImpl(NdbDictionary::Object::Type t);
-
- BaseString m_name;
- NdbDictionary::AutoGrowSpecification m_grow_spec;
-
- union {
- Uint32 m_extent_size;
- Uint32 m_undo_buffer_size;
- };
-
- BaseString m_logfile_group_name;
- Uint32 m_logfile_group_id;
- Uint32 m_logfile_group_version;
- Uint64 m_undo_free_words;
-};
-
-class NdbTablespaceImpl : public NdbDictionary::Tablespace,
- public NdbFilegroupImpl {
-public:
- NdbTablespaceImpl();
- NdbTablespaceImpl(NdbDictionary::Tablespace &);
- ~NdbTablespaceImpl();
-
- int assign(const NdbTablespaceImpl&);
-
- static NdbTablespaceImpl & getImpl(NdbDictionary::Tablespace & t);
- static const NdbTablespaceImpl & getImpl(const NdbDictionary::Tablespace &);
- NdbDictionary::Tablespace * m_facade;
-};
-
-class NdbLogfileGroupImpl : public NdbDictionary::LogfileGroup,
- public NdbFilegroupImpl {
-public:
- NdbLogfileGroupImpl();
- NdbLogfileGroupImpl(NdbDictionary::LogfileGroup &);
- ~NdbLogfileGroupImpl();
-
- int assign(const NdbLogfileGroupImpl&);
-
- static NdbLogfileGroupImpl & getImpl(NdbDictionary::LogfileGroup & t);
- static const NdbLogfileGroupImpl& getImpl(const
- NdbDictionary::LogfileGroup&);
- NdbDictionary::LogfileGroup * m_facade;
-};
-
-struct NdbFileImpl : public NdbDictObjectImpl {
- NdbFileImpl(NdbDictionary::Object::Type t);
-
- Uint64 m_size;
- Uint64 m_free;
- BaseString m_path;
- BaseString m_filegroup_name;
- Uint32 m_filegroup_id;
- Uint32 m_filegroup_version;
-};
-
-class NdbDatafileImpl : public NdbDictionary::Datafile, public NdbFileImpl {
-public:
- NdbDatafileImpl();
- NdbDatafileImpl(NdbDictionary::Datafile &);
- ~NdbDatafileImpl();
-
- int assign(const NdbDatafileImpl&);
-
- static NdbDatafileImpl & getImpl(NdbDictionary::Datafile & t);
- static const NdbDatafileImpl & getImpl(const NdbDictionary::Datafile & t);
- NdbDictionary::Datafile * m_facade;
-};
-
-class NdbUndofileImpl : public NdbDictionary::Undofile, public NdbFileImpl {
-public:
- NdbUndofileImpl();
- NdbUndofileImpl(NdbDictionary::Undofile &);
- ~NdbUndofileImpl();
-
- int assign(const NdbUndofileImpl&);
-
- static NdbUndofileImpl & getImpl(NdbDictionary::Undofile & t);
- static const NdbUndofileImpl & getImpl(const NdbDictionary::Undofile & t);
- NdbDictionary::Undofile * m_facade;
-};
-
-class NdbDictInterface {
-public:
- NdbDictInterface(NdbError& err) : m_error(err) {
- m_reference = 0;
- m_masterNodeId = 0;
- m_transporter= NULL;
- }
- ~NdbDictInterface();
-
- bool setTransporter(class Ndb * ndb, class TransporterFacade * tf);
- bool setTransporter(class TransporterFacade * tf);
-
- // To abstract the stuff thats made in all create/drop/lists below
- int dictSignal(NdbApiSignal* signal, LinearSectionPtr ptr[3], int secs,
- int nodeId, // -1 any, 0 = master, >1 = specified
- WaitSignalType wst,
- int timeout, Uint32 RETRIES,
- const int *errcodes = 0, int temporaryMask = 0);
-
- int createOrAlterTable(class Ndb & ndb, NdbTableImpl &, bool alter);
-
- int createTable(class Ndb & ndb, NdbTableImpl &);
- int alterTable(class Ndb & ndb, NdbTableImpl &);
- int dropTable(const NdbTableImpl &);
-
- int createIndex(class Ndb & ndb, const NdbIndexImpl &, const NdbTableImpl &);
- int dropIndex(const NdbIndexImpl &, const NdbTableImpl &);
-
- int createEvent(class Ndb & ndb, NdbEventImpl &, int getFlag);
- int dropEvent(const NdbEventImpl &);
- int dropEvent(NdbApiSignal* signal, LinearSectionPtr ptr[3], int noLSP);
-
- int executeSubscribeEvent(class Ndb & ndb, NdbEventOperationImpl &);
- int stopSubscribeEvent(class Ndb & ndb, NdbEventOperationImpl &);
-
- int listObjects(NdbDictionary::Dictionary::List& list, Uint32 requestData, bool fullyQualifiedNames);
- int listObjects(NdbApiSignal* signal);
-
- NdbTableImpl * getTable(int tableId, bool fullyQualifiedNames);
- NdbTableImpl * getTable(const BaseString& name, bool fullyQualifiedNames);
- NdbTableImpl * getTable(class NdbApiSignal * signal,
- LinearSectionPtr ptr[3],
- Uint32 noOfSections, bool fullyQualifiedNames);
-
- int forceGCPWait();
-
- static int parseTableInfo(NdbTableImpl ** dst,
- const Uint32 * data, Uint32 len,
- bool fullyQualifiedNames,
- Uint32 version= 0xFFFFFFFF);
-
- static int parseFileInfo(NdbFileImpl &dst,
- const Uint32 * data, Uint32 len);
-
- static int parseFilegroupInfo(NdbFilegroupImpl &dst,
- const Uint32 * data, Uint32 len);
-
- int create_file(const NdbFileImpl &, const NdbFilegroupImpl&,
- bool overwrite, NdbDictObjectImpl*);
- int drop_file(const NdbFileImpl &);
- int create_filegroup(const NdbFilegroupImpl &, NdbDictObjectImpl*);
- int drop_filegroup(const NdbFilegroupImpl &);
-
- int get_filegroup(NdbFilegroupImpl&, NdbDictionary::Object::Type, Uint32);
- int get_filegroup(NdbFilegroupImpl&,NdbDictionary::Object::Type,const char*);
- int get_file(NdbFileImpl&, NdbDictionary::Object::Type, int, int);
- int get_file(NdbFileImpl&, NdbDictionary::Object::Type, int, const char *);
-
- static int create_index_obj_from_table(NdbIndexImpl ** dst,
- NdbTableImpl* index_table,
- const NdbTableImpl* primary_table);
-
- const NdbError &getNdbError() const;
- NdbError & m_error;
-private:
- Uint32 m_reference;
- Uint32 m_masterNodeId;
-
- NdbWaiter m_waiter;
- class TransporterFacade * m_transporter;
-
- friend class Ndb;
- friend class NdbDictionaryImpl;
- static void execSignal(void* dictImpl,
- class NdbApiSignal* signal,
- struct LinearSectionPtr ptr[3]);
-
- static void execNodeStatus(void* dictImpl, Uint32,
- bool alive, bool nfCompleted);
-
- void execGET_TABINFO_REF(NdbApiSignal *, LinearSectionPtr ptr[3]);
- void execGET_TABINFO_CONF(NdbApiSignal *, LinearSectionPtr ptr[3]);
- void execCREATE_TABLE_REF(NdbApiSignal *, LinearSectionPtr ptr[3]);
- void execCREATE_TABLE_CONF(NdbApiSignal *, LinearSectionPtr ptr[3]);
- void execALTER_TABLE_REF(NdbApiSignal *, LinearSectionPtr ptr[3]);
- void execALTER_TABLE_CONF(NdbApiSignal *, LinearSectionPtr ptr[3]);
-
- void execCREATE_INDX_REF(NdbApiSignal *, LinearSectionPtr ptr[3]);
- void execCREATE_INDX_CONF(NdbApiSignal *, LinearSectionPtr ptr[3]);
- void execDROP_INDX_REF(NdbApiSignal *, LinearSectionPtr ptr[3]);
- void execDROP_INDX_CONF(NdbApiSignal *, LinearSectionPtr ptr[3]);
-
- void execCREATE_EVNT_REF(NdbApiSignal *, LinearSectionPtr ptr[3]);
- void execCREATE_EVNT_CONF(NdbApiSignal *, LinearSectionPtr ptr[3]);
- void execSUB_START_CONF(NdbApiSignal *, LinearSectionPtr ptr[3]);
- void execSUB_START_REF(NdbApiSignal *, LinearSectionPtr ptr[3]);
- void execSUB_STOP_CONF(NdbApiSignal *, LinearSectionPtr ptr[3]);
- void execSUB_STOP_REF(NdbApiSignal *, LinearSectionPtr ptr[3]);
- void execDROP_EVNT_REF(NdbApiSignal *, LinearSectionPtr ptr[3]);
- void execDROP_EVNT_CONF(NdbApiSignal *, LinearSectionPtr ptr[3]);
-
- void execDROP_TABLE_REF(NdbApiSignal *, LinearSectionPtr ptr[3]);
- void execDROP_TABLE_CONF(NdbApiSignal *, LinearSectionPtr ptr[3]);
- void execLIST_TABLES_CONF(NdbApiSignal *, LinearSectionPtr ptr[3]);
-
- void execCREATE_FILE_REF(NdbApiSignal *, LinearSectionPtr ptr[3]);
- void execCREATE_FILE_CONF(NdbApiSignal *, LinearSectionPtr ptr[3]);
-
- void execCREATE_FILEGROUP_REF(NdbApiSignal *, LinearSectionPtr ptr[3]);
- void execCREATE_FILEGROUP_CONF(NdbApiSignal *, LinearSectionPtr ptr[3]);
-
- void execDROP_FILE_REF(NdbApiSignal *, LinearSectionPtr ptr[3]);
- void execDROP_FILE_CONF(NdbApiSignal *, LinearSectionPtr ptr[3]);
-
- void execDROP_FILEGROUP_REF(NdbApiSignal *, LinearSectionPtr ptr[3]);
- void execDROP_FILEGROUP_CONF(NdbApiSignal *, LinearSectionPtr ptr[3]);
-
- void execWAIT_GCP_CONF(NdbApiSignal *, LinearSectionPtr ptr[3]);
- void execWAIT_GCP_REF(NdbApiSignal *, LinearSectionPtr ptr[3]);
-
- Uint32 m_fragmentId;
- UtilBuffer m_buffer;
-};
-
-class NdbDictionaryImpl;
-class GlobalCacheInitObject
-{
-public:
- NdbDictionaryImpl *m_dict;
- const BaseString &m_name;
- GlobalCacheInitObject(NdbDictionaryImpl *dict,
- const BaseString &name) :
- m_dict(dict),
- m_name(name)
- {}
- virtual ~GlobalCacheInitObject() {}
- virtual int init(NdbTableImpl &tab) const = 0;
-};
-
-class NdbDictionaryImpl : public NdbDictionary::Dictionary {
-public:
- NdbDictionaryImpl(Ndb &ndb);
- NdbDictionaryImpl(Ndb &ndb, NdbDictionary::Dictionary & f);
- ~NdbDictionaryImpl();
-
- bool setTransporter(class Ndb * ndb, class TransporterFacade * tf);
- bool setTransporter(class TransporterFacade * tf);
-
- int createTable(NdbTableImpl &t);
- int createBlobTables(NdbTableImpl& org, NdbTableImpl& created);
- int alterTable(NdbTableImpl &t);
- int dropTable(const char * name);
- int dropTable(NdbTableImpl &);
- int dropBlobTables(NdbTableImpl &);
- int invalidateObject(NdbTableImpl &);
- int removeCachedObject(NdbTableImpl &);
-
- int createIndex(NdbIndexImpl &ix);
- int createIndex(NdbIndexImpl &ix, NdbTableImpl & tab);
- int dropIndex(const char * indexName,
- const char * tableName);
- int dropIndex(NdbIndexImpl &, const char * tableName);
- NdbTableImpl * getIndexTable(NdbIndexImpl * index,
- NdbTableImpl * table);
-
- int createEvent(NdbEventImpl &);
- int createBlobEvents(NdbEventImpl &);
- int dropEvent(const char * eventName);
- int dropEvent(const NdbEventImpl &);
- int dropBlobEvents(const NdbEventImpl &);
-
- int executeSubscribeEvent(NdbEventOperationImpl &);
- int stopSubscribeEvent(NdbEventOperationImpl &);
-
- int forceGCPWait();
-
- int listObjects(List& list, NdbDictionary::Object::Type type);
- int listIndexes(List& list, Uint32 indexId);
-
- NdbTableImpl * getTableGlobal(const char * tableName);
- NdbIndexImpl * getIndexGlobal(const char * indexName,
- NdbTableImpl &ndbtab);
- int alterTableGlobal(NdbTableImpl &orig_impl, NdbTableImpl &impl);
- int dropTableGlobal(NdbTableImpl &);
- int dropIndexGlobal(NdbIndexImpl & impl);
- int releaseTableGlobal(NdbTableImpl & impl, int invalidate);
- int releaseIndexGlobal(NdbIndexImpl & impl, int invalidate);
-
- NdbTableImpl * getTable(const char * tableName, void **data= 0);
- NdbTableImpl * getBlobTable(const NdbTableImpl&, uint col_no);
- NdbTableImpl * getBlobTable(uint tab_id, uint col_no);
- void putTable(NdbTableImpl *impl);
- int getBlobTables(NdbTableImpl &);
- Ndb_local_table_info*
- get_local_table_info(const BaseString& internalTableName);
- NdbIndexImpl * getIndex(const char * indexName,
- const char * tableName);
- NdbIndexImpl * getIndex(const char * indexName, const NdbTableImpl& prim);
- NdbEventImpl * getEvent(const char * eventName, NdbTableImpl* = NULL);
- NdbEventImpl * getBlobEvent(const NdbEventImpl& ev, uint col_no);
- NdbEventImpl * getEventImpl(const char * internalName);
-
- int createDatafile(const NdbDatafileImpl &, bool force, NdbDictObjectImpl*);
- int dropDatafile(const NdbDatafileImpl &);
- int createUndofile(const NdbUndofileImpl &, bool force, NdbDictObjectImpl*);
- int dropUndofile(const NdbUndofileImpl &);
-
- int createTablespace(const NdbTablespaceImpl &, NdbDictObjectImpl*);
- int dropTablespace(const NdbTablespaceImpl &);
-
- int createLogfileGroup(const NdbLogfileGroupImpl &, NdbDictObjectImpl*);
- int dropLogfileGroup(const NdbLogfileGroupImpl &);
-
- const NdbError & getNdbError() const;
- NdbError m_error;
- Uint32 m_local_table_data_size;
-
- LocalDictCache m_localHash;
- GlobalDictCache * m_globalHash;
-
- static NdbDictionaryImpl & getImpl(NdbDictionary::Dictionary & t);
- static const NdbDictionaryImpl & getImpl(const NdbDictionary::Dictionary &t);
- NdbDictionary::Dictionary * m_facade;
-
- NdbDictInterface m_receiver;
- Ndb & m_ndb;
-
- NdbIndexImpl* getIndexImpl(const char * externalName,
- const BaseString& internalName,
- NdbTableImpl &tab,
- NdbTableImpl &prim);
- NdbIndexImpl * getIndexImpl(const char * name,
- const BaseString& internalName);
-private:
- NdbTableImpl * fetchGlobalTableImplRef(const GlobalCacheInitObject &obj);
-};
-
-inline
-NdbEventImpl &
-NdbEventImpl::getImpl(const NdbDictionary::Event & t){
- return t.m_impl;
-}
-
-inline
-NdbEventImpl &
-NdbEventImpl::getImpl(NdbDictionary::Event & t){
- return t.m_impl;
-}
-
-inline
-NdbColumnImpl &
-NdbColumnImpl::getImpl(NdbDictionary::Column & t){
- return t.m_impl;
-}
-
-inline
-const NdbColumnImpl &
-NdbColumnImpl::getImpl(const NdbDictionary::Column & t){
- return t.m_impl;
-}
-
-inline
-bool
-NdbColumnImpl::getInterpretableType() const {
- return (m_type == NdbDictionary::Column::Unsigned ||
- m_type == NdbDictionary::Column::Bigunsigned);
-}
-
-inline
-bool
-NdbColumnImpl::getCharType() const {
- return (m_type == NdbDictionary::Column::Char ||
- m_type == NdbDictionary::Column::Varchar ||
- m_type == NdbDictionary::Column::Text ||
- m_type == NdbDictionary::Column::Longvarchar);
-}
-
-inline
-bool
-NdbColumnImpl::getStringType() const {
- return (m_type == NdbDictionary::Column::Char ||
- m_type == NdbDictionary::Column::Varchar ||
- m_type == NdbDictionary::Column::Longvarchar ||
- m_type == NdbDictionary::Column::Binary ||
- m_type == NdbDictionary::Column::Varbinary ||
- m_type == NdbDictionary::Column::Longvarbinary);
-}
-
-inline
-bool
-NdbColumnImpl::getBlobType() const {
- return (m_type == NdbDictionary::Column::Blob ||
- m_type == NdbDictionary::Column::Text);
-}
-
-inline
-bool
-NdbColumnImpl::get_var_length(const void* value, Uint32& len) const
-{
- Uint32 max_len = m_attrSize * m_arraySize;
- switch (m_arrayType) {
- case NDB_ARRAYTYPE_SHORT_VAR:
- len = 1 + *((Uint8*)value);
- break;
- case NDB_ARRAYTYPE_MEDIUM_VAR:
- len = 2 + uint2korr((char*)value);
- break;
- default:
- len = max_len;
- return true;
- }
- return (len <= max_len);
-}
-
-inline
-NdbTableImpl &
-NdbTableImpl::getImpl(NdbDictionary::Table & t){
- return t.m_impl;
-}
-
-inline
-NdbTableImpl &
-NdbTableImpl::getImpl(const NdbDictionary::Table & t){
- return t.m_impl;
-}
-
-inline
-NdbColumnImpl *
-NdbTableImpl::getColumn(unsigned attrId){
- if(m_columns.size() > attrId){
- return m_columns[attrId];
- }
- return 0;
-}
-
-inline
-const char *
-NdbTableImpl::getMysqlName() const
-{
- return m_mysqlName.c_str();
-}
-
-inline
-Uint32
-Hash( const char* str ){
- Uint32 h = 0;
- Uint32 len = strlen(str);
- while(len >= 4){
- h = (h << 5) + h + str[0];
- h = (h << 5) + h + str[1];
- h = (h << 5) + h + str[2];
- h = (h << 5) + h + str[3];
- len -= 4;
- str += 4;
- }
-
- switch(len){
- case 3:
- h = (h << 5) + h + *str++;
- case 2:
- h = (h << 5) + h + *str++;
- case 1:
- h = (h << 5) + h + *str++;
- }
- return h + h;
-}
-
-
-inline
-NdbColumnImpl *
-NdbTableImpl::getColumn(const char * name){
-
- Uint32 sz = m_columns.size();
- NdbColumnImpl** cols = m_columns.getBase();
- const Uint32 * hashtable = m_columnHash.getBase();
-
- if(sz > 5 && false){
- Uint32 hashValue = Hash(name) & 0xFFFE;
- Uint32 bucket = hashValue & m_columnHashMask;
- bucket = (bucket < sz ? bucket : bucket - sz);
- hashtable += bucket;
- Uint32 tmp = * hashtable;
- if((tmp & 1) == 1 ){ // No chaining
- sz = 1;
- } else {
- sz = (tmp >> 16);
- hashtable += (tmp & 0xFFFE) >> 1;
- tmp = * hashtable;
- }
- do {
- if(hashValue == (tmp & 0xFFFE)){
- NdbColumnImpl* col = cols[tmp >> 16];
- if(strncmp(name, col->m_name.c_str(), col->m_name.length()) == 0){
- return col;
- }
- }
- hashtable++;
- tmp = * hashtable;
- } while(--sz > 0);
-#if 0
- Uint32 dir = m_columnHash[bucket];
- Uint32 pos = bucket + ((dir & 0xFFFE) >> 1);
- Uint32 cnt = dir >> 16;
- ndbout_c("col: %s hv: %x bucket: %d dir: %x pos: %d cnt: %d tmp: %d -> 0",
- name, hashValue, bucket, dir, pos, cnt, tmp);
-#endif
- return 0;
- } else {
- for(Uint32 i = 0; i<sz; i++){
- NdbColumnImpl* col = * cols++;
- if(col != 0 && strcmp(name, col->m_name.c_str()) == 0)
- return col;
- }
- }
- return 0;
-}
-
-inline
-const NdbColumnImpl *
-NdbTableImpl::getColumn(unsigned attrId) const {
- if(m_columns.size() > attrId){
- return m_columns[attrId];
- }
- return 0;
-}
-
-inline
-const NdbColumnImpl *
-NdbTableImpl::getColumn(const char * name) const {
- Uint32 sz = m_columns.size();
- NdbColumnImpl* const * cols = m_columns.getBase();
- for(Uint32 i = 0; i<sz; i++, cols++){
- NdbColumnImpl* col = * cols;
- if(col != 0 && strcmp(name, col->m_name.c_str()) == 0)
- return col;
- }
- return 0;
-}
-
-inline
-NdbIndexImpl &
-NdbIndexImpl::getImpl(NdbDictionary::Index & t){
- return t.m_impl;
-}
-
-inline
-NdbIndexImpl &
-NdbIndexImpl::getImpl(const NdbDictionary::Index & t){
- return t.m_impl;
-}
-
-inline
-NdbDictionaryImpl &
-NdbDictionaryImpl::getImpl(NdbDictionary::Dictionary & t){
- return t.m_impl;
-}
-
-inline
-const NdbDictionaryImpl &
-NdbDictionaryImpl::getImpl(const NdbDictionary::Dictionary & t){
- return t.m_impl;
-}
-
-/*****************************************************************
- * Inline:d getters
- */
-
-class InitTable : public GlobalCacheInitObject
-{
-public:
- InitTable(NdbDictionaryImpl *dict,
- const BaseString &name) :
- GlobalCacheInitObject(dict, name)
- {}
- int init(NdbTableImpl &tab) const
- {
- return m_dict->getBlobTables(tab);
- }
-};
-
-inline
-NdbTableImpl *
-NdbDictionaryImpl::getTableGlobal(const char * table_name)
-{
- const BaseString internal_tabname(m_ndb.internalize_table_name(table_name));
- return fetchGlobalTableImplRef(InitTable(this, internal_tabname));
-}
-
-inline
-NdbTableImpl *
-NdbDictionaryImpl::getTable(const char * table_name, void **data)
-{
- DBUG_ENTER("NdbDictionaryImpl::getTable");
- DBUG_PRINT("enter", ("table: %s", table_name));
-
- if (unlikely(strchr(table_name, '$') != 0)) {
- Uint32 tab_id, col_no;
- if (is_ndb_blob_table(table_name, &tab_id, &col_no)) {
- NdbTableImpl* t = getBlobTable(tab_id, col_no);
- DBUG_RETURN(t);
- }
- }
-
- const BaseString internal_tabname(m_ndb.internalize_table_name(table_name));
- Ndb_local_table_info *info=
- get_local_table_info(internal_tabname);
- if (info == 0)
- DBUG_RETURN(0);
- if (data)
- *data= info->m_local_data;
- DBUG_RETURN(info->m_table_impl);
-}
-
-inline
-Ndb_local_table_info *
-NdbDictionaryImpl::get_local_table_info(const BaseString& internalTableName)
-{
- DBUG_ENTER("NdbDictionaryImpl::get_local_table_info");
- DBUG_PRINT("enter", ("table: %s", internalTableName.c_str()));
-
- Ndb_local_table_info *info= m_localHash.get(internalTableName.c_str());
- if (info == 0)
- {
- NdbTableImpl *tab=
- fetchGlobalTableImplRef(InitTable(this, internalTableName));
- if (tab)
- {
- info= Ndb_local_table_info::create(tab, m_local_table_data_size);
- if (info)
- {
- m_localHash.put(internalTableName.c_str(), info);
- }
- }
- }
- DBUG_RETURN(info); // autoincrement already initialized
-}
-
-class InitIndex : public GlobalCacheInitObject
-{
-public:
- const char *m_index_name;
- const NdbTableImpl &m_prim;
-
- InitIndex(const BaseString &internal_indexname,
- const char *index_name,
- const NdbTableImpl &prim) :
- GlobalCacheInitObject(0, internal_indexname),
- m_index_name(index_name),
- m_prim(prim)
- {}
-
- int init(NdbTableImpl &tab) const {
- DBUG_ENTER("InitIndex::init");
- DBUG_ASSERT(tab.m_indexType != NdbDictionary::Object::TypeUndefined);
- /**
- * Create index impl
- */
- NdbIndexImpl* idx;
- if(NdbDictInterface::create_index_obj_from_table(&idx, &tab, &m_prim) == 0)
- {
- idx->m_table = &tab;
- if (!idx->m_externalName.assign(m_index_name) ||
- !idx->m_internalName.assign(m_name))
- DBUG_RETURN(4000);
- tab.m_index = idx;
- DBUG_RETURN(0);
- }
- DBUG_RETURN(1);
- }
-};
-
-inline
-NdbIndexImpl *
-NdbDictionaryImpl::getIndexGlobal(const char * index_name,
- NdbTableImpl &ndbtab)
-{
- DBUG_ENTER("NdbDictionaryImpl::getIndexGlobal");
- const BaseString
- internal_indexname(m_ndb.internalize_index_name(&ndbtab, index_name));
- int retry= 2;
-
- while (retry)
- {
- NdbTableImpl *tab=
- fetchGlobalTableImplRef(InitIndex(internal_indexname,
- index_name, ndbtab));
- if (tab)
- {
- // tab->m_index sould be set. otherwise tab == 0
- NdbIndexImpl *idx= tab->m_index;
- if (idx->m_table_id != (unsigned)ndbtab.getObjectId() ||
- idx->m_table_version != (unsigned)ndbtab.getObjectVersion())
- {
- releaseIndexGlobal(*idx, 1);
- retry--;
- continue;
- }
- DBUG_RETURN(idx);
- }
- break;
- }
- {
- // Index not found, try old format
- const BaseString
- old_internal_indexname(m_ndb.old_internalize_index_name(&ndbtab,
- index_name));
- retry= 2;
- while (retry)
- {
- NdbTableImpl *tab=
- fetchGlobalTableImplRef(InitIndex(old_internal_indexname,
- index_name, ndbtab));
- if (tab)
- {
- // tab->m_index sould be set. otherwise tab == 0
- NdbIndexImpl *idx= tab->m_index;
- if (idx->m_table_id != (unsigned)ndbtab.getObjectId() ||
- idx->m_table_version != (unsigned)ndbtab.getObjectVersion())
- {
- releaseIndexGlobal(*idx, 1);
- retry--;
- continue;
- }
- DBUG_RETURN(idx);
- }
- break;
- }
- }
- m_error.code= 4243;
- DBUG_RETURN(0);
-}
-
-inline int
-NdbDictionaryImpl::releaseTableGlobal(NdbTableImpl & impl, int invalidate)
-{
- DBUG_ENTER("NdbDictionaryImpl::releaseTableGlobal");
- DBUG_PRINT("enter", ("internal_name: %s", impl.m_internalName.c_str()));
- m_globalHash->lock();
- m_globalHash->release(&impl, invalidate);
- m_globalHash->unlock();
- DBUG_RETURN(0);
-}
-
-inline int
-NdbDictionaryImpl::releaseIndexGlobal(NdbIndexImpl & impl, int invalidate)
-{
- DBUG_ENTER("NdbDictionaryImpl::releaseIndexGlobal");
- DBUG_PRINT("enter", ("internal_name: %s", impl.m_internalName.c_str()));
- m_globalHash->lock();
- m_globalHash->release(impl.m_table, invalidate);
- m_globalHash->unlock();
- DBUG_RETURN(0);
-}
-
-inline
-NdbIndexImpl *
-NdbDictionaryImpl::getIndex(const char * index_name,
- const char * table_name)
-{
- if (table_name == 0)
- {
- assert(0);
- m_error.code= 4243;
- return 0;
- }
-
-
- NdbTableImpl* prim = getTable(table_name);
- if (prim == 0)
- {
- m_error.code= 4243;
- return 0;
- }
-
- return getIndex(index_name, *prim);
-}
-
-inline
-NdbIndexImpl *
-NdbDictionaryImpl::getIndex(const char* index_name,
- const NdbTableImpl& prim)
-{
-
- const BaseString
- internal_indexname(m_ndb.internalize_index_name(&prim, index_name));
-
- Ndb_local_table_info *info= m_localHash.get(internal_indexname.c_str());
- NdbTableImpl *tab;
- if (info == 0)
- {
- tab= fetchGlobalTableImplRef(InitIndex(internal_indexname,
- index_name,
- prim));
- if (!tab)
- goto retry;
-
- info= Ndb_local_table_info::create(tab, 0);
- if (!info)
- goto retry;
- m_localHash.put(internal_indexname.c_str(), info);
- }
- else
- tab= info->m_table_impl;
-
- return tab->m_index;
-
-retry:
- // Index not found, try fetching it from current database
- const BaseString
- old_internal_indexname(m_ndb.old_internalize_index_name(&prim, index_name));
-
- info= m_localHash.get(old_internal_indexname.c_str());
- if (info == 0)
- {
- tab= fetchGlobalTableImplRef(InitIndex(old_internal_indexname,
- index_name,
- prim));
- if (!tab)
- goto err;
-
- info= Ndb_local_table_info::create(tab, 0);
- if (!info)
- goto err;
- m_localHash.put(old_internal_indexname.c_str(), info);
- }
- else
- tab= info->m_table_impl;
-
- return tab->m_index;
-
-err:
- m_error.code= 4243;
- return 0;
-}
-
-inline
-NdbTablespaceImpl &
-NdbTablespaceImpl::getImpl(NdbDictionary::Tablespace & t){
- return t.m_impl;
-}
-
-inline
-const NdbTablespaceImpl &
-NdbTablespaceImpl::getImpl(const NdbDictionary::Tablespace & t){
- return t.m_impl;
-}
-
-inline
-NdbLogfileGroupImpl &
-NdbLogfileGroupImpl::getImpl(NdbDictionary::LogfileGroup & t){
- return t.m_impl;
-}
-
-inline
-const NdbLogfileGroupImpl &
-NdbLogfileGroupImpl::getImpl(const NdbDictionary::LogfileGroup & t){
- return t.m_impl;
-}
-
-inline
-NdbDatafileImpl &
-NdbDatafileImpl::getImpl(NdbDictionary::Datafile & t){
- return t.m_impl;
-}
-
-inline
-const NdbDatafileImpl &
-NdbDatafileImpl::getImpl(const NdbDictionary::Datafile & t){
- return t.m_impl;
-}
-
-inline
-NdbUndofileImpl &
-NdbUndofileImpl::getImpl(NdbDictionary::Undofile & t){
- return t.m_impl;
-}
-
-inline
-const NdbUndofileImpl &
-NdbUndofileImpl::getImpl(const NdbDictionary::Undofile & t){
- return t.m_impl;
-}
-
-#endif