1
0
mirror of https://github.com/MariaDB/server.git synced 2025-05-27 01:57:48 +03:00
mariadb/ndb/src/ndbapi/NdbDictionary.cpp
unknown dbff1150c5 ndb - fix old decimal type mysql vs ndb
mysql-test/r/ndb_index_ordered.result:
  fix old decimal type mysql vs ndb (re-commit 3)
mysql-test/t/ndb_index_ordered.test:
  fix old decimal type mysql vs ndb (re-commit 3)
ndb/include/kernel/signaldata/DictTabInfo.hpp:
  fix old decimal type mysql vs ndb (re-commit 3)
ndb/include/ndbapi/NdbDictionary.hpp:
  fix old decimal type mysql vs ndb (re-commit 3)
ndb/include/util/NdbSqlUtil.hpp:
  fix old decimal type mysql vs ndb (re-commit 3)
ndb/src/common/util/NdbSqlUtil.cpp:
  fix old decimal type mysql vs ndb (re-commit 3)
ndb/src/ndbapi/NdbDictionary.cpp:
  fix old decimal type mysql vs ndb (re-commit 3)
ndb/src/ndbapi/NdbDictionaryImpl.cpp:
  fix old decimal type mysql vs ndb (re-commit 3)
ndb/src/ndbapi/NdbRecAttr.cpp:
  fix old decimal type mysql vs ndb (re-commit 3)
ndb/test/include/NdbSchemaOp.hpp:
  fix old decimal type mysql vs ndb (re-commit 3)
ndb/tools/restore/consumer.cpp:
  fix old decimal type mysql vs ndb (re-commit 3)
sql/ha_ndbcluster.cc:
  fix old decimal type mysql vs ndb (re-commit 3)
2005-02-16 12:45:59 +01:00

986 lines
20 KiB
C++

/* Copyright (C) 2003 MySQL AB
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
#include <NdbDictionary.hpp>
#include "NdbDictionaryImpl.hpp"
#include <NdbOut.hpp>
/*****************************************************************
* Column facade
*/
NdbDictionary::Column::Column(const char * name)
: m_impl(* new NdbColumnImpl(* this))
{
setName(name);
}
NdbDictionary::Column::Column(const NdbDictionary::Column & org)
: m_impl(* new NdbColumnImpl(* this))
{
m_impl = org.m_impl;
}
NdbDictionary::Column::Column(NdbColumnImpl& impl)
: m_impl(impl)
{
}
NdbDictionary::Column::~Column(){
NdbColumnImpl * tmp = &m_impl;
if(this != tmp){
delete tmp;
}
}
NdbDictionary::Column&
NdbDictionary::Column::operator=(const NdbDictionary::Column& column)
{
m_impl = column.m_impl;
return *this;
}
void
NdbDictionary::Column::setName(const char * name){
m_impl.m_name.assign(name);
}
const char*
NdbDictionary::Column::getName() const {
return m_impl.m_name.c_str();
}
void
NdbDictionary::Column::setType(Type t){
m_impl.init(t);
}
NdbDictionary::Column::Type
NdbDictionary::Column::getType() const {
return m_impl.m_type;
}
void
NdbDictionary::Column::setPrecision(int val){
m_impl.m_precision = val;
}
int
NdbDictionary::Column::getPrecision() const {
return m_impl.m_precision;
}
void
NdbDictionary::Column::setScale(int val){
m_impl.m_scale = val;
}
int
NdbDictionary::Column::getScale() const{
return m_impl.m_scale;
}
void
NdbDictionary::Column::setLength(int length){
m_impl.m_length = length;
}
int
NdbDictionary::Column::getLength() const{
return m_impl.m_length;
}
void
NdbDictionary::Column::setInlineSize(int size)
{
m_impl.m_precision = size;
}
void
NdbDictionary::Column::setCharset(CHARSET_INFO* cs)
{
m_impl.m_cs = cs;
}
CHARSET_INFO*
NdbDictionary::Column::getCharset() const
{
return m_impl.m_cs;
}
int
NdbDictionary::Column::getInlineSize() const
{
return m_impl.m_precision;
}
void
NdbDictionary::Column::setPartSize(int size)
{
m_impl.m_scale = size;
}
int
NdbDictionary::Column::getPartSize() const
{
return m_impl.m_scale;
}
void
NdbDictionary::Column::setStripeSize(int size)
{
m_impl.m_length = size;
}
int
NdbDictionary::Column::getStripeSize() const
{
return m_impl.m_length;
}
int
NdbDictionary::Column::getSize() const{
return m_impl.m_attrSize;
}
void
NdbDictionary::Column::setNullable(bool val){
m_impl.m_nullable = val;
}
bool
NdbDictionary::Column::getNullable() const {
return m_impl.m_nullable;
}
void
NdbDictionary::Column::setPrimaryKey(bool val){
m_impl.m_pk = val;
}
bool
NdbDictionary::Column::getPrimaryKey() const {
return m_impl.m_pk;
}
void
NdbDictionary::Column::setTupleKey(bool val){
m_impl.m_tupleKey = val;
}
bool
NdbDictionary::Column::getTupleKey() const {
return m_impl.m_tupleKey;
}
void
NdbDictionary::Column::setDistributionKey(bool val){
m_impl.m_distributionKey = val;
}
bool
NdbDictionary::Column::getDistributionKey() const{
return m_impl.m_distributionKey;
}
void
NdbDictionary::Column::setDistributionGroup(bool val, int bits){
m_impl.m_distributionGroup = val;
m_impl.m_distributionGroupBits = bits;
}
bool
NdbDictionary::Column::getDistributionGroup() const {
return m_impl.m_distributionGroup;
}
int
NdbDictionary::Column::getDistributionGroupBits() const{
return m_impl.m_distributionGroupBits;
}
void
NdbDictionary::Column::setIndexOnlyStorage(bool val){
m_impl.m_indexOnly = val;
}
bool
NdbDictionary::Column::getIndexOnlyStorage() const {
return m_impl.m_indexOnly;
}
const NdbDictionary::Table *
NdbDictionary::Column::getBlobTable() const {
NdbTableImpl * t = m_impl.m_blobTable;
if (t)
return t->m_facade;
return 0;
}
void
NdbDictionary::Column::setAutoIncrement(bool val){
m_impl.m_autoIncrement = val;
}
bool
NdbDictionary::Column::getAutoIncrement() const {
return m_impl.m_autoIncrement;
}
void
NdbDictionary::Column::setAutoIncrementInitialValue(Uint64 val){
m_impl.m_autoIncrementInitialValue = val;
}
void
NdbDictionary::Column::setDefaultValue(const char* defaultValue)
{
m_impl.m_defaultValue.assign(defaultValue);
}
const char*
NdbDictionary::Column::getDefaultValue() const
{
return m_impl.m_defaultValue.c_str();
}
int
NdbDictionary::Column::getColumnNo() const {
return m_impl.m_attrId;
}
bool
NdbDictionary::Column::equal(const NdbDictionary::Column & col) const {
return m_impl.equal(col.m_impl);
}
/*****************************************************************
* Table facade
*/
NdbDictionary::Table::Table(const char * name)
: m_impl(* new NdbTableImpl(* this))
{
setName(name);
}
NdbDictionary::Table::Table(const NdbDictionary::Table & org)
: NdbDictionary::Object(),
m_impl(* new NdbTableImpl(* this))
{
m_impl.assign(org.m_impl);
}
NdbDictionary::Table::Table(NdbTableImpl & impl)
: m_impl(impl)
{
}
NdbDictionary::Table::~Table(){
NdbTableImpl * tmp = &m_impl;
if(this != tmp){
delete tmp;
}
}
NdbDictionary::Table&
NdbDictionary::Table::operator=(const NdbDictionary::Table& table)
{
m_impl.assign(table.m_impl);
m_impl.m_facade = this;
return *this;
}
void
NdbDictionary::Table::setName(const char * name){
m_impl.setName(name);
}
const char *
NdbDictionary::Table::getName() const {
return m_impl.getName();
}
int
NdbDictionary::Table::getTableId() const {
return m_impl.m_tableId;
}
void
NdbDictionary::Table::addColumn(const Column & c){
NdbColumnImpl* col = new NdbColumnImpl;
(* col) = NdbColumnImpl::getImpl(c);
m_impl.m_columns.push_back(col);
if(c.getPrimaryKey()){
m_impl.m_noOfKeys++;
}
if (col->getBlobType()) {
m_impl.m_noOfBlobs++;
}
m_impl.buildColumnHash();
}
const NdbDictionary::Column*
NdbDictionary::Table::getColumn(const char * name) const {
return m_impl.getColumn(name);
}
const NdbDictionary::Column*
NdbDictionary::Table::getColumn(const int attrId) const {
return m_impl.getColumn(attrId);
}
NdbDictionary::Column*
NdbDictionary::Table::getColumn(const char * name)
{
return m_impl.getColumn(name);
}
NdbDictionary::Column*
NdbDictionary::Table::getColumn(const int attrId)
{
return m_impl.getColumn(attrId);
}
void
NdbDictionary::Table::setLogging(bool val){
m_impl.m_logging = val;
}
bool
NdbDictionary::Table::getLogging() const {
return m_impl.m_logging;
}
void
NdbDictionary::Table::setFragmentType(FragmentType ft){
m_impl.m_fragmentType = ft;
}
NdbDictionary::Object::FragmentType
NdbDictionary::Table::getFragmentType() const {
return m_impl.m_fragmentType;
}
void
NdbDictionary::Table::setKValue(int kValue){
m_impl.m_kvalue = kValue;
}
int
NdbDictionary::Table::getKValue() const {
return m_impl.m_kvalue;
}
void
NdbDictionary::Table::setMinLoadFactor(int lf){
m_impl.m_minLoadFactor = lf;
}
int
NdbDictionary::Table::getMinLoadFactor() const {
return m_impl.m_minLoadFactor;
}
void
NdbDictionary::Table::setMaxLoadFactor(int lf){
m_impl.m_maxLoadFactor = lf;
}
int
NdbDictionary::Table::getMaxLoadFactor() const {
return m_impl.m_maxLoadFactor;
}
int
NdbDictionary::Table::getNoOfColumns() const {
return m_impl.m_columns.size();
}
int
NdbDictionary::Table::getNoOfPrimaryKeys() const {
return m_impl.m_noOfKeys;
}
const char*
NdbDictionary::Table::getPrimaryKey(int no) const {
int count = 0;
for (unsigned i = 0; i < m_impl.m_columns.size(); i++) {
if (m_impl.m_columns[i]->m_pk) {
if (count++ == no)
return m_impl.m_columns[i]->m_name.c_str();
}
}
return 0;
}
const void*
NdbDictionary::Table::getFrmData() const {
return m_impl.m_frm.get_data();
}
Uint32
NdbDictionary::Table::getFrmLength() const {
return m_impl.m_frm.length();
}
void
NdbDictionary::Table::setFrm(const void* data, Uint32 len){
m_impl.m_frm.assign(data, len);
}
NdbDictionary::Object::Status
NdbDictionary::Table::getObjectStatus() const {
return m_impl.m_status;
}
int
NdbDictionary::Table::getObjectVersion() const {
return m_impl.m_version;
}
bool
NdbDictionary::Table::equal(const NdbDictionary::Table & col) const {
return m_impl.equal(col.m_impl);
}
int
NdbDictionary::Table::getRowSizeInBytes() const {
int sz = 0;
for(int i = 0; i<getNoOfColumns(); i++){
const NdbDictionary::Column * c = getColumn(i);
const NdbColumnImpl & col = NdbColumnImpl::getImpl(* c);
sz += (((col.m_attrSize * col.m_arraySize) + 3) / 4);
}
return sz * 4;
}
int
NdbDictionary::Table::createTableInDb(Ndb* pNdb, bool equalOk) const {
const NdbDictionary::Table * pTab =
pNdb->getDictionary()->getTable(getName());
if(pTab != 0 && equal(* pTab))
return 0;
if(pTab != 0 && !equal(* pTab))
return -1;
return pNdb->getDictionary()->createTable(* this);
}
/*****************************************************************
* Index facade
*/
NdbDictionary::Index::Index(const char * name)
: m_impl(* new NdbIndexImpl(* this))
{
setName(name);
}
NdbDictionary::Index::Index(NdbIndexImpl & impl)
: m_impl(impl)
{
}
NdbDictionary::Index::~Index(){
NdbIndexImpl * tmp = &m_impl;
if(this != tmp){
delete tmp;
}
}
void
NdbDictionary::Index::setName(const char * name){
m_impl.setName(name);
}
const char *
NdbDictionary::Index::getName() const {
return m_impl.getName();
}
void
NdbDictionary::Index::setTable(const char * table){
m_impl.setTable(table);
}
const char *
NdbDictionary::Index::getTable() const {
return m_impl.getTable();
}
unsigned
NdbDictionary::Index::getNoOfColumns() const {
return m_impl.m_columns.size();
}
int
NdbDictionary::Index::getNoOfIndexColumns() const {
return m_impl.m_columns.size();
}
const NdbDictionary::Column *
NdbDictionary::Index::getColumn(unsigned no) const {
if(no < m_impl.m_columns.size())
return m_impl.m_columns[no];
return NULL;
}
const char *
NdbDictionary::Index::getIndexColumn(int no) const {
const NdbDictionary::Column* col = getColumn(no);
if (col)
return col->getName();
else
return NULL;
}
void
NdbDictionary::Index::addColumn(const Column & c){
NdbColumnImpl* col = new NdbColumnImpl;
(* col) = NdbColumnImpl::getImpl(c);
m_impl.m_columns.push_back(col);
}
void
NdbDictionary::Index::addColumnName(const char * name){
const Column c(name);
addColumn(c);
}
void
NdbDictionary::Index::addIndexColumn(const char * name){
const Column c(name);
addColumn(c);
}
void
NdbDictionary::Index::addColumnNames(unsigned noOfNames, const char ** names){
for(unsigned i = 0; i < noOfNames; i++) {
const Column c(names[i]);
addColumn(c);
}
}
void
NdbDictionary::Index::addIndexColumns(int noOfNames, const char ** names){
for(int i = 0; i < noOfNames; i++) {
const Column c(names[i]);
addColumn(c);
}
}
void
NdbDictionary::Index::setType(NdbDictionary::Index::Type t){
m_impl.m_type = t;
}
NdbDictionary::Index::Type
NdbDictionary::Index::getType() const {
return m_impl.m_type;
}
void
NdbDictionary::Index::setLogging(bool val){
m_impl.m_logging = val;
}
bool
NdbDictionary::Index::getLogging() const {
return m_impl.m_logging;
}
NdbDictionary::Object::Status
NdbDictionary::Index::getObjectStatus() const {
return m_impl.m_status;
}
int
NdbDictionary::Index::getObjectVersion() const {
return m_impl.m_version;
}
/*****************************************************************
* Event facade
*/
NdbDictionary::Event::Event(const char * name)
: m_impl(* new NdbEventImpl(* this))
{
setName(name);
}
NdbDictionary::Event::Event(NdbEventImpl & impl)
: m_impl(impl)
{
}
NdbDictionary::Event::~Event()
{
NdbEventImpl * tmp = &m_impl;
if(this != tmp){
delete tmp;
}
}
void
NdbDictionary::Event::setName(const char * name)
{
m_impl.setName(name);
}
void
NdbDictionary::Event::setTable(const char * table)
{
m_impl.setTable(table);
}
void
NdbDictionary::Event::addTableEvent(const TableEvent t)
{
m_impl.addTableEvent(t);
}
void
NdbDictionary::Event::setDurability(const EventDurability d)
{
m_impl.setDurability(d);
}
void
NdbDictionary::Event::addColumn(const Column & c){
NdbColumnImpl* col = new NdbColumnImpl;
(* col) = NdbColumnImpl::getImpl(c);
m_impl.m_columns.push_back(col);
}
void
NdbDictionary::Event::addEventColumn(unsigned attrId)
{
m_impl.m_attrIds.push_back(attrId);
}
void
NdbDictionary::Event::addEventColumn(const char * name)
{
const Column c(name);
addColumn(c);
}
void
NdbDictionary::Event::addEventColumns(int n, const char ** names)
{
for (int i = 0; i < n; i++)
addEventColumn(names[i]);
}
NdbDictionary::Object::Status
NdbDictionary::Event::getObjectStatus() const
{
return m_impl.m_status;
}
int
NdbDictionary::Event::getObjectVersion() const
{
return m_impl.m_version;
}
void NdbDictionary::Event::print()
{
m_impl.print();
}
/*****************************************************************
* Dictionary facade
*/
NdbDictionary::Dictionary::Dictionary(Ndb & ndb)
: m_impl(* new NdbDictionaryImpl(ndb, *this))
{
}
NdbDictionary::Dictionary::Dictionary(NdbDictionaryImpl & impl)
: m_impl(impl)
{
}
NdbDictionary::Dictionary::~Dictionary(){
NdbDictionaryImpl * tmp = &m_impl;
if(this != tmp){
delete tmp;
}
}
int
NdbDictionary::Dictionary::createTable(const Table & t){
return m_impl.createTable(NdbTableImpl::getImpl(t));
}
int
NdbDictionary::Dictionary::dropTable(Table & t){
return m_impl.dropTable(NdbTableImpl::getImpl(t));
}
int
NdbDictionary::Dictionary::dropTable(const char * name){
return m_impl.dropTable(name);
}
int
NdbDictionary::Dictionary::alterTable(const Table & t){
return m_impl.alterTable(NdbTableImpl::getImpl(t));
}
const NdbDictionary::Table *
NdbDictionary::Dictionary::getTable(const char * name, void **data){
NdbTableImpl * t = m_impl.getTable(name, data);
if(t)
return t->m_facade;
return 0;
}
void NdbDictionary::Dictionary::set_local_table_data_size(unsigned sz)
{
m_impl.m_local_table_data_size= sz;
}
const NdbDictionary::Table *
NdbDictionary::Dictionary::getTable(const char * name){
return getTable(name, 0);
}
void
NdbDictionary::Dictionary::invalidateTable(const char * name){
NdbTableImpl * t = m_impl.getTable(name);
if(t)
m_impl.invalidateObject(* t);
}
void
NdbDictionary::Dictionary::removeCachedTable(const char * name){
NdbTableImpl * t = m_impl.getTable(name);
if(t)
m_impl.removeCachedObject(* t);
}
int
NdbDictionary::Dictionary::createIndex(const Index & ind)
{
return m_impl.createIndex(NdbIndexImpl::getImpl(ind));
}
int
NdbDictionary::Dictionary::dropIndex(const char * indexName,
const char * tableName)
{
return m_impl.dropIndex(indexName, tableName);
}
const NdbDictionary::Index *
NdbDictionary::Dictionary::getIndex(const char * indexName,
const char * tableName)
{
NdbIndexImpl * i = m_impl.getIndex(indexName, tableName);
if(i)
return i->m_facade;
return 0;
}
void
NdbDictionary::Dictionary::invalidateIndex(const char * indexName,
const char * tableName){
NdbIndexImpl * i = m_impl.getIndex(indexName, tableName);
if(i) {
assert(i->m_table != 0);
m_impl.invalidateObject(* i->m_table);
}
}
void
NdbDictionary::Dictionary::removeCachedIndex(const char * indexName,
const char * tableName){
NdbIndexImpl * i = m_impl.getIndex(indexName, tableName);
if(i) {
assert(i->m_table != 0);
m_impl.removeCachedObject(* i->m_table);
}
}
const NdbDictionary::Table *
NdbDictionary::Dictionary::getIndexTable(const char * indexName,
const char * tableName)
{
NdbIndexImpl * i = m_impl.getIndex(indexName, tableName);
NdbTableImpl * t = m_impl.getTable(tableName);
if(i && t) {
NdbTableImpl * it = m_impl.getIndexTable(i, t);
return it->m_facade;
}
return 0;
}
int
NdbDictionary::Dictionary::createEvent(const Event & ev)
{
return m_impl.createEvent(NdbEventImpl::getImpl(ev));
}
int
NdbDictionary::Dictionary::dropEvent(const char * eventName)
{
return m_impl.dropEvent(eventName);
}
const NdbDictionary::Event *
NdbDictionary::Dictionary::getEvent(const char * eventName)
{
NdbEventImpl * t = m_impl.getEvent(eventName);
if(t)
return t->m_facade;
return 0;
}
int
NdbDictionary::Dictionary::listObjects(List& list, Object::Type type)
{
return m_impl.listObjects(list, type);
}
int
NdbDictionary::Dictionary::listIndexes(List& list, const char * tableName)
{
const NdbDictionary::Table* tab= getTable(tableName);
if(tab == 0)
{
return -1;
}
return m_impl.listIndexes(list, tab->getTableId());
}
const struct NdbError &
NdbDictionary::Dictionary::getNdbError() const {
return m_impl.getNdbError();
}
// printers
NdbOut&
operator<<(NdbOut& out, const NdbDictionary::Column& col)
{
const CHARSET_INFO *cs = col.getCharset();
const char *csname = cs ? cs->name : "?";
out << col.getName() << " ";
switch (col.getType()) {
case NdbDictionary::Column::Tinyint:
out << "Tinyint";
break;
case NdbDictionary::Column::Tinyunsigned:
out << "Tinyunsigned";
break;
case NdbDictionary::Column::Smallint:
out << "Smallint";
break;
case NdbDictionary::Column::Smallunsigned:
out << "Smallunsigned";
break;
case NdbDictionary::Column::Mediumint:
out << "Mediumint";
break;
case NdbDictionary::Column::Mediumunsigned:
out << "Mediumunsigned";
break;
case NdbDictionary::Column::Int:
out << "Int";
break;
case NdbDictionary::Column::Unsigned:
out << "Unsigned";
break;
case NdbDictionary::Column::Bigint:
out << "Bigint";
break;
case NdbDictionary::Column::Bigunsigned:
out << "Bigunsigned";
break;
case NdbDictionary::Column::Float:
out << "Float";
break;
case NdbDictionary::Column::Double:
out << "Double";
break;
case NdbDictionary::Column::Olddecimal:
out << "Olddecimal(" << col.getPrecision() << "," << col.getScale() << ")";
break;
case NdbDictionary::Column::Olddecimalunsigned:
out << "Olddecimalunsigned(" << col.getPrecision() << "," << col.getScale() << ")";
break;
case NdbDictionary::Column::Char:
out << "Char(" << col.getLength() << ";" << csname << ")";
break;
case NdbDictionary::Column::Varchar:
out << "Varchar(" << col.getLength() << ";" << csname << ")";
break;
case NdbDictionary::Column::Binary:
out << "Binary(" << col.getLength() << ")";
break;
case NdbDictionary::Column::Varbinary:
out << "Varbinary(" << col.getLength() << ")";
break;
case NdbDictionary::Column::Datetime:
out << "Datetime";
break;
case NdbDictionary::Column::Date:
out << "Date";
break;
case NdbDictionary::Column::Blob:
out << "Blob(" << col.getInlineSize() << "," << col.getPartSize()
<< ";" << col.getStripeSize() << ")";
break;
case NdbDictionary::Column::Text:
out << "Text(" << col.getInlineSize() << "," << col.getPartSize()
<< ";" << col.getStripeSize() << ";" << csname << ")";
break;
case NdbDictionary::Column::Time:
out << "Time";
break;
case NdbDictionary::Column::Year:
out << "Year";
break;
case NdbDictionary::Column::Timestamp:
out << "Timestamp";
break;
case NdbDictionary::Column::Undefined:
out << "Undefined";
break;
default:
out << "Type" << (Uint32)col.getType();
break;
}
if (col.getPrimaryKey())
out << " PRIMARY KEY";
else if (! col.getNullable())
out << " NOT NULL";
else
out << " NULL";
if (col.getDistributionKey())
out << " DISTRIBUTION KEY";
return out;
}
const NdbDictionary::Column * NdbDictionary::Column::FRAGMENT = 0;
const NdbDictionary::Column * NdbDictionary::Column::ROW_COUNT = 0;
const NdbDictionary::Column * NdbDictionary::Column::COMMIT_COUNT = 0;