NamedPipeSocketFactory.java
上传用户:sxlinghang
上传日期:2022-07-20
资源大小:1405k
文件大小:6k
源码类别:

数据库编程

开发平台:

Java

  1. /*
  2.    Copyright (C) 2002 MySQL AB
  3.       This program is free software; you can redistribute it and/or modify
  4.       it under the terms of the GNU General Public License as published by
  5.       the Free Software Foundation; either version 2 of the License, or
  6.       (at your option) any later version.
  7.       This program is distributed in the hope that it will be useful,
  8.       but WITHOUT ANY WARRANTY; without even the implied warranty of
  9.       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  10.       GNU General Public License for more details.
  11.       You should have received a copy of the GNU General Public License
  12.       along with this program; if not, write to the Free Software
  13.       Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  14.  */
  15. package com.mysql.jdbc;
  16. import java.io.IOException;
  17. import java.io.InputStream;
  18. import java.io.OutputStream;
  19. import java.io.RandomAccessFile;
  20. import java.net.Socket;
  21. import java.net.SocketException;
  22. import java.util.Properties;
  23. /**
  24.  * A socket factory for named pipes (on Windows)
  25.  *
  26.  * @author Mark Matthews
  27.  */
  28. public class NamedPipeSocketFactory implements SocketFactory {
  29.     private static final String NAMED_PIPE_PROP_NAME = "namedPipePath";
  30.     private Socket namedPipeSocket;
  31.     /**
  32.      * Constructor for NamedPipeSocketFactory.
  33.      */
  34.     public NamedPipeSocketFactory() {
  35.         super();
  36.     }
  37.     /**
  38.      * @see com.mysql.jdbc.SocketFactory#afterHandshake()
  39.      */
  40.     public Socket afterHandshake() throws SocketException, IOException {
  41.         return this.namedPipeSocket;
  42.     }
  43.     /**
  44.      * @see com.mysql.jdbc.SocketFactory#beforeHandshake()
  45.      */
  46.     public Socket beforeHandshake() throws SocketException, IOException {
  47.         return this.namedPipeSocket;
  48.     }
  49.     /**
  50.      * @see com.mysql.jdbc.SocketFactory#connect(String, Properties)
  51.      */
  52.     public Socket connect(String host, Properties props)
  53.         throws SocketException, IOException {
  54.         String namedPipePath = props.getProperty(NAMED_PIPE_PROP_NAME);
  55.         if (namedPipePath == null) {
  56.             namedPipePath = "\\.\pipe\MySQL";
  57.         } else if (namedPipePath.length() == 0) {
  58.             throw new SocketException(
  59.                 "Can not specify NULL or empty value for property '"
  60.                 + NAMED_PIPE_PROP_NAME + "'.");
  61.         }
  62.         this.namedPipeSocket = new NamedPipeSocket(namedPipePath);
  63.         return this.namedPipeSocket;
  64.     }
  65.     /**
  66.      * A socket that encapsulates named pipes on Windows
  67.      */
  68.     class NamedPipeSocket extends Socket {
  69.         private RandomAccessFile namedPipeFile;
  70.         private boolean isClosed = false;
  71.         NamedPipeSocket(String filePath) throws IOException {
  72.             if ((filePath == null) || (filePath.length() == 0)) {
  73.                 throw new IOException(
  74.                     "Named pipe path can not be null or empty");
  75.             }
  76.             this.namedPipeFile = new RandomAccessFile(filePath, "rw");
  77.         }
  78.         /**
  79.          * @see java.net.Socket#isClosed()
  80.          */
  81.         public boolean isClosed() {
  82.             return this.isClosed;
  83.         }
  84.         /**
  85.          * @see java.net.Socket#getInputStream()
  86.          */
  87.         public InputStream getInputStream() throws IOException {
  88.             return new RandomAccessFileInputStream(this.namedPipeFile);
  89.         }
  90.         /**
  91.          * @see java.net.Socket#getOutputStream()
  92.          */
  93.         public OutputStream getOutputStream() throws IOException {
  94.             return new RandomAccessFileOutputStream(this.namedPipeFile);
  95.         }
  96.         /**
  97.          * @see java.net.Socket#close()
  98.          */
  99.         public synchronized void close() throws IOException {
  100.             this.namedPipeFile.close();
  101.             this.isClosed = true;
  102.         }
  103.     }
  104.     /**
  105.      * Enables OutputStream-type functionality for a RandomAccessFile
  106.      */
  107.     class RandomAccessFileInputStream extends InputStream {
  108.         RandomAccessFile raFile;
  109.         RandomAccessFileInputStream(RandomAccessFile file) {
  110.             this.raFile = file;
  111.         }
  112.         /**
  113.          * @see java.io.InputStream#available()
  114.          */
  115.         public int available() throws IOException {
  116.             return -1;
  117.         }
  118.         /**
  119.          * @see java.io.InputStream#close()
  120.          */
  121.         public void close() throws IOException {
  122.             this.raFile.close();
  123.         }
  124.         /**
  125.          * @see java.io.InputStream#read()
  126.          */
  127.         public int read() throws IOException {
  128.             return this.raFile.read();
  129.         }
  130.         /**
  131.          * @see java.io.InputStream#read(byte[], int, int)
  132.          */
  133.         public int read(byte[] b, int off, int len) throws IOException {
  134.             return this.raFile.read(b, off, len);
  135.         }
  136.         /**
  137.          * @see java.io.InputStream#read(byte[])
  138.          */
  139.         public int read(byte[] b) throws IOException {
  140.             return this.raFile.read(b);
  141.         }
  142.     }
  143.     /**
  144.      * Enables OutputStream-type functionality for a RandomAccessFile
  145.      */
  146.     class RandomAccessFileOutputStream extends OutputStream {
  147.         RandomAccessFile raFile;
  148.         RandomAccessFileOutputStream(RandomAccessFile file) {
  149.             this.raFile = file;
  150.         }
  151.         /**
  152.          * @see java.io.OutputStream#close()
  153.          */
  154.         public void close() throws IOException {
  155.             this.raFile.close();
  156.         }
  157.         /**
  158.          * @see java.io.OutputStream#write(byte[], int, int)
  159.          */
  160.         public void write(byte[] b, int off, int len) throws IOException {
  161.             this.raFile.write(b, off, len);
  162.         }
  163.         /**
  164.          * @see java.io.OutputStream#write(byte[])
  165.          */
  166.         public void write(byte[] b) throws IOException {
  167.             this.raFile.write(b);
  168.         }
  169.         /**
  170.          * @see java.io.OutputStream#write(int)
  171.          */
  172.         public void write(int b) throws IOException {
  173.         }
  174.     }
  175. }