亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? sessionremote.java

?? 非常棒的java數據庫
?? JAVA
字號:
/*
 * Copyright 2004-2008 H2 Group. Licensed under the H2 License, Version 1.0
 * (http://h2database.com/html/license.html).
 * Initial Developer: H2 Group
 */
package org.h2.engine;

import java.io.IOException;
import java.net.Socket;
import java.sql.SQLException;

import org.h2.command.CommandInterface;
import org.h2.command.CommandRemote;
import org.h2.command.dml.SetTypes;
import org.h2.constant.ErrorCode;
import org.h2.constant.SysProperties;
import org.h2.jdbc.JdbcSQLException;
import org.h2.message.Message;
import org.h2.message.Trace;
import org.h2.message.TraceSystem;
import org.h2.store.DataHandler;
import org.h2.store.FileStore;
import org.h2.util.FileUtils;
import org.h2.util.NetUtils;
import org.h2.util.ObjectArray;
import org.h2.util.RandomUtils;
import org.h2.util.SmallLRUCache;
import org.h2.util.StringUtils;
import org.h2.value.Transfer;
import org.h2.value.Value;

/**
 * The client side part of a session when using the server mode.
 * This object communicates with a Session on the server side.
 */
public class SessionRemote implements SessionInterface, DataHandler {

    public static final int SESSION_PREPARE = 0;
    public static final int SESSION_CLOSE = 1;
    public static final int COMMAND_EXECUTE_QUERY = 2;
    public static final int COMMAND_EXECUTE_UPDATE = 3;
    public static final int COMMAND_CLOSE = 4;
    public static final int RESULT_FETCH_ROWS = 5;
    public static final int RESULT_RESET = 6;
    public static final int RESULT_CLOSE = 7;
    public static final int COMMAND_COMMIT = 8;
    public static final int CHANGE_ID = 9;
    public static final int COMMAND_GET_META_DATA = 10;

    public static final int STATUS_ERROR = 0;
    public static final int STATUS_OK = 1;
    public static final int STATUS_CLOSED = 2;

    private TraceSystem traceSystem;
    private Trace trace;
    private ObjectArray transferList;
    private int nextId;
    private boolean autoCommit = true;
    private CommandInterface switchOffAutoCommit;
    private ConnectionInfo connectionInfo;
    private int objectId;
    private String databaseName;
    private String cipher;
    private byte[] fileEncryptionKey;
    private Object lobSyncObject = new Object();

    private Transfer initTransfer(ConnectionInfo ci, String db, String server) throws IOException, SQLException {
        Socket socket = NetUtils.createSocket(server, Constants.DEFAULT_SERVER_PORT, ci.isSSL());
        Transfer trans = new Transfer(this);
        trans.setSocket(socket);
        trans.init();
        trans.writeInt(Constants.TCP_DRIVER_VERSION);
        trans.writeString(db);
        trans.writeString(ci.getOriginalURL());
        trans.writeString(ci.getUserName());
        trans.writeBytes(ci.getUserPasswordHash());
        trans.writeBytes(ci.getFilePasswordHash());
        String[] keys = ci.getKeys();
        trans.writeInt(keys.length);
        for (int i = 0; i < keys.length; i++) {
            String key = keys[i];
            trans.writeString(key).writeString(ci.getProperty(key));
        }
        try {
            done(trans);
        } catch (SQLException e) {
            trans.close();
            throw e;
        }
        autoCommit = true;
        return trans;
    }

    private void switchOffAutoCommitIfCluster() throws SQLException {
        if (autoCommit && transferList.size() > 1) {
            if (switchOffAutoCommit == null) {
                switchOffAutoCommit = prepareCommand("SET AUTOCOMMIT FALSE", Integer.MAX_VALUE);
            }
            // this will call setAutoCommit(false)
            switchOffAutoCommit.executeUpdate();
            // so we need to switch it on
            autoCommit = true;
        }
    }

    public void setAutoCommit(boolean autoCommit) {
        this.autoCommit = autoCommit;
    }

    public void autoCommitIfCluster() throws SQLException {
        if (autoCommit && transferList != null && transferList.size() > 1) {
            // server side auto commit is off because of race conditions
            // (update set id=1 where id=0, but update set id=2 where id=0 is
            // faster)
            for (int i = 0; i < transferList.size(); i++) {
                Transfer transfer = (Transfer) transferList.get(i);
                try {
                    traceOperation("COMMAND_COMMIT", 0);
                    transfer.writeInt(SessionRemote.COMMAND_COMMIT);
                    done(transfer);
                } catch (IOException e) {
                    removeServer(i--);
                }
            }
        }
    }

    private String getTraceFilePrefix(String dbName) throws SQLException {
        String dir = SysProperties.CLIENT_TRACE_DIRECTORY;
        StringBuffer buff = new StringBuffer();
        buff.append(dir);
        for (int i = 0; i < dbName.length(); i++) {
            char ch = dbName.charAt(i);
            if (Character.isLetterOrDigit(ch)) {
                buff.append(ch);
            } else {
                buff.append('_');
            }
        }
        return buff.toString();
    }

    public SessionRemote() {
    }

    public int getPowerOffCount() {
        return 0;
    }

    public void setPowerOffCount(int count) throws SQLException {
        throw Message.getUnsupportedException();
    }

    public SessionInterface createSession(ConnectionInfo ci) throws SQLException {
        return new SessionRemote(ci);
    }

    private SessionRemote(ConnectionInfo ci) throws SQLException {
        this.connectionInfo = ci;
        connect();
    }

    private void connect() throws SQLException {
        ConnectionInfo ci = connectionInfo;
        String name = ci.getName();
        if (name.startsWith("//")) {
            name = name.substring("//".length());
        }
        int idx = name.indexOf('/');
        if (idx < 0) {
            throw ci.getFormatException();
        }
        databaseName = name.substring(idx + 1);
        String server = name.substring(0, idx);
        traceSystem = new TraceSystem(null, false);
        try {
            String traceLevelFile = ci.getProperty(SetTypes.TRACE_LEVEL_FILE, null);
            if (traceLevelFile != null) {
                int level = Integer.parseInt(traceLevelFile);
                String prefix = getTraceFilePrefix(databaseName);
                String file = FileUtils.createTempFile(prefix, Constants.SUFFIX_TRACE_FILE, false, false);
                traceSystem.setFileName(file);
                traceSystem.setLevelFile(level);
            }
            String traceLevelSystemOut = ci.getProperty(SetTypes.TRACE_LEVEL_SYSTEM_OUT, null);
            if (traceLevelSystemOut != null) {
                int level = Integer.parseInt(traceLevelSystemOut);
                traceSystem.setLevelSystemOut(level);
            }
        } catch (Exception e) {
            throw Message.convert(e);
        }
        trace = traceSystem.getTrace(Trace.JDBC);
        transferList = new ObjectArray();
        String serverlist = null;
        if (server.indexOf(',') >= 0) {
            serverlist = StringUtils.quoteStringSQL(server);
            ci.setProperty("CLUSTER", serverlist);
        }
        cipher = ci.getProperty("CIPHER");
        if (cipher != null) {
            fileEncryptionKey = RandomUtils.getSecureBytes(32);
        }
        String[] servers = StringUtils.arraySplit(server, ',', true);
        int len = servers.length;
        transferList = new ObjectArray();
        // TODO cluster: support at most 2 connections
        boolean switchOffCluster = false;
        try {
            for (int i = 0; i < len; i++) {
                try {
                    Transfer trans = initTransfer(ci, databaseName, servers[i]);
                    transferList.add(trans);
                } catch (IOException e) {
                    switchOffCluster = true;
                }
            }
            checkClosed();
            if (switchOffCluster) {
                switchOffCluster();
            }
            switchOffAutoCommitIfCluster();
        } catch (SQLException e) {
            traceSystem.close();
            throw e;
        }
    }

    private void switchOffCluster() throws SQLException {
        CommandInterface ci = prepareCommand("SET CLUSTER ''", Integer.MAX_VALUE);
        ci.executeUpdate();
    }

    public void removeServer(int i) throws SQLException {
        transferList.remove(i);
        checkClosed();
        switchOffCluster();
    }

    public CommandInterface prepareCommand(String sql, int fetchSize) throws SQLException {
        synchronized (this) {
            checkClosed();
            return new CommandRemote(this, transferList, sql, fetchSize);
        }
    }

    public void checkClosed() throws SQLException {
        if (isClosed()) {
            // TODO broken connection: try to reconnect automatically
            throw Message.getSQLException(ErrorCode.CONNECTION_BROKEN);
        }
    }

    public void close() {
        if (transferList != null) {
            synchronized (this) {
                for (int i = 0; i < transferList.size(); i++) {
                    Transfer transfer = (Transfer) transferList.get(i);
                    try {
                        traceOperation("SESSION_CLOSE", 0);
                        transfer.writeInt(SessionRemote.SESSION_CLOSE);
                        done(transfer);
                        transfer.close();
                    } catch (Exception e) {
                        trace.error("close", e);
                    }
                }
            }
            transferList = null;
        }
        traceSystem.close();
    }

    public Trace getTrace() {
        return traceSystem.getTrace(Trace.JDBC);
    }

    public int getNextId() {
        return nextId++;
    }

    public int getCurrentId() {
        return nextId;
    }

    public void done(Transfer transfer) throws SQLException, IOException {
        transfer.flush();
        int status = transfer.readInt();
        if (status == STATUS_ERROR) {
            String sqlstate = transfer.readString();
            String message = transfer.readString();
            String sql = transfer.readString();
            int errorCode = transfer.readInt();
            String trace = transfer.readString();
            throw new JdbcSQLException(message, sql, sqlstate, errorCode, null, trace);
        } else if (status == STATUS_CLOSED) {
            transferList = null;
        }
    }

    public boolean isClustered() {
        return transferList.size() > 1;
    }

    public boolean isClosed() {
        return transferList == null || transferList.size() == 0;
    }

    public void traceOperation(String operation, int id) {
        if (trace.debug()) {
            trace.debug(operation + " " + id);
        }
    }

    public int allocateObjectId(boolean needFresh, boolean dataFile) {
        return objectId++;
    }

    public void checkPowerOff() throws SQLException {
    }

    public void checkWritingAllowed() throws SQLException {
    }

    public int compareTypeSave(Value a, Value b) throws SQLException {
        throw Message.getInternalError();
    }

    public String createTempFile() throws SQLException {
        try {
            return FileUtils.createTempFile(databaseName, Constants.SUFFIX_TEMP_FILE, true, false);
        } catch (IOException e) {
            throw Message.convertIOException(e, databaseName);
        }
    }

    public void freeUpDiskSpace() throws SQLException {
    }

    public int getChecksum(byte[] data, int start, int end) {
        return 0;
    }

    public String getDatabasePath() {
        return "";
    }

    public String getLobCompressionAlgorithm(int type) {
        return null;
    }

    public int getMaxLengthInplaceLob() {
        return Constants.DEFAULT_MAX_LENGTH_CLIENTSIDE_LOB;
    }

    public boolean getTextStorage() {
        return false;
    }

    public void handleInvalidChecksum() throws SQLException {
        throw Message.getSQLException(ErrorCode.FILE_CORRUPTED_1, "wrong checksum");
    }

    public FileStore openFile(String name, String mode, boolean mustExist) throws SQLException {
        if (mustExist && !FileUtils.exists(name)) {
            throw Message.getSQLException(ErrorCode.FILE_CORRUPTED_1, name);
        }
        FileStore store;
        byte[] magic = Constants.MAGIC_FILE_HEADER.getBytes();
        if (cipher == null) {
            store = FileStore.open(this, name, mode, magic);
        } else {
            store = FileStore.open(this, name, mode, magic, cipher, fileEncryptionKey, 0);
        }
        store.setCheckedWriting(false);
        try {
            store.init();
        } catch (SQLException e) {
            store.closeSilently();
            throw e;
        }
        return store;
    }

    public DataHandler getDataHandler() {
        return this;
    }

    public Object getLobSyncObject() {
        return lobSyncObject;
    }

    public void cancel() {
        // TODO open another remote connection and cancel this session 
        // using a unique id (like PostgreSQL)
    }

    public boolean getLobFilesInDirectories() {
        return false;
    }

    public SmallLRUCache getLobFileListCache() {
        return null;
    }

}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一本一道久久a久久精品 | 天堂久久久久va久久久久| heyzo一本久久综合| 国产精品久久久久久久第一福利| 风间由美一区二区av101 | 91丨porny丨中文| 亚洲视频一二三区| 欧美色区777第一页| 天堂av在线一区| 日韩欧美一级精品久久| 日韩和欧美的一区| 久久久精品日韩欧美| 欧美精品精品一区| 久久精品国产免费| 国产精品天美传媒| 欧美综合视频在线观看| 免费成人小视频| 中文字幕的久久| 91九色02白丝porn| 激情都市一区二区| 亚洲欧美日韩中文字幕一区二区三区| 日本精品视频一区二区| 免费成人你懂的| 亚洲视频一二区| 欧美mv日韩mv国产网站app| 成人在线视频一区| 天天综合天天综合色| 久久精品一区二区三区不卡牛牛| 色先锋久久av资源部| 久久成人免费日本黄色| 亚洲人成人一区二区在线观看| 在线播放国产精品二区一二区四区 | 国产精品福利一区| 日韩视频在线你懂得| 成人av免费在线观看| 秋霞午夜鲁丝一区二区老狼| 国产精品久久久久7777按摩| 欧美一区二区三区四区五区| av午夜精品一区二区三区| 麻豆成人在线观看| 一区二区三区国产| 久久久久国产精品人| 4438x亚洲最大成人网| 99视频热这里只有精品免费| 日本不卡的三区四区五区| 中文字幕日本不卡| 精品国免费一区二区三区| 色天天综合色天天久久| 国产成a人亚洲精品| 视频精品一区二区| 亚洲精品免费在线| 国产精品水嫩水嫩| 日韩欧美精品在线视频| 欧美性猛交一区二区三区精品| 懂色av一区二区三区免费观看| 久久精品国产一区二区三 | 波多野结衣视频一区| 国产自产2019最新不卡| 肉色丝袜一区二区| 亚洲一区av在线| 亚洲欧洲综合另类在线| 久久久夜色精品亚洲| 日韩午夜激情av| 91精品国产色综合久久不卡蜜臀| 在线精品视频一区二区| 99re这里只有精品视频首页| 国产精华液一区二区三区| 久久精品国产精品亚洲红杏| 天天操天天色综合| 亚洲大片在线观看| 亚洲国产精品尤物yw在线观看| 自拍偷拍欧美精品| 中文字幕一区二区三区在线播放 | 日韩和欧美一区二区三区| 亚洲国产精品久久久久婷婷884| 综合欧美亚洲日本| 亚洲人精品一区| 一区二区激情小说| 成人激情免费网站| proumb性欧美在线观看| 97久久超碰国产精品电影| 99久久免费国产| 日本丰满少妇一区二区三区| 色女孩综合影院| 欧美美女一区二区| 欧美一级免费大片| 精品福利一区二区三区免费视频| 欧美tk丨vk视频| 久久久99精品免费观看| 国产精品视频免费| 亚洲视频你懂的| 丝袜亚洲精品中文字幕一区| 免费成人你懂的| 丰满少妇久久久久久久| 色综合色综合色综合色综合色综合| 一本到三区不卡视频| 欧美日韩视频第一区| 日韩视频一区二区| 国产精品视频观看| 亚洲一区二区免费视频| 免费欧美在线视频| 国产成人亚洲综合色影视| 99久久久久免费精品国产 | 青青草97国产精品免费观看无弹窗版| 久久成人免费电影| 丰满白嫩尤物一区二区| 91性感美女视频| 制服丝袜一区二区三区| 久久久久97国产精华液好用吗| 中文字幕一区二区三区四区不卡 | 国产精品人人做人人爽人人添| 国产精品大尺度| 日韩精品亚洲一区| 国产凹凸在线观看一区二区| 在线免费观看不卡av| 精品久久久久久最新网址| 日本一二三四高清不卡| 亚洲一区二区五区| 国产久卡久卡久卡久卡视频精品| 99re这里只有精品首页| 制服.丝袜.亚洲.另类.中文| 国产视频一区在线播放| 亚洲精品美腿丝袜| 国内不卡的二区三区中文字幕| 91污片在线观看| 日韩精品专区在线影院重磅| 最近日韩中文字幕| 久久99九九99精品| 欧美色欧美亚洲另类二区| 久久亚洲一区二区三区明星换脸| 亚洲日本在线天堂| 国产精品一区免费在线观看| 欧美日韩一区在线| 国产精品乱码妇女bbbb| 毛片av一区二区三区| 欧美视频一区二区三区在线观看| 欧美美女一区二区在线观看| 国产精品私人影院| 久久99精品久久久久久| 欧美日韩一区高清| 亚洲男帅同性gay1069| 国产美女在线观看一区| 欧美日韩你懂的| 亚洲男同性恋视频| 不卡视频在线观看| 久久综合色天天久久综合图片| 亚洲chinese男男1069| 91丨porny丨首页| 日本一区二区久久| 国产精品一区二区久激情瑜伽| 欧美一级免费观看| 天天色 色综合| 欧美视频中文一区二区三区在线观看| 中文字幕一区免费在线观看| 国产综合色产在线精品| 日韩欧美资源站| 麻豆精品新av中文字幕| 欧美日本国产一区| 亚洲第一会所有码转帖| 欧美午夜精品久久久久久孕妇 | 欧美电影免费观看高清完整版在线| 亚洲一区二区视频在线| 一本一道久久a久久精品| 国产精品免费av| 成人理论电影网| 国产精品美女久久久久久久| 风间由美中文字幕在线看视频国产欧美| 精品国产乱码久久久久久老虎| 免费观看30秒视频久久| 欧美一卡二卡在线观看| 日本午夜一本久久久综合| 69p69国产精品| 老色鬼精品视频在线观看播放| 制服丝袜中文字幕亚洲| 蜜桃一区二区三区在线观看| 日韩情涩欧美日韩视频| 激情偷乱视频一区二区三区| 2021久久国产精品不只是精品| 国产精品一区专区| 亚洲国产岛国毛片在线| 99国产欧美久久久精品| 亚洲综合偷拍欧美一区色| 欧美久久一二三四区| 日韩精品每日更新| 精品国产凹凸成av人网站| 国产一区在线观看视频| 国产精品久久99| 欧美三区在线观看| 欧美日韩午夜影院| 日韩va欧美va亚洲va久久| 精品国产乱码久久久久久久| 成人免费高清在线| 亚洲午夜电影网| 日韩美女视频一区二区在线观看| 国产精品1024| 亚洲精品ww久久久久久p站| 欧美视频在线一区| 极品美女销魂一区二区三区免费| 日本一区二区三区高清不卡| 91黄色激情网站|