From b18953565b68e46289ad85927d79f5978a51078b Mon Sep 17 00:00:00 2001 From: Tamas Bunth Date: Tue, 24 Apr 2018 19:10:24 +0200 Subject: tdf#116980 Add constraints after data migration MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit So there won't be any violation problems while migrating data. If there is a constraint created in a "CREATE TABLE..." statement, then cut it off and move it to a separate "ALTER TABLE ... ADD CONSTRAINT" statement. Change-Id: I7245ba8b23a6239cd3b724815a6385b9e6c17a91 Reviewed-on: https://gerrit.libreoffice.org/53508 Tested-by: Jenkins Reviewed-by: Tamás Bunth --- dbaccess/source/filter/hsqldb/fbcreateparser.cxx | 8 ------- dbaccess/source/filter/hsqldb/hsqlimport.cxx | 11 ++++++++- dbaccess/source/filter/hsqldb/parseschema.cxx | 29 +++++++++++++++++------- dbaccess/source/filter/hsqldb/parseschema.hxx | 15 ++++++++++-- 4 files changed, 44 insertions(+), 19 deletions(-) (limited to 'dbaccess') diff --git a/dbaccess/source/filter/hsqldb/fbcreateparser.cxx b/dbaccess/source/filter/hsqldb/fbcreateparser.cxx index 3a16aab196a3..2208ce12d272 100644 --- a/dbaccess/source/filter/hsqldb/fbcreateparser.cxx +++ b/dbaccess/source/filter/hsqldb/fbcreateparser.cxx @@ -164,14 +164,6 @@ OUString FbCreateStmtParser::compose() const sSql.append(","); } - // foreign keys - const std::vector& sForeignParts = getForeignParts(); - for (const auto& sPart : sForeignParts) - { - sSql.append(","); - sSql.append(sPart); - } - sSql.append(")"); // end of column declaration return sSql.makeStringAndClear(); } diff --git a/dbaccess/source/filter/hsqldb/hsqlimport.cxx b/dbaccess/source/filter/hsqldb/hsqlimport.cxx index c5f77cef12ef..409ad54447d1 100644 --- a/dbaccess/source/filter/hsqldb/hsqlimport.cxx +++ b/dbaccess/source/filter/hsqldb/hsqlimport.cxx @@ -291,7 +291,9 @@ void HsqlImporter::importHsqlDatabase() assert(m_xStorage); SchemaParser parser(m_xStorage); - SqlStatementVector statements = parser.parseSchema(); + parser.parseSchema(); + + auto statements = parser.getCreateStatements(); if (statements.size() < 1) { @@ -312,6 +314,13 @@ void HsqlImporter::importHsqlDatabase() std::vector aColTypes = parser.getTableColumnTypes(tableIndex.first); parseTableRows(tableIndex.second, aColTypes, tableIndex.first); } + + // alter stmts + for (const auto& sSql : parser.getAlterStatements()) + { + Reference statement = m_rConnection->createStatement(); + statement->executeQuery(sSql); + } } } diff --git a/dbaccess/source/filter/hsqldb/parseschema.cxx b/dbaccess/source/filter/hsqldb/parseschema.cxx index 489f78a7d4b3..25f26ed7e626 100644 --- a/dbaccess/source/filter/hsqldb/parseschema.cxx +++ b/dbaccess/source/filter/hsqldb/parseschema.cxx @@ -76,6 +76,16 @@ public: return string::split(m_sql, u' ')[2]; } }; + +OUString lcl_createAlterForeign(const OUString& sForeignPart, const OUString& sTableName) +{ + OUStringBuffer sBuff("ALTER TABLE "); + sBuff.append(sTableName); + sBuff.append(" ADD "); + sBuff.append(sForeignPart); + return sBuff.makeStringAndClear(); +} + } // anonymous namespace namespace dbahsql @@ -91,7 +101,7 @@ SchemaParser::SchemaParser(Reference& rStorage) { } -SqlStatementVector SchemaParser::parseSchema() +void SchemaParser::parseSchema() { assert(m_rStorage); @@ -99,7 +109,7 @@ SqlStatementVector SchemaParser::parseSchema() if (!m_rStorage->hasByName(SCHEMA_FILENAME)) { SAL_WARN("dbaccess", "script file does not exist in storage during hsqldb import"); - return SqlStatementVector{}; + return; } Reference xStream(m_rStorage->openStreamElement(SCHEMA_FILENAME, ElementModes::READ)); @@ -109,7 +119,6 @@ SqlStatementVector SchemaParser::parseSchema() xTextInput->setEncoding("UTF-8"); xTextInput->setInputStream(xStream->getInputStream()); - SqlStatementVector parsedStatements; while (!xTextInput->isEOF()) { // every line contains exactly one DDL statement @@ -128,11 +137,17 @@ SqlStatementVector SchemaParser::parseSchema() FbCreateStmtParser aCreateParser; aCreateParser.parse(sSql); + for (const auto& foreignParts : aCreateParser.getForeignParts()) + { + m_sAlterStatements.push_back( + lcl_createAlterForeign(foreignParts, aCreateParser.getTableName())); + } + sSql = aCreateParser.compose(); // save column definitions m_ColumnTypes[aCreateParser.getTableName()] = aCreateParser.getColumnDef(); - parsedStatements.push_back(sSql); + m_sCreateStatements.push_back(sSql); } else if (sSql.startsWith("ALTER")) { @@ -141,13 +156,11 @@ SqlStatementVector SchemaParser::parseSchema() OUString parsedStmt = aAlterParser.compose(); if (!parsedStmt.isEmpty()) - parsedStatements.push_back(parsedStmt); + m_sAlterStatements.push_back(parsedStmt); } else if (sSql.startsWith("CREATE VIEW")) - parsedStatements.push_back(sSql); + m_sCreateStatements.push_back(sSql); } - - return parsedStatements; } ColumnTypeVector SchemaParser::getTableColumnTypes(const OUString& sTableName) const diff --git a/dbaccess/source/filter/hsqldb/parseschema.hxx b/dbaccess/source/filter/hsqldb/parseschema.hxx index 94e72c815717..a46e7ae4fdb6 100644 --- a/dbaccess/source/filter/hsqldb/parseschema.hxx +++ b/dbaccess/source/filter/hsqldb/parseschema.hxx @@ -32,15 +32,26 @@ private: // root element's position of data for each table std::map> m_Indexes; + SqlStatementVector m_sCreateStatements; + SqlStatementVector m_sAlterStatements; + public: explicit SchemaParser(css::uno::Reference& rStorage); /** * Parses table definitions contained by a file called "script" in storage. - * + */ + void parseSchema(); + + /** * @return A vector of schema definition SQL strings in Firebird dialect. */ - SqlStatementVector parseSchema(); + const SqlStatementVector& getCreateStatements() { return m_sCreateStatements; } + + /** + * @return A vector of alter SQL strings in Firebird dialect. + */ + const SqlStatementVector& getAlterStatements() { return m_sAlterStatements; } /** * Returns the column types of a table. It should not be called before -- cgit v1.2.3