summaryrefslogtreecommitdiff
path: root/dbaccess/source/filter/hsqldb/createparser.cxx
diff options
context:
space:
mode:
authorTamas Bunth <tamas.bunth@collabora.co.uk>2018-05-14 07:30:37 +0200
committerTamás Bunth <btomi96@gmail.com>2018-05-14 09:21:44 +0200
commit4f043c0a269ff0bb13d4714dbcda471e47f7c1c1 (patch)
tree35f5d5319ce21f3e3d6cc980c75a3e24effd5390 /dbaccess/source/filter/hsqldb/createparser.cxx
parentd9c2523b0c83d0d8cf5874e33f45e018a77aebe4 (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.cxx33
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);