1
/* Copyright (C) 2003 MySQL AB
3
This program is free software; you can redistribute it and/or modify
4
it under the terms of the GNU General Public License as published by
5
the Free Software Foundation; version 2 of the License.
7
This program is distributed in the hope that it will be useful,
8
but WITHOUT ANY WARRANTY; without even the implied warranty of
9
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10
GNU General Public License for more details.
12
You should have received a copy of the GNU General Public License
13
along with this program; if not, write to the Free Software
14
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
16
#ifndef NdbDictionaryImpl_H
17
#define NdbDictionaryImpl_H
19
#include <ndb_types.h>
20
#include <kernel_types.h>
21
#include <NdbError.hpp>
22
#include <BaseString.hpp>
24
#include <UtilBuffer.hpp>
25
#include <NdbDictionary.hpp>
26
#include <Bitmask.hpp>
27
#include <AttributeList.hpp>
29
#include "NdbWaiter.hpp"
30
#include "DictCache.hpp"
33
is_ndb_blob_table(const char* name, Uint32* ptab_id = 0, Uint32* pcol_no = 0);
35
is_ndb_blob_table(const class NdbTableImpl* t);
37
extern int ndb_dictionary_is_mysqld;
38
#define ASSERT_NOT_MYSQLD assert(ndb_dictionary_is_mysqld == 0)
40
class NdbDictObjectImpl {
44
NdbDictionary::Object::Type m_type;
45
NdbDictionary::Object::Status m_status;
49
static NdbDictObjectImpl & getImpl(NdbDictionary::ObjectId & t) {
52
static const NdbDictObjectImpl & getImpl(const NdbDictionary::ObjectId & t){
57
friend class NdbDictionary::ObjectId;
59
NdbDictObjectImpl(NdbDictionary::Object::Type type) :
61
m_status(NdbDictionary::Object::New) {
69
class NdbColumnImpl : public NdbDictionary::Column {
72
NdbColumnImpl(NdbDictionary::Column &); // This is not a copy constructor
74
NdbColumnImpl& operator=(const NdbColumnImpl&);
75
void init(Type t = Unsigned);
79
NdbDictionary::Column::Type m_type;
84
CHARSET_INFO * m_cs; // not const in MySQL
87
bool m_distributionKey;
90
Uint64 m_autoIncrementInitialValue;
91
BaseString m_defaultValue;
92
NdbTableImpl * m_blobTable;
95
* Internal types and sizes, and aggregates
97
Uint32 m_attrSize; // element size (size when arraySize==1)
98
Uint32 m_arraySize; // length or maxlength+1/2 for Var* types
99
Uint32 m_arrayType; // NDB_ARRAYTYPE_FIXED or _VAR
100
Uint32 m_storageType; // NDB_STORAGETYPE_MEMORY or _DISK
102
* NdbTableImpl: if m_pk, 0-based index of key in m_attrId order
103
* NdbIndexImpl: m_column_no of primary table column
106
// TODO: use bits in attr desc 2
107
bool getInterpretableType() const ;
108
bool getCharType() const;
109
bool getStringType() const;
110
bool getBlobType() const;
115
bool equal(const NdbColumnImpl&) const;
117
static NdbColumnImpl & getImpl(NdbDictionary::Column & t);
118
static const NdbColumnImpl & getImpl(const NdbDictionary::Column & t);
119
NdbDictionary::Column * m_facade;
121
static NdbDictionary::Column * create_pseudo(const char *);
123
// Get total length in bytes, used by NdbOperation
124
bool get_var_length(const void* value, Uint32& len) const;
127
class NdbTableImpl : public NdbDictionary::Table, public NdbDictObjectImpl {
130
NdbTableImpl(NdbDictionary::Table &);
134
int setName(const char * name);
135
const char * getName() const;
136
void setFragmentCount(Uint32 count);
137
Uint32 getFragmentCount() const;
138
int setFrm(const void* data, Uint32 len);
139
const void * getFrmData() const;
140
Uint32 getFrmLength() const;
141
int setFragmentData(const void* data, Uint32 len);
142
const void * getFragmentData() const;
143
Uint32 getFragmentDataLen() const;
144
int setTablespaceNames(const void* data, Uint32 len);
145
Uint32 getTablespaceNamesLen() const;
146
const void * getTablespaceNames() const;
147
int setTablespaceData(const void* data, Uint32 len);
148
const void * getTablespaceData() const;
149
Uint32 getTablespaceDataLen() const;
150
int setRangeListData(const void* data, Uint32 len);
151
const void * getRangeListData() const;
152
Uint32 getRangeListDataLen() const;
154
const char * getMysqlName() const;
155
int updateMysqlName();
157
int aggregate(NdbError& error);
158
int validate(NdbError& error);
161
Uint32 m_primaryTableId;
162
BaseString m_internalName;
163
BaseString m_externalName;
164
BaseString m_mysqlName;
165
BaseString m_newExternalName; // Used for alter table
167
UtilBuffer m_newFrm; // Used for alter table
168
UtilBuffer m_ts_name; //Tablespace Names
169
UtilBuffer m_new_ts_name; //Tablespace Names
170
UtilBuffer m_ts; //TablespaceData
171
UtilBuffer m_new_ts; //TablespaceData
172
UtilBuffer m_fd; //FragmentData
173
UtilBuffer m_new_fd; //FragmentData
174
UtilBuffer m_range; //Range Or List Array
175
UtilBuffer m_new_range; //Range Or List Array
176
NdbDictionary::Object::FragmentType m_fragmentType;
181
Uint32 m_columnHashMask;
182
Vector<Uint32> m_columnHash;
183
Vector<NdbColumnImpl *> m_columns;
184
void computeAggregates();
185
int buildColumnHash();
190
Uint32 m_hashValueMask;
191
Uint32 m_hashpointerValue;
192
Vector<Uint16> m_fragments;
196
Uint32 m_default_no_part_flag;
202
bool m_force_var_part;
206
Uint16 m_keyLenInWords;
207
Uint16 m_fragmentCount;
208
Uint8 m_single_user_mode;
210
NdbIndexImpl * m_index;
211
NdbColumnImpl * getColumn(unsigned attrId);
212
NdbColumnImpl * getColumn(const char * name);
213
const NdbColumnImpl * getColumn(unsigned attrId) const;
214
const NdbColumnImpl * getColumn(const char * name) const;
219
BaseString m_primaryTable;
220
NdbDictionary::Object::Type m_indexType;
226
// if all pk = dk then this is zero!
227
Uint8 m_noOfDistributionKeys;
229
Uint8 m_noOfDiskColumns;
230
Uint8 m_replicaCount;
235
bool equal(const NdbTableImpl&) const;
236
int assign(const NdbTableImpl&);
238
static NdbTableImpl & getImpl(NdbDictionary::Table & t);
239
static NdbTableImpl & getImpl(const NdbDictionary::Table & t);
240
NdbDictionary::Table * m_facade;
245
Uint32 get_nodes(Uint32 hashValue, const Uint16** nodes) const ;
250
BaseString m_tablespace_name;
251
Uint32 m_tablespace_id;
252
Uint32 m_tablespace_version;
255
class NdbIndexImpl : public NdbDictionary::Index, public NdbDictObjectImpl {
258
NdbIndexImpl(NdbDictionary::Index &);
262
int setName(const char * name);
263
const char * getName() const;
264
int setTable(const char * table);
265
const char * getTable() const;
266
const NdbTableImpl * getIndexTable() const;
268
BaseString m_internalName;
269
BaseString m_externalName;
270
BaseString m_tableName;
272
Uint32 m_table_version;
273
Vector<NdbColumnImpl *> m_columns;
274
Vector<int> m_key_ids;
279
NdbTableImpl * m_table;
281
static NdbIndexImpl & getImpl(NdbDictionary::Index & t);
282
static NdbIndexImpl & getImpl(const NdbDictionary::Index & t);
283
NdbDictionary::Index * m_facade;
286
class NdbEventImpl : public NdbDictionary::Event, public NdbDictObjectImpl {
287
friend class NdbDictInterface;
288
friend class NdbDictionaryImpl;
289
friend class NdbEventOperation;
290
friend class NdbEventOperationImpl;
291
friend class NdbEventBuffer;
292
friend class EventBufData_hash;
293
friend class NdbBlob;
296
NdbEventImpl(NdbDictionary::Event &);
300
int setName(const char * name);
301
const char * getName() const;
302
int setTable(const NdbDictionary::Table& table);
303
const NdbDictionary::Table * getTable() const;
304
int setTable(const char * table);
305
const char * getTableName() const;
306
void addTableEvent(const NdbDictionary::Event::TableEvent t);
307
bool getTableEvent(const NdbDictionary::Event::TableEvent t) const;
308
void setDurability(NdbDictionary::Event::EventDurability d);
309
NdbDictionary::Event::EventDurability getDurability() const;
310
void setReport(NdbDictionary::Event::EventReport r);
311
NdbDictionary::Event::EventReport getReport() const;
312
int getNoOfEventColumns() const;
313
const NdbDictionary::Column * getEventColumn(unsigned no) const;
316
ndbout_c("NdbEventImpl: id=%d, key=%d",
323
AttributeMask m_attrListBitmask;
325
Uint32 m_table_version;
328
NdbDictionary::Event::EventDurability m_dur;
329
NdbDictionary::Event::EventReport m_rep;
332
BaseString m_tableName;
333
Vector<NdbColumnImpl *> m_columns;
334
Vector<unsigned> m_attrIds;
336
static NdbEventImpl & getImpl(NdbDictionary::Event & t);
337
static NdbEventImpl & getImpl(const NdbDictionary::Event & t);
338
NdbDictionary::Event * m_facade;
340
NdbTableImpl *m_tableImpl;
341
void setTable(NdbTableImpl *tableImpl);
344
struct NdbFilegroupImpl : public NdbDictObjectImpl {
345
NdbFilegroupImpl(NdbDictionary::Object::Type t);
348
NdbDictionary::AutoGrowSpecification m_grow_spec;
351
Uint32 m_extent_size;
352
Uint32 m_undo_buffer_size;
355
BaseString m_logfile_group_name;
356
Uint32 m_logfile_group_id;
357
Uint32 m_logfile_group_version;
358
Uint64 m_undo_free_words;
361
class NdbTablespaceImpl : public NdbDictionary::Tablespace,
362
public NdbFilegroupImpl {
365
NdbTablespaceImpl(NdbDictionary::Tablespace &);
366
~NdbTablespaceImpl();
368
int assign(const NdbTablespaceImpl&);
370
static NdbTablespaceImpl & getImpl(NdbDictionary::Tablespace & t);
371
static const NdbTablespaceImpl & getImpl(const NdbDictionary::Tablespace &);
372
NdbDictionary::Tablespace * m_facade;
375
class NdbLogfileGroupImpl : public NdbDictionary::LogfileGroup,
376
public NdbFilegroupImpl {
378
NdbLogfileGroupImpl();
379
NdbLogfileGroupImpl(NdbDictionary::LogfileGroup &);
380
~NdbLogfileGroupImpl();
382
int assign(const NdbLogfileGroupImpl&);
384
static NdbLogfileGroupImpl & getImpl(NdbDictionary::LogfileGroup & t);
385
static const NdbLogfileGroupImpl& getImpl(const
386
NdbDictionary::LogfileGroup&);
387
NdbDictionary::LogfileGroup * m_facade;
390
struct NdbFileImpl : public NdbDictObjectImpl {
391
NdbFileImpl(NdbDictionary::Object::Type t);
396
BaseString m_filegroup_name;
397
Uint32 m_filegroup_id;
398
Uint32 m_filegroup_version;
401
class NdbDatafileImpl : public NdbDictionary::Datafile, public NdbFileImpl {
404
NdbDatafileImpl(NdbDictionary::Datafile &);
407
int assign(const NdbDatafileImpl&);
409
static NdbDatafileImpl & getImpl(NdbDictionary::Datafile & t);
410
static const NdbDatafileImpl & getImpl(const NdbDictionary::Datafile & t);
411
NdbDictionary::Datafile * m_facade;
414
class NdbUndofileImpl : public NdbDictionary::Undofile, public NdbFileImpl {
417
NdbUndofileImpl(NdbDictionary::Undofile &);
420
int assign(const NdbUndofileImpl&);
422
static NdbUndofileImpl & getImpl(NdbDictionary::Undofile & t);
423
static const NdbUndofileImpl & getImpl(const NdbDictionary::Undofile & t);
424
NdbDictionary::Undofile * m_facade;
427
class NdbDictInterface {
429
NdbDictInterface(NdbError& err) : m_error(err) {
436
bool setTransporter(class Ndb * ndb, class TransporterFacade * tf);
437
bool setTransporter(class TransporterFacade * tf);
439
// To abstract the stuff thats made in all create/drop/lists below
440
int dictSignal(NdbApiSignal* signal, LinearSectionPtr ptr[3], int secs,
441
int nodeId, // -1 any, 0 = master, >1 = specified
443
int timeout, Uint32 RETRIES,
444
const int *errcodes = 0, int temporaryMask = 0);
446
int createOrAlterTable(class Ndb & ndb, NdbTableImpl &, bool alter);
448
int createTable(class Ndb & ndb, NdbTableImpl &);
449
int alterTable(class Ndb & ndb, NdbTableImpl &);
450
int dropTable(const NdbTableImpl &);
452
int createIndex(class Ndb & ndb, const NdbIndexImpl &, const NdbTableImpl &);
453
int dropIndex(const NdbIndexImpl &, const NdbTableImpl &);
455
int createEvent(class Ndb & ndb, NdbEventImpl &, int getFlag);
456
int dropEvent(const NdbEventImpl &);
457
int dropEvent(NdbApiSignal* signal, LinearSectionPtr ptr[3], int noLSP);
459
int executeSubscribeEvent(class Ndb & ndb, NdbEventOperationImpl &);
460
int stopSubscribeEvent(class Ndb & ndb, NdbEventOperationImpl &);
462
int listObjects(NdbDictionary::Dictionary::List& list, Uint32 requestData, bool fullyQualifiedNames);
463
int listObjects(NdbApiSignal* signal);
465
NdbTableImpl * getTable(int tableId, bool fullyQualifiedNames);
466
NdbTableImpl * getTable(const BaseString& name, bool fullyQualifiedNames);
467
NdbTableImpl * getTable(class NdbApiSignal * signal,
468
LinearSectionPtr ptr[3],
469
Uint32 noOfSections, bool fullyQualifiedNames);
473
static int parseTableInfo(NdbTableImpl ** dst,
474
const Uint32 * data, Uint32 len,
475
bool fullyQualifiedNames,
476
Uint32 version= 0xFFFFFFFF);
478
static int parseFileInfo(NdbFileImpl &dst,
479
const Uint32 * data, Uint32 len);
481
static int parseFilegroupInfo(NdbFilegroupImpl &dst,
482
const Uint32 * data, Uint32 len);
484
int create_file(const NdbFileImpl &, const NdbFilegroupImpl&,
485
bool overwrite, NdbDictObjectImpl*);
486
int drop_file(const NdbFileImpl &);
487
int create_filegroup(const NdbFilegroupImpl &, NdbDictObjectImpl*);
488
int drop_filegroup(const NdbFilegroupImpl &);
490
int get_filegroup(NdbFilegroupImpl&, NdbDictionary::Object::Type, Uint32);
491
int get_filegroup(NdbFilegroupImpl&,NdbDictionary::Object::Type,const char*);
492
int get_file(NdbFileImpl&, NdbDictionary::Object::Type, int, int);
493
int get_file(NdbFileImpl&, NdbDictionary::Object::Type, int, const char *);
495
static int create_index_obj_from_table(NdbIndexImpl ** dst,
496
NdbTableImpl* index_table,
497
const NdbTableImpl* primary_table);
499
const NdbError &getNdbError() const;
503
Uint32 m_masterNodeId;
506
class TransporterFacade * m_transporter;
509
friend class NdbDictionaryImpl;
510
static void execSignal(void* dictImpl,
511
class NdbApiSignal* signal,
512
struct LinearSectionPtr ptr[3]);
514
static void execNodeStatus(void* dictImpl, Uint32,
515
bool alive, bool nfCompleted);
517
void execGET_TABINFO_REF(NdbApiSignal *, LinearSectionPtr ptr[3]);
518
void execGET_TABINFO_CONF(NdbApiSignal *, LinearSectionPtr ptr[3]);
519
void execCREATE_TABLE_REF(NdbApiSignal *, LinearSectionPtr ptr[3]);
520
void execCREATE_TABLE_CONF(NdbApiSignal *, LinearSectionPtr ptr[3]);
521
void execALTER_TABLE_REF(NdbApiSignal *, LinearSectionPtr ptr[3]);
522
void execALTER_TABLE_CONF(NdbApiSignal *, LinearSectionPtr ptr[3]);
524
void execCREATE_INDX_REF(NdbApiSignal *, LinearSectionPtr ptr[3]);
525
void execCREATE_INDX_CONF(NdbApiSignal *, LinearSectionPtr ptr[3]);
526
void execDROP_INDX_REF(NdbApiSignal *, LinearSectionPtr ptr[3]);
527
void execDROP_INDX_CONF(NdbApiSignal *, LinearSectionPtr ptr[3]);
529
void execCREATE_EVNT_REF(NdbApiSignal *, LinearSectionPtr ptr[3]);
530
void execCREATE_EVNT_CONF(NdbApiSignal *, LinearSectionPtr ptr[3]);
531
void execSUB_START_CONF(NdbApiSignal *, LinearSectionPtr ptr[3]);
532
void execSUB_START_REF(NdbApiSignal *, LinearSectionPtr ptr[3]);
533
void execSUB_STOP_CONF(NdbApiSignal *, LinearSectionPtr ptr[3]);
534
void execSUB_STOP_REF(NdbApiSignal *, LinearSectionPtr ptr[3]);
535
void execDROP_EVNT_REF(NdbApiSignal *, LinearSectionPtr ptr[3]);
536
void execDROP_EVNT_CONF(NdbApiSignal *, LinearSectionPtr ptr[3]);
538
void execDROP_TABLE_REF(NdbApiSignal *, LinearSectionPtr ptr[3]);
539
void execDROP_TABLE_CONF(NdbApiSignal *, LinearSectionPtr ptr[3]);
540
void execLIST_TABLES_CONF(NdbApiSignal *, LinearSectionPtr ptr[3]);
542
void execCREATE_FILE_REF(NdbApiSignal *, LinearSectionPtr ptr[3]);
543
void execCREATE_FILE_CONF(NdbApiSignal *, LinearSectionPtr ptr[3]);
545
void execCREATE_FILEGROUP_REF(NdbApiSignal *, LinearSectionPtr ptr[3]);
546
void execCREATE_FILEGROUP_CONF(NdbApiSignal *, LinearSectionPtr ptr[3]);
548
void execDROP_FILE_REF(NdbApiSignal *, LinearSectionPtr ptr[3]);
549
void execDROP_FILE_CONF(NdbApiSignal *, LinearSectionPtr ptr[3]);
551
void execDROP_FILEGROUP_REF(NdbApiSignal *, LinearSectionPtr ptr[3]);
552
void execDROP_FILEGROUP_CONF(NdbApiSignal *, LinearSectionPtr ptr[3]);
554
void execWAIT_GCP_CONF(NdbApiSignal *, LinearSectionPtr ptr[3]);
555
void execWAIT_GCP_REF(NdbApiSignal *, LinearSectionPtr ptr[3]);
561
class NdbDictionaryImpl;
562
class GlobalCacheInitObject
565
NdbDictionaryImpl *m_dict;
566
const BaseString &m_name;
567
GlobalCacheInitObject(NdbDictionaryImpl *dict,
568
const BaseString &name) :
572
virtual ~GlobalCacheInitObject() {}
573
virtual int init(NdbTableImpl &tab) const = 0;
576
class NdbDictionaryImpl : public NdbDictionary::Dictionary {
578
NdbDictionaryImpl(Ndb &ndb);
579
NdbDictionaryImpl(Ndb &ndb, NdbDictionary::Dictionary & f);
580
~NdbDictionaryImpl();
582
bool setTransporter(class Ndb * ndb, class TransporterFacade * tf);
583
bool setTransporter(class TransporterFacade * tf);
585
int createTable(NdbTableImpl &t);
586
int createBlobTables(NdbTableImpl& org, NdbTableImpl& created);
587
int alterTable(NdbTableImpl &t);
588
int dropTable(const char * name);
589
int dropTable(NdbTableImpl &);
590
int dropBlobTables(NdbTableImpl &);
591
int invalidateObject(NdbTableImpl &);
592
int removeCachedObject(NdbTableImpl &);
594
int createIndex(NdbIndexImpl &ix);
595
int createIndex(NdbIndexImpl &ix, NdbTableImpl & tab);
596
int dropIndex(const char * indexName,
597
const char * tableName);
598
int dropIndex(NdbIndexImpl &, const char * tableName);
599
NdbTableImpl * getIndexTable(NdbIndexImpl * index,
600
NdbTableImpl * table);
602
int createEvent(NdbEventImpl &);
603
int createBlobEvents(NdbEventImpl &);
604
int dropEvent(const char * eventName);
605
int dropEvent(const NdbEventImpl &);
606
int dropBlobEvents(const NdbEventImpl &);
608
int executeSubscribeEvent(NdbEventOperationImpl &);
609
int stopSubscribeEvent(NdbEventOperationImpl &);
613
int listObjects(List& list, NdbDictionary::Object::Type type);
614
int listIndexes(List& list, Uint32 indexId);
616
NdbTableImpl * getTableGlobal(const char * tableName);
617
NdbIndexImpl * getIndexGlobal(const char * indexName,
618
NdbTableImpl &ndbtab);
619
int alterTableGlobal(NdbTableImpl &orig_impl, NdbTableImpl &impl);
620
int dropTableGlobal(NdbTableImpl &);
621
int dropIndexGlobal(NdbIndexImpl & impl);
622
int releaseTableGlobal(NdbTableImpl & impl, int invalidate);
623
int releaseIndexGlobal(NdbIndexImpl & impl, int invalidate);
625
NdbTableImpl * getTable(const char * tableName, void **data= 0);
626
NdbTableImpl * getBlobTable(const NdbTableImpl&, uint col_no);
627
NdbTableImpl * getBlobTable(uint tab_id, uint col_no);
628
void putTable(NdbTableImpl *impl);
629
int getBlobTables(NdbTableImpl &);
630
Ndb_local_table_info*
631
get_local_table_info(const BaseString& internalTableName);
632
NdbIndexImpl * getIndex(const char * indexName,
633
const char * tableName);
634
NdbIndexImpl * getIndex(const char * indexName, const NdbTableImpl& prim);
635
NdbEventImpl * getEvent(const char * eventName, NdbTableImpl* = NULL);
636
NdbEventImpl * getBlobEvent(const NdbEventImpl& ev, uint col_no);
637
NdbEventImpl * getEventImpl(const char * internalName);
639
int createDatafile(const NdbDatafileImpl &, bool force, NdbDictObjectImpl*);
640
int dropDatafile(const NdbDatafileImpl &);
641
int createUndofile(const NdbUndofileImpl &, bool force, NdbDictObjectImpl*);
642
int dropUndofile(const NdbUndofileImpl &);
644
int createTablespace(const NdbTablespaceImpl &, NdbDictObjectImpl*);
645
int dropTablespace(const NdbTablespaceImpl &);
647
int createLogfileGroup(const NdbLogfileGroupImpl &, NdbDictObjectImpl*);
648
int dropLogfileGroup(const NdbLogfileGroupImpl &);
650
const NdbError & getNdbError() const;
652
Uint32 m_local_table_data_size;
654
LocalDictCache m_localHash;
655
GlobalDictCache * m_globalHash;
657
static NdbDictionaryImpl & getImpl(NdbDictionary::Dictionary & t);
658
static const NdbDictionaryImpl & getImpl(const NdbDictionary::Dictionary &t);
659
NdbDictionary::Dictionary * m_facade;
661
NdbDictInterface m_receiver;
664
NdbIndexImpl* getIndexImpl(const char * externalName,
665
const BaseString& internalName,
668
NdbIndexImpl * getIndexImpl(const char * name,
669
const BaseString& internalName);
671
NdbTableImpl * fetchGlobalTableImplRef(const GlobalCacheInitObject &obj);
676
NdbEventImpl::getImpl(const NdbDictionary::Event & t){
682
NdbEventImpl::getImpl(NdbDictionary::Event & t){
688
NdbColumnImpl::getImpl(NdbDictionary::Column & t){
693
const NdbColumnImpl &
694
NdbColumnImpl::getImpl(const NdbDictionary::Column & t){
700
NdbColumnImpl::getInterpretableType() const {
701
return (m_type == NdbDictionary::Column::Unsigned ||
702
m_type == NdbDictionary::Column::Bigunsigned);
707
NdbColumnImpl::getCharType() const {
708
return (m_type == NdbDictionary::Column::Char ||
709
m_type == NdbDictionary::Column::Varchar ||
710
m_type == NdbDictionary::Column::Text ||
711
m_type == NdbDictionary::Column::Longvarchar);
716
NdbColumnImpl::getStringType() const {
717
return (m_type == NdbDictionary::Column::Char ||
718
m_type == NdbDictionary::Column::Varchar ||
719
m_type == NdbDictionary::Column::Longvarchar ||
720
m_type == NdbDictionary::Column::Binary ||
721
m_type == NdbDictionary::Column::Varbinary ||
722
m_type == NdbDictionary::Column::Longvarbinary);
727
NdbColumnImpl::getBlobType() const {
728
return (m_type == NdbDictionary::Column::Blob ||
729
m_type == NdbDictionary::Column::Text);
734
NdbColumnImpl::get_var_length(const void* value, Uint32& len) const
736
Uint32 max_len = m_attrSize * m_arraySize;
737
switch (m_arrayType) {
738
case NDB_ARRAYTYPE_SHORT_VAR:
739
len = 1 + *((Uint8*)value);
741
case NDB_ARRAYTYPE_MEDIUM_VAR:
742
len = 2 + uint2korr((char*)value);
748
return (len <= max_len);
753
NdbTableImpl::getImpl(NdbDictionary::Table & t){
759
NdbTableImpl::getImpl(const NdbDictionary::Table & t){
765
NdbTableImpl::getColumn(unsigned attrId){
766
if(m_columns.size() > attrId){
767
return m_columns[attrId];
774
NdbTableImpl::getMysqlName() const
776
return m_mysqlName.c_str();
781
Hash( const char* str ){
783
Uint32 len = strlen(str);
785
h = (h << 5) + h + str[0];
786
h = (h << 5) + h + str[1];
787
h = (h << 5) + h + str[2];
788
h = (h << 5) + h + str[3];
795
h = (h << 5) + h + *str++;
797
h = (h << 5) + h + *str++;
799
h = (h << 5) + h + *str++;
807
NdbTableImpl::getColumn(const char * name){
809
Uint32 sz = m_columns.size();
810
NdbColumnImpl** cols = m_columns.getBase();
811
const Uint32 * hashtable = m_columnHash.getBase();
814
Uint32 hashValue = Hash(name) & 0xFFFE;
815
Uint32 bucket = hashValue & m_columnHashMask;
816
bucket = (bucket < sz ? bucket : bucket - sz);
818
Uint32 tmp = * hashtable;
819
if((tmp & 1) == 1 ){ // No chaining
823
hashtable += (tmp & 0xFFFE) >> 1;
827
if(hashValue == (tmp & 0xFFFE)){
828
NdbColumnImpl* col = cols[tmp >> 16];
829
if(strncmp(name, col->m_name.c_str(), col->m_name.length()) == 0){
837
Uint32 dir = m_columnHash[bucket];
838
Uint32 pos = bucket + ((dir & 0xFFFE) >> 1);
839
Uint32 cnt = dir >> 16;
840
ndbout_c("col: %s hv: %x bucket: %d dir: %x pos: %d cnt: %d tmp: %d -> 0",
841
name, hashValue, bucket, dir, pos, cnt, tmp);
845
for(Uint32 i = 0; i<sz; i++){
846
NdbColumnImpl* col = * cols++;
847
if(col != 0 && strcmp(name, col->m_name.c_str()) == 0)
855
const NdbColumnImpl *
856
NdbTableImpl::getColumn(unsigned attrId) const {
857
if(m_columns.size() > attrId){
858
return m_columns[attrId];
864
const NdbColumnImpl *
865
NdbTableImpl::getColumn(const char * name) const {
866
Uint32 sz = m_columns.size();
867
NdbColumnImpl* const * cols = m_columns.getBase();
868
for(Uint32 i = 0; i<sz; i++, cols++){
869
NdbColumnImpl* col = * cols;
870
if(col != 0 && strcmp(name, col->m_name.c_str()) == 0)
878
NdbIndexImpl::getImpl(NdbDictionary::Index & t){
884
NdbIndexImpl::getImpl(const NdbDictionary::Index & t){
890
NdbDictionaryImpl::getImpl(NdbDictionary::Dictionary & t){
895
const NdbDictionaryImpl &
896
NdbDictionaryImpl::getImpl(const NdbDictionary::Dictionary & t){
900
/*****************************************************************
904
class InitTable : public GlobalCacheInitObject
907
InitTable(NdbDictionaryImpl *dict,
908
const BaseString &name) :
909
GlobalCacheInitObject(dict, name)
911
int init(NdbTableImpl &tab) const
913
return m_dict->getBlobTables(tab);
919
NdbDictionaryImpl::getTableGlobal(const char * table_name)
921
const BaseString internal_tabname(m_ndb.internalize_table_name(table_name));
922
return fetchGlobalTableImplRef(InitTable(this, internal_tabname));
927
NdbDictionaryImpl::getTable(const char * table_name, void **data)
929
DBUG_ENTER("NdbDictionaryImpl::getTable");
930
DBUG_PRINT("enter", ("table: %s", table_name));
932
if (unlikely(strchr(table_name, '$') != 0)) {
933
Uint32 tab_id, col_no;
934
if (is_ndb_blob_table(table_name, &tab_id, &col_no)) {
935
NdbTableImpl* t = getBlobTable(tab_id, col_no);
940
const BaseString internal_tabname(m_ndb.internalize_table_name(table_name));
941
Ndb_local_table_info *info=
942
get_local_table_info(internal_tabname);
946
*data= info->m_local_data;
947
DBUG_RETURN(info->m_table_impl);
951
Ndb_local_table_info *
952
NdbDictionaryImpl::get_local_table_info(const BaseString& internalTableName)
954
DBUG_ENTER("NdbDictionaryImpl::get_local_table_info");
955
DBUG_PRINT("enter", ("table: %s", internalTableName.c_str()));
957
Ndb_local_table_info *info= m_localHash.get(internalTableName.c_str());
961
fetchGlobalTableImplRef(InitTable(this, internalTableName));
964
info= Ndb_local_table_info::create(tab, m_local_table_data_size);
967
m_localHash.put(internalTableName.c_str(), info);
971
DBUG_RETURN(info); // autoincrement already initialized
974
class InitIndex : public GlobalCacheInitObject
977
const char *m_index_name;
978
const NdbTableImpl &m_prim;
980
InitIndex(const BaseString &internal_indexname,
981
const char *index_name,
982
const NdbTableImpl &prim) :
983
GlobalCacheInitObject(0, internal_indexname),
984
m_index_name(index_name),
988
int init(NdbTableImpl &tab) const {
989
DBUG_ENTER("InitIndex::init");
990
DBUG_ASSERT(tab.m_indexType != NdbDictionary::Object::TypeUndefined);
995
if(NdbDictInterface::create_index_obj_from_table(&idx, &tab, &m_prim) == 0)
998
if (!idx->m_externalName.assign(m_index_name) ||
999
!idx->m_internalName.assign(m_name))
1010
NdbDictionaryImpl::getIndexGlobal(const char * index_name,
1011
NdbTableImpl &ndbtab)
1013
DBUG_ENTER("NdbDictionaryImpl::getIndexGlobal");
1015
internal_indexname(m_ndb.internalize_index_name(&ndbtab, index_name));
1021
fetchGlobalTableImplRef(InitIndex(internal_indexname,
1022
index_name, ndbtab));
1025
// tab->m_index sould be set. otherwise tab == 0
1026
NdbIndexImpl *idx= tab->m_index;
1027
if (idx->m_table_id != (unsigned)ndbtab.getObjectId() ||
1028
idx->m_table_version != (unsigned)ndbtab.getObjectVersion())
1030
releaseIndexGlobal(*idx, 1);
1039
// Index not found, try old format
1041
old_internal_indexname(m_ndb.old_internalize_index_name(&ndbtab,
1047
fetchGlobalTableImplRef(InitIndex(old_internal_indexname,
1048
index_name, ndbtab));
1051
// tab->m_index sould be set. otherwise tab == 0
1052
NdbIndexImpl *idx= tab->m_index;
1053
if (idx->m_table_id != (unsigned)ndbtab.getObjectId() ||
1054
idx->m_table_version != (unsigned)ndbtab.getObjectVersion())
1056
releaseIndexGlobal(*idx, 1);
1070
NdbDictionaryImpl::releaseTableGlobal(NdbTableImpl & impl, int invalidate)
1072
DBUG_ENTER("NdbDictionaryImpl::releaseTableGlobal");
1073
DBUG_PRINT("enter", ("internal_name: %s", impl.m_internalName.c_str()));
1074
m_globalHash->lock();
1075
m_globalHash->release(&impl, invalidate);
1076
m_globalHash->unlock();
1081
NdbDictionaryImpl::releaseIndexGlobal(NdbIndexImpl & impl, int invalidate)
1083
DBUG_ENTER("NdbDictionaryImpl::releaseIndexGlobal");
1084
DBUG_PRINT("enter", ("internal_name: %s", impl.m_internalName.c_str()));
1085
m_globalHash->lock();
1086
m_globalHash->release(impl.m_table, invalidate);
1087
m_globalHash->unlock();
1093
NdbDictionaryImpl::getIndex(const char * index_name,
1094
const char * table_name)
1096
if (table_name == 0)
1104
NdbTableImpl* prim = getTable(table_name);
1111
return getIndex(index_name, *prim);
1116
NdbDictionaryImpl::getIndex(const char* index_name,
1117
const NdbTableImpl& prim)
1121
internal_indexname(m_ndb.internalize_index_name(&prim, index_name));
1123
Ndb_local_table_info *info= m_localHash.get(internal_indexname.c_str());
1127
tab= fetchGlobalTableImplRef(InitIndex(internal_indexname,
1133
info= Ndb_local_table_info::create(tab, 0);
1136
m_localHash.put(internal_indexname.c_str(), info);
1139
tab= info->m_table_impl;
1141
return tab->m_index;
1144
// Index not found, try fetching it from current database
1146
old_internal_indexname(m_ndb.old_internalize_index_name(&prim, index_name));
1148
info= m_localHash.get(old_internal_indexname.c_str());
1151
tab= fetchGlobalTableImplRef(InitIndex(old_internal_indexname,
1157
info= Ndb_local_table_info::create(tab, 0);
1160
m_localHash.put(old_internal_indexname.c_str(), info);
1163
tab= info->m_table_impl;
1165
return tab->m_index;
1174
NdbTablespaceImpl::getImpl(NdbDictionary::Tablespace & t){
1179
const NdbTablespaceImpl &
1180
NdbTablespaceImpl::getImpl(const NdbDictionary::Tablespace & t){
1185
NdbLogfileGroupImpl &
1186
NdbLogfileGroupImpl::getImpl(NdbDictionary::LogfileGroup & t){
1191
const NdbLogfileGroupImpl &
1192
NdbLogfileGroupImpl::getImpl(const NdbDictionary::LogfileGroup & t){
1198
NdbDatafileImpl::getImpl(NdbDictionary::Datafile & t){
1203
const NdbDatafileImpl &
1204
NdbDatafileImpl::getImpl(const NdbDictionary::Datafile & t){
1210
NdbUndofileImpl::getImpl(NdbDictionary::Undofile & t){
1215
const NdbUndofileImpl &
1216
NdbUndofileImpl::getImpl(const NdbDictionary::Undofile & t){