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

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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2