1 mike 1.2 //%/////////////////////////////////////////////////////////////////////////////
2 //
|
3 kumpf 1.6 // Copyright (c) 2000, 2001, 2002 BMC Software, Hewlett-Packard Company, IBM,
|
4 mike 1.2 // The Open Group, Tivoli Systems
5 //
6 // Permission is hereby granted, free of charge, to any person obtaining a copy
|
7 kumpf 1.6 // of this software and associated documentation files (the "Software"), to
8 // deal in the Software without restriction, including without limitation the
9 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
10 mike 1.2 // sell copies of the Software, and to permit persons to whom the Software is
11 // furnished to do so, subject to the following conditions:
12 //
|
13 kumpf 1.6 // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
|
14 mike 1.2 // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
15 // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
|
16 kumpf 1.6 // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
17 // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
18 // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
19 mike 1.2 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21 //
22 //==============================================================================
23 //
24 // Author: Mike Brasher (mbrasher@bmc.com)
25 //
26 // Modified By:
27 //
28 //%/////////////////////////////////////////////////////////////////////////////
29
30 #include <Pegasus/Common/Config.h>
|
31 kumpf 1.7 #include <Pegasus/Common/InternalException.h>
|
32 mike 1.3 #include <Pegasus/Common/Destroyer.h>
|
33 kumpf 1.4 #include <Pegasus/Common/Tracer.h>
|
34 kumpf 1.5 #include <Pegasus/Common/PegasusVersion.h>
35
|
36 mike 1.2 #include <iostream>
37 #include "WQLParser.h"
38 #include "WQLParserState.h"
39
40 PEGASUS_USING_STD;
41
42 extern int WQL_parse();
|
43 kumpf 1.10 extern void WQL_restart (FILE *input_file);
|
44 mike 1.2
45 PEGASUS_NAMESPACE_BEGIN
46
47 WQLParserState* globalParserState = 0;
48
49 void WQLParser::parse(
|
50 mike 1.3 const char* text,
|
51 mike 1.2 WQLSelectStatement& statement)
52 {
|
53 kumpf 1.4 PEG_METHOD_ENTER(TRC_WQL,"WQLParser::parse");
54
|
55 mike 1.3 if (!text)
|
56 kumpf 1.4 {
57 PEG_METHOD_EXIT();
|
58 mike 1.3 throw NullPointer();
|
59 kumpf 1.4 }
|
60 mike 1.3
61 statement.clear();
|
62 mike 1.2
63 globalParserState = new WQLParserState;
64 globalParserState->error = false;
65 globalParserState->text = text;
|
66 mike 1.3 globalParserState->textSize = strlen(text) + 1;
|
67 mike 1.2 globalParserState->offset = 0;
68 globalParserState->statement = &statement;
69
70 WQL_parse();
71
72 if (globalParserState->error)
73 {
74 String errorMessage = globalParserState->errorMessage;
75 cleanup();
76 delete globalParserState;
|
77 kumpf 1.4 PEG_METHOD_EXIT();
|
78 mike 1.2 throw ParseError(errorMessage);
79 }
80
81 cleanup();
82 delete globalParserState;
|
83 kumpf 1.4 PEG_METHOD_EXIT();
|
84 mike 1.2 }
85
|
86 mike 1.3 void WQLParser::parse(
87 const Array<Sint8>& text,
88 WQLSelectStatement& statement)
89 {
|
90 kumpf 1.4 PEG_METHOD_ENTER(TRC_WQL,"WQLParser::parse");
91
|
92 mike 1.3 if (text.size() == 0 || text[text.size() - 1] != '\0')
|
93 kumpf 1.4 {
94 PEG_METHOD_EXIT();
|
95 mike 1.3 throw MissingNullTerminator();
|
96 kumpf 1.4 }
|
97 mike 1.3
98 parse(text.getData(), statement);
|
99 kumpf 1.4 PEG_METHOD_EXIT();
|
100 mike 1.3 }
101
102 void WQLParser::parse(
103 const String& text,
104 WQLSelectStatement& statement)
105 {
|
106 kumpf 1.4 PEG_METHOD_ENTER(TRC_WQL,"WQLParser::parse");
107
|
108 kumpf 1.9 parse(text.getCString(), statement);
|
109 kumpf 1.4
110 PEG_METHOD_EXIT();
|
111 mike 1.3 }
112
|
113 mike 1.2 void WQLParser::cleanup()
114 {
|
115 kumpf 1.4 PEG_METHOD_ENTER(TRC_WQL,"WQLParser::cleanup");
116
|
117 mike 1.2 Array<char*>& arr = globalParserState->outstandingStrings;
118
119 for (Uint32 i = 0, n = arr.size(); i < n; i++)
120 delete [] arr[i];
121
122 arr.clear();
|
123 kumpf 1.4
124 PEG_METHOD_EXIT();
|
125 mike 1.2 }
126
127 PEGASUS_NAMESPACE_END
128
129 PEGASUS_USING_PEGASUS;
130
|
131 kumpf 1.8 int WQL_error(const char* errorMessage)
|
132 mike 1.2 {
|
133 kumpf 1.4 PEG_METHOD_ENTER(TRC_WQL,"WQL_error");
134
|
135 mike 1.2 globalParserState->error = true;
136 globalParserState->errorMessage = errorMessage;
|
137 kumpf 1.10
138 //
139 // flex does not automatically flush the input buffer in case of error
140 //
141 WQL_restart (0);
|
142 kumpf 1.4
143 PEG_METHOD_EXIT();
|
144 mike 1.2 return -1;
145 }
146
147 int WQLInput(char* buffer, int& numRead, int numRequested)
148 {
|
149 kumpf 1.4 PEG_METHOD_ENTER(TRC_WQL,"WQLInput");
|
150 mike 1.2 //
151 // Be sure to account for the null terminator (the size of the text will
152 // be one or more; this is fixed checked beforehand by WQLParser::parse()).
153 //
154
155 int remaining =
|
156 mike 1.3 globalParserState->textSize - globalParserState->offset - 1;
|
157 mike 1.2
158 if (remaining == 0)
159 {
160 numRead = 0;
|
161 kumpf 1.4 PEG_METHOD_EXIT();
|
162 mike 1.2 return 0;
163 }
164
165 if (remaining < numRequested)
166 numRequested = remaining;
167
168 memcpy(buffer,
|
169 mike 1.3 globalParserState->text + globalParserState->offset,
|
170 mike 1.2 numRequested);
171
172 globalParserState->offset += numRequested;
173 numRead = numRequested;
174
|
175 kumpf 1.4 PEG_METHOD_EXIT();
|
176 mike 1.2 return numRead;
177 }
|