diff options
Diffstat (limited to 'dbaccess/source')
-rw-r--r-- | dbaccess/source/filter/hsqldb/hsqlimport.cxx | 68 | ||||
-rw-r--r-- | dbaccess/source/filter/hsqldb/parseschema.cxx | 61 | ||||
-rw-r--r-- | dbaccess/source/filter/hsqldb/parseschema.hxx | 7 |
3 files changed, 73 insertions, 63 deletions
diff --git a/dbaccess/source/filter/hsqldb/hsqlimport.cxx b/dbaccess/source/filter/hsqldb/hsqlimport.cxx index 95f7de3a878a..0775fa580063 100644 --- a/dbaccess/source/filter/hsqldb/hsqlimport.cxx +++ b/dbaccess/source/filter/hsqldb/hsqlimport.cxx @@ -28,7 +28,7 @@ #include <com/sun/star/sdbc/XParameters.hpp> #include <com/sun/star/sdbc/DataType.hpp> -#include <comphelper/string.hxx> +#include <rtl/ustrbuf.hxx> #include "hsqlimport.hxx" #include "parseschema.hxx" @@ -36,7 +36,6 @@ namespace { -using namespace ::comphelper; using namespace css::io; using namespace css::uno; using namespace css::sdbc; @@ -45,45 +44,6 @@ using ColumnTypeVector = std::vector<sal_Int32>; using RowVector = std::vector<Any>; using IndexVector = std::vector<sal_Int32>; -class IndexStmtParser -{ -private: - OUString m_sql; - -public: - IndexStmtParser(const OUString& sSql) - : m_sql(sSql) - { - } - - bool isIndexStatement() const - { - return m_sql.startsWith("SET TABLE") && m_sql.indexOf("INDEX") >= 0; - } - - IndexVector getIndexes() const - { - assert(isIndexStatement()); - - OUString sIndexPart = m_sql.copy(m_sql.indexOf("INDEX") + 5); - sal_Int32 nQuotePos = sIndexPart.indexOf("'") + 1; - OUString sIndexNums = sIndexPart.copy(nQuotePos, sIndexPart.lastIndexOf("'") - nQuotePos); - - std::vector<OUString> sIndexes = string::split(sIndexNums, u' '); - IndexVector indexes; - for (const auto& sIndex : sIndexes) - indexes.push_back(sIndex.toInt32()); - - return indexes; - } - - OUString getTableName() const - { - // SET TABLE <tableName> - return string::split(m_sql, u' ')[2]; - } -}; - void lcl_setParams(const RowVector& row, Reference<XParameters>& xParam, const ColumnTypeVector& rColTypes) { @@ -316,26 +276,18 @@ void HsqlImporter::importHsqlDatabase() SchemaParser parser(m_xStorage); SqlStatementVector statements = parser.parseSchema(); + // schema for (auto& sSql : statements) { - // SET TABLE ... INDEX ... - // These statements tell us the position of the data in the binary data - // file - IndexStmtParser aIndexParser(sSql); - if (aIndexParser.isIndexStatement()) - { - IndexVector aIndexes = aIndexParser.getIndexes(); - OUString sTableName = aIndexParser.getTableName(); - std::vector<sal_Int32> aColTypes = parser.getTableColumnTypes(sTableName); + Reference<XStatement> statement = m_rConnection->createStatement(); + statement->executeQuery(sSql); + } - parseTableRows(aIndexes, aColTypes, sTableName); - } - else - { - // other, "normal" statements - Reference<XStatement> statement = m_rConnection->createStatement(); - statement->executeQuery(sSql); - } + // data + for (const auto& tableIndex : parser.getTableIndexes()) + { + std::vector<sal_Int32> aColTypes = parser.getTableColumnTypes(tableIndex.first); + parseTableRows(tableIndex.second, aColTypes, tableIndex.first); } } } diff --git a/dbaccess/source/filter/hsqldb/parseschema.cxx b/dbaccess/source/filter/hsqldb/parseschema.cxx index 5ee2b4d1e2c6..c6331889adad 100644 --- a/dbaccess/source/filter/hsqldb/parseschema.cxx +++ b/dbaccess/source/filter/hsqldb/parseschema.cxx @@ -24,6 +24,53 @@ #include <com/sun/star/embed/XStorage.hpp> #include <com/sun/star/embed/ElementModes.hpp> #include <comphelper/processfactory.hxx> +#include <comphelper/string.hxx> + +namespace +{ +using namespace ::comphelper; + +using IndexVector = std::vector<sal_Int32>; + +class IndexStmtParser +{ +private: + OUString m_sql; + +public: + IndexStmtParser(const OUString& sSql) + : m_sql(sSql) + { + } + + bool isIndexStatement() const + { + return m_sql.startsWith("SET TABLE") && m_sql.indexOf("INDEX") >= 0; + } + + IndexVector getIndexes() const + { + assert(isIndexStatement()); + + OUString sIndexPart = m_sql.copy(m_sql.indexOf("INDEX") + 5); + sal_Int32 nQuotePos = sIndexPart.indexOf("'") + 1; + OUString sIndexNums = sIndexPart.copy(nQuotePos, sIndexPart.lastIndexOf("'") - nQuotePos); + + std::vector<OUString> sIndexes = string::split(sIndexNums, u' '); + IndexVector indexes; + for (const auto& sIndex : sIndexes) + indexes.push_back(sIndex.toInt32()); + + return indexes; + } + + OUString getTableName() const + { + // SET TABLE <tableName> + return string::split(m_sql, u' ')[2]; + } +}; +} // anonymous namespace namespace dbahsql { @@ -62,8 +109,10 @@ SqlStatementVector SchemaParser::parseSchema() // every line contains exactly one DDL statement OUString sSql = xTextInput->readLine(); - if (sSql.startsWith("SET TABLE") && sSql.indexOf("INDEX") > 0) - { // nothing + IndexStmtParser indexParser{ sSql }; + if (indexParser.isIndexStatement()) + { + m_ColumnTypes[indexParser.getTableName()] = indexParser.getIndexes(); } else if (sSql.startsWith("SET") || sSql.startsWith("CREATE USER") || sSql.startsWith("CREATE SCHEMA") || sSql.startsWith("GRANT")) @@ -82,9 +131,8 @@ SqlStatementVector SchemaParser::parseSchema() colTypes.push_back(colDef.getDataType()); m_ColumnTypes[aCreateParser.getTableName()] = colTypes; + parsedStatements.push_back(sSql); } - - parsedStatements.push_back(sSql); } return parsedStatements; @@ -95,6 +143,11 @@ ColumnTypeVector SchemaParser::getTableColumnTypes(const OUString& sTableName) c return m_ColumnTypes.at(sTableName); } +const std::map<OUString, std::vector<sal_Int32>>& SchemaParser::getTableIndexes() const +{ + return m_Indexes; +} + } // namespace dbahsql /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/dbaccess/source/filter/hsqldb/parseschema.hxx b/dbaccess/source/filter/hsqldb/parseschema.hxx index af97ae578241..c0c31a3c6884 100644 --- a/dbaccess/source/filter/hsqldb/parseschema.hxx +++ b/dbaccess/source/filter/hsqldb/parseschema.hxx @@ -17,7 +17,7 @@ namespace dbahsql { -typedef std::vector<OUString> SqlStatementVector; +using SqlStatementVector = std::vector<OUString>; class SchemaParser { @@ -27,12 +27,17 @@ private: // column type for each table. It is filled after parsing schema. std::map<OUString, std::vector<sal_Int32>> m_ColumnTypes; + // root element's position of data for each table + std::map<OUString, std::vector<sal_Int32>> m_Indexes; + public: explicit SchemaParser(css::uno::Reference<css::embed::XStorage>& rStorage); SqlStatementVector parseSchema(); std::vector<sal_Int32> getTableColumnTypes(const OUString& sTableName) const; + + const std::map<OUString, std::vector<sal_Int32>>& getTableIndexes() const; }; } |