Search in sources :

Example 61 with User

use of org.h2.engine.User in project h2database by h2database.

the class Engine method openSession.

private synchronized Session openSession(ConnectionInfo ci) {
    boolean ifExists = ci.removeProperty("IFEXISTS", false);
    boolean ignoreUnknownSetting = ci.removeProperty("IGNORE_UNKNOWN_SETTINGS", false);
    String cipher = ci.removeProperty("CIPHER", null);
    String init = ci.removeProperty("INIT", null);
    Session session;
    for (int i = 0; ; i++) {
        session = openSession(ci, ifExists, cipher);
        if (session != null) {
            break;
        }
        // wait a bit to avoid a busy loop (the method is synchronized)
        if (i > 60 * 1000) {
            // retry at most 1 minute
            throw DbException.get(ErrorCode.DATABASE_ALREADY_OPEN_1, "Waited for database closing longer than 1 minute");
        }
        try {
            Thread.sleep(1);
        } catch (InterruptedException e) {
        // ignore
        }
    }
    synchronized (session) {
        session.setAllowLiterals(true);
        DbSettings defaultSettings = DbSettings.getDefaultSettings();
        for (String setting : ci.getKeys()) {
            if (defaultSettings.containsKey(setting)) {
                // database setting are only used when opening the database
                continue;
            }
            String value = ci.getProperty(setting);
            try {
                CommandInterface command = session.prepareCommand("SET " + Parser.quoteIdentifier(setting) + " " + value, Integer.MAX_VALUE);
                command.executeUpdate(false);
            } catch (DbException e) {
                if (e.getErrorCode() == ErrorCode.ADMIN_RIGHTS_REQUIRED) {
                    session.getTrace().error(e, "admin rights required; user: \"" + ci.getUserName() + "\"");
                } else {
                    session.getTrace().error(e, "");
                }
                if (!ignoreUnknownSetting) {
                    session.close();
                    throw e;
                }
            }
        }
        if (init != null) {
            try {
                CommandInterface command = session.prepareCommand(init, Integer.MAX_VALUE);
                command.executeUpdate(false);
            } catch (DbException e) {
                if (!ignoreUnknownSetting) {
                    session.close();
                    throw e;
                }
            }
        }
        session.setAllowLiterals(false);
        session.commit(true);
    }
    return session;
}
Also used : CommandInterface(org.h2.command.CommandInterface) DbException(org.h2.message.DbException)

Example 62 with User

use of org.h2.engine.User in project h2database by h2database.

the class WebApp method login.

private String login() {
    String driver = attributes.getProperty("driver", "");
    String url = attributes.getProperty("url", "");
    String user = attributes.getProperty("user", "");
    String password = attributes.getProperty("password", "");
    session.put("autoCommit", "checked");
    session.put("autoComplete", "1");
    session.put("maxrows", "1000");
    boolean isH2 = url.startsWith("jdbc:h2:");
    try {
        Connection conn = server.getConnection(driver, url, user, password);
        session.setConnection(conn);
        session.put("url", url);
        session.put("user", user);
        session.remove("error");
        settingSave();
        return "frame.jsp";
    } catch (Exception e) {
        session.put("error", getLoginError(e, isH2));
        return "login.jsp";
    }
}
Also used : Connection(java.sql.Connection) DbException(org.h2.message.DbException) InvocationTargetException(java.lang.reflect.InvocationTargetException) SQLException(java.sql.SQLException) JdbcSQLException(org.h2.jdbc.JdbcSQLException)

Example 63 with User

use of org.h2.engine.User in project h2database by h2database.

the class WebApp method test.

private String test() {
    String driver = attributes.getProperty("driver", "");
    String url = attributes.getProperty("url", "");
    String user = attributes.getProperty("user", "");
    String password = attributes.getProperty("password", "");
    session.put("driver", driver);
    session.put("url", url);
    session.put("user", user);
    boolean isH2 = url.startsWith("jdbc:h2:");
    try {
        long start = System.currentTimeMillis();
        String profOpen = "", profClose = "";
        Profiler prof = new Profiler();
        prof.startCollecting();
        Connection conn;
        try {
            conn = server.getConnection(driver, url, user, password);
        } finally {
            prof.stopCollecting();
            profOpen = prof.getTop(3);
        }
        prof = new Profiler();
        prof.startCollecting();
        try {
            JdbcUtils.closeSilently(conn);
        } finally {
            prof.stopCollecting();
            profClose = prof.getTop(3);
        }
        long time = System.currentTimeMillis() - start;
        String success;
        if (time > 1000) {
            success = "<a class=\"error\" href=\"#\" " + "onclick=\"var x=document.getElementById('prof').style;x." + "display=x.display==''?'none':'';\">" + "${text.login.testSuccessful}</a>" + "<span style=\"display: none;\" id=\"prof\"><br />" + PageParser.escapeHtml(profOpen) + "<br />" + PageParser.escapeHtml(profClose) + "</span>";
        } else {
            success = "<div class=\"success\">${text.login.testSuccessful}</div>";
        }
        session.put("error", success);
        // session.put("error", "${text.login.testSuccessful}");
        return "login.jsp";
    } catch (Exception e) {
        session.put("error", getLoginError(e, isH2));
        return "login.jsp";
    }
}
Also used : Profiler(org.h2.util.Profiler) Connection(java.sql.Connection) DbException(org.h2.message.DbException) InvocationTargetException(java.lang.reflect.InvocationTargetException) SQLException(java.sql.SQLException) JdbcSQLException(org.h2.jdbc.JdbcSQLException)

Example 64 with User

use of org.h2.engine.User in project h2database by h2database.

the class Recover method dumpPageDataLeaf.

private void dumpPageDataLeaf(PrintWriter writer, Data s, boolean last, long pageId, int columnCount, int entryCount) {
    long[] keys = new long[entryCount];
    int[] offsets = new int[entryCount];
    long next = 0;
    if (!last) {
        next = s.readInt();
        writer.println("--   next: " + next);
    }
    int empty = pageSize;
    for (int i = 0; i < entryCount; i++) {
        keys[i] = s.readVarLong();
        int off = s.readShortInt();
        empty = Math.min(off, empty);
        offsets[i] = off;
    }
    stat.pageDataRows += pageSize - empty;
    empty = empty - s.length();
    stat.pageDataHead += s.length();
    stat.pageDataEmpty += empty;
    if (trace) {
        writer.println("--   empty: " + empty);
    }
    if (!last) {
        Data s2 = Data.create(this, pageSize);
        s.setPos(pageSize);
        long parent = pageId;
        while (true) {
            checkParent(writer, parent, new int[] { (int) next }, 0);
            parent = next;
            seek(next);
            store.readFully(s2.getBytes(), 0, pageSize);
            s2.reset();
            int type = s2.readByte();
            s2.readShortInt();
            s2.readInt();
            if (type == (Page.TYPE_DATA_OVERFLOW | Page.FLAG_LAST)) {
                int size = s2.readShortInt();
                writer.println("-- chain: " + next + " type: " + type + " size: " + size);
                s.checkCapacity(size);
                s.write(s2.getBytes(), s2.length(), size);
                break;
            } else if (type == Page.TYPE_DATA_OVERFLOW) {
                next = s2.readInt();
                if (next == 0) {
                    writeDataError(writer, "next:0", s2.getBytes());
                    break;
                }
                int size = pageSize - s2.length();
                writer.println("-- chain: " + next + " type: " + type + " size: " + size + " next: " + next);
                s.checkCapacity(size);
                s.write(s2.getBytes(), s2.length(), size);
            } else {
                writeDataError(writer, "type: " + type, s2.getBytes());
                break;
            }
        }
    }
    for (int i = 0; i < entryCount; i++) {
        long key = keys[i];
        int off = offsets[i];
        if (trace) {
            writer.println("-- [" + i + "] storage: " + storageId + " key: " + key + " off: " + off);
        }
        s.setPos(off);
        Value[] data = createRecord(writer, s, columnCount);
        if (data != null) {
            createTemporaryTable(writer);
            writeRow(writer, s, data);
            if (remove && storageId == 0) {
                String sql = data[3].getString();
                if (sql.startsWith("CREATE USER ")) {
                    int saltIndex = Utils.indexOf(s.getBytes(), "SALT ".getBytes(), off);
                    if (saltIndex >= 0) {
                        String userName = sql.substring("CREATE USER ".length(), sql.indexOf("SALT ") - 1);
                        if (userName.startsWith("IF NOT EXISTS ")) {
                            userName = userName.substring("IF NOT EXISTS ".length());
                        }
                        if (userName.startsWith("\"")) {
                            // TODO doesn't work for all cases ("" inside
                            // user name)
                            userName = userName.substring(1, userName.length() - 1);
                        }
                        byte[] userPasswordHash = SHA256.getKeyPasswordHash(userName, "".toCharArray());
                        byte[] salt = MathUtils.secureRandomBytes(Constants.SALT_LEN);
                        byte[] passwordHash = SHA256.getHashWithSalt(userPasswordHash, salt);
                        StringBuilder buff = new StringBuilder();
                        buff.append("SALT '").append(StringUtils.convertBytesToHex(salt)).append("' HASH '").append(StringUtils.convertBytesToHex(passwordHash)).append('\'');
                        byte[] replacement = buff.toString().getBytes();
                        System.arraycopy(replacement, 0, s.getBytes(), saltIndex, replacement.length);
                        seek(pageId);
                        store.write(s.getBytes(), 0, pageSize);
                        if (trace) {
                            out.println("User: " + userName);
                        }
                        remove = false;
                    }
                }
            }
        }
    }
}
Also used : Value(org.h2.value.Value) Data(org.h2.store.Data)

Example 65 with User

use of org.h2.engine.User in project h2database by h2database.

the class PgServerThread method process.

private void process() throws IOException {
    int x;
    if (initDone) {
        x = dataInRaw.read();
        if (x < 0) {
            stop = true;
            return;
        }
    } else {
        x = 0;
    }
    int len = dataInRaw.readInt();
    len -= 4;
    byte[] data = Utils.newBytes(len);
    dataInRaw.readFully(data, 0, len);
    dataIn = new DataInputStream(new ByteArrayInputStream(data, 0, len));
    switch(x) {
        case 0:
            server.trace("Init");
            int version = readInt();
            if (version == 80877102) {
                server.trace("CancelRequest");
                int pid = readInt();
                int key = readInt();
                PgServerThread c = server.getThread(pid);
                if (c != null && key == c.secret) {
                    c.cancelRequest();
                } else {
                    // According to the PostgreSQL documentation, when canceling
                    // a request, if an invalid secret is provided then no
                    // exception should be sent back to the client.
                    server.trace("Invalid CancelRequest: pid=" + pid + ", key=" + key);
                }
                close();
            } else if (version == 80877103) {
                server.trace("SSLRequest");
                out.write('N');
            } else {
                server.trace("StartupMessage");
                server.trace(" version " + version + " (" + (version >> 16) + "." + (version & 0xff) + ")");
                while (true) {
                    String param = readString();
                    if (param.length() == 0) {
                        break;
                    }
                    String value = readString();
                    if ("user".equals(param)) {
                        this.userName = value;
                    } else if ("database".equals(param)) {
                        this.databaseName = server.checkKeyAndGetDatabaseName(value);
                    } else if ("client_encoding".equals(param)) {
                        // UTF8
                        clientEncoding = value;
                    } else if ("DateStyle".equals(param)) {
                        if (value.indexOf(',') < 0) {
                            value += ", MDY";
                        }
                        dateStyle = value;
                    }
                    // extra_float_digits 2
                    // geqo on (Genetic Query Optimization)
                    server.trace(" param " + param + "=" + value);
                }
                sendAuthenticationCleartextPassword();
                initDone = true;
            }
            break;
        case 'p':
            {
                server.trace("PasswordMessage");
                String password = readString();
                try {
                    Properties info = new Properties();
                    info.put("MODE", "PostgreSQL");
                    info.put("USER", userName);
                    info.put("PASSWORD", password);
                    String url = "jdbc:h2:" + databaseName;
                    ConnectionInfo ci = new ConnectionInfo(url, info);
                    String baseDir = server.getBaseDir();
                    if (baseDir == null) {
                        baseDir = SysProperties.getBaseDir();
                    }
                    if (baseDir != null) {
                        ci.setBaseDir(baseDir);
                    }
                    if (server.getIfExists()) {
                        ci.setProperty("IFEXISTS", "TRUE");
                    }
                    conn = new JdbcConnection(ci, false);
                    // can not do this because when called inside
                    // DriverManager.getConnection, a deadlock occurs
                    // conn = DriverManager.getConnection(url, userName, password);
                    initDb();
                    sendAuthenticationOk();
                } catch (Exception e) {
                    e.printStackTrace();
                    stop = true;
                }
                break;
            }
        case 'P':
            {
                server.trace("Parse");
                Prepared p = new Prepared();
                p.name = readString();
                p.sql = getSQL(readString());
                int paramTypesCount = readShort();
                int[] paramTypes = null;
                if (paramTypesCount > 0) {
                    paramTypes = new int[paramTypesCount];
                    for (int i = 0; i < paramTypesCount; i++) {
                        paramTypes[i] = readInt();
                    }
                }
                try {
                    p.prep = (JdbcPreparedStatement) conn.prepareStatement(p.sql);
                    ParameterMetaData meta = p.prep.getParameterMetaData();
                    p.paramType = new int[meta.getParameterCount()];
                    for (int i = 0; i < p.paramType.length; i++) {
                        int type;
                        if (i < paramTypesCount && paramTypes[i] != 0) {
                            type = paramTypes[i];
                            server.checkType(type);
                        } else {
                            type = PgServer.convertType(meta.getParameterType(i + 1));
                        }
                        p.paramType[i] = type;
                    }
                    prepared.put(p.name, p);
                    sendParseComplete();
                } catch (Exception e) {
                    sendErrorResponse(e);
                }
                break;
            }
        case 'B':
            {
                server.trace("Bind");
                Portal portal = new Portal();
                portal.name = readString();
                String prepName = readString();
                Prepared prep = prepared.get(prepName);
                if (prep == null) {
                    sendErrorResponse("Prepared not found");
                    break;
                }
                portal.prep = prep;
                portals.put(portal.name, portal);
                int formatCodeCount = readShort();
                int[] formatCodes = new int[formatCodeCount];
                for (int i = 0; i < formatCodeCount; i++) {
                    formatCodes[i] = readShort();
                }
                int paramCount = readShort();
                try {
                    for (int i = 0; i < paramCount; i++) {
                        setParameter(prep.prep, prep.paramType[i], i, formatCodes);
                    }
                } catch (Exception e) {
                    sendErrorResponse(e);
                    break;
                }
                int resultCodeCount = readShort();
                portal.resultColumnFormat = new int[resultCodeCount];
                for (int i = 0; i < resultCodeCount; i++) {
                    portal.resultColumnFormat[i] = readShort();
                }
                sendBindComplete();
                break;
            }
        case 'C':
            {
                char type = (char) readByte();
                String name = readString();
                server.trace("Close");
                if (type == 'S') {
                    Prepared p = prepared.remove(name);
                    if (p != null) {
                        JdbcUtils.closeSilently(p.prep);
                    }
                } else if (type == 'P') {
                    portals.remove(name);
                } else {
                    server.trace("expected S or P, got " + type);
                    sendErrorResponse("expected S or P");
                    break;
                }
                sendCloseComplete();
                break;
            }
        case 'D':
            {
                char type = (char) readByte();
                String name = readString();
                server.trace("Describe");
                if (type == 'S') {
                    Prepared p = prepared.get(name);
                    if (p == null) {
                        sendErrorResponse("Prepared not found: " + name);
                    } else {
                        try {
                            sendParameterDescription(p.prep.getParameterMetaData(), p.paramType);
                            sendRowDescription(p.prep.getMetaData());
                        } catch (Exception e) {
                            sendErrorResponse(e);
                        }
                    }
                } else if (type == 'P') {
                    Portal p = portals.get(name);
                    if (p == null) {
                        sendErrorResponse("Portal not found: " + name);
                    } else {
                        PreparedStatement prep = p.prep.prep;
                        try {
                            ResultSetMetaData meta = prep.getMetaData();
                            sendRowDescription(meta);
                        } catch (Exception e) {
                            sendErrorResponse(e);
                        }
                    }
                } else {
                    server.trace("expected S or P, got " + type);
                    sendErrorResponse("expected S or P");
                }
                break;
            }
        case 'E':
            {
                String name = readString();
                server.trace("Execute");
                Portal p = portals.get(name);
                if (p == null) {
                    sendErrorResponse("Portal not found: " + name);
                    break;
                }
                int maxRows = readShort();
                Prepared prepared = p.prep;
                JdbcPreparedStatement prep = prepared.prep;
                server.trace(prepared.sql);
                try {
                    prep.setMaxRows(maxRows);
                    setActiveRequest(prep);
                    boolean result = prep.execute();
                    if (result) {
                        try {
                            ResultSet rs = prep.getResultSet();
                            // the meta-data is sent in the prior 'Describe'
                            while (rs.next()) {
                                sendDataRow(rs, p.resultColumnFormat);
                            }
                            sendCommandComplete(prep, 0);
                        } catch (Exception e) {
                            sendErrorResponse(e);
                        }
                    } else {
                        sendCommandComplete(prep, prep.getUpdateCount());
                    }
                } catch (Exception e) {
                    if (prep.isCancelled()) {
                        sendCancelQueryResponse();
                    } else {
                        sendErrorResponse(e);
                    }
                } finally {
                    setActiveRequest(null);
                }
                break;
            }
        case 'S':
            {
                server.trace("Sync");
                sendReadyForQuery();
                break;
            }
        case 'Q':
            {
                server.trace("Query");
                String query = readString();
                ScriptReader reader = new ScriptReader(new StringReader(query));
                while (true) {
                    JdbcStatement stat = null;
                    try {
                        String s = reader.readStatement();
                        if (s == null) {
                            break;
                        }
                        s = getSQL(s);
                        stat = (JdbcStatement) conn.createStatement();
                        setActiveRequest(stat);
                        boolean result = stat.execute(s);
                        if (result) {
                            ResultSet rs = stat.getResultSet();
                            ResultSetMetaData meta = rs.getMetaData();
                            try {
                                sendRowDescription(meta);
                                while (rs.next()) {
                                    sendDataRow(rs, null);
                                }
                                sendCommandComplete(stat, 0);
                            } catch (Exception e) {
                                sendErrorResponse(e);
                                break;
                            }
                        } else {
                            sendCommandComplete(stat, stat.getUpdateCount());
                        }
                    } catch (SQLException e) {
                        if (stat != null && stat.isCancelled()) {
                            sendCancelQueryResponse();
                        } else {
                            sendErrorResponse(e);
                        }
                        break;
                    } finally {
                        JdbcUtils.closeSilently(stat);
                        setActiveRequest(null);
                    }
                }
                sendReadyForQuery();
                break;
            }
        case 'X':
            {
                server.trace("Terminate");
                close();
                break;
            }
        default:
            server.trace("Unsupported: " + x + " (" + (char) x + ")");
            break;
    }
}
Also used : SQLException(java.sql.SQLException) JdbcConnection(org.h2.jdbc.JdbcConnection) PreparedStatement(java.sql.PreparedStatement) JdbcPreparedStatement(org.h2.jdbc.JdbcPreparedStatement) DataInputStream(java.io.DataInputStream) SysProperties(org.h2.engine.SysProperties) Properties(java.util.Properties) DbException(org.h2.message.DbException) SQLException(java.sql.SQLException) IOException(java.io.IOException) EOFException(java.io.EOFException) ResultSetMetaData(java.sql.ResultSetMetaData) JdbcStatement(org.h2.jdbc.JdbcStatement) ByteArrayInputStream(java.io.ByteArrayInputStream) ResultSet(java.sql.ResultSet) JdbcResultSet(org.h2.jdbc.JdbcResultSet) StringReader(java.io.StringReader) ConnectionInfo(org.h2.engine.ConnectionInfo) JdbcPreparedStatement(org.h2.jdbc.JdbcPreparedStatement) ParameterMetaData(java.sql.ParameterMetaData) ScriptReader(org.h2.util.ScriptReader)

Aggregations

Connection (java.sql.Connection)36 SQLException (java.sql.SQLException)21 PreparedStatement (java.sql.PreparedStatement)17 Statement (java.sql.Statement)17 ResultSet (java.sql.ResultSet)16 Server (org.h2.tools.Server)15 DbException (org.h2.message.DbException)14 Column (org.h2.table.Column)12 ValueString (org.h2.value.ValueString)12 Properties (java.util.Properties)10 Database (org.h2.engine.Database)10 Schema (org.h2.schema.Schema)8 IOException (java.io.IOException)7 User (org.h2.engine.User)7 JdbcDataSource (org.h2.jdbcx.JdbcDataSource)7 SimpleResultSet (org.h2.tools.SimpleResultSet)7 Value (org.h2.value.Value)7 PrintStream (java.io.PrintStream)6 Timestamp (java.sql.Timestamp)6 GridH2Table (org.apache.ignite.internal.processors.query.h2.opt.GridH2Table)6