You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by th...@apache.org on 2011/06/14 15:18:38 UTC
svn commit: r1135556 - in /jackrabbit/sandbox/microkernel/src:
main/java/org/apache/jackrabbit/mk/store/ test/java/org/apache/jackrabbit/mk/
Author: thomasm
Date: Tue Jun 14 13:18:38 2011
New Revision: 1135556
URL: http://svn.apache.org/viewvc?rev=1135556&view=rev
Log:
Simple persistent data store implementation.
Modified:
jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/H2RevisionStore.java
jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/ObjectStore.java
jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/RevisionStore.java
jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/SimpleRevisionStore.java
jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/DataStoreTest.java
Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/H2RevisionStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/H2RevisionStore.java?rev=1135556&r1=1135555&r2=1135556&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/H2RevisionStore.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/H2RevisionStore.java Tue Jun 14 13:18:38 2011
@@ -16,12 +16,14 @@
*/
package org.apache.jackrabbit.mk.store;
+import org.apache.jackrabbit.mk.api.MicroKernelException;
import org.apache.jackrabbit.mk.util.StringUtils;
import org.h2.jdbcx.JdbcConnectionPool;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.InputStream;
+import java.security.DigestInputStream;
import java.security.DigestOutputStream;
import java.security.MessageDigest;
import java.sql.Connection;
@@ -62,6 +64,8 @@ public class H2RevisionStore extends Sim
Statement stmt = con.createStatement();
stmt.execute("create table if not exists REVS (ID binary primary key, DATA binary)");
stmt.execute("create table if not exists head(id varchar) as select ''");
+ stmt.execute("create sequence if not exists datastore_id");
+ stmt.execute("create table if not exists datastore(id varchar primary key, data blob)");
} finally {
con.close();
}
@@ -178,4 +182,104 @@ public class H2RevisionStore extends Sim
return id;
}
+ @Override
+ public String writeBlob(InputStream in) throws Exception {
+ if (!initialized) {
+ throw new IllegalStateException("not initialized");
+ }
+ Connection con = cp.getConnection();
+ String id;
+ try {
+ String tempId;
+ PreparedStatement stmt = con.prepareStatement(
+ "insert into datastore(id, data) values(datastore_id.nextval, ?)");
+ try {
+ MessageDigest digest = MessageDigest.getInstance("SHA-1");
+ DigestInputStream din = new DigestInputStream(in, digest);
+ stmt.setBinaryStream(1, din);
+ stmt.executeUpdate();
+ ResultSet rs = stmt.getGeneratedKeys();
+ rs.next();
+ tempId = rs.getString(1);
+ id = "ds:" + StringUtils.convertBytesToHex(digest.digest());
+ } finally {
+ stmt.close();
+ }
+ stmt = con.prepareStatement(
+ "update datastore set id = ? where id = ? and not exists(select * from datastore where id = ?)");
+ try {
+ stmt.setString(1, id);
+ stmt.setString(2, tempId);
+ stmt.setString(3, id);
+ int count = stmt.executeUpdate();
+ if (count == 0) {
+ stmt.close();
+ stmt = con.prepareStatement(
+ "delete from datastore where id = ?");
+ stmt.setString(1, tempId);
+ stmt.executeUpdate();
+ }
+ } finally {
+ stmt.close();
+ }
+ } finally {
+ con.close();
+ }
+ return id;
+ }
+
+ @Override
+ public int readBlob(String blobId, long pos, byte[] buff, int off, int length) throws Exception {
+ if (!initialized) {
+ throw new IllegalStateException("not initialized");
+ }
+ Connection con = cp.getConnection();
+ try {
+ final PreparedStatement stmt = con.prepareStatement(
+ "select data from datastore where id = ?");
+ try {
+ stmt.setString(1, blobId);
+ ResultSet rs = stmt.executeQuery();
+ if (!rs.next()) {
+ throw new MicroKernelException("Blob not found: " + blobId);
+ }
+ InputStream in = rs.getBinaryStream(1);
+ in.skip(pos);
+ int len = in.read(buff, off, length);
+ rs.close();
+ return len;
+ } finally {
+ stmt.close();
+ }
+ } finally {
+ con.close();
+ }
+ }
+
+ @Override
+ public long getBlobLength(String blobId) throws Exception {
+ if (!initialized) {
+ throw new IllegalStateException("not initialized");
+ }
+ Connection con = cp.getConnection();
+ try {
+ final PreparedStatement stmt = con.prepareStatement(
+ "select length(data) from datastore where id = ?");
+ try {
+ stmt.setString(1, blobId);
+ ResultSet rs = stmt.executeQuery();
+ if (!rs.next()) {
+ throw new MicroKernelException("Blob not found: " + blobId);
+ }
+ long length = rs.getLong(1);
+ rs.close();
+ return length;
+ } finally {
+ stmt.close();
+ }
+ } finally {
+ con.close();
+ }
+ }
+
}
Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/ObjectStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/ObjectStore.java?rev=1135556&r1=1135555&r2=1135556&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/ObjectStore.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/ObjectStore.java Tue Jun 14 13:18:38 2011
@@ -17,6 +17,7 @@
package org.apache.jackrabbit.mk.store;
import java.io.File;
+import java.io.InputStream;
import java.util.concurrent.locks.ReentrantLock;
/**
@@ -114,4 +115,17 @@ public class ObjectStore implements Cons
public void unlockHead() {
headLock.unlock();
}
+
+ public String writeBlob(InputStream in) throws Exception {
+ return store.writeBlob(in);
+ }
+
+ public int readBlob(String blobId, long pos, byte[] buff, int off, int length) throws Exception {
+ return store.readBlob(blobId, pos, buff, off, length);
+ }
+
+ public long getBlobLength(String blobId) throws Exception {
+ return store.getBlobLength(blobId);
+ }
+
}
Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/RevisionStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/RevisionStore.java?rev=1135556&r1=1135555&r2=1135556&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/RevisionStore.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/RevisionStore.java Tue Jun 14 13:18:38 2011
@@ -16,6 +16,8 @@
*/
package org.apache.jackrabbit.mk.store;
+import java.io.InputStream;
+
/**
*
*/
@@ -24,4 +26,11 @@ public interface RevisionStore extends D
String /* id */ getHeadRevision() throws Exception;
void setHeadRevision(String revId) throws Exception;
+
+ String writeBlob(InputStream in) throws Exception;
+
+ int readBlob(String blobId, long pos, byte[] buff, int off, int length) throws Exception;
+
+ long getBlobLength(String blobId) throws Exception;
+
}
Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/SimpleRevisionStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/SimpleRevisionStore.java?rev=1135556&r1=1135555&r2=1135556&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/SimpleRevisionStore.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/SimpleRevisionStore.java Tue Jun 14 13:18:38 2011
@@ -164,4 +164,16 @@ public class SimpleRevisionStore impleme
return new File(dataDir, buf.toString());
}
+ public String writeBlob(InputStream in) throws Exception {
+ throw new UnsupportedOperationException();
+ }
+
+ public int readBlob(String blobId, long pos, byte[] buff, int off, int length) throws Exception {
+ throw new UnsupportedOperationException();
+ }
+
+ public long getBlobLength(String blobId) throws Exception {
+ throw new UnsupportedOperationException();
+ }
+
}
Modified: jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/DataStoreTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/DataStoreTest.java?rev=1135556&r1=1135555&r2=1135556&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/DataStoreTest.java (original)
+++ jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/DataStoreTest.java Tue Jun 14 13:18:38 2011
@@ -44,6 +44,7 @@ public class DataStoreTest extends TestC
String[] s = new String[len];
for (int i = 0; i < len; i++) {
s[i] = mk.write(new ByteArrayInputStream(new byte[i]));
+ s[i] = mk.write(new ByteArrayInputStream(new byte[i]));
}
for (int i = 0; i < len; i++) {
assertEquals(i, mk.getLength(s[i]));