From: <nn...@us...> - 2009-11-05 14:36:56
|
Revision: 3344 http://tora.svn.sourceforge.net/tora/?rev=3344&view=rev Author: nneul Date: 2009-11-05 14:36:49 +0000 (Thu, 05 Nov 2009) Log Message: ----------- missed files in commit Added Paths: ----------- trunk/tora/src/tooracleextract.h trunk/tora/src/tooracletable.cpp Added: trunk/tora/src/tooracleextract.h =================================================================== --- trunk/tora/src/tooracleextract.h (rev 0) +++ trunk/tora/src/tooracleextract.h 2009-11-05 14:36:49 UTC (rev 3344) @@ -0,0 +1,356 @@ + +/* BEGIN_COMMON_COPYRIGHT_HEADER + * + * TOra - An Oracle Toolkit for DBA's and developers + * + * Shared/mixed copyright is held throughout files in this product + * + * Portions Copyright (C) 2000-2001 Underscore AB + * Portions Copyright (C) 2003-2005 Quest Software, Inc. + * Portions Copyright (C) 2004-2009 Numerous Other Contributors + * + * 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; only version 2 of + * the License is valid for this program. + * + * 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. + * + * As a special exception, you have permission to link this program + * with the Oracle Client libraries and distribute executables, as long + * as you follow the requirements of the GNU GPL in regard to all of the + * software in the executable aside from Oracle client libraries. + * + * Specifically you are not permitted to link this program with the + * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. + * And you are not permitted to distribute binaries compiled against + * these libraries. + * + * You may link this product with any GPL'd Qt library. + * + * All trademarks belong to their respective owners. + * + * END_COMMON_COPYRIGHT_HEADER */ + +#ifndef TO_ORACLEEXTRACT +#define TO_ORACLEEXTRACT + +#include "utils.h" + +#include "toconf.h" +#include "toconnection.h" +#include "toextract.h" +#include "tosql.h" +#include "totool.h" + +#include <qapplication.h> +#include <qregexp.h> + +// Some convenient defines + +static const QString ORACLE_NAME("Oracle"); +#define CONNECTION (ext.connection()) +#define QUOTE(x) (ext.connection().quote(x)) +#define PROMPT (ext.getPrompt()) + +#define addDescription toExtract::addDescription + +class toOracleExtract : public toExtract::extractor +{ +std::list<toExtract::datatype> oracle_datatypes; + // Misc utility functions + + void clearFlags(toExtract &ext) const; + QString displaySource(toExtract &ext, const QString &schema, const QString &owner, + const QString &name, const QString &type, bool describe) const; + QString keyColumns(toExtract &ext, const QString &owner, const QString &name, + const QString &type, const QString &table) const; + QString partitionKeyColumns(toExtract &ext, const QString &owner, + const QString &name, const QString &type) const; + static QString prepareDB(const QString &data); + QString segments(toExtract &ext) const; + QString segments(toExtract &ext, const toSQL &sql) const; + QString subPartitionKeyColumns(toExtract &ext, const QString &owner, + const QString &name, const QString &type) const; + + // Create utility functions + + QString constraintColumns(toExtract &ext, const QString &owner, const QString &name) const; + QString createComments(toExtract &ext, const QString &schema, + const QString &owner, const QString &name) const; + QString createContextPrefs(toExtract &ext, const QString &schema, const QString &owner, + const QString &name, const QString &sql) const; + QString createIOT(toExtract &ext, const QString &schema, const QString &owner, + const QString &name) const; + QString createMView(toExtract &ext, const QString &schema, const QString &owner, + const QString &name, const QString &type) const; + QString createMViewIndex(toExtract &ext, const QString &schema, const QString &owner, + const QString &name) const; + QString createMViewLog(toExtract &ext, const QString &schema, const QString &owner, + const QString &name, const QString &type) const; + QString createMViewTable(toExtract &ext, const QString &schema, const QString &owner, + const QString &name) const; + QString createPartitionedIOT(toExtract &ext, const QString &schema, + const QString &owner, const QString &name) const; + QString createPartitionedIndex(toExtract &ext, const QString &schema, const QString &owner, + const QString &name, const QString &sql) const; + QString createPartitionedTable(toExtract &ext, const QString &schema, + const QString &owner, const QString &name) const; + QString createTableText(toExtract &ext, toQList &result, const QString &schema, + const QString &owner, const QString &name) const; + QString grantedPrivs(toExtract &ext, const QString &dest, const QString &name, int typ) const; + QString indexColumns(toExtract &ext, const QString &indent, const QString &owner, + const QString &name) const; + QString rangePartitions(toExtract &ext, const QString &owner, const QString &name, + const QString &subPartitionType, const QString &caller) const; + QString segmentAttributes(toExtract &ext, toQList &result) const; + QString tableColumns(toExtract &ext, const QString &owner, const QString &name) const; + + // Describe utility functions + void describeAttributes(toExtract &ext, std::list<QString> &dsp, std::list<QString> &ctx, + toQList &result) const; + void describeComments(toExtract &ext, std::list<QString> &lst, std::list<QString> &ctx, + const QString &owner, const QString &name) const; + void describePrivs(toExtract &ext, std::list<QString> &lst, std::list<QString> &ctx, + const QString &name) const; + void describeIOT(toExtract &ext, std::list<QString> &lst, std::list<QString> &ctx, + const QString &schema, const QString &owner, const QString &name) const; + void describeIndexColumns(toExtract &ext, std::list<QString> &lst, std::list<QString> &ctx, + const QString &owner, const QString &name) const; + void describeMView(toExtract &ext, std::list<QString> &lst, const QString &schema, + const QString &owner, const QString &name, const QString &type) const; + void describeMViewIndex(toExtract &ext, std::list<QString> &lst, std::list<QString> &ctx, + const QString &schema, const QString &owner, const QString &name) const; + void describeMViewLog(toExtract &ext, std::list<QString> &lst, const QString &schema, + const QString &owner, const QString &name, const QString &type) const; + void describeMViewTable(toExtract &ext, std::list<QString> &lst, std::list<QString> &ctx, + const QString &schema, const QString &owner, const QString &name) const; + void describePartitions(toExtract &ext, std::list<QString> &lst, std::list<QString> &ctx, + const QString &owner, const QString &name, + const QString &subPartitionType, const QString &caller) const; + void describePartitionedIOT(toExtract &ext, std::list<QString> &lst, std::list<QString> &ctx, + const QString &schema, const QString &owner, + const QString &name) const; + void describePartitionedIndex(toExtract &ext, std::list<QString> &lst, std::list<QString> &ctx, + const QString &schema, const QString &owner, + const QString &name) const; + void describePartitionedTable(toExtract &ext, std::list<QString> &lst, std::list<QString> &ctx, + const QString &schema, const QString &owner, + const QString &name) const; + void describeSource(toExtract &ext, std::list<QString> &lst, const QString &schema, + const QString &owner, const QString &name, const QString &type) const; + void describeTableColumns(toExtract &ext, std::list<QString> &lst, std::list<QString> &ctx, + const QString &owner, const QString &name) const; + void describeTableText(toExtract &ext, std::list<QString> &lst, std::list<QString> &ctx, + toQList &result, const QString &schema, const QString &owner, + const QString &name) const; + + // Migrate utility functions + + QString migrateAttributes(std::list<QString> &desc, + std::list<QString>::iterator i, + int level, + const QString &indent) const; + QString migrateIndexColumns(std::list<QString> &destin, + std::list<QString>::iterator i, + const QString &context) const; + QString migratePartitions(std::list<QString> &desc, + std::list<QString>::iterator &i, + int level, + const QString &indent) const; + QString migratePrivs(toExtract &ext, + std::list<QString> &source, + std::list<QString> &destin, + const QString &type) const; + QString migrateSource(toExtract &ext, + std::list<QString> &source, + std::list<QString> &destin, + const QString &type) const; + QString createTable(std::list<QString> &destin) const; + QString alterTable(std::list<QString> &source, std::list<QString> &destin) const; + + // Create functions + + QString createConstraint(toExtract &ext, const QString &schema, const QString &owner, + const QString &name) const; + QString createDBLink(toExtract &ext, const QString &schema, const QString &owner, + const QString &name) const; + QString createExchangeIndex(toExtract &ext, const QString &schema, const QString &owner, + const QString &name) const; + QString createExchangeTable(toExtract &ext, const QString &schema, const QString &owner, + const QString &name) const; + QString createFunction(toExtract &ext, const QString &schema, const QString &owner, + const QString &name) const; + QString createIndex(toExtract &ext, const QString &schema, const QString &owner, + const QString &name) const; + QString createMaterializedView(toExtract &ext, const QString &schema, const QString &owner, + const QString &name) const; + QString createMaterializedViewLog(toExtract &ext, const QString &schema, const QString &owner, + const QString &name) const; + QString createPackage(toExtract &ext, const QString &schema, const QString &owner, + const QString &name) const; + QString createPackageBody(toExtract &ext, const QString &schema, const QString &owner, + const QString &name) const; + QString createProcedure(toExtract &ext, const QString &schema, const QString &owner, + const QString &name) const; + QString createProfile(toExtract &ext, const QString &schema, const QString &owner, + const QString &name) const; + QString createRole(toExtract &ext, const QString &schema, const QString &owner, + const QString &name) const; + QString createRollbackSegment(toExtract &ext, const QString &schema, const QString &owner, + const QString &name) const; + QString createSequence(toExtract &ext, const QString &schema, const QString &owner, + const QString &name) const; + QString createSnapshot(toExtract &ext, const QString &schema, const QString &owner, + const QString &name) const; + QString createSnapshotLog(toExtract &ext, const QString &schema, const QString &owner, + const QString &name) const; + QString createSynonym(toExtract &ext, const QString &schema, const QString &owner, + const QString &name) const; + QString createTable(toExtract &ext, const QString &schema, const QString &owner, + const QString &name) const; + QString createTableFamily(toExtract &ext, const QString &schema, const QString &owner, + const QString &name) const; + void createTableContents(toExtract &ext, QTextStream &stream, + const QString &schema, const QString &owner, const QString &name) const; + QString createTableReferences(toExtract &ext, const QString &schema, const QString &owner, + const QString &name) const; + QString createTablespace(toExtract &ext, const QString &schema, const QString &owner, + const QString &name) const; + QString createTrigger(toExtract &ext, const QString &schema, const QString &owner, + const QString &name) const; + QString createType(toExtract &ext, const QString &schema, const QString &owner, + const QString &name) const; + QString createUser(toExtract &ext, const QString &schema, const QString &owner, + const QString &name) const; + QString createView(toExtract &ext, const QString &schema, const QString &owner, + const QString &name) const; + + // Describe functions + void describeConstraint(toExtract &ext, std::list<QString> &lst, const QString &schema, + const QString &owner, const QString &name) const; + void describeDBLink(toExtract &ext, std::list<QString> &lst, const QString &schema, + const QString &owner, const QString &name) const; + void describeExchangeIndex(toExtract &ext, std::list<QString> &lst, const QString &schema, + const QString &owner, const QString &name) const; + void describeExchangeTable(toExtract &ext, std::list<QString> &lst, const QString &schema, + const QString &owner, const QString &name) const; + void describeFunction(toExtract &ext, std::list<QString> &lst, const QString &schema, + const QString &owner, const QString &name) const; + void describeIndex(toExtract &ext, std::list<QString> &lst, const QString &schema, + const QString &owner, const QString &name) const; + void describeMaterializedView(toExtract &ext, std::list<QString> &lst, const QString &schema, + const QString &owner, const QString &name) const; + void describeMaterializedViewLog(toExtract &ext, std::list<QString> &lst, const QString &schema, + const QString &owner, const QString &name) const; + void describePackage(toExtract &ext, std::list<QString> &lst, const QString &schema, + const QString &owner, const QString &name) const; + void describePackageBody(toExtract &ext, std::list<QString> &lst, const QString &schema, + const QString &owner, const QString &name) const; + void describeProcedure(toExtract &ext, std::list<QString> &lst, const QString &schema, + const QString &owner, const QString &name) const; + void describeProfile(toExtract &ext, std::list<QString> &lst, const QString &schema, + const QString &owner, const QString &name) const; + void describeRole(toExtract &ext, std::list<QString> &lst, const QString &schema, + const QString &owner, const QString &name) const; + void describeRollbackSegment(toExtract &ext, std::list<QString> &lst, const QString &schema, + const QString &owner, const QString &name) const; + void describeSequence(toExtract &ext, std::list<QString> &lst, const QString &schema, + const QString &owner, const QString &name) const; + void describeSnapshot(toExtract &ext, std::list<QString> &lst, const QString &schema, + const QString &owner, const QString &name) const; + void describeSnapshotLog(toExtract &ext, std::list<QString> &lst, const QString &schema, + const QString &owner, const QString &name) const; + void describeSynonym(toExtract &ext, std::list<QString> &lst, const QString &schema, + const QString &owner, const QString &name) const; + void describeTable(toExtract &ext, std::list<QString> &lst, const QString &schema, + const QString &owner, const QString &name) const; + void describeTableFamily(toExtract &ext, std::list<QString> &lst, const QString &schema, + const QString &owner, const QString &name) const; + void describeTableReferences(toExtract &ext, std::list<QString> &lst, const QString &schema, + const QString &owner, const QString &name) const; + void describeTablespace(toExtract &ext, std::list<QString> &lst, const QString &schema, + const QString &owner, const QString &name) const; + void describeTrigger(toExtract &ext, std::list<QString> &lst, const QString &schema, + const QString &owner, const QString &name) const; + void describeType(toExtract &ext, std::list<QString> &lst, const QString &schema, + const QString &owner, const QString &name) const; + void describeUser(toExtract &ext, std::list<QString> &lst, const QString &schema, + const QString &owner, const QString &name) const; + void describeView(toExtract &ext, std::list<QString> &lst, const QString &schema, + const QString &owner, const QString &name) const; + + // Drop functions + QString dropConstraint(toExtract &ext, const QString &schema, const QString &owner, + const QString &type, const QString &name) const; + QString dropDatabaseLink(toExtract &ext, const QString &schema, const QString &owner, + const QString &type, const QString &name) const; + QString dropMViewLog(toExtract &ext, const QString &schema, const QString &owner, + const QString &type, const QString &name) const; + QString dropObject(toExtract &ext, const QString &schema, const QString &owner, + const QString &type, const QString &name) const; + QString dropProfile(toExtract &ext, const QString &schema, const QString &owner, + const QString &type, const QString &name) const; + QString dropSchemaObject(toExtract &ext, const QString &schema, const QString &owner, + const QString &type, const QString &name) const; + QString dropSynonym(toExtract &ext, const QString &schema, const QString &owner, + const QString &type, const QString &name) const; + QString dropTable(toExtract &ext, const QString &schema, const QString &owner, + const QString &type, const QString &name) const; + QString dropTablespace(toExtract &ext, const QString &schema, const QString &owner, + const QString &type, const QString &name) const; + QString dropUser(toExtract &ext, const QString &schema, const QString &owner, + const QString &type, const QString &name) const; + + // Migrate functions + QString migrateConstraint(toExtract &ext, std::list<QString> &source, + std::list<QString> &destin) const; + QString migrateDBLink(toExtract &ext, std::list<QString> &source, + std::list<QString> &destin) const; + QString migrateFunction(toExtract &ext, std::list<QString> &source, + std::list<QString> &destin) const; + QString migrateIndex(toExtract &ext, std::list<QString> &source, + std::list<QString> &destin) const; + QString migratePackage(toExtract &ext, std::list<QString> &source, + std::list<QString> &destin) const; + QString migratePackageBody(toExtract &ext, std::list<QString> &source, + std::list<QString> &destin) const; + QString migrateProcedure(toExtract &ext, std::list<QString> &source, + std::list<QString> &destin) const; + QString migrateRole(toExtract &ext, std::list<QString> &source, + std::list<QString> &destin) const; + QString migrateSequence(toExtract &ext, std::list<QString> &source, + std::list<QString> &destin) const; + QString migrateTable(toExtract &ext, std::list<QString> &source, + std::list<QString> &destin) const; +public: + // Public interface + + toOracleExtract(); + virtual ~toOracleExtract(); + + virtual void initialize(toExtract &ext) const; + virtual void create(toExtract &ext, QTextStream &stream, + const QString &type, const QString &schema, + const QString &owner, const QString &name) const; + virtual void describe(toExtract &ext, std::list<QString> &lst, const QString &type, + const QString &schema, const QString &owner, const QString &name) const; + virtual void drop(toExtract &ext, QTextStream &stream, const QString &type, const QString &schema, + const QString &owner, const QString &name) const; + virtual void migrate(toExtract &ext, + QTextStream &stream, + const QString &type, + std::list<QString> &src, + std::list<QString> &dst) const; + +virtual std::list<toExtract::datatype> datatypes() const; +}; + +#endif Added: trunk/tora/src/tooracletable.cpp =================================================================== --- trunk/tora/src/tooracletable.cpp (rev 0) +++ trunk/tora/src/tooracletable.cpp 2009-11-05 14:36:49 UTC (rev 3344) @@ -0,0 +1,228 @@ +#include "tooracleextract.h" + +// the same function as in tooracleextract.cpp should probably be moved to toextract.cpp? +static bool SameContext(const QString &str, const QString &str2) +{ + if (str.startsWith(str2)) + { + if (str.length() == str2.length()) + return true; + if (str.length() > str2.length() && + str.at(str2.length()) == QChar('\001')) + return true; + } + return false; +} // SameContext + +/*********************************************************************************** +Purpose: Create new table +TODO: Maybe toExtract::parseColumnDescription should be used to extract columns? +************************************************************************************/ +QString toOracleExtract::createTable(std::list<QString> &destin) const +{ + QString context; // grouping properties of one entity (for example one column) + + QString schema_name; + QString table_name; + QString tablespace; + std::list<QString> table_columns; + QString column_name; // extract data to these variables before ... + QString column_type; // ... combining and pushing to table_columns list + + QString tmp; + QString tmp1; + bool first_column = true; + + // Part I - go through given rows and extract table information into local structures + std::list<QString>::iterator i = destin.begin(); + + while (i != destin.end()) { + tmp = toExtract::partDescribe(*i, 3); + if (tmp.isNull()) { + // part 3 (starting from 0) is null only for table name description + if (!table_name.isNull()) { + // if table_name already filled in - error in data or this code + throw qApp->translate("toExtract", "Too many table definitions"); + } + schema_name = toExtract::partDescribe(*i, 0); + tmp = toExtract::partDescribe(*i, 1); + if (tmp != "TABLE") { + throw qApp->translate("toExtract", "Unkown string %s").arg(*i); + } + table_name = toExtract::partDescribe(*i, 2); + } else { + if (!SameContext(*i, context)) { + if (!context.isNull()) { + table_columns.insert(table_columns.end(), column_name + " " + column_type); + column_name == ""; + } + context = toExtract::contextDescribe(*i, 1); + } + if (tmp == "COLUMN") { + tmp1 = toExtract::partDescribe(*i, 5); + if (tmp1.isNull()) { + column_name = toExtract::partDescribe(*i, 4); + } else if (tmp1 == "ORDER") { + // nothing to do with ORDER + } else { + column_type = tmp1; + } + } else if (tmp == "TABLESPACE") { + tablespace = toExtract::partDescribe(*i, 4); + } else { + throw qApp->translate("toExtract", "Unkown string %s").arg(*i); + } + } // if context.isNull + i++; + } // while + if (!column_name.isNull()) { + table_columns.insert(table_columns.end(), column_name + " " + column_type); + } + + // Part II - generate oracle create table statement from data in local structures + // table header + tmp = "create table " + schema_name + "." + table_name + "("; + + // table body + for (std::list<QString>::iterator i = table_columns.begin(); i != table_columns.end(); i++) { + if (!first_column) { + tmp += ","; + first_column = false; + } + tmp += ("\n" + *i); + } // for + + // table footer + tmp += ")"; + if (!tablespace.isNull()) + tmp += ("\ntablespace " + tablespace); + + return tmp; +} // createTable + +/*********************************************************************************** +Purpose: Alter existing table +************************************************************************************/ +QString toOracleExtract::alterTable(std::list<QString> &source, + std::list<QString> &destin) const +{ + std::list<QString> drop; // will hold table properties being removed + std::list<QString> create; // will hold table properties being added + toExtract::srcDst2DropCreate(source, destin, drop, create); + + QString statements; + QString context = ""; + QString table_name; + QString new_table_name; + QString column_name = "", column_type; + QString tmp, tmp1; + bool add_column = true; + + // drop statements + for (std::list<QString>::iterator i = drop.begin(); i != drop.end(); i++) { +printf(">>%s\n", (*i).toAscii().constData()); + table_name = toExtract::partDescribe(*i, 2); + tmp = toExtract::partDescribe(*i, 3); + if (!SameContext(*i, context)) { + if (context != "") { + if (column_name != "") + statements += ("alter table " + table_name + " drop column " + column_name + ";\n"); + column_name = ""; + } + context = toExtract::contextDescribe(*i, 1); + } + + if (tmp == "COLUMN") { + tmp1 = toExtract::partDescribe(*i, 5); + if (tmp1.isNull()) { +printf("qqqqq\n"); + column_name = toExtract::partDescribe(*i, 4); + } else if (tmp1 == "ORDER") { + // nothing to do with ORDER + } + } else { + throw qApp->translate("toExtract", "Unkown string %s").arg(tmp); + } + } + if (column_name != "") { + statements += ("alter table " + table_name + " drop column " + column_name + ";\n"); + } + + // add/modify/rename statements + column_name = ""; + context = ""; + for (std::list<QString>::iterator i = create.begin();i != create.end();i++) { + + table_name = toExtract::partDescribe(*i, 2); + tmp = toExtract::partDescribe(*i, 3); + if (!SameContext(*i, context)) { + if (context != "") { + if (add_column) + statements += ("alter table " + table_name + " add (" + column_name + " " + column_type + ");\n"); + column_name == ""; + add_column = true; + } + context = toExtract::contextDescribe(*i, 1); + } + + if (tmp == "COLUMN") { + tmp1 = toExtract::partDescribe(*i, 5); + if (tmp1.isNull()) { + column_name = toExtract::partDescribe(*i, 4); + } else if (tmp1 == "MODIFY") { + add_column = false; + tmp = toExtract::partDescribe(*i, 6); + column_name = toExtract::partDescribe(*i, 4); + statements += ("alter table " + table_name + " modify (" + column_name + " " + tmp + ");\n"); + } else if (tmp1 == "RENAME") { + add_column = false; + tmp = toExtract::partDescribe(*i, 6); + column_name = toExtract::partDescribe(*i, 4); + statements += ("alter table " + table_name + " rename column " + column_name + " to " + tmp + ";\n"); + } else if (tmp1 == "ORDER") { + // nothing to do with ORDER + } else { + column_type = tmp1; + } + } else if (tmp == "RENAME") { + new_table_name = toExtract::partDescribe(*i, 4); + add_column = false; + } else { + throw qApp->translate("toExtract", "Unkown string %s").arg(tmp); + } + } + if (column_name != "") { + if (add_column) + statements += ("alter table " + table_name + " add (" + column_name + " " + column_type + ");\n"); + } + + if (!new_table_name.isNull()) + statements += ("rename table " + table_name + " to " + new_table_name + ";"); + + return statements; +} // alterTable + +/*********************************************************************************** + Main function for table creation/altering called from tobrowsertable.cpp + It will call either createTable either alterTable +************************************************************************************/ +QString toOracleExtract::migrateTable(toExtract &ext, std::list<QString> &source, + std::list<QString> &destin) const +{ + printf("source=\n"); + for (std::list<QString>::iterator i = source.begin(); i != source.end(); i++) { + printf("%s\n", i->toAscii().constData()); + } + printf("destin=\n"); + for (std::list<QString>::iterator i = destin.begin();i != destin.end();i++) { + printf("%s\n", i->toAscii().constData()); + } + + if (source.empty()) { + printf("New table has to be created.\n"); + return createTable(destin); + } else { + printf("Existing table is to be modified.\n"); + return alterTable(source, destin); + } +} // migrateTable This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |