24
24
25
25
#include " Parser.hpp"
26
26
27
+ #include " oatpp/core/data/stream/BufferStream.hpp"
27
28
#include " oatpp/core/parser/ParsingError.hpp"
28
29
29
30
namespace oatpp { namespace postgresql { namespace ql_template {
30
31
32
+ oatpp::String Parser::preprocess (const oatpp::String& text, std::vector<CleanSection>& cleanSections) {
33
+
34
+ data::stream::BufferOutputStream ss;
35
+ parser::Caret caret (text);
36
+
37
+ bool writeChar = true ;
38
+
39
+ v_buff_size sectionStart = -1 ;
40
+
41
+ while (caret.canContinue ()) {
42
+
43
+ v_char8 c = *caret.getCurrData ();
44
+ writeChar = true ;
45
+
46
+ switch (c) {
47
+
48
+ case ' \' ' : {
49
+ auto l = caret.putLabel ();
50
+ skipStringInQuotes (caret);
51
+ ss.writeSimple (l.getData (), l.getSize ());
52
+ writeChar = false ;
53
+ break ;
54
+ }
55
+ case ' $' : {
56
+ auto l = caret.putLabel ();
57
+ skipStringInDollars (caret);
58
+ ss.writeSimple (l.getData (), l.getSize ());
59
+ writeChar = false ;
60
+ break ;
61
+ }
62
+
63
+ case ' <' : {
64
+ if (sectionStart == -1 ) {
65
+ if (caret.isAtText ((p_char8) " <!!" , 3 , true )) {
66
+ sectionStart = ss.getCurrentPosition ();
67
+ writeChar = false ;
68
+ } else {
69
+ caret.inc ();
70
+ }
71
+ } else {
72
+ caret.inc ();
73
+ }
74
+ break ;
75
+ }
76
+
77
+ case ' !' : {
78
+ if (sectionStart != -1 ) {
79
+ if (caret.isAtText ((p_char8) " !!>" , 3 , true )) {
80
+ cleanSections.emplace_back (CleanSection (sectionStart, ss.getCurrentPosition () - sectionStart));
81
+ sectionStart = -1 ;
82
+ writeChar = false ;
83
+ } else {
84
+ caret.inc ();
85
+ }
86
+ } else {
87
+ caret.inc ();
88
+ }
89
+ break ;
90
+ }
91
+
92
+ default :
93
+ caret.inc ();
94
+
95
+ }
96
+
97
+ if (writeChar) {
98
+ ss.writeCharSimple (c);
99
+ }
100
+
101
+ }
102
+
103
+ return ss.toString ();
104
+
105
+ }
106
+
31
107
data::share::StringTemplate::Variable Parser::parseIdentifier (parser::Caret& caret) {
32
108
data::share::StringTemplate::Variable result;
33
109
result.posStart = caret.getPosition ();
@@ -99,11 +175,23 @@ void Parser::skipStringInDollars(parser::Caret& caret) {
99
175
100
176
data::share::StringTemplate Parser::parseTemplate (const oatpp::String& text) {
101
177
178
+ std::vector<CleanSection> cleanSections;
179
+ auto processedText = preprocess (text, cleanSections);
180
+
181
+ parser::Caret caret (processedText);
182
+
102
183
std::vector<data::share::StringTemplate::Variable> variables;
103
184
104
- parser::Caret caret (text);
185
+ v_buff_size currSection = 0 ;
186
+
105
187
while (caret.canContinue ()) {
106
188
189
+ if (currSection < cleanSections.size () && cleanSections[currSection].position == caret.getPosition ()) {
190
+ caret.inc (cleanSections[currSection].size );
191
+ currSection ++;
192
+ continue ;
193
+ }
194
+
107
195
v_char8 c = *caret.getCurrData ();
108
196
109
197
switch (c) {
@@ -130,7 +218,7 @@ data::share::StringTemplate Parser::parseTemplate(const oatpp::String& text) {
130
218
throw oatpp::parser::ParsingError (caret.getErrorMessage (), caret.getErrorCode (), caret.getPosition ());
131
219
}
132
220
133
- return data::share::StringTemplate (text , std::move (variables));
221
+ return data::share::StringTemplate (processedText , std::move (variables));
134
222
135
223
}
136
224
0 commit comments