dbnameindex.java
来自「jsr170接口的java实现。是个apache的开源项目。」· Java 代码 · 共 251 行
JAVA
251 行
/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package org.apache.jackrabbit.core.persistence.bundle.util;import java.util.HashMap;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;/** * Implements a {@link StringIndex} that stores and retrieves the names from a * table in a database. * <p/> * Note that this class is not threadsafe by itself. it needs to be synchronized * by the using application. * <p/> * Due to a bug with oracle that treats empty strings a null values * (see JCR-815), all empty strings are replaced by a ' '. since names never * start with a space, this it not problematic yet. */public class DbNameIndex implements StringIndex { /** * The CVS/SVN id */ static final String CVS_ID = "$URL: http://svn.apache.org/repos/asf/jackrabbit/tags/1.3.3/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/DbNameIndex.java $ $Rev: 523272 $ $Date: 2007-03-28 13:49:28 +0300 (Wed, 28 Mar 2007) $"; // name index statements protected PreparedStatement nameSelect; protected PreparedStatement indexSelect; protected PreparedStatement nameInsert; // caches private final HashMap string2Index = new HashMap(); private final HashMap index2String= new HashMap(); /** * Creates a new index that is stored in a db. * @param con the jdbc connection * @param schemaObjectPrefix the prefix for table names * @throws SQLException if the statements cannot be prepared. */ public DbNameIndex(Connection con, String schemaObjectPrefix) throws SQLException { init(con, schemaObjectPrefix); } /** * Inits this index and prepares the statements. * * @param con the jdbc connection * @param schemaObjectPrefix the prefix for table names * @throws SQLException if the statements cannot be prepared. */ protected void init(Connection con, String schemaObjectPrefix) throws SQLException { nameSelect = con.prepareStatement("select NAME from " + schemaObjectPrefix + "NAMES where ID = ?"); indexSelect = con.prepareStatement("select ID from " + schemaObjectPrefix + "NAMES where NAME = ?"); nameInsert = con.prepareStatement("insert into " + schemaObjectPrefix + "NAMES (NAME) values (?)", Statement.RETURN_GENERATED_KEYS); } /** * Closes this index and releases it's resources. */ public void close() { closeStatement(nameSelect); closeStatement(indexSelect); closeStatement(nameInsert); } /** * {@inheritDoc} */ public int stringToIndex(String string) { // check cache Integer index = (Integer) string2Index.get(string); if (index == null) { String dbString = string.length() == 0 ? " " : string; int idx = getIndex(dbString); if (idx == -1) { idx = insertString(dbString); } index = new Integer(idx); string2Index.put(string, index); index2String.put(index, string); return idx; } else { return index.intValue(); } } /** * {@inheritDoc} */ public String indexToString(int idx) { // check cache Integer index = new Integer(idx); String s = (String) index2String.get(index); if (s == null) { s = getString(idx); if (s == null) { throw new IllegalStateException("String empty???"); } if (s.equals(" ")) { s = ""; } index2String.put(index, s); string2Index.put(s, index); } return s; } /** * Inserts a string into the database and returns the new index. * * @param string the string to insert * @return the new index. */ protected int insertString(String string) { // assert index does not exist PreparedStatement stmt = nameInsert; ResultSet rs = null; try { stmt.setString(1, string); stmt.executeUpdate(); rs = stmt.getGeneratedKeys(); if (!rs.next()) { return -1; } else { return rs.getInt(1); } } catch (Exception e) { throw new IllegalStateException("Unable to insert index: " + e); } finally { closeResultSet(rs); resetStatement(stmt); } } /** * Retrieves the index from the database for the given string. * @param string the string to retrieve the index for * @return the index or -1 if not found. */ protected int getIndex(String string) { PreparedStatement stmt = indexSelect; ResultSet rs = null; try { stmt.setString(1, string); stmt.execute(); rs = stmt.getResultSet(); if (!rs.next()) { return -1; } else { return rs.getInt(1); } } catch (Exception e) { throw new IllegalStateException("Unable to read index: " + e); } finally { closeResultSet(rs); resetStatement(stmt); } } /** * Retrieves the string from the database for the given index. * @param index the index to retrieve the string for. * @return the string or <code>null</code> if not found. */ protected String getString(int index) { PreparedStatement stmt = nameSelect; ResultSet rs = null; try { stmt.setInt(1, index); stmt.execute(); rs = stmt.getResultSet(); if (!rs.next()) { return null; } else { return rs.getString(1); } } catch (Exception e) { throw new IllegalStateException("Unable to read name: " + e); } finally { closeResultSet(rs); resetStatement(stmt); } } /** * closes the statement * @param stmt the statement */ protected void closeStatement(PreparedStatement stmt) { if (stmt != null) { try { stmt.close(); } catch (SQLException se) { // ignore } } } /** * Resets the given <code>PreparedStatement</code> by clearing the * parameters and warnings contained. * * @param stmt The <code>PreparedStatement</code> to reset. If * <code>null</code> this method does nothing. */ protected void resetStatement(PreparedStatement stmt) { if (stmt != null) { try { stmt.clearParameters(); stmt.clearWarnings(); } catch (SQLException se) { // ignore } } } /** * Closes the result set * @param rs the result set. */ protected void closeResultSet(ResultSet rs) { if (rs != null) { try { rs.close(); } catch (SQLException se) { // ignore } } }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?