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
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
return sSql.makeStringAndClear();
}
......
......@@ -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<ColumnDefinition> aColTypes = parser.getTableColumnTypes(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:
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<XStorage>& 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> 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
......
......@@ -32,15 +32,26 @@ private:
// root element's position of data for each table
std::map<OUString, std::vector<sal_Int32>> m_Indexes;
SqlStatementVector m_sCreateStatements;
SqlStatementVector m_sAlterStatements;
public:
explicit SchemaParser(css::uno::Reference<css::embed::XStorage>& 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
......
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