Skip to content

Commit

Permalink
Update Issue 4
Browse files Browse the repository at this point in the history
New option -z provides requested functionality.
  • Loading branch information
mantlik committed Sep 12, 2012
1 parent 808c5f2 commit d46353a
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 8 deletions.
16 changes: 12 additions & 4 deletions src/main/java/com/nothome/delta/GDiffWriter.java
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ public class GDiffWriter implements DiffWriter {
private boolean debug = false;
private boolean skipHeaders = false;
private boolean differential = false;
private boolean zeroAdditions = false;
private long currentOffset = 0l;
private long written = 0;
private int data_max = DATA_MAX;
Expand All @@ -71,19 +72,22 @@ public class GDiffWriter implements DiffWriter {

/**
* Constructs a new GDiffWriter.
* @param os
* @throws IOException
*/
public GDiffWriter(DataOutputStream os) throws IOException {
this(os, false, false);
this(os, false, false, false);
}

public GDiffWriter(DataOutputStream os, boolean skipHeaders) throws IOException {
this(os, skipHeaders, false);
this(os, skipHeaders, false, false);
}

public GDiffWriter(DataOutputStream os, boolean skipHeaders, boolean differential) throws IOException {
public GDiffWriter(DataOutputStream os, boolean skipHeaders, boolean differential, boolean zeroAdditions) throws IOException {
this.differential = differential;
this.output = os;
this.skipHeaders = skipHeaders;
this.zeroAdditions = zeroAdditions;
// write magic string "d1 ff d1 ff 04"
if (!skipHeaders) {
output.writeByte(0xd1);
Expand Down Expand Up @@ -195,7 +199,11 @@ public void addCopy(long offset, int length) throws IOException {
*/
@Override
public void addData(byte b) throws IOException {
buf.write(b);
if (zeroAdditions) {
buf.write(0);
} else {
buf.write(b);
}
if (buf.size() >= CHUNK_SIZE) {
writeBuf();
}
Expand Down
15 changes: 11 additions & 4 deletions src/main/java/org/mantlik/xdeltaencoder/XDeltaEncoder.java
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ public class XDeltaEncoder {
private static boolean multiBuffer = false;
private static File oldDeltaReference = null;
private static CompareOutputStream compareStream;
private static boolean zeroAdditions = false;

private static void encode(int blocksize) throws FileNotFoundException, IOException, SQLException, ClassNotFoundException {
ByteBuffer sourcebuf = ByteBuffer.wrap(new byte[2 * blocksize]);
Expand Down Expand Up @@ -192,7 +193,7 @@ private static void encodeVirtual(int blocksize) throws FileNotFoundException, I
tStream = new BufferedInputStream(new FileInputStream(target));
DiffWriter ddStream;
if (source.length() < blocksize && (!preparation_pass)) {
ddStream = new GDiffWriter(new DataOutputStream(new GZIPOutputStream(new FileOutputStream(delta))), false, differential);
ddStream = new GDiffWriter(new DataOutputStream(new GZIPOutputStream(new FileOutputStream(delta))), false, differential, zeroAdditions);
} else {
ddStream = new VirtualWriter(new DataOutputStream(new BufferedOutputStream(new FileOutputStream(tempFile1))));
}
Expand Down Expand Up @@ -255,7 +256,7 @@ private static void encodeVirtual(int blocksize) throws FileNotFoundException, I
sourcebuf.get(ss);
SeekableSource sourceData = new ByteBufferSeekableSource(ss);
if ((!preparation_pass) && (sourcepos + sourcesize) >= source.length()) {
ddStream = new GDiffWriter(new DataOutputStream(new GZIPOutputStream(new FileOutputStream(delta))), false, differential);
ddStream = new GDiffWriter(new DataOutputStream(new GZIPOutputStream(new FileOutputStream(delta))), false, differential, zeroAdditions);
} else {
ddStream = new VirtualWriter(new DataOutputStream(new BufferedOutputStream(new FileOutputStream(tempFile2))));
}
Expand Down Expand Up @@ -477,7 +478,7 @@ private static void encodeVirtualFile(long blocksize) throws FileNotFoundExcepti
if (xdiff) {
ddStream = new XDiffWriter(new DataOutputStream(new GZIPOutputStream(new FileOutputStream(delta))));
} else {
ddStream = new GDiffWriter(new DataOutputStream(new GZIPOutputStream(new FileOutputStream(delta))), false, differential);
ddStream = new GDiffWriter(new DataOutputStream(new GZIPOutputStream(new FileOutputStream(delta))), false, differential, zeroAdditions);
}
} else {
ddStream = new VirtualWriter(new DataOutputStream(new BufferedOutputStream(new FileOutputStream(tempFile1), 1024 * 1024)));
Expand Down Expand Up @@ -640,7 +641,8 @@ private static void encodeVirtualFile(long blocksize) throws FileNotFoundExcepti
if (xdiff) {
ddStream = new XDiffWriter(new DataOutputStream(new GZIPOutputStream(new FileOutputStream(delta))));
} else {
ddStream = new GDiffWriter(new DataOutputStream(new GZIPOutputStream(new FileOutputStream(delta))), false, differential);
ddStream = new GDiffWriter(new DataOutputStream(new GZIPOutputStream(new FileOutputStream(delta)))
, false, differential, zeroAdditions);
}
} else {
ddStream = new VirtualWriter(new DataOutputStream(new BufferedOutputStream(new FileOutputStream(tempFile2))));
Expand Down Expand Up @@ -1285,6 +1287,9 @@ public static void main(String[] args) {
+ " -mb multi-buffer source - can be faster but needs more memory\n"
+ " -t test the best block size (deprecated)\n"
+ " -p preprocess using full file size (can be slow)\n"
+ " -z zero additions instead of copying dest blocks\n"
+ " decoded destination will contain copied source data,\n"
+ " the rest will be filled in with zeroes.\n"
+ " -f read source block from file in memory\n"
+ " slower but needs less memory\n"
+ " -s single pass encoding (deprecated)\n"
Expand Down Expand Up @@ -1348,6 +1353,8 @@ public static void main(String[] args) {
ignoreWarnings = true;
} else if (args[arcbase].equalsIgnoreCase("-x")) {
xdiff = true;
} else if (args[arcbase].equalsIgnoreCase("-z")) {
zeroAdditions = true;
} else if (args[arcbase].equalsIgnoreCase("-c")) {
arcbase++;
chunksize = Integer.decode(args[arcbase]);
Expand Down

0 comments on commit d46353a

Please sign in to comment.