(file) Return to WQLParser.cpp CVS log (file) (dir) Up to [Pegasus] / pegasus / src / Pegasus / WQL

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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2