diff options
author | Tamas Bunth <tamas.bunth@collabora.co.uk> | 2018-05-14 07:30:37 +0200 |
---|---|---|
committer | Tamás Bunth <btomi96@gmail.com> | 2018-05-14 09:21:44 +0200 |
commit | 4f043c0a269ff0bb13d4714dbcda471e47f7c1c1 (patch) | |
tree | 35f5d5319ce21f3e3d6cc980c75a3e24effd5390 /dbaccess/source/filter/hsqldb/createparser.cxx | |
parent | d9c2523b0c83d0d8cf5874e33f45e018a77aebe4 (diff) |
tdf#117092 dbahsql: handle multiple primary keys
Set primary keys at the end of the sql statement instead of putting it
right after the column definition. This way multiple primary keys can be
defined.
Change-Id: I7956a536b0516fd8a773d4aa64ccb930ae5c715d
Reviewed-on: https://gerrit.libreoffice.org/54204
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Tamás Bunth <btomi96@gmail.com>
Diffstat (limited to 'dbaccess/source/filter/hsqldb/createparser.cxx')
-rw-r--r-- | dbaccess/source/filter/hsqldb/createparser.cxx | 33 |
1 files changed, 29 insertions, 4 deletions
diff --git a/dbaccess/source/filter/hsqldb/createparser.cxx b/dbaccess/source/filter/hsqldb/createparser.cxx index 66993ace227b..1323d74e5ce7 100644 --- a/dbaccess/source/filter/hsqldb/createparser.cxx +++ b/dbaccess/source/filter/hsqldb/createparser.cxx @@ -154,17 +154,36 @@ namespace dbahsql { CreateStmtParser::CreateStmtParser() {} +void CreateStmtParser::parsePrimaryKeys(const OUString& sPrimaryPart) +{ + sal_Int32 nParenPos = sPrimaryPart.indexOf("("); + if (nParenPos > 0) + { + OUString sParamStr + = sPrimaryPart.copy(nParenPos + 1, sPrimaryPart.lastIndexOf(")") - nParenPos - 1); + auto sParams = string::split(sParamStr, sal_Unicode(u',')); + for (auto& sParam : sParams) + { + m_PrimaryKeys.push_back(sParam); + } + } +} + void CreateStmtParser::parseColumnPart(const OUString& sColumnPart) { auto sColumns = lcl_splitColumnPart(sColumnPart); for (OUString& sColumn : sColumns) { + if (sColumn.startsWithIgnoreAsciiCase("PRIMARY KEY")) + { + parsePrimaryKeys(sColumn); + continue; + } + std::vector<OUString> words = string::split(sColumn, sal_Unicode(u' ')); if (words[0] == "CONSTRAINT") { - // TODO parse foreign key part instead of just saving the string - // part m_aForeignParts.push_back(sColumn); continue; } @@ -192,8 +211,14 @@ void CreateStmtParser::parseColumnPart(const OUString& sColumnPart) } bool bCaseInsensitive = sTypeName.indexOf("IGNORECASE") >= 0; - ColumnDefinition aColDef(words[0], lcl_getDataTypeFromHsql(sTypeName), aParams, - lcl_isPrimaryKey(sColumn), lcl_getAutoIncrementDefault(sColumn), + const OUString& rTableName = words[0]; + bool isPrimaryKey = lcl_isPrimaryKey(sColumn); + + if (isPrimaryKey) + m_PrimaryKeys.push_back(rTableName); + + ColumnDefinition aColDef(rTableName, lcl_getDataTypeFromHsql(sTypeName), aParams, + isPrimaryKey, lcl_getAutoIncrementDefault(sColumn), lcl_isNullable(sColumn), bCaseInsensitive); m_aColumns.push_back(aColDef); |