18 #include <NdbDictionary.hpp>
19 #include "NdbDictionaryImpl.hpp"
21 #include <signaldata/CreateHashMap.hpp>
22 #include <NdbBlob.hpp>
29 NdbDictionary::RecordType
32 return NdbDictionaryImpl::getRecordType(record);
38 return NdbDictionaryImpl::getRecordTableName(record);
44 return NdbDictionaryImpl::getRecordIndexName(record);
51 return NdbDictionaryImpl::getNextAttrIdFrom(record,
60 return NdbDictionaryImpl::getNextAttrIdFrom(record,
70 return NdbDictionaryImpl::getOffset(record, attrId, offset);
76 Uint32& nullbit_byte_offset,
77 Uint32& nullbit_bit_in_byte)
79 return NdbDictionaryImpl::getNullBitOffset(record,
91 return NdbDictionaryImpl::getValuePtr(record, row, attrId);
99 return NdbDictionaryImpl::getValuePtr(record, row, attrId);
107 return NdbDictionaryImpl::isNull(record, row, attrId);
116 return NdbDictionaryImpl::setNull(record, row, attrId, value);
122 return NdbDictionaryImpl::getRecordRowLength(record);
126 NdbDictionary::getEmptyBitmask()
133 NdbDictionary::ObjectId::ObjectId()
138 NdbDictionary::ObjectId::~ObjectId()
146 return m_impl.m_status;
151 return m_impl.m_version;
155 NdbDictionary::ObjectId::getObjectId()
const {
179 NdbDictionary::Column::~Column(){
189 m_impl = column.m_impl;
196 return !m_impl.m_name.assign(name);
201 return m_impl.m_name.c_str();
211 return m_impl.m_type;
216 m_impl.m_precision = val;
221 return m_impl.m_precision;
226 m_impl.m_scale = val;
231 return m_impl.m_scale;
236 m_impl.m_length = length;
241 return m_impl.m_length;
247 m_impl.m_precision =
size;
265 return m_impl.m_cs->number;
271 return m_impl.m_precision;
277 m_impl.m_scale =
size;
283 return m_impl.m_scale;
289 m_impl.m_length =
size;
295 return m_impl.m_length;
300 return m_impl.m_attrSize;
305 m_impl.m_nullable = val;
310 return m_impl.m_nullable;
325 m_impl.m_distributionKey = val;
330 return m_impl.m_distributionKey;
334 NdbDictionary::Column::getBlobTable()
const {
342 NdbDictionary::Column::setAutoIncrement(
bool val){
343 m_impl.m_autoIncrement = val;
347 NdbDictionary::Column::getAutoIncrement()
const {
348 return m_impl.m_autoIncrement;
352 NdbDictionary::Column::setAutoIncrementInitialValue(Uint64 val){
353 m_impl.m_autoIncrementInitialValue = val;
374 if (defaultValue == NULL)
375 return m_impl.m_defaultValue.assign(NULL, 0);
377 return m_impl.m_defaultValue.assign(defaultValue, n);
381 NdbDictionary::Column::getDefaultValue(
unsigned int* len)
const
384 *len = m_impl.m_defaultValue.length();
386 return m_impl.m_defaultValue.get_data();
391 return m_impl.m_column_no;
395 NdbDictionary::Column::getAttrId()
const {
396 return m_impl.m_attrId;
401 return m_impl.equal(col.m_impl);
405 NdbDictionary::Column::getSizeInBytes()
const
407 return m_impl.m_attrSize * m_impl.m_arraySize;
411 NdbDictionary::Column::setArrayType(ArrayType
type)
413 m_impl.m_arrayType =
type;
416 NdbDictionary::Column::ArrayType
417 NdbDictionary::Column::getArrayType()
const
419 return (ArrayType)m_impl.m_arrayType;
423 NdbDictionary::Column::setStorageType(StorageType
type)
425 m_impl.m_storageType =
type;
428 NdbDictionary::Column::StorageType
429 NdbDictionary::Column::getStorageType()
const
431 return (StorageType)m_impl.m_storageType;
435 NdbDictionary::Column::getBlobVersion()
const
437 return m_impl.getBlobVersion();
441 NdbDictionary::Column::setBlobVersion(
int blobVersion)
443 m_impl.setBlobVersion(blobVersion);
448 m_impl.m_dynamic = val;
453 return m_impl.m_dynamic;
458 return m_impl.m_indexSourced;
466 if (m_impl.m_type != parentColumn.m_type ||
467 m_impl.m_precision != parentColumn.m_precision ||
468 m_impl.m_scale != parentColumn.m_scale ||
469 m_impl.m_length != parentColumn.m_length ||
470 m_impl.m_cs != parentColumn.m_cs)
492 m_impl.assign(org.m_impl);
500 NdbDictionary::Table::~Table(){
510 m_impl.assign(table.m_impl);
512 m_impl.m_facade =
this;
518 return m_impl.setName(name);
523 return m_impl.getName();
527 NdbDictionary::Table::getMysqlName()
const {
528 return m_impl.getMysqlName();
544 (* col) = NdbColumnImpl::getImpl(c);
545 if (m_impl.m_columns.push_back(col))
549 if (m_impl.buildColumnHash())
553 col->m_column_no = m_impl.m_columns.size() - 1;
559 return m_impl.getColumn(name);
564 return m_impl.getColumn(attrId);
570 return m_impl.getColumn(name);
576 return m_impl.getColumn(attrId);
581 m_impl.m_logging = val;
586 return m_impl.m_logging;
591 m_impl.m_fragmentType = ft;
596 return m_impl.m_fragmentType;
601 m_impl.m_kvalue = kValue;
606 return m_impl.m_kvalue;
611 m_impl.m_minLoadFactor = lf;
616 return m_impl.m_minLoadFactor;
621 m_impl.m_maxLoadFactor = lf;
626 return m_impl.m_maxLoadFactor;
631 return m_impl.m_columns.size();
636 return m_impl.m_noOfAutoIncColumns;
641 return m_impl.m_noOfKeys;
647 m_impl.m_max_rows = maxRows;
651 NdbDictionary::Table::getMaxRows()
const
653 return m_impl.m_max_rows;
659 m_impl.m_min_rows = minRows;
663 NdbDictionary::Table::getMinRows()
const
665 return m_impl.m_min_rows;
671 m_impl.m_default_no_part_flag = flag;
675 NdbDictionary::Table::getDefaultNoPartitionsFlag()
const
677 return m_impl.m_default_no_part_flag;
683 for (
unsigned i = 0;
i < m_impl.m_columns.size();
i++) {
684 if (m_impl.m_columns[
i]->m_pk) {
686 return m_impl.m_columns[
i]->m_name.c_str();
694 return m_impl.getFrmData();
698 NdbDictionary::Table::getFrmLength()
const {
699 return m_impl.getFrmLength();
702 enum NdbDictionary::Table::SingleUserMode
703 NdbDictionary::Table::getSingleUserMode()
const
705 return (
enum SingleUserMode)m_impl.m_single_user_mode;
711 m_impl.m_single_user_mode = (Uint8)mode;
716 NdbDictionary::Table::setTablespaceNames(
const void *data, Uint32 len)
718 return m_impl.setTablespaceNames(data, len);
722 NdbDictionary::Table::getTablespaceNames()
724 return m_impl.getTablespaceNames();
728 NdbDictionary::Table::getTablespaceNamesLen()
const
730 return m_impl.getTablespaceNamesLen();
737 m_impl.m_linear_flag = flag;
741 NdbDictionary::Table::getLinearFlag()
const
743 return m_impl.m_linear_flag;
749 m_impl.setFragmentCount(count);
755 return m_impl.getFragmentCount();
760 return m_impl.setFrm(data, len);
765 return m_impl.getFragmentData();
769 NdbDictionary::Table::getFragmentDataLen()
const {
770 return m_impl.getFragmentDataLen();
776 return m_impl.setFragmentData(data, cnt);
781 return m_impl.getRangeListData();
785 NdbDictionary::Table::getRangeListDataLen()
const {
786 return m_impl.getRangeListDataLen();
792 return m_impl.setRangeListData(data, len);
797 Uint32* nodeIdArrayPtr,
798 Uint32 arraySize)
const
800 return m_impl.getFragmentNodes(fragmentId, nodeIdArrayPtr, arraySize);
805 return m_impl.m_status;
809 NdbDictionary::Table::setStatusInvalid()
const {
815 return m_impl.m_version;
825 return m_impl.equal(col.m_impl);
829 NdbDictionary::Table::getRowSizeInBytes()
const {
831 for(
int i = 0;
i<getNoOfColumns();
i++){
833 sz += (c->getSizeInBytes()+ 3) / 4;
839 NdbDictionary::Table::getReplicaCount()
const {
840 return m_impl.m_replicaCount;
844 NdbDictionary::Table::getTemporary()
const {
845 return m_impl.m_temporary;
849 NdbDictionary::Table::setTemporary(
bool val) {
850 m_impl.m_temporary = val;
854 NdbDictionary::Table::createTableInDb(
Ndb* pNdb,
bool equalOk)
const {
857 if(pTab != 0 && equal(* pTab))
859 if(pTab != 0 && !equal(* pTab))
865 NdbDictionary::Table::getTablespace(Uint32 *
id, Uint32 *version)
const
867 if (m_impl.m_tablespace_id == RNIL)
870 *
id= m_impl.m_tablespace_id;
872 *version= m_impl.m_version;
877 NdbDictionary::Table::getTablespaceName()
const
879 return m_impl.m_tablespace_name.c_str();
883 NdbDictionary::Table::setTablespaceName(
const char *
name){
884 m_impl.m_tablespace_id = ~0;
885 m_impl.m_tablespace_version = ~0;
886 return !m_impl.m_tablespace_name.assign(name);
891 m_impl.m_tablespace_id = NdbTablespaceImpl::getImpl(ts).m_id;
893 return !m_impl.m_tablespace_name.assign(ts.getName());
897 NdbDictionary::Table::getHashMap(Uint32 *
id, Uint32 *version)
const
899 if (m_impl.m_hash_map_id == RNIL)
902 *
id= m_impl.m_hash_map_id;
904 *version= m_impl.m_hash_map_version;
917 NdbDictionary::Table::setRowChecksumIndicator(
bool val){
918 m_impl.m_row_checksum = val;
922 NdbDictionary::Table::getRowChecksumIndicator()
const {
923 return m_impl.m_row_checksum;
927 NdbDictionary::Table::setRowGCIIndicator(
bool val){
928 m_impl.m_row_gci = val;
932 NdbDictionary::Table::getRowGCIIndicator()
const {
933 return m_impl.m_row_gci;
941 m_impl.m_extra_row_gci_bits = val;
946 NdbDictionary::Table::getExtraRowGciBits()
const
948 return m_impl.m_extra_row_gci_bits;
956 m_impl.m_extra_row_author_bits = val;
961 NdbDictionary::Table::getExtraRowAuthorBits()
const
963 return m_impl.m_extra_row_author_bits;
967 NdbDictionary::Table::setForceVarPart(
bool val){
968 m_impl.m_force_var_part = val;
973 return m_impl.m_force_var_part;
977 NdbDictionary::Table::hasDefaultValues()
const {
978 return m_impl.m_has_default_values;
983 return m_impl.m_ndbrecord;
989 return m_impl.aggregate(error);
995 return m_impl.validate(error);
1001 switch (m_impl.m_fragmentType){
1006 case NdbDictionary::Object::DistrKeyLin:
1008 Uint32 fragmentId = hashValue & m_impl.m_hashValueMask;
1009 if(fragmentId < m_impl.m_hashpointerValue)
1010 fragmentId = hashValue & ((m_impl.m_hashValueMask << 1) + 1);
1013 case NdbDictionary::Object::DistrKeyHash:
1015 Uint32 cnt = m_impl.m_fragmentCount;
1016 return hashValue % (cnt ? cnt : 1);
1018 case NdbDictionary::Object::HashMapPartition:
1020 Uint32 cnt = m_impl.m_hash_map.size();
1021 return m_impl.m_hash_map[hashValue % cnt];
1032 m_impl.m_id = objId.m_id;
1033 m_impl.m_version = objId.m_version;
1039 m_impl.m_storageType =
type;
1042 NdbDictionary::Column::StorageType
1043 NdbDictionary::Table::getStorageType()
const
1045 return (NdbDictionary::Column::StorageType)m_impl.m_storageType;
1063 NdbDictionary::Index::~Index(){
1072 return m_impl.setName(name);
1077 return m_impl.getName();
1082 return m_impl.setTable(table);
1087 return m_impl.getTable();
1092 return m_impl.m_columns.size();
1097 return m_impl.m_columns.size();
1102 if(no < m_impl.m_columns.size())
1103 return m_impl.m_columns[no];
1119 return m_impl.m_table->m_ndbrecord;
1130 (* col) = NdbColumnImpl::getImpl(c);
1132 col->m_indexSourced=
true;
1135 col->m_defaultValue.clear();
1137 if (m_impl.m_columns.push_back(col))
1147 return addColumn(c);
1153 return addColumn(c);
1158 for(
unsigned i = 0;
i < noOfNames;
i++) {
1170 for(
int i = 0;
i < noOfNames;
i++) {
1192 m_impl.m_logging = val;
1196 NdbDictionary::Index::getTemporary()
const {
1197 return m_impl.m_temporary;
1201 NdbDictionary::Index::setTemporary(
bool val){
1202 m_impl.m_temporary = val;
1207 return m_impl.m_logging;
1212 return m_impl.m_table->m_status;
1217 return m_impl.m_table->m_version;
1222 return m_impl.m_table->m_id;
1236 NdbDictionary::OptimizeTableHandle::~OptimizeTableHandle()
1247 return m_impl.next();
1253 int result = m_impl.close();
1268 NdbDictionary::OptimizeIndexHandle::~OptimizeIndexHandle()
1279 return m_impl.next();
1285 int result = m_impl.close();
1310 NdbDictionary::Event::~Event()
1321 return m_impl.setName(name);
1327 return m_impl.getName();
1333 m_impl.setTable(table);
1339 return m_impl.getTable();
1345 return m_impl.setTable(table);
1351 return m_impl.getTableName();
1357 m_impl.addTableEvent(t);
1363 return m_impl.getTableEvent(t);
1369 m_impl.setDurability(d);
1375 return m_impl.getDurability();
1381 m_impl.setReport(r);
1387 return m_impl.getReport();
1391 NdbDictionary::Event::addColumn(
const Column & c){
1393 (* col) = NdbColumnImpl::getImpl(c);
1394 m_impl.m_columns.push_back(col);
1400 m_impl.m_attrIds.push_back(attrId);
1413 for (
int i = 0;
i <
n;
i++)
1414 addEventColumn(names[
i]);
1419 return m_impl.getNoOfEventColumns();
1425 return m_impl.getEventColumn(no);
1430 m_impl.m_mergeEvents = flag;
1436 return m_impl.m_status;
1442 return m_impl.m_version;
1450 void NdbDictionary::Event::print()
1458 NdbDictionary::Tablespace::Tablespace()
1471 m_impl.assign(org.m_impl);
1474 NdbDictionary::Tablespace::~Tablespace(){
1482 NdbDictionary::Tablespace::setName(
const char * name){
1483 m_impl.m_name.assign(name);
1487 NdbDictionary::Tablespace::getName()
const {
1488 return m_impl.m_name.c_str();
1492 NdbDictionary::Tablespace::setAutoGrowSpecification
1494 m_impl.m_grow_spec = spec;
1497 NdbDictionary::Tablespace::getAutoGrowSpecification()
const {
1498 return m_impl.m_grow_spec;
1502 NdbDictionary::Tablespace::setExtentSize(Uint32 sz){
1503 m_impl.m_extent_size = sz;
1507 NdbDictionary::Tablespace::getExtentSize()
const {
1508 return m_impl.m_extent_size;
1512 NdbDictionary::Tablespace::setDefaultLogfileGroup(
const char * name){
1513 m_impl.m_logfile_group_id = ~0;
1514 m_impl.m_logfile_group_version = ~0;
1515 m_impl.m_logfile_group_name.assign(name);
1519 NdbDictionary::Tablespace::setDefaultLogfileGroup
1521 m_impl.m_logfile_group_id = NdbLogfileGroupImpl::getImpl(lg).m_id;
1523 m_impl.m_logfile_group_name.assign(lg.getName());
1527 NdbDictionary::Tablespace::getDefaultLogfileGroup()
const {
1528 return m_impl.m_logfile_group_name.c_str();
1532 NdbDictionary::Tablespace::getDefaultLogfileGroupId()
const {
1533 return m_impl.m_logfile_group_id;
1538 return m_impl.m_status;
1543 return m_impl.m_version;
1554 NdbDictionary::LogfileGroup::LogfileGroup()
1567 m_impl.assign(org.m_impl);
1570 NdbDictionary::LogfileGroup::~LogfileGroup(){
1578 NdbDictionary::LogfileGroup::setName(
const char * name){
1579 m_impl.m_name.assign(name);
1583 NdbDictionary::LogfileGroup::getName()
const {
1584 return m_impl.m_name.c_str();
1588 NdbDictionary::LogfileGroup::setUndoBufferSize(Uint32 sz){
1589 m_impl.m_undo_buffer_size = sz;
1593 NdbDictionary::LogfileGroup::getUndoBufferSize()
const {
1594 return m_impl.m_undo_buffer_size;
1598 NdbDictionary::LogfileGroup::setAutoGrowSpecification
1600 m_impl.m_grow_spec = spec;
1603 NdbDictionary::LogfileGroup::getAutoGrowSpecification()
const {
1604 return m_impl.m_grow_spec;
1607 Uint64 NdbDictionary::LogfileGroup::getUndoFreeWords()
const {
1608 return m_impl.m_undo_free_words;
1613 return m_impl.m_status;
1618 return m_impl.m_version;
1629 NdbDictionary::Datafile::Datafile()
1642 m_impl.assign(org.m_impl);
1645 NdbDictionary::Datafile::~Datafile(){
1653 NdbDictionary::Datafile::setPath(
const char * path){
1654 m_impl.m_path.assign(path);
1658 NdbDictionary::Datafile::getPath()
const {
1659 return m_impl.m_path.c_str();
1663 NdbDictionary::Datafile::setSize(Uint64 sz){
1668 NdbDictionary::Datafile::getSize()
const {
1669 return m_impl.m_size;
1673 NdbDictionary::Datafile::getFree()
const {
1674 return m_impl.m_free;
1678 NdbDictionary::Datafile::setTablespace(
const char * tablespace){
1679 m_impl.m_filegroup_id = ~0;
1680 m_impl.m_filegroup_version = ~0;
1681 return !m_impl.m_filegroup_name.assign(tablespace);
1686 m_impl.m_filegroup_id = NdbTablespaceImpl::getImpl(ts).m_id;
1688 return !m_impl.m_filegroup_name.assign(ts.getName());
1692 NdbDictionary::Datafile::getTablespace()
const {
1693 return m_impl.m_filegroup_name.c_str();
1701 NdbDictObjectImpl::getImpl(* dst).m_id = m_impl.m_filegroup_id;
1702 NdbDictObjectImpl::getImpl(* dst).m_version = m_impl.m_filegroup_version;
1708 return m_impl.m_status;
1713 return m_impl.m_version;
1724 NdbDictionary::Undofile::Undofile()
1737 m_impl.assign(org.m_impl);
1740 NdbDictionary::Undofile::~Undofile(){
1748 NdbDictionary::Undofile::setPath(
const char * path){
1749 m_impl.m_path.assign(path);
1753 NdbDictionary::Undofile::getPath()
const {
1754 return m_impl.m_path.c_str();
1758 NdbDictionary::Undofile::setSize(Uint64 sz){
1763 NdbDictionary::Undofile::getSize()
const {
1764 return m_impl.m_size;
1768 NdbDictionary::Undofile::setLogfileGroup(
const char * logfileGroup){
1769 m_impl.m_filegroup_id = ~0;
1770 m_impl.m_filegroup_version = ~0;
1771 m_impl.m_filegroup_name.assign(logfileGroup);
1775 NdbDictionary::Undofile::setLogfileGroup
1777 m_impl.m_filegroup_id = NdbLogfileGroupImpl::getImpl(ts).m_id;
1779 m_impl.m_filegroup_name.assign(ts.getName());
1783 NdbDictionary::Undofile::getLogfileGroup()
const {
1784 return m_impl.m_filegroup_name.c_str();
1792 NdbDictObjectImpl::getImpl(* dst).m_id = m_impl.m_filegroup_id;
1793 NdbDictObjectImpl::getImpl(* dst).m_version = m_impl.m_filegroup_version;
1799 return m_impl.m_status;
1804 return m_impl.m_version;
1815 NdbDictionary::HashMap::HashMap()
1828 m_impl.assign(org.m_impl);
1831 NdbDictionary::HashMap::~HashMap(){
1839 NdbDictionary::HashMap::setName(
const char * path)
1841 m_impl.m_name.assign(path);
1845 NdbDictionary::HashMap::getName()
const
1847 return m_impl.m_name.c_str();
1851 NdbDictionary::HashMap::setMap(
const Uint32* map, Uint32 len)
1853 m_impl.m_map.assign(map, len);
1857 NdbDictionary::HashMap::getMapLen()
const
1859 return m_impl.m_map.size();
1863 NdbDictionary::HashMap::getMapValues(Uint32* dst, Uint32 len)
const
1865 if (len != getMapLen())
1868 memcpy(dst, m_impl.m_map.getBase(),
sizeof(Uint32) * len);
1875 return m_impl.m_map.equal(obj.m_impl.m_map);
1880 return m_impl.m_status;
1885 return m_impl.m_version;
1898 tmp.
assfmt(
"DEFAULT-HASHMAP-%u-%u",
1899 NDB_DEFAULT_HASHMAP_BUCKTETS, fragments);
1901 return getHashMap(dst, tmp.
c_str());
1908 return m_impl.m_receiver.get_hashmap(NdbHashMapImpl::getImpl(dst), name);
1921 m_impl.m_receiver.get_hashmap(NdbHashMapImpl::getImpl(dst),
1922 NdbTableImpl::getImpl(*tab).m_hash_map_id);
1930 tmp.
assfmt(
"DEFAULT-HASHMAP-%u-%u",
1931 NDB_DEFAULT_HASHMAP_BUCKTETS, fragments);
1933 dst.setName(tmp.
c_str());
1936 for (Uint32
i = 0;
i<NDB_DEFAULT_HASHMAP_BUCKTETS;
i++)
1938 map.push_back(
i % fragments);
1941 dst.setMap(map.getBase(), map.size());
1949 if (!hasSchemaTrans())
1954 const NdbTableImpl& oldTable = NdbTableImpl::getImpl(oldTableF);
1955 NdbTableImpl& newTable = NdbTableImpl::getImpl(newTableF);
1957 if (oldTable.
getFragmentType() == NdbDictionary::Object::HashMapPartition)
1960 if (getHashMap(oldmap, &oldTable) == -1)
1972 newmap.assign(NdbHashMapImpl::getImpl(oldmap));
1983 int ret = m_impl.m_receiver.create_hashmap(NdbHashMapImpl::getImpl(newmapF),
1984 &NdbDictObjectImpl::getImpl(tmp),
1985 CreateHashMapReq::CreateDefault |
1986 CreateHashMapReq::CreateIfNotExists);
1993 ret = m_impl.m_receiver.get_hashmap(NdbHashMapImpl::getImpl(hm), tmp.getObjectId());
2000 values.fill(hm.getMapLen() - 1, zero);
2001 hm.getMapValues(values.getBase(), values.size());
2002 for (Uint32
i = 0;
i<hm.getMapLen();
i++)
2004 if (values[
i] > newcnt)
2008 if (newcnt < oldcnt)
2019 for (Uint32
i = 0;
i<newmap.m_map.size();
i++)
2021 Uint32 newval =
i % newcnt;
2022 if (newval >= oldcnt)
2024 newmap.m_map[
i] = newval;
2032 if (getDefaultHashMap(def, newcnt) == 0)
2034 if (def.
equal(newmapF))
2042 initDefaultHashMap(def, newcnt);
2043 if (def.
equal(newmapF))
2046 if (createHashMap(def, &tmp) == -1)
2050 newTable.m_hash_map_id = tmp.getObjectId();
2059 newmap.m_name.
assfmt(
"HASHMAP-%u-%u-%u",
2060 NDB_DEFAULT_HASHMAP_BUCKTETS,
2066 newmap.m_name.
assfmt(
"HASHMAP-%u-%u-%u-#%u",
2067 NDB_DEFAULT_HASHMAP_BUCKTETS,
2074 if (getHashMap(def, newmap.getName()) == 0)
2076 if (def.
equal(newmap))
2087 if (createHashMap(newmapF, &tmp) == -1)
2091 newTable.m_hash_map_id = tmp.getObjectId();
2102 NdbDictionary::Dictionary::Dictionary(
Ndb & ndb)
2111 NdbDictionary::Dictionary::~Dictionary(){
2119 #define DO_TRANS(ret, action) \
2121 bool trans = hasSchemaTrans(); \
2122 if ((trans || (ret = beginSchemaTrans()) == 0) && \
2123 (ret = (action)) == 0 && \
2124 (trans || (ret = endSchemaTrans()) == 0)) \
2126 else if (!trans) { \
2127 NdbError save_error = m_impl.m_error; \
2128 (void)endSchemaTrans(SchemaTransAbort); \
2129 m_impl.m_error = save_error; \
2136 return createTable(t, 0);
2147 if (likely(! is_ndb_blob_table(t.
getName())))
2151 m_impl.createTable(NdbTableImpl::getImpl(t),
2152 NdbDictObjectImpl::getImpl( *objId))
2158 m_impl.m_error.code = 4307;
2167 DBUG_ENTER(
"NdbDictionary::Dictionary::optimzeTable");
2168 DBUG_RETURN(m_impl.optimizeTable(NdbTableImpl::getImpl(t),
2169 NdbOptimizeTableHandleImpl::getImpl(h)));
2176 DBUG_ENTER(
"NdbDictionary::Dictionary::optimzeIndex");
2177 DBUG_RETURN(m_impl.optimizeIndex(NdbIndexImpl::getImpl(ind),
2178 NdbOptimizeIndexHandleImpl::getImpl(h)));
2185 if (likely(! is_ndb_blob_table(t.
getName())))
2189 m_impl.dropTable(NdbTableImpl::getImpl(t))
2195 m_impl.m_error.code = 4249;
2202 NdbDictionary::Dictionary::dropTableGlobal(
const Table & t)
2205 if (likely(! is_ndb_blob_table(t.
getName())))
2209 m_impl.dropTableGlobal(NdbTableImpl::getImpl(t))
2215 m_impl.m_error.code = 4249;
2225 if (likely(! is_ndb_blob_table(name)))
2229 m_impl.dropTable(name)
2235 m_impl.m_error.code = 4307;
2245 return m_impl.supportedAlterTable(NdbTableImpl::getImpl(f),
2246 NdbTableImpl::getImpl(t));
2255 m_impl.alterTable(NdbTableImpl::getImpl(f),
2256 NdbTableImpl::getImpl(t))
2262 NdbDictionary::Dictionary::alterTableGlobal(
const Table & f,
2268 m_impl.alterTableGlobal(NdbTableImpl::getImpl(f),
2269 NdbTableImpl::getImpl(t))
2284 NdbDictionary::Dictionary::getIndexGlobal(
const char * indexName,
2285 const Table &ndbtab)
const
2288 NdbTableImpl::getImpl(ndbtab));
2295 NdbDictionary::Dictionary::getIndexGlobal(
const char * indexName,
2296 const char * tableName)
const
2306 NdbDictionary::Dictionary::getTableGlobal(
const char * name)
const
2315 NdbDictionary::Dictionary::removeIndexGlobal(
const Index &ndbidx,
2316 int invalidate)
const
2318 return m_impl.releaseIndexGlobal(NdbIndexImpl::getImpl(ndbidx), invalidate);
2322 NdbDictionary::Dictionary::removeTableGlobal(
const Table &ndbtab,
2323 int invalidate)
const
2325 return m_impl.releaseTableGlobal(NdbTableImpl::getImpl(ndbtab), invalidate);
2329 NdbDictionary::Dictionary::createRecord(
const Table *
table,
2330 const RecordSpecification *recSpec,
2337 Ndb* myNdb= &m_impl.m_ndb;
2346 (Ndb::getDatabaseFromInternalName(impl->m_internalName.
c_str()).c_str());
2348 (Ndb::getSchemaFromInternalName(impl->m_internalName.
c_str()).c_str());
2353 const Table* globalTab= getTableGlobal(impl->m_externalName.
c_str());
2359 if (globalTab == NULL)
2363 NdbTableImpl* globalTabImpl= &NdbTableImpl::getImpl(*globalTab);
2365 assert(impl->m_id == globalTabImpl->m_id);
2366 if (table_version_major(impl->m_version) !=
2367 table_version_major(globalTabImpl->m_version))
2369 removeTableGlobal(*globalTab,
false);
2370 m_impl.m_error.code= 241;
2374 NdbRecord* result= m_impl.createRecord(globalTabImpl,
2383 removeTableGlobal(*globalTab,
false);
2389 NdbDictionary::Dictionary::createRecord(
const Index *
index,
2391 const RecordSpecification *recSpec,
2400 Ndb* myNdb= &m_impl.m_ndb;
2410 (Ndb::getDatabaseFromInternalName(tabImpl->m_internalName.
c_str()).c_str());
2412 (Ndb::getSchemaFromInternalName(tabImpl->m_internalName.
c_str()).c_str());
2417 const Index* globalIndex= getIndexGlobal(index->getName(), *
table);
2423 if (globalIndex == NULL)
2427 NdbIndexImpl* indexImpl= &NdbIndexImpl::getImpl(*index);
2428 NdbIndexImpl* globalIndexImpl= &NdbIndexImpl::getImpl(*globalIndex);
2430 assert(indexImpl->m_id == globalIndexImpl->m_id);
2432 if (table_version_major(indexImpl->m_version) !=
2433 table_version_major(globalIndexImpl->m_version))
2435 removeIndexGlobal(*globalIndex,
false);
2436 m_impl.m_error.code= 241;
2440 NdbRecord* result= m_impl.createRecord(globalIndexImpl->m_table,
2449 removeIndexGlobal(*globalIndex,
false);
2455 NdbDictionary::Dictionary::createRecord(
const Index *index,
2456 const RecordSpecification *recSpec,
2464 return createRecord(index,
2473 NdbDictionary::Dictionary::releaseRecord(
NdbRecord *
rec)
2475 m_impl.releaseRecord_impl(rec);
2481 *copy_table = *
table;
2482 m_impl.putTable(&NdbTableImpl::getImpl(*copy_table));
2485 void NdbDictionary::Dictionary::set_local_table_data_size(
unsigned sz)
2487 m_impl.m_local_table_data_size= sz;
2493 return getTable(name, 0);
2498 const char* col_name)
2502 m_impl.m_error.code = 4318;
2512 return m_impl.getBlobTable(NdbTableImpl::getImpl(*table), col_no);
2517 DBUG_ENTER(
"NdbDictionaryImpl::invalidateTable");
2520 m_impl.invalidateObject(* t);
2527 m_impl.invalidateObject(t);
2534 m_impl.removeCachedObject(* t);
2540 m_impl.removeCachedObject(t);
2549 m_impl.createIndex(NdbIndexImpl::getImpl(ind), offline)
2561 m_impl.createIndex(NdbIndexImpl::getImpl(ind),
2562 NdbTableImpl::getImpl(tab),
2570 const char * tableName)
2575 m_impl.dropIndex(indexName, tableName)
2581 NdbDictionary::Dictionary::dropIndexGlobal(
const Index &ind)
2586 m_impl.dropIndexGlobal(NdbIndexImpl::getImpl(ind))
2592 NdbDictionary::Dictionary::updateIndexStat(
const Index& index,
2598 m_impl.updateIndexStat(NdbIndexImpl::getImpl(index),
2599 NdbTableImpl::getImpl(table))
2605 NdbDictionary::Dictionary::updateIndexStat(Uint32 indexId,
2606 Uint32 indexVersion,
2612 m_impl.updateIndexStat(indexId,
2620 NdbDictionary::Dictionary::deleteIndexStat(
const Index& index,
2626 m_impl.deleteIndexStat(NdbIndexImpl::getImpl(index),
2627 NdbTableImpl::getImpl(table))
2633 NdbDictionary::Dictionary::deleteIndexStat(Uint32 indexId,
2634 Uint32 indexVersion,
2640 m_impl.deleteIndexStat(indexId,
2649 const char * tableName)
const
2651 NdbIndexImpl * i = m_impl.getIndex(indexName, tableName);
2659 DBUG_ENTER(
"NdbDictionary::Dictionary::invalidateIndex");
2661 assert(i.m_table != 0);
2662 m_impl.invalidateObject(* i.m_table);
2668 const char * tableName){
2669 DBUG_ENTER(
"NdbDictionaryImpl::invalidateIndex");
2670 NdbIndexImpl * i = m_impl.getIndex(indexName, tableName);
2672 assert(i->m_table != 0);
2673 m_impl.invalidateObject(* i->m_table);
2681 return forceGCPWait(0);
2687 return m_impl.forceGCPWait(type);
2693 return m_impl.getRestartGCI(gci);
2698 DBUG_ENTER(
"NdbDictionary::Dictionary::removeCachedIndex");
2700 assert(i.m_table != 0);
2701 m_impl.removeCachedObject(* i.m_table);
2707 const char * tableName){
2708 NdbIndexImpl * i = m_impl.getIndex(indexName, tableName);
2710 assert(i->m_table != 0);
2711 m_impl.removeCachedObject(* i->m_table);
2716 NdbDictionary::Dictionary::getIndexTable(
const char * indexName,
2717 const char * tableName)
const
2719 NdbIndexImpl * i = m_impl.getIndex(indexName, tableName);
2723 return it->m_facade;
2732 return m_impl.createEvent(NdbEventImpl::getImpl(ev));
2738 return m_impl.dropEvent(eventName, force);
2755 return cthis->NdbDictionary::Dictionary::listEvents(list);
2761 return m_impl.listEvents(list);
2769 return cthis->NdbDictionary::Dictionary::listObjects(list, type);
2776 return listObjects(list, type,
2777 m_impl.m_ndb.usingFullyQualifiedNames());
2782 bool fullyQualified)
const
2784 return m_impl.listObjects(list, type,
2793 return cthis->NdbDictionary::Dictionary::listIndexes(list, tableName);
2798 const char * tableName)
const
2805 return m_impl.listIndexes(list, tab->
getTableId());
2812 return m_impl.listIndexes(list, table.
getTableId());
2817 return m_impl.getNdbError();
2823 return m_impl.m_warn;
2829 pretty_print_string(NdbOut& out,
2831 const char *type,
bool is_binary,
2832 const void *aref,
unsigned sz)
2834 const unsigned char* ref = (
const unsigned char*)aref;
2835 int i, len, printable= 1;
2837 for (i=sz-1; i >= 0; i--)
2838 if (ref[i] == 0) sz--;
2843 for (i=sz-1; i >= 0; i--)
2844 if (ref[i] == 32) sz--;
2847 if (is_binary && f.hex_format)
2855 for (len = 0; len < (int)sz; len++)
2856 out.print(
"%02X", (
int)ref[len]);
2859 if (sz == 0)
return;
2861 for (len=0; len < (int)sz && ref[i] != 0; len++)
2862 if (printable && !isprint((
int)ref[i]))
2866 out.print(
"%.*s", len, ref);
2870 for (i=0; i < len; i++)
2871 out.print(
"%02X", (
int)ref[i]);
2876 for (i= len+1; ref[
i] != 0; i++)
2877 out.print(
"%u]",len-i);
2878 assert((
int)sz > i);
2879 pretty_print_string(out,f,type,is_binary,ref+i,sz-i);
2884 static const int MaxMySQLDecimalPrecision= 65;
2885 static const int MaxMySQLDecimalScale= 30;
2886 static const int DigitsPerDigit_t= 9;
2890 static const int MaxDecimalStrLen= MaxMySQLDecimalPrecision + 3;
2891 static const int IntPartDigit_ts=
2892 ((MaxMySQLDecimalPrecision -
2893 MaxMySQLDecimalScale) +
2894 DigitsPerDigit_t -1) / DigitsPerDigit_t;
2895 static const int FracPartDigit_ts=
2896 (MaxMySQLDecimalScale +
2897 DigitsPerDigit_t - 1) / DigitsPerDigit_t;
2898 static const int DigitArraySize= IntPartDigit_ts + FracPartDigit_ts;
2901 NdbDictionary::printFormattedValue(NdbOut& out,
2902 const NdbDataPrintFormat& format,
2908 out << format.null_string;
2912 const unsigned char* val_p= (
const unsigned char*) val;
2917 const char *fields_optionally_enclosed_by;
2918 if (format.fields_enclosed_by[0] ==
'\0')
2919 fields_optionally_enclosed_by=
2920 format.fields_optionally_enclosed_by;
2922 fields_optionally_enclosed_by=
"";
2923 out << format.fields_enclosed_by;
2929 memcpy(&temp, val, 8);
2935 out << format.hex_prefix <<
"0x";
2937 const Uint32 *
buf = (
const Uint32 *)val;
2938 unsigned int k = (length+31)/32;
2939 const unsigned int sigbits= length & 31;
2940 Uint32 wordMask= (1 << sigbits) -1;
2945 const Uint32 v= buf[--k] & wordMask;
2953 out.print(
"%X", (buf[k] & wordMask));
2957 out.print(
"%.8X", buf[--k]);
2964 out << format.start_array_enclosure;
2965 out << *(
const Uint32*)val;
2966 for (j = 1; j < length; j++)
2967 out <<
" " << *(((
const Uint32*)val) + j);
2969 out << format.end_array_enclosure;
2973 out << (
const Uint32) uint3korr(val_p);
2976 out << *((
const Uint16*) val);
2979 out << *((
const Uint8*) val);
2984 memcpy(&temp, val, 8);
2989 out << *((Int32*)val);
2992 out << sint3korr(val_p);
2995 out << *((
const short*) val);
2998 out << *((Int8*) val);
3001 if (!format.hex_format)
3002 out << fields_optionally_enclosed_by;
3004 pretty_print_string(out,format,
"Binary",
true, val, j);
3005 if (!format.hex_format)
3006 out << fields_optionally_enclosed_by;
3009 out << fields_optionally_enclosed_by;
3011 pretty_print_string(out,format,
"Char",
false, val, j);
3012 out << fields_optionally_enclosed_by;
3016 out << fields_optionally_enclosed_by;
3017 unsigned len = *val_p;
3018 pretty_print_string(out,format,
"Varchar",
false, val_p+1,len);
3020 out << fields_optionally_enclosed_by;
3025 if (!format.hex_format)
3026 out << fields_optionally_enclosed_by;
3027 unsigned len = *val_p;
3028 pretty_print_string(out,format,
"Varbinary",
true, val_p+1,len);
3030 if (!format.hex_format)
3031 out << fields_optionally_enclosed_by;
3037 memcpy(&temp, val,
sizeof(temp));
3044 memcpy(&temp, val,
sizeof(temp));
3051 out.print(
"%.*s", len, val_p);
3054 case NdbDictionary::Column::Olddecimalunsigned:
3057 out.print(
"%.*s", len, val_p);
3061 case NdbDictionary::Column::Decimalunsigned:
3066 assert(precision <= MaxMySQLDecimalPrecision);
3067 assert(scale <= MaxMySQLDecimalScale);
3068 assert(decimal_size(precision, scale) <= DigitArraySize );
3069 decimal_digit_t buff[ DigitArraySize ];
3072 tmpDec.len= DigitArraySize;
3073 decimal_make_zero(&tmpDec);
3076 const uchar* data= (
const uchar*) val_p;
3077 if ((rc= bin2decimal(data, &tmpDec, precision, scale)))
3079 out.print(
"***Error : Bad bin2decimal conversion %d ***",
3085 char decStr[MaxDecimalStrLen];
3086 assert(decimal_string_size(&tmpDec) <= MaxDecimalStrLen);
3087 int len= MaxDecimalStrLen;
3088 if ((rc= decimal2string(&tmpDec, decStr,
3094 out.print(
"***Error : bad decimal2string conversion %d ***",
3099 out.print(
"%s", decStr);
3107 memcpy(&tmp, val, 8);
3109 long part1,part2,part3;
3110 part1=(long) (tmp/LL(1000000));
3111 part2=(long) (tmp - (ulonglong) part1*LL(1000000));
3113 char* pos=(
char*) buf+19;
3115 *pos--= (char) (
'0'+(
char) (part2%10)); part2/=10;
3116 *pos--= (char) (
'0'+(
char) (part2%10)); part3= (int) (part2 / 10);
3118 *pos--= (char) (
'0'+(
char) (part3%10)); part3/=10;
3119 *pos--= (char) (
'0'+(
char) (part3%10)); part3/=10;
3121 *pos--= (char) (
'0'+(
char) (part3%10)); part3/=10;
3122 *pos--= (char) (
'0'+(
char) part3);
3124 *pos--= (char) (
'0'+(
char) (part1%10)); part1/=10;
3125 *pos--= (char) (
'0'+(
char) (part1%10)); part1/=10;
3127 *pos--= (char) (
'0'+(
char) (part1%10)); part1/=10;
3128 *pos--= (char) (
'0'+(
char) (part1%10)); part3= (int) (part1/10);
3130 *pos--= (char) (
'0'+(
char) (part3%10)); part3/=10;
3131 *pos--= (char) (
'0'+(
char) (part3%10)); part3/=10;
3132 *pos--= (char) (
'0'+(
char) (part3%10)); part3/=10;
3133 *pos=(char) (
'0'+(
char) part3);
3139 uint32 tmp=(uint32) uint3korr(val_p);
3142 char *pos=(
char*) buf+10;
3144 part=(int) (tmp & 31);
3145 *pos--= (char) (
'0'+part%10);
3146 *pos--= (char) (
'0'+part/10);
3148 part=(int) (tmp >> 5 & 15);
3149 *pos--= (char) (
'0'+part%10);
3150 *pos--= (char) (
'0'+part/10);
3152 part=(int) (tmp >> 9);
3153 *pos--= (char) (
'0'+part%10); part/=10;
3154 *pos--= (char) (
'0'+part%10); part/=10;
3155 *pos--= (char) (
'0'+part%10); part/=10;
3156 *pos= (char) (
'0'+part);
3162 long tmp=(long) sint3korr(val_p);
3163 int hour=(uint) (tmp/10000);
3164 int minute=(uint) (tmp/100 % 100);
3165 int second=(uint) (tmp % 100);
3167 sprintf(buf,
"%02d:%02d:%02d", hour, minute, second);
3173 uint year = 1900 + *((
const Uint8*) val);
3175 sprintf(buf,
"%04d", year);
3181 time_t time = *(
const Uint32*) val;
3189 NdbBlob::unpackBlobHead(head, (
const char*) val_p, c->getBlobVersion());
3190 out << head.length <<
":";
3191 const unsigned char* p = val_p + head.headsize;
3192 if ((
unsigned int) c->
getLength() < head.headsize)
3193 out <<
"***error***";
3195 unsigned n = c->
getLength() - head.headsize;
3196 for (
unsigned k = 0; k < n && k < head.length; k++) {
3198 out.print(
"%02X", (
int)p[k]);
3200 out.print(
"%c", (
int)p[k]);
3208 out << fields_optionally_enclosed_by;
3209 unsigned len = uint2korr(val_p);
3210 pretty_print_string(out,format,
"Longvarchar",
false,
3213 out << fields_optionally_enclosed_by;
3218 if (!format.hex_format)
3219 out << fields_optionally_enclosed_by;
3220 unsigned len = uint2korr(val_p);
3221 pretty_print_string(out,format,
"Longvarbinary",
true,
3224 if (!format.hex_format)
3225 out << fields_optionally_enclosed_by;
3230 out <<
"Unable to format type ("
3234 out <<
" " << length <<
" times";
3237 out << format.fields_enclosed_by;
3243 NdbDictionary::NdbDataPrintFormat::NdbDataPrintFormat()
3245 fields_terminated_by=
";";
3246 start_array_enclosure=
"[";
3247 end_array_enclosure=
"]";
3248 fields_enclosed_by=
"";
3249 fields_optionally_enclosed_by=
"\"";
3250 lines_terminated_by=
"\n";
3252 null_string=
"[NULL]";
3255 NdbDictionary::NdbDataPrintFormat::~NdbDataPrintFormat() {};
3262 const char *csname = cs ? cs->name :
"?";
3269 out <<
"Tinyunsigned";
3275 out <<
"Smallunsigned";
3281 out <<
"Mediumunsigned";
3293 out <<
"Bigunsigned";
3304 case NdbDictionary::Column::Olddecimalunsigned:
3310 case NdbDictionary::Column::Decimalunsigned:
3314 out <<
"Char(" << col.
getLength() <<
";" << csname <<
")";
3317 out <<
"Varchar(" << col.
getLength() <<
";" << csname <<
")";
3320 out <<
"Binary(" << col.
getLength() <<
")";
3323 out <<
"Varbinary(" << col.
getLength() <<
")";
3352 out <<
"Bit(" << col.
getLength() <<
")";
3355 out <<
"Longvarchar(" << col.
getLength() <<
";" << csname <<
")";
3358 out <<
"Longvarbinary(" << col.
getLength() <<
")";
3361 out <<
"Type" << (Uint32)col.
getType();
3384 out <<
" PRIMARY KEY";
3390 if(col.getDistributionKey())
3391 out <<
" DISTRIBUTION KEY";
3393 switch (col.getArrayType()) {
3394 case NDB_ARRAYTYPE_FIXED:
3397 case NDB_ARRAYTYPE_SHORT_VAR:
3398 out <<
" AT=SHORT_VAR";
3400 case NDB_ARRAYTYPE_MEDIUM_VAR:
3401 out <<
" AT=MEDIUM_VAR";
3404 out <<
" AT=" << (int)col.getArrayType() <<
"?";
3408 switch (col.getStorageType()) {
3409 case NDB_STORAGETYPE_MEMORY:
3410 out <<
" ST=MEMORY";
3412 case NDB_STORAGETYPE_DISK:
3416 out <<
" ST=" << (int)col.getStorageType() <<
"?";
3420 if (col.getAutoIncrement())
3421 out <<
" AUTO_INCR";
3426 out <<
" BV=" << col.getBlobVersion();
3427 out <<
" BT=" << ((col.getBlobTable() != 0) ? col.getBlobTable()->
getName() :
"<none>");
3436 const void *default_data = col.getDefaultValue();
3438 if (default_data != NULL)
3447 NdbDictionary::printFormattedValue(out,
3457 NdbDictionary::Dictionary::createLogfileGroup(
const LogfileGroup & lg,
3462 m_impl.createLogfileGroup(NdbLogfileGroupImpl::getImpl(lg),
3464 & NdbDictObjectImpl::getImpl(* obj) : 0));
3469 NdbDictionary::Dictionary::dropLogfileGroup(
const LogfileGroup & lg)
3473 m_impl.dropLogfileGroup(NdbLogfileGroupImpl::getImpl(lg)));
3478 NdbDictionary::Dictionary::getLogfileGroup(
const char * name)
3481 m_impl.m_receiver.get_filegroup(NdbLogfileGroupImpl::getImpl(tmp),
3487 NdbDictionary::Dictionary::createTablespace(
const Tablespace & lg,
3492 m_impl.createTablespace(NdbTablespaceImpl::getImpl(lg),
3494 & NdbDictObjectImpl::getImpl(* obj) : 0));
3499 NdbDictionary::Dictionary::dropTablespace(
const Tablespace & lg)
3503 m_impl.dropTablespace(NdbTablespaceImpl::getImpl(lg)));
3508 NdbDictionary::Dictionary::getTablespace(
const char * name)
3511 m_impl.m_receiver.get_filegroup(NdbTablespaceImpl::getImpl(tmp),
3517 NdbDictionary::Dictionary::getTablespace(Uint32 tablespaceId)
3520 m_impl.m_receiver.get_filegroup(NdbTablespaceImpl::getImpl(tmp),
3527 NdbDictionary::Dictionary::createDatafile(
const Datafile & df,
3533 m_impl.createDatafile(NdbDatafileImpl::getImpl(df),
3535 obj ? & NdbDictObjectImpl::getImpl(* obj): 0));
3540 NdbDictionary::Dictionary::dropDatafile(
const Datafile& df)
3544 m_impl.dropDatafile(NdbDatafileImpl::getImpl(df)));
3549 NdbDictionary::Dictionary::getDatafile(Uint32 node,
const char * path)
3552 m_impl.m_receiver.get_file(NdbDatafileImpl::getImpl(tmp),
3554 node ? (
int)node : -1, path);
3559 NdbDictionary::Dictionary::createUndofile(
const Undofile & df,
3565 m_impl.createUndofile(NdbUndofileImpl::getImpl(df),
3567 obj ? & NdbDictObjectImpl::getImpl(* obj): 0));
3572 NdbDictionary::Dictionary::dropUndofile(
const Undofile& df)
3576 m_impl.dropUndofile(NdbUndofileImpl::getImpl(df)));
3581 NdbDictionary::Dictionary::getUndofile(Uint32 node,
const char * path)
3584 m_impl.m_receiver.get_file(NdbUndofileImpl::getImpl(tmp),
3586 node ? (
int)node : -1, path);
3591 NdbDictionary::Dictionary::invalidateDbGlobal(
const char * name)
3593 if (m_impl.m_globalHash && name != 0)
3595 size_t len = strlen(name);
3596 m_impl.m_globalHash->lock();
3597 m_impl.m_globalHash->invalidateDb(name, len);
3598 m_impl.m_globalHash->unlock();
3605 return m_impl.beginSchemaTrans();
3611 return m_impl.endSchemaTrans(flags);
3617 return m_impl.hasSchemaTrans();
3629 m_impl.m_receiver.create_hashmap(NdbHashMapImpl::getImpl(map),
3630 &NdbDictObjectImpl::getImpl(*dst),