diff --git a/pglablib/util.cpp b/pglablib/util.cpp index 4b45e86..439eeca 100644 --- a/pglablib/util.cpp +++ b/pglablib/util.cpp @@ -107,6 +107,24 @@ void copySelectionToClipboard(const QTableView *view) } } +QString EscapeForCString(QString qi) +{ + int escape_count = 0; + for (QChar c : qi) + if (c == '"' || c == '\\') ++escape_count; + + QString out; + out.reserve(qi.size() + escape_count); + for (QChar c : qi) + if (c == '"' || c == '\\') { + out += "\\"; + out += c; + } + else + out += c; + return out; +} + QString ConvertToMultiLineCString(const QString &in_) { // We need to atleast escape " and \ and also any multi byte utf8 char @@ -170,7 +188,7 @@ QString ConvertToMultiLineCString(const QString &in_) comment.clear(); } else { - line += token.out; + line += EscapeForCString(token.out); } } else { diff --git a/tests/pglabtests/tst_ConvertToMultiLineCString.cpp b/tests/pglabtests/tst_ConvertToMultiLineCString.cpp index 8d60bc4..73b9459 100644 --- a/tests/pglabtests/tst_ConvertToMultiLineCString.cpp +++ b/tests/pglabtests/tst_ConvertToMultiLineCString.cpp @@ -106,3 +106,20 @@ FROM tab ASSERT_EQ(output, expected); } +TEST(ConvertToMultiLineCString, escapeDoubleQuote) +{ + QString in(R"__(SELECT * FROM "table")__"); + QString expected("\"SELECT * FROM \\\"table\\\"\""); + + auto output = ConvertToMultiLineCString(in); + ASSERT_EQ(output, expected); +} + +TEST(ConvertToMultiLineCString, escapeBackslash) +{ + QString in(R"__(SELECT '\test')__"); + QString expected(R"__("SELECT '\\test'")__"); + + auto output = ConvertToMultiLineCString(in); + ASSERT_EQ(output, expected); +}