/*
* Copyright 2004-2009 the original author or authors.
*
* Licensed 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.lucene.store.jdbc.handler;
import java.io.IOException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Timestamp;
import org.apache.lucene.store.IndexInput;
import org.apache.lucene.store.IndexOutput;
import org.apache.lucene.store.jdbc.JdbcDirectory;
import org.apache.lucene.store.jdbc.JdbcFileEntrySettings;
import org.apache.lucene.store.jdbc.JdbcStoreException;
import org.apache.lucene.store.jdbc.index.JdbcIndexConfigurable;
import org.apache.lucene.store.jdbc.support.JdbcTable;
import org.apache.lucene.store.jdbc.support.JdbcTemplate;
/**
* A base file entry handler that supports most of the file entry base operations.
* <p/>
* Supports the creation of configurable <code>IndexInput</code> and <code>IndexOutput</code>,
* base on the {@link JdbcFileEntrySettings#INDEX_INPUT_TYPE_SETTING} and
* {@link JdbcFileEntrySettings#INDEX_OUTPUT_TYPE_SETTING}.
* <p/>
* Does not implement the deletion of files.
*
* @author kimchy
*/
public abstract class AbstractFileEntryHandler implements FileEntryHandler {
protected JdbcDirectory jdbcDirectory;
protected JdbcTable table;
protected JdbcTemplate jdbcTemplate;
public void configure(JdbcDirectory jdbcDirectory) {
this.jdbcDirectory = jdbcDirectory;
this.jdbcTemplate = jdbcDirectory.getJdbcTemplate();
this.table = jdbcDirectory.getTable();
}
public boolean fileExists(final String name) throws IOException {
return ((Boolean) jdbcTemplate.executeSelect(table.sqlSelectNameExists(), new JdbcTemplate.ExecuteSelectCallback() {
public void fillPrepareStatement(PreparedStatement ps) throws Exception {
ps.setFetchSize(1);
ps.setString(1, name);
}
public Object execute(ResultSet rs) throws Exception {
if (!rs.next()) {
return Boolean.FALSE;
}
return (rs.getBoolean(1)) ? Boolean.FALSE : Boolean.TRUE;
}
})).booleanValue();
}
public long fileModified(final String name) throws IOException {
return ((Long) jdbcTemplate.executeSelect(table.sqlSelecltLastModifiedByName(), new JdbcTemplate.ExecuteSelectCallback() {
public void fillPrepareStatement(PreparedStatement ps) throws Exception {
ps.setFetchSize(1);
ps.setString(1, name);
}
public Object execute(ResultSet rs) throws Exception {
if (rs.next()) {
Timestamp ts = rs.getTimestamp(1);
return new Long(ts.getTime());
}
return new Long(0L);
}
})).longValue();
}
public void touchFile(final String name) throws IOException {
jdbcTemplate.executeUpdate(table.sqlUpdateLastModifiedByName(), new JdbcTemplate.PrepateStatementAwareCallback() {
public void fillPrepareStatement(PreparedStatement ps) throws Exception {
ps.setFetchSize(1);
ps.setString(1, name);
}
});
}
public void renameFile(final String from, final String to) throws IOException {
// TODO find a way if it can be done in the same sql query
deleteFile(to);
jdbcTemplate.executeUpdate(table.sqlUpdateNameByName(), new JdbcTemplate.PrepateStatementAwareCallback() {
public void fillPrepareStatement(PreparedStatement ps) throws Exception {
ps.setFetchSize(1);
ps.setString(1, to);
ps.setString(2, from);
}
});
}
public long fileLength(final String name) throws IOException {
return ((Long) jdbcTemplate.executeSelect(table.sqlSelectSizeByName(), new JdbcTemplate.ExecuteSelectCallback() {
public void fillPrepareStatement(PreparedStatement ps) throws Exception {
ps.setFetchSize(1);
ps.setString(1, name);
}
public Object execute(ResultSet rs) throws Exception {
if (rs.next()) {
return new Long(rs.getLong(1));
}
return new Long(0L);
}
})).longValue();
}
public IndexInput openInput(String name) throws IOException {
IndexInput indexInput;
JdbcFileEntrySettings settings = jdbcDirectory.getSettings().getFileEntrySettings(name);
try {
Class inputClass = settings.getSettingAsClass(JdbcFileEntrySettings.INDEX_INPUT_TYPE_SETTING, null);
indexInput = (IndexInput) inputClass.newInstance();
} catch (Exception e) {
throw new JdbcStoreException("Failed to create indexInput instance [" + settings.getSetting(JdbcFileEntrySettings.INDEX_INPUT_TYPE_SETTING) + "]", e);
}
((JdbcIndexConfigurable) indexInput).configure(name, jdbcDirectory, settings);
return indexInput;
}
public IndexOutput createOutput(String name) throws IOException {
IndexOutput indexOutput;
JdbcFileEntrySettings settings = jdbcDirectory.getSettings().getFileEntrySettings(name);
try {
Class inputClass = settings.getSettingAsClass(JdbcFileEntrySettings.INDEX_OUTPUT_TYPE_SETTING, null);
indexOutput = (IndexOutput) inputClass.newInstance();
} catch (Exception e) {
throw new JdbcStoreException("Failed to create indexOutput instance [" + settings.getSetting(JdbcFileEntrySettings.INDEX_OUTPUT_TYPE_SETTING) + "]", e);
}
((JdbcIndexConfigurable) indexOutput).configure(name, jdbcDirectory, settings);
return indexOutput;
}
public void close() throws IOException {
// do nothing
}
}