package com.perforce.cvs; import java.io.ByteArrayInputStream; import java.io.ObjectInputStream; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class DBRevisionWrapper implements Comparable<DBRevisionWrapper> { private Logger logger = LoggerFactory.getLogger(DBRevisionWrapper.class); private final String SQL_WRITE_OBJ = "INSERT INTO rev (name, value) VALUES (?, ?)"; private final String SQL_READ_OBJ = "SELECT value FROM rev WHERE id = ?"; private final long id; public DBRevisionWrapper(RevisionEntry entry) { long dbID = -1; try { dbID = put(entry); } catch (Exception e) { logger.equals(e); } id = dbID; } @Override public int compareTo(DBRevisionWrapper toWrapper) { RevisionEntry thisEntry = get(this.getId()); RevisionEntry toEntry = get(toWrapper.getId()); return thisEntry.compareTo(toEntry); } private long put(Object entry) { try { Connection connection = RevisionDB.getConnection(); String className = entry.getClass().getName(); PreparedStatement sql = connection.prepareStatement(SQL_WRITE_OBJ); // set input parameters sql.setString(1, className); sql.setObject(2, entry); sql.executeUpdate(); // get the generated key for the id ResultSet rs = sql.getGeneratedKeys(); int id = -1; if (rs.next()) { id = rs.getInt(1); } rs.close(); sql.close(); if (logger.isTraceEnabled()) { logger.trace("DB: done serializing: " + className); } return id; } catch (Exception e) { logger.error(e.toString()); e.printStackTrace(); return -1; } } public RevisionEntry get() { return get(id); } private RevisionEntry get(long id) { try { Connection connection = RevisionDB.getConnection(); PreparedStatement sql = connection.prepareStatement(SQL_READ_OBJ); sql.setLong(1, id); ResultSet rs = sql.executeQuery(); rs.next(); byte[] buf = rs.getBytes("value"); ObjectInputStream objectIn = null; if (buf != null) { objectIn = new ObjectInputStream(new ByteArrayInputStream(buf)); } Object entry = objectIn.readObject(); String className = entry.getClass().getName(); rs.close(); sql.close(); if (logger.isTraceEnabled()) { logger.trace("DB: done de-serializing: " + className); } return (RevisionEntry) entry; } catch (Exception e) { logger.error(e.toString()); e.printStackTrace(); return null; } } public long getId() { return id; } }
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#1 | 10826 | Paul Allen |
Experiment with H2 Java database. CVS revisions are stored as Blobs with an ID, the RevisionSorter uses the ID and accesses the Blobs to sort change order. Database is located in ${CWD}/db/rev.* |