/* Copyright (C) 2014 InfiniDB, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 of the License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /*********************************************************************** * $Id: tabledef.cpp 9210 2013-01-21 14:10:42Z rdempsey $ * * ***********************************************************************/ #include #define DDLPKG_DLLEXPORT #include "ddlpkg.h" #undef DDLPKG_DLLEXPORT namespace ddlpackage { using namespace std; TableDef::~TableDef() { { ColumnDefList::iterator itr; for(itr=fColumns.begin(); itr != fColumns.end(); itr++) { delete *itr; } } { TableConstraintDefList::iterator itr; for(itr=fConstraints.begin(); itr != fConstraints.end(); itr++) { delete *itr; } } delete fQualifiedName; } TableDef::TableDef(QualifiedName* name, TableElementList* elements, TableOptionMap* options) : fQualifiedName(name) { if(options) { fOptions = *options; delete options; } ColumnDef *column; TableConstraintDef *constraint; /* When parsing, it is necessary to collect ColumnDefs and TableConstraintDefs as TableElements. Here we separate them out into separately typed lists. */ TableElementList::iterator itr; for(itr = elements->begin(); itr != elements->end(); ++itr) { column = dynamic_cast(*itr); if(column) { fColumns.push_back(column); } else { constraint = dynamic_cast(*itr); if(constraint) { fConstraints.push_back(constraint); } } } delete elements; } /** \brief Put to ostream. */ ostream& operator<<(ostream& os, const TableDef& tableDef) { os << "CreateTable "; if(tableDef.fQualifiedName->fSchema != "") //cout << tableDef.fQualifiedName->fSchema << "."; os << tableDef.fQualifiedName->fName << " " << tableDef.fConstraints.size() << " table constraints" << endl; { ColumnDefList::const_iterator itr; for(itr = tableDef.fColumns.begin(); itr != tableDef.fColumns.end(); ++itr) { ColumnDef* col = *itr; os << *col << endl; } } { TableConstraintDefList::const_iterator itr; for(itr = tableDef.fConstraints.begin(); itr != tableDef.fConstraints.end(); ++itr) { os << (**itr); } } pair oval; TableOptionMap::const_iterator oitr; os << "Table Options" << endl; if(!tableDef.fOptions.empty()) { TableOptionMap::const_iterator oitr; for(oitr = tableDef.fOptions.begin(); oitr != tableDef.fOptions.end(); ++oitr) { oval = *oitr; os << " " << oval.first << "=" << oval.second << endl; } } return os; } ostream& operator<<(ostream &os, const TableConstraintDef& constraint) { return constraint.put(os); } std::ostream& TableConstraintDef::put(std::ostream& os) const { os << "No!!!" << endl; return os; } TableConstraintDef::TableConstraintDef(DDL_CONSTRAINTS cType) : fConstraintType(cType) { } TableConstraintDef::TableConstraintDef() : fConstraintType(DDL_INVALID_CONSTRAINT) { } TableCheckConstraintDef::TableCheckConstraintDef(const char *check) : TableConstraintDef(DDL_CHECK), fCheck(check) { } std::ostream& TableCheckConstraintDef::put(std::ostream& os) const { os << "Constraint: " << ConstraintString[fConstraintType] << " "; os << "\"" << fCheck << "\""; os << endl; return os; } TableUniqueConstraintDef::TableUniqueConstraintDef(ColumnNameList *columns) : TableConstraintDef(DDL_UNIQUE), fColumnNameList(*columns) { delete columns; } std::ostream& TableUniqueConstraintDef::put(std::ostream& os) const { os << "Constraint: " << fName << " " << ConstraintString[fConstraintType] << " "; ColumnNameList::const_iterator itr; os << "("; for(itr = fColumnNameList.begin(); itr != fColumnNameList.end(); ++itr) { os << *itr << " "; } os << ")"; return os; } TablePrimaryKeyConstraintDef::TablePrimaryKeyConstraintDef(ColumnNameList *columns) : TableConstraintDef(DDL_PRIMARY_KEY), fColumnNameList(*columns) { delete columns; } std::ostream& TablePrimaryKeyConstraintDef::put(std::ostream& os) const { os << "Constraint: " << fName << " " << ConstraintString[fConstraintType] << " "; ColumnNameList::const_iterator itr; os << "("; for(itr = fColumnNameList.begin(); itr != fColumnNameList.end(); ++itr) { os << *itr << " "; } os << ")"; return os; } TableReferencesConstraintDef::TableReferencesConstraintDef (ColumnNameList *columns, QualifiedName *tableName, ColumnNameList *foreignColumns, DDL_MATCH_TYPE matchType, ReferentialAction *refAction) : TableConstraintDef(DDL_REFERENCES), fColumns(*columns), fTableName(tableName), fForeignColumns(*foreignColumns), fMatchType(matchType), fRefAction(refAction) { delete columns; delete foreignColumns; } std::ostream& TableReferencesConstraintDef::put(std::ostream& os) const { os << "Constraint: " << fName << " " << ConstraintString[fConstraintType] << " "; ColumnNameList::const_iterator itr; os << "lcols ("; for(itr = fColumns.begin(); itr != fColumns.end(); ++itr) { os << *itr << " "; } os << ")"; os << " ftable=" << *fTableName; os << " "; os << "fcols ("; for(itr = fForeignColumns.begin(); itr != fForeignColumns.end(); ++itr) { os << *itr << " "; } os << ")"; return os; } std::ostream &operator<<(std::ostream& os, const ColumnNameList &columnNames) { ColumnNameList::const_iterator itr; os << '('; for(itr = columnNames.begin(); itr != columnNames.end(); ++itr) { os << *itr << " "; } os << ')'; return os; } TableReferencesConstraintDef::~TableReferencesConstraintDef() { delete fTableName; delete fRefAction; } }