📄 preparedstatement.java
字号:
} public void setObject(int parameterIndex, Object X, int targetSqlType) throws java.sql.SQLException { setObject(parameterIndex, X, targetSqlType, 0); } public void setObject(int parameterIndex, Object X) throws java.sql.SQLException { if (X == null) { setNull(parameterIndex, java.sql.Types.OTHER); } else { if (X instanceof String) setString(parameterIndex, (String)X); else if (X instanceof BigDecimal) setBigDecimal(parameterIndex, (BigDecimal)X); else if (X instanceof Integer) setInt(parameterIndex, ((Integer)X).intValue()); else if (X instanceof Long) setLong(parameterIndex, ((Long)X).longValue()); else if (X instanceof Float) setFloat(parameterIndex, ((Float)X).floatValue()); else if (X instanceof Double) setDouble(parameterIndex, ((Double)X).doubleValue()); else if (X instanceof byte[]) setBytes(parameterIndex, (byte[])X); else if (X instanceof java.sql.Date) setDate(parameterIndex, (java.sql.Date)X); else if (X instanceof Time) setTime(parameterIndex, (Time)X); else if (X instanceof Timestamp) setTimestamp(parameterIndex, (Timestamp)X); else if (X instanceof Boolean) setBoolean(parameterIndex, ((Boolean)X).booleanValue()); else { try { ByteArrayOutputStream BytesOut = new ByteArrayOutputStream(); ObjectOutputStream ObjectOut = new ObjectOutputStream(BytesOut); ObjectOut.writeObject(X); ObjectOut.flush(); ObjectOut.close(); BytesOut.flush(); BytesOut.close(); byte[] buf = BytesOut.toByteArray(); ByteArrayInputStream BytesIn = new ByteArrayInputStream(buf); setBinaryStream(parameterIndex, BytesIn, -1); } catch (Exception E) { throw new java.sql.SQLException("Invalid argument value: " + E.getClass().getName(), "S1009"); } } } } /** * Some prepared statements return multiple results; the execute method * handles these complex statements as well as the simpler form of * statements handled by executeQuery and executeUpdate * * @return true if the next result is a ResultSet; false if it is an * update count or there are no more results * @exception java.sql.SQLException if a database access error occurs */ public boolean execute() throws java.sql.SQLException { boolean do_escape_processing = _escapeProcessing; _escapeProcessing = false; Buffer Packet = new Buffer(MysqlIO.getMaxBuf()); Packet.writeByte((byte)MysqlDefs.QUERY); String Encoding = null; if (_Conn.useUnicode()) { Encoding = _Conn.getEncoding(); } try { for (int i = 0 ; i < _ParameterStrings.length ; ++i) { if (_ParameterStrings[i] == null && (_IsStream[i] && _ParameterStreams[i] == null)) { throw new java.sql.SQLException("No value specified for parameter " + (i + 1)); } if (Encoding != null) { Packet.writeStringNoNull(_TemplateStrings[i], Encoding); } else { Packet.writeStringNoNull(_TemplateStrings[i]); } if (_IsStream[i]) { Packet.writeBytesNoNull(streamToBytes(_ParameterStreams[i])); } else { if (do_escape_processing) { _ParameterStrings[i] = _Escaper.escapeSQL(_ParameterStrings[i]); } if (Encoding != null) { Packet.writeStringNoNull(_ParameterStrings[i], Encoding); } else { Packet.writeStringNoNull(_ParameterStrings[i]); } } } if (Encoding != null) { Packet.writeStringNoNull(_TemplateStrings[_ParameterStrings.length], Encoding); } else { Packet.writeStringNoNull(_TemplateStrings[_ParameterStrings.length]); } } catch (java.io.UnsupportedEncodingException UE) { throw new SQLException("Unsupported character encoding '" + Encoding + "'"); } ResultSet RS = null; synchronized (_Conn.getMutex()) { String OldCatalog = null; if (!_Conn.getCatalog().equals(_Catalog)) { OldCatalog = _Conn.getCatalog(); _Conn.setCatalog(_Catalog); } // If there isn't a limit clause in the SQL // then limit the number of rows to return in // an efficient manner. Only do this if // setMaxRows() hasn't been used on any Statements // generated from the current Connection (saves // a query, and network traffic). if (_Conn.useMaxRows()) { if (_has_limit_clause) { RS = _Conn.execSQL(null, _max_rows, Packet); } else { if (_max_rows <= 0) { _Conn.execSQL("SET OPTION SQL_SELECT_LIMIT=" + MysqlDefs.MAX_ROWS, -1); } else { _Conn.execSQL("SET OPTION SQL_SELECT_LIMIT=" + _max_rows,-1); } RS = _Conn.execSQL(null, -1, Packet); } } else { RS = _Conn.execSQL(null, -1, Packet); } if (OldCatalog != null) { _Conn.setCatalog(OldCatalog); } } _last_insert_id = RS.getUpdateID(); if (RS != null) { _Results = RS; } _escapeProcessing = do_escape_processing; RS.setConnection(_Conn); return (RS != null && RS.reallyResult()); } public String toString() { String Encoding = null; if (_Conn.useUnicode()) { Encoding = _Conn.getEncoding(); } StringBuffer SB = new StringBuffer(); SB.append(super.toString()); SB.append(": "); try { for (int i = 0 ; i < _ParameterStrings.length ; ++i) { if (Encoding != null) { SB.append(new String(_TemplateStrings[i].getBytes(), Encoding)); } else { SB.append(_TemplateStrings[i]); } if (_ParameterStrings[i] == null && (_IsStream[i] && _ParameterStreams[i] == null)) { SB.append("** NOT SPECIFIED **"); } else if (_IsStream[i]) { SB.append("** STREAM DATA **"); } else { if (_escapeProcessing) { try { _ParameterStrings[i] = _Escaper.escapeSQL(_ParameterStrings[i]); } catch (SQLException SQE) {} } if (Encoding != null) { SB.append(new String(_ParameterStrings[i].getBytes(), Encoding)); } else { SB.append(_ParameterStrings[i]); } } } if (Encoding != null) { SB.append(new String(_TemplateStrings[_ParameterStrings.length].getBytes(), Encoding)); } else { SB.append(_TemplateStrings[_ParameterStrings.length]); } } catch (java.io.UnsupportedEncodingException UE) { SB.append("\n\n** WARNING **\n\n Unsupported character encoding '"); SB.append(Encoding); SB.append("'"); } return SB.toString(); } /** * There are a lot of setXXX classes which all basically do * the same thing. We need a method which actually does the * set for us. * * @param paramIndex the index into the inString * @param s a string to be stored * @exception java.sql.SQLException if something goes wrong */ private final void set(int paramIndex, String S) throws java.sql.SQLException { if (paramIndex < 1 || paramIndex > _TemplateStrings.length) { throw new java.sql.SQLException("Parameter index out of range (" + paramIndex + " > " + _TemplateStrings.length + ").", "S1009"); } _ParameterStrings[paramIndex - 1] = S; } private final int readblock(InputStream i,byte[] b) throws java.sql.SQLException { try { return i.read(b); } catch (Throwable E) { throw new java.sql.SQLException("Error reading from InputStream " + E.getClass().getName(), "S1000"); } } private final void escapeblock(byte[] buf,ByteArrayOutputStream BytesOut,int size) { int c =0; for (int i=0;i<size;i++) { byte b = buf[i]; if (b == '\0') { BytesOut.write('\\'); BytesOut.write('0'); } else { if (b == '\\' || b == '\'' || b == '"') { BytesOut.write('\\'); } BytesOut.write(b); } } } /** * For the setXXXStream() methods. Basically converts an * InputStream into a String. Not very efficient, but it * works. * */ private final byte[] streamToBytes(InputStream In) throws java.sql.SQLException { byte[] bi=new byte[128*1024]; ByteArrayOutputStream BytesOut = new ByteArrayOutputStream(); int bc = readblock(In,bi); BytesOut.write('\''); while (bc > 0) { escapeblock(bi,BytesOut,bc); bc = readblock(In,bi); } BytesOut.write('\''); return BytesOut.toByteArray(); } private final char getSuccessor(char c,int n) { return (c=='y' && n==2) ? 'X' : //ym ((c=='y' && n<4) ? 'y' : ((c=='y') ? 'M' : ((c=='M' && n==2) ? 'Y' : //Md ((c=='M' && n<3) ? 'M' : ((c=='M') ? 'd' : ((c=='d' && n<2) ? 'd' : ((c=='d') ? 'h' : ((c=='h' && n<2) ? 'h' : ((c=='h') ? 'm' : ((c=='m' && n<2) ? 'm' : ((c=='m') ? 's' : ((c=='s' && n<2) ? 's' : 'W' )))))))))))); } private final String getDateTimePattern(String dt,boolean toTime) throws Exception { int n,z,count,maxvecs; char c,separator; StringReader reader=new StringReader(dt+" "); Vector vec=new Vector(); Vector vec_removelist=new Vector(); Object[] nv=new Object[3]; Object[] v; nv[0]=new Character('y'); nv[1]=new StringBuffer(); nv[2]=new Integer(0); vec.addElement(nv); if (toTime) { nv=new Object[3]; nv[0]=new Character('h'); nv[1]=new StringBuffer(); nv[2]=new Integer(0); vec.addElement(nv); } while ((z=reader.read())!=-1) { separator=(char)z; maxvecs=vec.size(); for(count=0;count<maxvecs;count++) { v=(Object [])vec.elementAt(count); n=((Integer)v[2]).intValue(); c = getSuccessor(((Character)v[0]).charValue(),n); if (!Character.isLetterOrDigit(separator)) { if ((c==((Character)v[0]).charValue())&&(c!='S')) vec_removelist.addElement(v); else { ((StringBuffer)v[1]).append(separator); if (c=='X' || c=='Y') v[2]=new Integer(4); } } else { if (c=='X') { c='y'; nv=new Object[3]; nv[1]=(new StringBuffer(((StringBuffer)v[1]).toString())).append('M'); nv[0]=new Character('M'); nv[2]=new Integer(1); vec.addElement(nv); } else if (c=='Y') { c='M'; nv=new Object[3]; nv[1]=(new StringBuffer(((StringBuffer)v[1]).toString())).append('d'); nv[0]=new Character('d'); nv[2]=new Integer(1); vec.addElement(nv); } ((StringBuffer)v[1]).append(c); if (c==((Character)v[0]).charValue()) v[2]=new Integer(n+1); else { v[0]=new Character(c); v[2]=new Integer(1); } } } for(Enumeration en=vec_removelist.elements(); en.hasMoreElements();) { v=(Object [])en.nextElement(); vec.removeElement(v); } vec_removelist.removeAllElements(); } for(Enumeration en=vec.elements();en.hasMoreElements();) { v=(Object [])en.nextElement(); c=((Character)v[0]).charValue(); n=((Integer)v[2]).intValue(); boolean bk=getSuccessor(c,n)!=c; boolean atEnd=((c=='s'||c=='m'||(c=='h' && toTime))&&bk); boolean finishesAtDate=(bk&&(c=='d')&& !toTime); boolean containsEnd=(((StringBuffer)v[1]).toString().indexOf('W')!=-1); if ((!atEnd && !finishesAtDate) || (containsEnd)) { vec_removelist.addElement(v); } } for(Enumeration en=vec_removelist.elements();en.hasMoreElements();) vec.removeElement(en.nextElement()); vec_removelist.removeAllElements(); v=(Object [])vec.firstElement(); //might throw exception StringBuffer format=((StringBuffer)v[1]); format.setLength(format.length()-1); return format.toString(); } /** * Formatter for double - Steve Ferguson */ private static NumberFormat _DoubleFormatter; // Class Initializer static { _DoubleFormatter = NumberFormat.getNumberInstance(java.util.Locale.US); _DoubleFormatter.setGroupingUsed(false); // attempt to prevent truncation _DoubleFormatter.setMaximumFractionDigits(8); }};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -