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

📄 mysqlio.java

📁 SSD9 练习9
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
    final ResultSet sqlQueryDirect(Buffer QueryPacket, int max_rows) throws Exception    {	long updateCount = -1;	long updateID = -1;  	// Send query command and sql query string	clearAllReceive();			Buffer Packet = sendCommand(MysqlDefs.QUERY, null, QueryPacket);	Packet.pos--;	long columnCount = Packet.readLength();	if (Driver.trace) {	    Debug.msg(this, "Column count: " + columnCount);	}	if (columnCount == 0) {	    try {		if (_server_major_version >= 3 &&		    _server_minor_version >= 22 &&		    _server_sub_minor_version >= 5) {		    updateCount = Packet.newReadLength();		    updateID = Packet.newReadLength();		}		else {		    updateCount = (long)Packet.readLength();		    updateID = (long)Packet.readLength();		}	    }	    catch (Exception E) {		throw new java.sql.SQLException(SQLError.get("S1000") + 						": " + E.getClass().getName(),						"S1000", -1);	    }		  	    if (Driver.trace) {		Debug.msg(this, "Update Count = " + updateCount);	    }		 	    return new ResultSet(updateCount, updateID);	}	else {	    Field[] Fields = new Field[(int)columnCount];	    // Read in the column information	    for (int i = 0; i < columnCount; i++) {		Packet = readPacket();		String TableName = Packet.readLenString();		String ColName   = Packet.readLenString();		int colLength    = Packet.readnBytes();		int colType      = Packet.readnBytes();		Packet.readByte(); // We know it's currently 2		short colFlag    = (short)Buffer.ub(Packet.readByte());		int colDecimals  = Buffer.ub(Packet.readByte());		    		Fields[i] = new Field(TableName, ColName, colLength, 				      colType, colFlag, colDecimals);	    }	    Packet = readPacket();    	    Vector Rows = new Vector();	    // Now read the data	    byte[][] Row = nextRow((int)columnCount);		 	    Rows.addElement(Row);	    int row_count = 1;	    while (Row != null && row_count < max_rows) {		Row = nextRow((int)columnCount);		if (Row != null) {		    Rows.addElement(Row);		    row_count++;		}		else {		    if (Driver.trace) {			Debug.msg(this, "* NULL Row *");		    }		}	    }	    if (Driver.trace) {		Debug.msg(this, "* Fetched " + Rows.size() + " rows from server *");	    }	    return new ResultSet(Fields, Rows);	}    }    /**     * Send a query specified in the String "Query" to the MySQL server.     *     * This method uses the specified character encoding to get the     * bytes from the query string.     */    final ResultSet sqlQuery(String Query, int max_rows, String Encoding)	throws Exception    {	// We don't know exactly how many bytes we're going to get 	// from the query. Since we're dealing with Unicode, the         // max is 2, so pad it (2 * query) + space for headers 	int pack_length = HEADER_LENGTH + 1 + (Query.length() * 2) + 2;	Buffer Packet = new Buffer(pack_length);	Packet.writeByte((byte)MysqlDefs.QUERY);	if (Encoding != null) {	    Packet.writeStringNoNull(Query, Encoding);         }        else {            Packet.writeStringNoNull(Query);	}	return sqlQueryDirect(Packet, max_rows);    }	    final ResultSet sqlQuery(String Query, int max_rows) throws Exception    {	long updateCount = -1;	long updateID = -1;  	// Send query command and sql query string	clearAllReceive();	Buffer Packet = sendCommand(MysqlDefs.QUERY, Query, null); //, (byte)0);	Packet.pos--;	long columnCount = Packet.readLength();			if (Driver.trace) {	    Debug.msg(this, "Column count: " + columnCount);	}    	if (columnCount == 0) {	    try {		if (_server_major_version >= 3 &&		    _server_minor_version >= 22 &&		    _server_sub_minor_version >= 5) {		    updateCount = Packet.newReadLength();		    updateID = Packet.newReadLength();		}		else {		    updateCount = (long)Packet.readLength();		    updateID = (long)Packet.readLength();		}	    }	    catch (Exception E) {		throw new java.sql.SQLException(SQLError.get("S1000") + ": " + E.getClass().getName(),						"S1000", -1);	    }		  	    if (Driver.trace) {		Debug.msg(this, "Update Count = " + updateCount);	    }		 	    return new ResultSet(updateCount, updateID);	}	else {	    Field[] Fields = new Field[(int)columnCount];	    // Read in the column information	    for (int i = 0; i < columnCount; i++) {		Packet = readPacket();		String TableName = Packet.readLenString();		String ColName   = Packet.readLenString();		int colLength    = Packet.readnBytes();		int colType      = Packet.readnBytes();		Packet.readByte(); // We know it's currently 2		short colFlag    = (short)Buffer.ub(Packet.readByte());		int colDecimals  = Buffer.ub(Packet.readByte());		    		Fields[i] = new Field(TableName, ColName, colLength, colType, colFlag, 				      colDecimals);	    }	    Packet = readPacket();    	    Vector Rows = new Vector();	    // Now read the data	    byte[][] Row = nextRow((int)columnCount);		 	    Rows.addElement(Row);	    int row_count = 1;	    while (Row != null && row_count < max_rows) {		Row = nextRow((int)columnCount);		if (Row != null) {		    Rows.addElement(Row);		    row_count++;		}		else {		    if (Driver.trace) {			Debug.msg(this, "* NULL Row *");		    }		}	    }	    if (Driver.trace) {		Debug.msg(this, "* Fetched " + Rows.size() + " rows from server *");	    }	    return new ResultSet(Fields, Rows);	}    }        /**     * Retrieve one row from the MySQL server.     *     * Note: this method is not thread-safe, but it is only called     * from methods that are guarded by synchronizing on this object.     */    private final byte[][] nextRow(int columnCount) throws Exception    {	// Get the next incoming packet, re-using the packet because	// all the data we need gets copied out of it.	Buffer Packet = reuseAndReadPacket(_ReusablePacket);    	// check for errors.    	if (Packet.readByte() == (byte)0xff) {	    String ErrorMessage;	    int errno = 2000;		  	    if (_protocol_V > 9) {		errno = Packet.readInt();		ErrorMessage = Packet.readString();		String XOpen = SQLError.mysqlToXOpen(errno);		clearReceive();		throw new java.sql.SQLException(SQLError.get(SQLError.get(XOpen)) + ": " 						+ ErrorMessage, XOpen, errno);	    }	    else {		ErrorMessage = Packet.readString();		clearReceive();		throw new java.sql.SQLException(ErrorMessage, SQLError.mysqlToXOpen(errno), errno);	    }	}    	// Away we go....    	Packet.pos--;    	int[] dataStart = new int[columnCount];	byte[][] Row = new byte[columnCount][];	if (!Packet.isLastDataPacket()) {		 	    for (int i = 0; i < columnCount; i++) {		int p = Packet.pos;		dataStart[i] = p;		Packet.pos = (int)Packet.readLength() + Packet.pos;	    }	    for (int i = 0; i < columnCount; i++) {		Packet.pos = dataStart[i];		Row[i] = Packet.readLenByteArray();			if (Driver.trace) {		    if (Row[i] == null) {			Debug.msg(this, "Field value: NULL");		    }		    else {			Debug.msg(this, "Field value: " + Row[i].toString());		    }		}	    }	    return Row;	}	return null;    }    /**     * Log-off of the MySQL server and close the socket.     */    final void quit() throws IOException    {	Buffer Packet = new Buffer(6);	_packetSequence = -1;	Packet.writeByte((byte)MysqlDefs.QUIT);	send(Packet);	_Mysql_Conn.close();    }    /**     * Get the major version of the MySQL server we are     * talking to.     */    final int getServerMajorVersion()    {	return _server_major_version;    }    /**     * Get the minor version of the MySQL server we are     * talking to.     */    final int getServerMinorVersion()    {	return _server_minor_version;    }    /**     * Get the sub-minor version of the MySQL server we are     * talking to.     */    final int getServerSubMinorVersion()    {	return _server_sub_minor_version;    }    /**     * Read one packet from the MySQL server     */    private final Buffer readPacket() throws IOException    {	byte b0, b1, b2;	b0 = _Mysql_Input.readByte();	b1 = _Mysql_Input.readByte();	b2 = _Mysql_Input.readByte();    	int packetLength = (int)(Buffer.ub(b0) + (256*Buffer.ub(b1)) + (256*256*Buffer.ub(b2)));	byte packetSeq = _Mysql_Input.readByte();	// Read data	byte[] buffer = new byte[packetLength + 1];	_Mysql_Input.readFully(buffer, 0, packetLength);	buffer[packetLength] = 0;	return new Buffer(buffer);    }    /**     * Re-use a packet to read from the MySQL server     */    private final Buffer reuseAndReadPacket(Buffer Reuse) throws IOException    {	byte b0, b1, b2;	b0 = _Mysql_Input.readByte();	b1 = _Mysql_Input.readByte();	b2 = _Mysql_Input.readByte();    	int packetLength = (int)(Buffer.ub(b0) + (256*Buffer.ub(b1)) + (256*256*Buffer.ub(b2)));		byte packetSeq = _Mysql_Input.readByte();	// Set the Buffer to it's original state	Reuse.pos = 0;	Reuse.send_length = 0;		// Do we need to re-alloc the byte buffer?	//	// Note: We actually check the length of the buffer,	// rather than buf_length, because buf_length is not	// necesarily the actual length of the byte array	// used as the buffer	if (Reuse.buf.length < packetLength) {	    Reuse.buf = new byte[packetLength];	}	// Set the new length	Reuse.buf_length = packetLength;	// Read the data from the server	_Mysql_Input.readFully(Reuse.buf, 0, packetLength);	Reuse.buf[packetLength] = 0; // Null-termination       	return Reuse;    }	    /**     * Send a packet to the MySQL server     */    private final void send(Buffer Packet) throws IOException    {	int l = Packet.pos;	_packetSequence++;	Packet.pos = 0;	Packet.writeLongInt(l - HEADER_LENGTH);	Packet.writeByte(_packetSequence);	_Mysql_Output.write(Packet.buf, 0, l);	_Mysql_Output.flush();	_Mysql_Buf_Output.flush();	int total_header_length = HEADER_LENGTH;    }    /**     * Clear waiting data in the InputStream     */    private final void clearReceive() throws IOException    {	int len = _Mysql_Buf_Input.available();	if (len > 0) {	    _Mysql_Input.skipBytes(len);	}      }    /**     * Clear all data in the InputStream that is being     * sent by the MySQL server.     */    private final void clearAllReceive() throws java.sql.SQLException    {	try {	    int len = _Mysql_Buf_Input.available();	    if (len > 0) {		Buffer Packet = readPacket();		if (Packet.buf[0] == (byte)0xff){		    clearReceive();		    return;		}		while (!Packet.isLastDataPacket()) {            		    // larger than the socket buffer.		    Packet = readPacket();		    if (Packet.buf[0] == (byte)0xff)			break;		}	    }	    clearReceive();	}	catch (IOException E) {	    throw new SQLException("Communication link failure: " + 				   E.getClass().getName(), "08S01");	}    }      static int getMaxBuf()    {        return MAXBUF;    }};

⌨️ 快捷键说明

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