Kaydet (Commit) b1895356 authored tarafından Tamas Bunth's avatar Tamas Bunth Kaydeden (comit) Tamás Bunth

tdf#116980 Add constraints after data migration

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/53508Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarTamás Bunth <btomi96@gmail.com>
üst e148a58b
...@@ -164,14 +164,6 @@ OUString FbCreateStmtParser::compose() const ...@@ -164,14 +164,6 @@ OUString FbCreateStmtParser::compose() const
sSql.append(","); sSql.append(",");
} }
// foreign keys
const std::vector<OUString>& sForeignParts = getForeignParts();
for (const auto& sPart : sForeignParts)
{
sSql.append(",");
sSql.append(sPart);
}
sSql.append(")"); // end of column declaration sSql.append(")"); // end of column declaration
return sSql.makeStringAndClear(); return sSql.makeStringAndClear();
} }
......
...@@ -291,7 +291,9 @@ void HsqlImporter::importHsqlDatabase() ...@@ -291,7 +291,9 @@ void HsqlImporter::importHsqlDatabase()
assert(m_xStorage); assert(m_xStorage);
SchemaParser parser(m_xStorage); SchemaParser parser(m_xStorage);
SqlStatementVector statements = parser.parseSchema(); parser.parseSchema();
auto statements = parser.getCreateStatements();
if (statements.size() < 1) if (statements.size() < 1)
{ {
...@@ -312,6 +314,13 @@ void HsqlImporter::importHsqlDatabase() ...@@ -312,6 +314,13 @@ void HsqlImporter::importHsqlDatabase()
std::vector<ColumnDefinition> aColTypes = parser.getTableColumnTypes(tableIndex.first); std::vector<ColumnDefinition> aColTypes = parser.getTableColumnTypes(tableIndex.first);
parseTableRows(tableIndex.second, aColTypes, tableIndex.first); parseTableRows(tableIndex.second, aColTypes, tableIndex.first);
} }
// alter stmts
for (const auto& sSql : parser.getAlterStatements())
{
Reference<XStatement> statement = m_rConnection->createStatement();
statement->executeQuery(sSql);
}
} }
} }
......
...@@ -76,6 +76,16 @@ public: ...@@ -76,6 +76,16 @@ public:
return string::split(m_sql, u' ')[2]; 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 } // anonymous namespace
namespace dbahsql namespace dbahsql
...@@ -91,7 +101,7 @@ SchemaParser::SchemaParser(Reference<XStorage>& rStorage) ...@@ -91,7 +101,7 @@ SchemaParser::SchemaParser(Reference<XStorage>& rStorage)
{ {
} }
SqlStatementVector SchemaParser::parseSchema() void SchemaParser::parseSchema()
{ {
assert(m_rStorage); assert(m_rStorage);
...@@ -99,7 +109,7 @@ SqlStatementVector SchemaParser::parseSchema() ...@@ -99,7 +109,7 @@ SqlStatementVector SchemaParser::parseSchema()
if (!m_rStorage->hasByName(SCHEMA_FILENAME)) if (!m_rStorage->hasByName(SCHEMA_FILENAME))
{ {
SAL_WARN("dbaccess", "script file does not exist in storage during hsqldb import"); SAL_WARN("dbaccess", "script file does not exist in storage during hsqldb import");
return SqlStatementVector{}; return;
} }
Reference<XStream> xStream(m_rStorage->openStreamElement(SCHEMA_FILENAME, ElementModes::READ)); Reference<XStream> xStream(m_rStorage->openStreamElement(SCHEMA_FILENAME, ElementModes::READ));
...@@ -109,7 +119,6 @@ SqlStatementVector SchemaParser::parseSchema() ...@@ -109,7 +119,6 @@ SqlStatementVector SchemaParser::parseSchema()
xTextInput->setEncoding("UTF-8"); xTextInput->setEncoding("UTF-8");
xTextInput->setInputStream(xStream->getInputStream()); xTextInput->setInputStream(xStream->getInputStream());
SqlStatementVector parsedStatements;
while (!xTextInput->isEOF()) while (!xTextInput->isEOF())
{ {
// every line contains exactly one DDL statement // every line contains exactly one DDL statement
...@@ -128,11 +137,17 @@ SqlStatementVector SchemaParser::parseSchema() ...@@ -128,11 +137,17 @@ SqlStatementVector SchemaParser::parseSchema()
FbCreateStmtParser aCreateParser; FbCreateStmtParser aCreateParser;
aCreateParser.parse(sSql); aCreateParser.parse(sSql);
for (const auto& foreignParts : aCreateParser.getForeignParts())
{
m_sAlterStatements.push_back(
lcl_createAlterForeign(foreignParts, aCreateParser.getTableName()));
}
sSql = aCreateParser.compose(); sSql = aCreateParser.compose();
// save column definitions // save column definitions
m_ColumnTypes[aCreateParser.getTableName()] = aCreateParser.getColumnDef(); m_ColumnTypes[aCreateParser.getTableName()] = aCreateParser.getColumnDef();
parsedStatements.push_back(sSql); m_sCreateStatements.push_back(sSql);
} }
else if (sSql.startsWith("ALTER")) else if (sSql.startsWith("ALTER"))
{ {
...@@ -141,13 +156,11 @@ SqlStatementVector SchemaParser::parseSchema() ...@@ -141,13 +156,11 @@ SqlStatementVector SchemaParser::parseSchema()
OUString parsedStmt = aAlterParser.compose(); OUString parsedStmt = aAlterParser.compose();
if (!parsedStmt.isEmpty()) if (!parsedStmt.isEmpty())
parsedStatements.push_back(parsedStmt); m_sAlterStatements.push_back(parsedStmt);
} }
else if (sSql.startsWith("CREATE VIEW")) else if (sSql.startsWith("CREATE VIEW"))
parsedStatements.push_back(sSql); m_sCreateStatements.push_back(sSql);
} }
return parsedStatements;
} }
ColumnTypeVector SchemaParser::getTableColumnTypes(const OUString& sTableName) const ColumnTypeVector SchemaParser::getTableColumnTypes(const OUString& sTableName) const
......
...@@ -32,15 +32,26 @@ private: ...@@ -32,15 +32,26 @@ private:
// root element's position of data for each table // root element's position of data for each table
std::map<OUString, std::vector<sal_Int32>> m_Indexes; std::map<OUString, std::vector<sal_Int32>> m_Indexes;
SqlStatementVector m_sCreateStatements;
SqlStatementVector m_sAlterStatements;
public: public:
explicit SchemaParser(css::uno::Reference<css::embed::XStorage>& rStorage); explicit SchemaParser(css::uno::Reference<css::embed::XStorage>& rStorage);
/** /**
* Parses table definitions contained by a file called "script" in storage. * Parses table definitions contained by a file called "script" in storage.
* */
void parseSchema();
/**
* @return A vector of schema definition SQL strings in Firebird dialect. * @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 * Returns the column types of a table. It should not be called before
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment