⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 genericstatement.java

📁 derby database source code.good for you.
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/*   Derby - Class org.apache.derby.impl.sql.GenericStatement   Copyright 1997, 2004 The Apache Software Foundation or its licensors, as applicable.   Licensed under the Apache License, Version 2.0 (the "License");   you may not use this file except in compliance with the License.   You may obtain a copy of the License at      http://www.apache.org/licenses/LICENSE-2.0   Unless required by applicable law or agreed to in writing, software   distributed under the License is distributed on an "AS IS" BASIS,   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   See the License for the specific language governing permissions and   limitations under the License. */package org.apache.derby.impl.sql;import org.apache.derby.iapi.services.stream.HeaderPrintWriter;import org.apache.derby.iapi.reference.JDBC20Translation;import org.apache.derby.iapi.reference.JDBC30Translation;import org.apache.derby.iapi.reference.SQLState;import org.apache.derby.iapi.sql.Activation;import org.apache.derby.iapi.types.DataTypeDescriptor;import org.apache.derby.iapi.sql.ResultSet;import org.apache.derby.iapi.sql.Statement;import org.apache.derby.iapi.sql.PreparedStatement;import org.apache.derby.iapi.sql.execute.ConstantAction;import org.apache.derby.iapi.sql.execute.ExecutionContext;import org.apache.derby.iapi.sql.execute.ExecPreparedStatement;import org.apache.derby.iapi.sql.ParameterValueSet;import org.apache.derby.iapi.sql.conn.LanguageConnectionFactory;import org.apache.derby.iapi.sql.conn.LanguageConnectionContext;import org.apache.derby.iapi.sql.conn.StatementContext;import org.apache.derby.iapi.sql.depend.Dependent;import org.apache.derby.iapi.sql.compile.CompilerContext;import org.apache.derby.iapi.sql.compile.NodeFactory;import org.apache.derby.iapi.sql.compile.Parser;import org.apache.derby.impl.sql.compile.QueryTreeNode;import org.apache.derby.impl.sql.conn.GenericLanguageConnectionContext;import org.apache.derby.iapi.sql.dictionary.SchemaDescriptor;import org.apache.derby.iapi.sql.dictionary.DataDictionaryContext;import org.apache.derby.iapi.sql.dictionary.DataDictionary;import org.apache.derby.iapi.services.compiler.JavaFactory;import org.apache.derby.iapi.services.uuid.UUIDFactory;import org.apache.derby.iapi.util.ByteArray;import org.apache.derby.iapi.error.StandardException;import org.apache.derby.iapi.services.monitor.Monitor;import org.apache.derby.iapi.services.context.Context;import org.apache.derby.iapi.services.context.ContextService;import org.apache.derby.iapi.services.context.ContextManager;import org.apache.derby.iapi.services.sanity.SanityManager;import org.apache.derby.iapi.services.loader.GeneratedClass;import java.sql.Timestamp;import java.sql.SQLWarning;public class GenericStatement	implements Statement {	// these fields define the identity of the statement	private final SchemaDescriptor compilationSchema;	private final String			statementText;	private int                      prepareIsolationLevel;	private GenericPreparedStatement preparedStmt;	/**	 * Constructor for a Statement given the text of the statement in a String	 *	 * @param statementText	The text of the statement	 */	public GenericStatement(SchemaDescriptor compilationSchema, String statementText)	{		this.compilationSchema = compilationSchema;		this.statementText = statementText;	}	/*	 * Statement interface	 */	/* RESOLVE: may need error checking, debugging code here */	public PreparedStatement prepare(LanguageConnectionContext lcc) throws StandardException	{		/*		** Note: don't reset state since this might be		** a recompilation of an already prepared statement.		*/ 		return prepMinion(lcc, true, (Object[]) null, (SchemaDescriptor) null, false); 	}	private PreparedStatement prepMinion(LanguageConnectionContext lcc, boolean cacheMe, Object[] paramDefaults,		SchemaDescriptor spsSchema, boolean internalSQL)		throws StandardException	{						  		long				beginTime = 0;		long				parseTime = 0;		long				bindTime = 0;		long				optimizeTime = 0;		long				generateTime = 0;		Timestamp			beginTimestamp = null;		Timestamp			endTimestamp = null;		StatementContext	statementContext = null;		// verify it isn't already prepared...		// if it is, and is valid, simply return that tree.		// if it is invalid, we will recompile now.		if (preparedStmt != null) {			if (preparedStmt.upToDate())				return preparedStmt;		}		// Clear the optimizer trace from the last statement		if (lcc.getOptimizerTrace())			lcc.setOptimizerTraceOutput(getSource() + "\n");		beginTime = getCurrentTimeMillis(lcc);		/* beginTimestamp only meaningful if beginTime is meaningful.		 * beginTime is meaningful if STATISTICS TIMING is ON.		 */		if (beginTime != 0)		{			beginTimestamp = new Timestamp(beginTime);		}		/** set the prepare Isolaton from the LanguageConnectionContext now as 		 * we need to consider it in caching decisions		 */		prepareIsolationLevel = lcc.getPrepareIsolationLevel();		/* a note on statement caching:		 * 		 * A GenericPreparedStatement (GPS) is only added it to the cache if the		 * parameter cacheMe is set to TRUE when the GPS is created.		 * 		 * Earlier only CacheStatement (CS) looked in the statement cache for a		 * prepared statement when prepare was called. Now the functionality 		 * of CS has been folded into GenericStatement (GS). So we search the		 * cache for an existing PreparedStatement only when cacheMe is TRUE.		 * i.e if the user calls prepare with cacheMe set to TRUE:		 * then we 		 *         a) look for the prepared statement in the cache.		 *         b) add the prepared statement to the cache.		 *		 * In cases where the statement cache has been disabled (by setting the		 * relevant cloudscape property) then the value of cacheMe is irrelevant.		 */ 		boolean foundInCache = false;		if (preparedStmt == null) 		{			if (cacheMe)				preparedStmt = (GenericPreparedStatement)((GenericLanguageConnectionContext)lcc).lookupStatement(this);			if (preparedStmt == null) 			{				preparedStmt = new GenericPreparedStatement(this);			}			else			{				foundInCache = true;			}		}		// if anyone else also has this prepared statement,		// we don't want them trying to compile with it while		// we are.  So, we synchronize on it and re-check		// its validity first.		// this is a no-op if and until there is a central		// cache of prepared statement objects...		synchronized (preparedStmt) 		{			for (;;) {				if (foundInCache) {					if (preparedStmt.referencesSessionSchema()) {						// cannot use this state since it is private to a connection.						// switch to a new statement.						foundInCache = false;						preparedStmt = new GenericPreparedStatement(this);						break;					}				}				// did it get updated while we waited for the lock on it?				if (preparedStmt.upToDate()) {					return preparedStmt;				}				if (!preparedStmt.compilingStatement) {					break;				}				try {					preparedStmt.wait();				} catch (InterruptedException ie) {					throw StandardException.interrupt(ie);				}			}			preparedStmt.compilingStatement = true;			preparedStmt.setActivationClass(null);		}		try {			HeaderPrintWriter istream = lcc.getLogStatementText() ? Monitor.getStream() : null;			/*			** For stored prepared statements, we want all			** errors, etc in the context of the underlying			** EXECUTE STATEMENT statement, so don't push/pop			** another statement context unless we don't have			** one.  We won't have one if it is an internal			** SPS (e.g. jdbcmetadata).			*/			if (!preparedStmt.isStorable() || lcc.getStatementDepth() == 0)			{				// since this is for compilation only, set atomic				// param to true				statementContext = lcc.pushStatementContext(true, getSource(), null, false);			}			/*			** RESOLVE: we may ultimately wish to pass in			** whether we are a jdbc metadata query or not to			** get the CompilerContext to make the createDependency()			** call a noop.			*/			CompilerContext cc = lcc.pushCompilerContext(compilationSchema);						if (prepareIsolationLevel != 				ExecutionContext.UNSPECIFIED_ISOLATION_LEVEL)			{				cc.setScanIsolationLevel(prepareIsolationLevel);			}			// Look for stored statements that are in a system schema			// and with a match compilation schema. If so, allow them			// to compile using internal SQL constructs.			if (internalSQL ||				(spsSchema != null) && (spsSchema.isSystemSchema()) &&					(spsSchema.equals(compilationSchema))) {						cc.setReliability(CompilerContext.INTERNAL_SQL_LEGAL);			}			try 			{				// Statement logging if lcc.getLogStatementText() is true				if (istream != null)				{					String xactId = lcc.getTransactionExecute().getActiveStateTxIdString();					istream.printlnWithHeader(LanguageConnectionContext.xidStr + 											  xactId + 											  "), " +											  LanguageConnectionContext.lccStr +												  lcc.getInstanceNumber() +											  "), " +											  LanguageConnectionContext.dbnameStr +												  lcc.getDbname() +											  "), " +											  LanguageConnectionContext.drdaStr +												  lcc.getDrdaID() +											  "), Begin compiling prepared statement: " + 											  getSource() +											  " :End prepared statement");				}				Parser p = cc.getParser();				cc.setCurrentDependent(preparedStmt);				//Only top level statements go through here, nested statement				//will invoke this method from other places				QueryTreeNode qt = p.parseStatement(statementText, paramDefaults);				parseTime = getCurrentTimeMillis(lcc);				if (SanityManager.DEBUG) 				{					if (SanityManager.DEBUG_ON("DumpParseTree")) 					{						qt.treePrint();					}					if (SanityManager.DEBUG_ON("StopAfterParsing")) 					{						throw StandardException.newException(SQLState.LANG_STOP_AFTER_PARSING);					}				}				/*				** Tell the data dictionary that we are about to do				** a bunch of "get" operations that must be consistent with				** each other.				*/								DataDictionary dataDictionary = lcc.getDataDictionary();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -