NdbDictionary.cpp
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:20k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #include <NdbDictionary.hpp>
  14. #include "NdbDictionaryImpl.hpp"
  15. #include <NdbOut.hpp>
  16. /*****************************************************************
  17.  * Column facade
  18.  */
  19. NdbDictionary::Column::Column(const char * name) 
  20.   : m_impl(* new NdbColumnImpl(* this))
  21. {
  22.   setName(name);
  23. }
  24. NdbDictionary::Column::Column(const NdbDictionary::Column & org)
  25.   : m_impl(* new NdbColumnImpl(* this))
  26. {
  27.   m_impl = org.m_impl;
  28. }
  29. NdbDictionary::Column::Column(NdbColumnImpl& impl)
  30.   : m_impl(impl)
  31. {
  32. }
  33. NdbDictionary::Column::~Column(){
  34.   NdbColumnImpl * tmp = &m_impl;  
  35.   if(this != tmp){
  36.     delete tmp;
  37.   }
  38. }
  39. NdbDictionary::Column&
  40. NdbDictionary::Column::operator=(const NdbDictionary::Column& column)
  41. {
  42.   m_impl = column.m_impl;
  43.   
  44.   return *this;
  45. }
  46. void 
  47. NdbDictionary::Column::setName(const char * name){
  48.   m_impl.m_name.assign(name);
  49. }
  50. const char* 
  51. NdbDictionary::Column::getName() const {
  52.   return m_impl.m_name.c_str();
  53. }
  54. void
  55. NdbDictionary::Column::setType(Type t){
  56.   m_impl.init(t);
  57. }
  58. NdbDictionary::Column::Type 
  59. NdbDictionary::Column::getType() const {
  60.   return m_impl.m_type;
  61. }
  62. void 
  63. NdbDictionary::Column::setPrecision(int val){
  64.   m_impl.m_precision = val;
  65. }
  66. int 
  67. NdbDictionary::Column::getPrecision() const {
  68.   return m_impl.m_precision;
  69. }
  70. void 
  71. NdbDictionary::Column::setScale(int val){
  72.   m_impl.m_scale = val;
  73. }
  74. int 
  75. NdbDictionary::Column::getScale() const{
  76.   return m_impl.m_scale;
  77. }
  78. void
  79. NdbDictionary::Column::setLength(int length){
  80.   m_impl.m_length = length;
  81. }
  82. int 
  83. NdbDictionary::Column::getLength() const{
  84.   return m_impl.m_length;
  85. }
  86. void
  87. NdbDictionary::Column::setInlineSize(int size)
  88. {
  89.   m_impl.m_precision = size;
  90. }
  91. void
  92. NdbDictionary::Column::setCharset(CHARSET_INFO* cs)
  93. {
  94.   m_impl.m_cs = cs;
  95. }
  96. CHARSET_INFO*
  97. NdbDictionary::Column::getCharset() const
  98. {
  99.   return m_impl.m_cs;
  100. }
  101. int
  102. NdbDictionary::Column::getInlineSize() const
  103. {
  104.   return m_impl.m_precision;
  105. }
  106. void
  107. NdbDictionary::Column::setPartSize(int size)
  108. {
  109.   m_impl.m_scale = size;
  110. }
  111. int
  112. NdbDictionary::Column::getPartSize() const
  113. {
  114.   return m_impl.m_scale;
  115. }
  116. void
  117. NdbDictionary::Column::setStripeSize(int size)
  118. {
  119.   m_impl.m_length = size;
  120. }
  121. int
  122. NdbDictionary::Column::getStripeSize() const
  123. {
  124.   return m_impl.m_length;
  125. }
  126. int 
  127. NdbDictionary::Column::getSize() const{
  128.   return m_impl.m_attrSize;
  129. }
  130. void 
  131. NdbDictionary::Column::setNullable(bool val){
  132.   m_impl.m_nullable = val;
  133. }
  134. bool 
  135. NdbDictionary::Column::getNullable() const {
  136.   return m_impl.m_nullable;
  137. }
  138. void 
  139. NdbDictionary::Column::setPrimaryKey(bool val){
  140.   m_impl.m_pk = val;
  141. }
  142. bool 
  143. NdbDictionary::Column::getPrimaryKey() const {
  144.   return m_impl.m_pk;
  145. }
  146. void
  147. NdbDictionary::Column::setTupleKey(bool val){
  148.   m_impl.m_tupleKey = val;
  149. }
  150. bool 
  151. NdbDictionary::Column::getTupleKey() const {
  152.   return m_impl.m_tupleKey;
  153. }
  154. void 
  155. NdbDictionary::Column::setDistributionKey(bool val){
  156.   m_impl.m_distributionKey = val;
  157. }
  158. bool 
  159. NdbDictionary::Column::getDistributionKey() const{
  160.   return m_impl.m_distributionKey;
  161. }
  162. void
  163. NdbDictionary::Column::setDistributionGroup(bool val, int bits){
  164.   m_impl.m_distributionGroup = val;
  165.   m_impl.m_distributionGroupBits = bits;
  166. }
  167. bool 
  168. NdbDictionary::Column::getDistributionGroup() const {
  169.   return m_impl.m_distributionGroup;
  170. }
  171. int 
  172. NdbDictionary::Column::getDistributionGroupBits() const{
  173.   return m_impl.m_distributionGroupBits;
  174. }
  175. void 
  176. NdbDictionary::Column::setIndexOnlyStorage(bool val){
  177.   m_impl.m_indexOnly = val;
  178. }
  179. bool 
  180. NdbDictionary::Column::getIndexOnlyStorage() const {
  181.   return m_impl.m_indexOnly;
  182. }
  183. const NdbDictionary::Table * 
  184. NdbDictionary::Column::getBlobTable() const {
  185.   NdbTableImpl * t = m_impl.m_blobTable;
  186.   if (t)
  187.     return t->m_facade;
  188.   return 0;
  189. }
  190. void 
  191. NdbDictionary::Column::setAutoIncrement(bool val){
  192.   m_impl.m_autoIncrement = val;
  193. }
  194. bool 
  195. NdbDictionary::Column::getAutoIncrement() const {
  196.   return m_impl.m_autoIncrement;
  197. }
  198. void
  199. NdbDictionary::Column::setAutoIncrementInitialValue(Uint64 val){
  200.   m_impl.m_autoIncrementInitialValue = val;
  201. }
  202. void
  203. NdbDictionary::Column::setDefaultValue(const char* defaultValue)
  204. {
  205.   m_impl.m_defaultValue.assign(defaultValue);
  206. }
  207. const char*
  208. NdbDictionary::Column::getDefaultValue() const
  209. {
  210.   return m_impl.m_defaultValue.c_str();
  211. }
  212. int
  213. NdbDictionary::Column::getColumnNo() const {
  214.   return m_impl.m_attrId;
  215. }
  216. bool
  217. NdbDictionary::Column::equal(const NdbDictionary::Column & col) const {
  218.   return m_impl.equal(col.m_impl);
  219. }
  220. /*****************************************************************
  221.  * Table facade
  222.  */
  223. NdbDictionary::Table::Table(const char * name)
  224.   : m_impl(* new NdbTableImpl(* this)) 
  225. {
  226.   setName(name);
  227. }
  228. NdbDictionary::Table::Table(const NdbDictionary::Table & org)
  229.   : NdbDictionary::Object(),
  230.     m_impl(* new NdbTableImpl(* this))
  231. {
  232.   m_impl.assign(org.m_impl);
  233. }
  234. NdbDictionary::Table::Table(NdbTableImpl & impl)
  235.   : m_impl(impl)
  236. {
  237. }
  238. NdbDictionary::Table::~Table(){
  239.   NdbTableImpl * tmp = &m_impl;  
  240.   if(this != tmp){
  241.     delete tmp;
  242.   }
  243. }
  244. NdbDictionary::Table&
  245. NdbDictionary::Table::operator=(const NdbDictionary::Table& table)
  246. {
  247.   m_impl.assign(table.m_impl);
  248.   
  249.   m_impl.m_facade = this;
  250.   return *this;
  251. }
  252. void 
  253. NdbDictionary::Table::setName(const char * name){
  254.   m_impl.setName(name);
  255. }
  256. const char * 
  257. NdbDictionary::Table::getName() const {
  258.   return m_impl.getName();
  259. }
  260. int
  261. NdbDictionary::Table::getTableId() const {
  262.   return m_impl.m_tableId;
  263. }
  264. void 
  265. NdbDictionary::Table::addColumn(const Column & c){
  266.   NdbColumnImpl* col = new NdbColumnImpl;
  267.   (* col) = NdbColumnImpl::getImpl(c);
  268.   m_impl.m_columns.push_back(col);
  269.   if(c.getPrimaryKey()){
  270.     m_impl.m_noOfKeys++;
  271.   }
  272.   if (col->getBlobType()) {
  273.     m_impl.m_noOfBlobs++;
  274.   }
  275.   m_impl.buildColumnHash();
  276. }
  277. const NdbDictionary::Column*
  278. NdbDictionary::Table::getColumn(const char * name) const {
  279.   return m_impl.getColumn(name);
  280. }
  281. const NdbDictionary::Column* 
  282. NdbDictionary::Table::getColumn(const int attrId) const {
  283.   return m_impl.getColumn(attrId);
  284. }
  285. NdbDictionary::Column*
  286. NdbDictionary::Table::getColumn(const char * name) 
  287. {
  288.   return m_impl.getColumn(name);
  289. }
  290. NdbDictionary::Column* 
  291. NdbDictionary::Table::getColumn(const int attrId)
  292. {
  293.   return m_impl.getColumn(attrId);
  294. }
  295. void
  296. NdbDictionary::Table::setLogging(bool val){
  297.   m_impl.m_logging = val;
  298. }
  299. bool 
  300. NdbDictionary::Table::getLogging() const {
  301.   return m_impl.m_logging;
  302. }
  303. void
  304. NdbDictionary::Table::setFragmentType(FragmentType ft){
  305.   m_impl.m_fragmentType = ft;
  306. }
  307. NdbDictionary::Object::FragmentType 
  308. NdbDictionary::Table::getFragmentType() const {
  309.   return m_impl.m_fragmentType;
  310. }
  311. void 
  312. NdbDictionary::Table::setKValue(int kValue){
  313.   m_impl.m_kvalue = kValue;
  314. }
  315. int
  316. NdbDictionary::Table::getKValue() const {
  317.   return m_impl.m_kvalue;
  318. }
  319. void 
  320. NdbDictionary::Table::setMinLoadFactor(int lf){
  321.   m_impl.m_minLoadFactor = lf;
  322. }
  323. int 
  324. NdbDictionary::Table::getMinLoadFactor() const {
  325.   return m_impl.m_minLoadFactor;
  326. }
  327. void 
  328. NdbDictionary::Table::setMaxLoadFactor(int lf){
  329.   m_impl.m_maxLoadFactor = lf;  
  330. }
  331. int 
  332. NdbDictionary::Table::getMaxLoadFactor() const {
  333.   return m_impl.m_maxLoadFactor;
  334. }
  335. int
  336. NdbDictionary::Table::getNoOfColumns() const {
  337.   return m_impl.m_columns.size();
  338. }
  339. int
  340. NdbDictionary::Table::getNoOfPrimaryKeys() const {
  341.   return m_impl.m_noOfKeys;
  342. }
  343. const char*
  344. NdbDictionary::Table::getPrimaryKey(int no) const {
  345.   int count = 0;
  346.   for (unsigned i = 0; i < m_impl.m_columns.size(); i++) {
  347.     if (m_impl.m_columns[i]->m_pk) {
  348.       if (count++ == no)
  349.         return m_impl.m_columns[i]->m_name.c_str();
  350.     }
  351.   }
  352.   return 0;
  353. }
  354. const void* 
  355. NdbDictionary::Table::getFrmData() const {
  356.   return m_impl.m_frm.get_data();
  357. }
  358. Uint32
  359. NdbDictionary::Table::getFrmLength() const {
  360.   return m_impl.m_frm.length();
  361. }
  362. void
  363. NdbDictionary::Table::setFrm(const void* data, Uint32 len){
  364.   m_impl.m_frm.assign(data, len);
  365. }
  366. NdbDictionary::Object::Status
  367. NdbDictionary::Table::getObjectStatus() const {
  368.   return m_impl.m_status;
  369. }
  370. int 
  371. NdbDictionary::Table::getObjectVersion() const {
  372.   return m_impl.m_version;
  373. }
  374. bool
  375. NdbDictionary::Table::equal(const NdbDictionary::Table & col) const {
  376.   return m_impl.equal(col.m_impl);
  377. }
  378. int
  379. NdbDictionary::Table::getRowSizeInBytes() const {  
  380.   int sz = 0;
  381.   for(int i = 0; i<getNoOfColumns(); i++){
  382.     const NdbDictionary::Column * c = getColumn(i);
  383.     const NdbColumnImpl & col = NdbColumnImpl::getImpl(* c);
  384.     sz += (((col.m_attrSize * col.m_arraySize) + 3) / 4);
  385.   }
  386.   return sz * 4;
  387. }
  388. int
  389. NdbDictionary::Table::createTableInDb(Ndb* pNdb, bool equalOk) const {  
  390.   const NdbDictionary::Table * pTab = 
  391.     pNdb->getDictionary()->getTable(getName());
  392.   if(pTab != 0 && equal(* pTab))
  393.     return 0;
  394.   if(pTab != 0 && !equal(* pTab))
  395.     return -1;
  396.   return pNdb->getDictionary()->createTable(* this);
  397. }
  398. /*****************************************************************
  399.  * Index facade
  400.  */
  401. NdbDictionary::Index::Index(const char * name)
  402.   : m_impl(* new NdbIndexImpl(* this))
  403. {
  404.   setName(name);
  405. }
  406. NdbDictionary::Index::Index(NdbIndexImpl & impl)
  407.   : m_impl(impl) 
  408. {
  409. }
  410. NdbDictionary::Index::~Index(){
  411.   NdbIndexImpl * tmp = &m_impl;  
  412.   if(this != tmp){
  413.     delete tmp;
  414.   }
  415. }
  416. void 
  417. NdbDictionary::Index::setName(const char * name){
  418.   m_impl.setName(name);
  419. }
  420. const char * 
  421. NdbDictionary::Index::getName() const {
  422.   return m_impl.getName();
  423. }
  424. void 
  425. NdbDictionary::Index::setTable(const char * table){
  426.   m_impl.setTable(table);
  427. }
  428. const char * 
  429. NdbDictionary::Index::getTable() const {
  430.   return m_impl.getTable();
  431. }
  432. unsigned
  433. NdbDictionary::Index::getNoOfColumns() const {
  434.   return m_impl.m_columns.size();
  435. }
  436. int
  437. NdbDictionary::Index::getNoOfIndexColumns() const {
  438.   return m_impl.m_columns.size();
  439. }
  440. const NdbDictionary::Column *
  441. NdbDictionary::Index::getColumn(unsigned no) const {
  442.   if(no < m_impl.m_columns.size())
  443.     return m_impl.m_columns[no];
  444.   return NULL;
  445. }
  446. const char *
  447. NdbDictionary::Index::getIndexColumn(int no) const {
  448.   const NdbDictionary::Column* col = getColumn(no);
  449.   if (col)
  450.     return col->getName();
  451.   else
  452.     return NULL;
  453. }
  454. void
  455. NdbDictionary::Index::addColumn(const Column & c){
  456.   NdbColumnImpl* col = new NdbColumnImpl;
  457.   (* col) = NdbColumnImpl::getImpl(c);
  458.   m_impl.m_columns.push_back(col);
  459. }
  460. void
  461. NdbDictionary::Index::addColumnName(const char * name){
  462.   const Column c(name);
  463.   addColumn(c);
  464. }
  465. void
  466. NdbDictionary::Index::addIndexColumn(const char * name){
  467.   const Column c(name);
  468.   addColumn(c);
  469. }
  470. void
  471. NdbDictionary::Index::addColumnNames(unsigned noOfNames, const char ** names){
  472.   for(unsigned i = 0; i < noOfNames; i++) {
  473.     const Column c(names[i]);
  474.     addColumn(c);
  475.   }
  476. }
  477. void
  478. NdbDictionary::Index::addIndexColumns(int noOfNames, const char ** names){
  479.   for(int i = 0; i < noOfNames; i++) {
  480.     const Column c(names[i]);
  481.     addColumn(c);
  482.   }
  483. }
  484. void
  485. NdbDictionary::Index::setType(NdbDictionary::Index::Type t){
  486.   m_impl.m_type = t;
  487. }
  488. NdbDictionary::Index::Type
  489. NdbDictionary::Index::getType() const {
  490.   return m_impl.m_type;
  491. }
  492. void
  493. NdbDictionary::Index::setLogging(bool val){
  494.   m_impl.m_logging = val;
  495. }
  496. bool 
  497. NdbDictionary::Index::getLogging() const {
  498.   return m_impl.m_logging;
  499. }
  500. NdbDictionary::Object::Status
  501. NdbDictionary::Index::getObjectStatus() const {
  502.   return m_impl.m_status;
  503. }
  504. int 
  505. NdbDictionary::Index::getObjectVersion() const {
  506.   return m_impl.m_version;
  507. }
  508. /*****************************************************************
  509.  * Event facade
  510.  */
  511. NdbDictionary::Event::Event(const char * name)
  512.   : m_impl(* new NdbEventImpl(* this))
  513. {
  514.   setName(name);
  515. }
  516. NdbDictionary::Event::Event(NdbEventImpl & impl)
  517.   : m_impl(impl) 
  518. {
  519. }
  520. NdbDictionary::Event::~Event()
  521. {
  522.   NdbEventImpl * tmp = &m_impl;
  523.   if(this != tmp){
  524.     delete tmp;
  525.   }
  526. }
  527. void 
  528. NdbDictionary::Event::setName(const char * name)
  529. {
  530.   m_impl.setName(name);
  531. }
  532. void 
  533. NdbDictionary::Event::setTable(const char * table)
  534. {
  535.   m_impl.setTable(table);
  536. }
  537. void
  538. NdbDictionary::Event::addTableEvent(const TableEvent t)
  539. {
  540.   m_impl.addTableEvent(t);
  541. }
  542. void
  543. NdbDictionary::Event::setDurability(const EventDurability d)
  544. {
  545.   m_impl.setDurability(d);
  546. }
  547. void
  548. NdbDictionary::Event::addColumn(const Column & c){
  549.   NdbColumnImpl* col = new NdbColumnImpl;
  550.   (* col) = NdbColumnImpl::getImpl(c);
  551.   m_impl.m_columns.push_back(col);
  552. }
  553. void
  554. NdbDictionary::Event::addEventColumn(unsigned attrId)
  555. {
  556.   m_impl.m_attrIds.push_back(attrId);
  557. }
  558. void
  559. NdbDictionary::Event::addEventColumn(const char * name)
  560. {
  561.   const Column c(name);
  562.   addColumn(c);
  563. }
  564. void
  565. NdbDictionary::Event::addEventColumns(int n, const char ** names)
  566. {
  567.   for (int i = 0; i < n; i++)
  568.     addEventColumn(names[i]);
  569. }
  570. NdbDictionary::Object::Status
  571. NdbDictionary::Event::getObjectStatus() const
  572. {
  573.   return m_impl.m_status;
  574. }
  575. int 
  576. NdbDictionary::Event::getObjectVersion() const
  577. {
  578.   return m_impl.m_version;
  579. }
  580. void NdbDictionary::Event::print()
  581. {
  582.   m_impl.print();
  583. }
  584. /*****************************************************************
  585.  * Dictionary facade
  586.  */
  587. NdbDictionary::Dictionary::Dictionary(Ndb & ndb)
  588.   : m_impl(* new NdbDictionaryImpl(ndb, *this))
  589. {
  590. }
  591. NdbDictionary::Dictionary::Dictionary(NdbDictionaryImpl & impl)
  592.   : m_impl(impl) 
  593. {
  594. }
  595. NdbDictionary::Dictionary::~Dictionary(){
  596.   NdbDictionaryImpl * tmp = &m_impl;  
  597.   if(this != tmp){
  598.     delete tmp;
  599.   }
  600. }
  601. int 
  602. NdbDictionary::Dictionary::createTable(const Table & t){
  603.   return m_impl.createTable(NdbTableImpl::getImpl(t));
  604. }
  605. int
  606. NdbDictionary::Dictionary::dropTable(Table & t){
  607.   return m_impl.dropTable(NdbTableImpl::getImpl(t));
  608. }
  609. int
  610. NdbDictionary::Dictionary::dropTable(const char * name){
  611.   return m_impl.dropTable(name);
  612. }
  613. int
  614. NdbDictionary::Dictionary::alterTable(const Table & t){
  615.   return m_impl.alterTable(NdbTableImpl::getImpl(t));
  616. }
  617. const NdbDictionary::Table * 
  618. NdbDictionary::Dictionary::getTable(const char * name, void **data){
  619.   NdbTableImpl * t = m_impl.getTable(name, data);
  620.   if(t)
  621.     return t->m_facade;
  622.   return 0;
  623. }
  624. void NdbDictionary::Dictionary::set_local_table_data_size(unsigned sz)
  625. {
  626.   m_impl.m_local_table_data_size= sz;
  627. }
  628. const NdbDictionary::Table * 
  629. NdbDictionary::Dictionary::getTable(const char * name){
  630.   return getTable(name, 0);
  631. }
  632. void
  633. NdbDictionary::Dictionary::invalidateTable(const char * name){
  634.   NdbTableImpl * t = m_impl.getTable(name);
  635.   if(t)
  636.     m_impl.invalidateObject(* t);
  637. }
  638. void
  639. NdbDictionary::Dictionary::removeCachedTable(const char * name){
  640.   NdbTableImpl * t = m_impl.getTable(name);
  641.   if(t)
  642.     m_impl.removeCachedObject(* t);
  643. }
  644. int
  645. NdbDictionary::Dictionary::createIndex(const Index & ind)
  646. {
  647.   return m_impl.createIndex(NdbIndexImpl::getImpl(ind));
  648. }
  649. int 
  650. NdbDictionary::Dictionary::dropIndex(const char * indexName,
  651.      const char * tableName)
  652. {
  653.   return m_impl.dropIndex(indexName, tableName);
  654. }
  655. const NdbDictionary::Index * 
  656. NdbDictionary::Dictionary::getIndex(const char * indexName,
  657.     const char * tableName)
  658. {
  659.   NdbIndexImpl * i = m_impl.getIndex(indexName, tableName);
  660.   if(i)
  661.     return i->m_facade;
  662.   return 0;
  663. }
  664. void
  665. NdbDictionary::Dictionary::invalidateIndex(const char * indexName,
  666.                                            const char * tableName){
  667.   NdbIndexImpl * i = m_impl.getIndex(indexName, tableName);
  668.   if(i) {
  669.     assert(i->m_table != 0);
  670.     m_impl.invalidateObject(* i->m_table);
  671.   }
  672. }
  673. void
  674. NdbDictionary::Dictionary::removeCachedIndex(const char * indexName,
  675.      const char * tableName){
  676.   NdbIndexImpl * i = m_impl.getIndex(indexName, tableName);
  677.   if(i) {
  678.     assert(i->m_table != 0);
  679.     m_impl.removeCachedObject(* i->m_table);
  680.   }
  681. }
  682. const NdbDictionary::Table *
  683. NdbDictionary::Dictionary::getIndexTable(const char * indexName, 
  684.  const char * tableName)
  685. {
  686.   NdbIndexImpl * i = m_impl.getIndex(indexName, tableName);
  687.   NdbTableImpl * t = m_impl.getTable(tableName);
  688.   if(i && t) {
  689.     NdbTableImpl * it = m_impl.getIndexTable(i, t);
  690.     return it->m_facade;
  691.   }
  692.   return 0;
  693. }
  694. int
  695. NdbDictionary::Dictionary::createEvent(const Event & ev)
  696. {
  697.   return m_impl.createEvent(NdbEventImpl::getImpl(ev));
  698. }
  699. int 
  700. NdbDictionary::Dictionary::dropEvent(const char * eventName)
  701. {
  702.   return m_impl.dropEvent(eventName);
  703. }
  704. const NdbDictionary::Event *
  705. NdbDictionary::Dictionary::getEvent(const char * eventName)
  706. {
  707.   NdbEventImpl * t = m_impl.getEvent(eventName);
  708.   if(t)
  709.     return t->m_facade;
  710.   return 0;
  711. }
  712. int
  713. NdbDictionary::Dictionary::listObjects(List& list, Object::Type type)
  714. {
  715.   return m_impl.listObjects(list, type);
  716. }
  717. int
  718. NdbDictionary::Dictionary::listIndexes(List& list, const char * tableName)
  719. {
  720.   const NdbDictionary::Table* tab= getTable(tableName);
  721.   if(tab == 0)
  722.   {
  723.     return -1;
  724.   }
  725.   return m_impl.listIndexes(list, tab->getTableId());
  726. }
  727. const struct NdbError & 
  728. NdbDictionary::Dictionary::getNdbError() const {
  729.   return m_impl.getNdbError();
  730. }
  731. // printers
  732. NdbOut&
  733. operator<<(NdbOut& out, const NdbDictionary::Column& col)
  734. {
  735.   const CHARSET_INFO *cs = col.getCharset();
  736.   const char *csname = cs ? cs->name : "?";
  737.   out << col.getName() << " ";
  738.   switch (col.getType()) {
  739.   case NdbDictionary::Column::Tinyint:
  740.     out << "Tinyint";
  741.     break;
  742.   case NdbDictionary::Column::Tinyunsigned:
  743.     out << "Tinyunsigned";
  744.     break;
  745.   case NdbDictionary::Column::Smallint:
  746.     out << "Smallint";
  747.     break;
  748.   case NdbDictionary::Column::Smallunsigned:
  749.     out << "Smallunsigned";
  750.     break;
  751.   case NdbDictionary::Column::Mediumint:
  752.     out << "Mediumint";
  753.     break;
  754.   case NdbDictionary::Column::Mediumunsigned:
  755.     out << "Mediumunsigned";
  756.     break;
  757.   case NdbDictionary::Column::Int:
  758.     out << "Int";
  759.     break;
  760.   case NdbDictionary::Column::Unsigned:
  761.     out << "Unsigned";
  762.     break;
  763.   case NdbDictionary::Column::Bigint:
  764.     out << "Bigint";
  765.     break;
  766.   case NdbDictionary::Column::Bigunsigned:
  767.     out << "Bigunsigned";
  768.     break;
  769.   case NdbDictionary::Column::Float:
  770.     out << "Float";
  771.     break;
  772.   case NdbDictionary::Column::Double:
  773.     out << "Double";
  774.     break;
  775.   case NdbDictionary::Column::Olddecimal:
  776.     out << "Olddecimal(" << col.getPrecision() << "," << col.getScale() << ")";
  777.     break;
  778.   case NdbDictionary::Column::Olddecimalunsigned:
  779.     out << "Olddecimalunsigned(" << col.getPrecision() << "," << col.getScale() << ")";
  780.     break;
  781.   case NdbDictionary::Column::Char:
  782.     out << "Char(" << col.getLength() << ";" << csname << ")";
  783.     break;
  784.   case NdbDictionary::Column::Varchar:
  785.     out << "Varchar(" << col.getLength() << ";" << csname << ")";
  786.     break;
  787.   case NdbDictionary::Column::Binary:
  788.     out << "Binary(" << col.getLength() << ")";
  789.     break;
  790.   case NdbDictionary::Column::Varbinary:
  791.     out << "Varbinary(" << col.getLength() << ")";
  792.     break;
  793.   case NdbDictionary::Column::Datetime:
  794.     out << "Datetime";
  795.     break;
  796.   case NdbDictionary::Column::Date:
  797.     out << "Date";
  798.     break;
  799.   case NdbDictionary::Column::Blob:
  800.     out << "Blob(" << col.getInlineSize() << "," << col.getPartSize()
  801.         << ";" << col.getStripeSize() << ")";
  802.     break;
  803.   case NdbDictionary::Column::Text:
  804.     out << "Text(" << col.getInlineSize() << "," << col.getPartSize()
  805.         << ";" << col.getStripeSize() << ";" << csname << ")";
  806.     break;
  807.   case NdbDictionary::Column::Time:
  808.     out << "Time";
  809.     break;
  810.   case NdbDictionary::Column::Year:
  811.     out << "Year";
  812.     break;
  813.   case NdbDictionary::Column::Timestamp:
  814.     out << "Timestamp";
  815.     break;
  816.   case NdbDictionary::Column::Undefined:
  817.     out << "Undefined";
  818.     break;
  819.   default:
  820.     out << "Type" << (Uint32)col.getType();
  821.     break;
  822.   }
  823.   if (col.getPrimaryKey())
  824.     out << " PRIMARY KEY";
  825.   else if (! col.getNullable())
  826.     out << " NOT NULL";
  827.   else
  828.     out << " NULL";
  829.   if (col.getDistributionKey())
  830.     out << " DISTRIBUTION KEY";
  831.   
  832.   return out;
  833. }
  834. const NdbDictionary::Column * NdbDictionary::Column::FRAGMENT = 0;
  835. const NdbDictionary::Column * NdbDictionary::Column::ROW_COUNT = 0;
  836. const NdbDictionary::Column * NdbDictionary::Column::COMMIT_COUNT = 0;