Mercurial > jhg
annotate src/com/tmate/hgkit/fs/DataAccessProvider.java @ 159:f5aed108754e wrap-data-access
Approach with DataAccess instead of plain byte[] was merged into default branch
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> | 
|---|---|
| date | Wed, 09 Mar 2011 13:28:02 +0100 | 
| parents | 9429c7bd1920 | 
| children | 
| rev | line source | 
|---|---|
| 
10
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
1 /* | 
| 
23
 
6f9aca1a97be
Severe defect in buffer wrap on seek
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
10 
diff
changeset
 | 
2 * Copyright (c) 2010, 2011 Artem Tikhomirov | 
| 
10
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
3 */ | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
4 package com.tmate.hgkit.fs; | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
5 | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
6 import java.io.File; | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
7 import java.io.FileInputStream; | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
8 import java.io.IOException; | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
9 import java.nio.ByteBuffer; | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
10 import java.nio.MappedByteBuffer; | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
11 import java.nio.channels.FileChannel; | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
12 | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
13 /** | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
14 * | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
15 * @author artem | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
16 */ | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
17 public class DataAccessProvider { | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
18 | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
19 private final int mapioMagicBoundary; | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
20 private final int bufferSize; | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
21 | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
22 public DataAccessProvider() { | 
| 
27
 
b0a15cefdfd6
Cons args instead of fixed consts
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
26 
diff
changeset
 | 
23 this(100 * 1024, 8 * 1024); | 
| 
 
b0a15cefdfd6
Cons args instead of fixed consts
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
26 
diff
changeset
 | 
24 } | 
| 
 
b0a15cefdfd6
Cons args instead of fixed consts
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
26 
diff
changeset
 | 
25 | 
| 
 
b0a15cefdfd6
Cons args instead of fixed consts
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
26 
diff
changeset
 | 
26 public DataAccessProvider(int mapioBoundary, int regularBufferSize) { | 
| 
 
b0a15cefdfd6
Cons args instead of fixed consts
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
26 
diff
changeset
 | 
27 mapioMagicBoundary = mapioBoundary; | 
| 
 
b0a15cefdfd6
Cons args instead of fixed consts
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
26 
diff
changeset
 | 
28 bufferSize = regularBufferSize; | 
| 
10
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
29 } | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
30 | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
31 public DataAccess create(File f) { | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
32 if (!f.exists()) { | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
33 return new DataAccess(); | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
34 } | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
35 try { | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
36 FileChannel fc = new FileInputStream(f).getChannel(); | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
37 if (fc.size() > mapioMagicBoundary) { | 
| 
26
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
38 // TESTS: bufLen of 1024 was used to test MemMapFileAccess | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
39 return new MemoryMapFileAccess(fc, fc.size(), mapioMagicBoundary); | 
| 
10
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
40 } else { | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
41 // XXX once implementation is more or less stable, | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
42 // may want to try ByteBuffer.allocateDirect() to see | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
43 // if there's any performance gain. | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
44 boolean useDirectBuffer = false; | 
| 
26
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
45 // TESTS: bufferSize of 100 was used to check buffer underflow states when readBytes reads chunks bigger than bufSize | 
| 
10
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
46 return new FileAccess(fc, fc.size(), bufferSize, useDirectBuffer); | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
47 } | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
48 } catch (IOException ex) { | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
49 // unlikely to happen, we've made sure file exists. | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
50 ex.printStackTrace(); // FIXME log error | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
51 } | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
52 return new DataAccess(); // non-null, empty. | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
53 } | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
54 | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
55 // DOESN'T WORK YET | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
56 private static class MemoryMapFileAccess extends DataAccess { | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
57 private FileChannel fileChannel; | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
58 private final long size; | 
| 
26
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
59 private long position = 0; // always points to buffer's absolute position in the file | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
60 private final int memBufferSize; | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
61 private MappedByteBuffer buffer; | 
| 
10
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
62 | 
| 
26
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
63 public MemoryMapFileAccess(FileChannel fc, long channelSize, int /*long?*/ bufferSize) { | 
| 
10
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
64 fileChannel = fc; | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
65 size = channelSize; | 
| 
26
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
66 memBufferSize = bufferSize; | 
| 
10
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
67 } | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
68 | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
69 @Override | 
| 
26
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
70 public boolean isEmpty() { | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
71 return position + (buffer == null ? 0 : buffer.position()) >= size; | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
72 } | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
73 | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
74 @Override | 
| 
51
 
9429c7bd1920
Try DataAccess to reach revision data instead of plain byte arrays
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
27 
diff
changeset
 | 
75 public long length() { | 
| 
 
9429c7bd1920
Try DataAccess to reach revision data instead of plain byte arrays
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
27 
diff
changeset
 | 
76 return size; | 
| 
 
9429c7bd1920
Try DataAccess to reach revision data instead of plain byte arrays
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
27 
diff
changeset
 | 
77 } | 
| 
 
9429c7bd1920
Try DataAccess to reach revision data instead of plain byte arrays
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
27 
diff
changeset
 | 
78 | 
| 
 
9429c7bd1920
Try DataAccess to reach revision data instead of plain byte arrays
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
27 
diff
changeset
 | 
79 @Override | 
| 
 
9429c7bd1920
Try DataAccess to reach revision data instead of plain byte arrays
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
27 
diff
changeset
 | 
80 public void reset() throws IOException { | 
| 
 
9429c7bd1920
Try DataAccess to reach revision data instead of plain byte arrays
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
27 
diff
changeset
 | 
81 seek(0); | 
| 
 
9429c7bd1920
Try DataAccess to reach revision data instead of plain byte arrays
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
27 
diff
changeset
 | 
82 } | 
| 
 
9429c7bd1920
Try DataAccess to reach revision data instead of plain byte arrays
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
27 
diff
changeset
 | 
83 | 
| 
 
9429c7bd1920
Try DataAccess to reach revision data instead of plain byte arrays
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
27 
diff
changeset
 | 
84 @Override | 
| 
10
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
85 public void seek(long offset) { | 
| 
26
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
86 assert offset >= 0; | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
87 // offset may not necessarily be further than current position in the file (e.g. rewind) | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
88 if (buffer != null && /*offset is within buffer*/ offset >= position && (offset - position) < buffer.limit()) { | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
89 buffer.position((int) (offset - position)); | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
90 } else { | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
91 position = offset; | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
92 buffer = null; | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
93 } | 
| 
10
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
94 } | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
95 | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
96 @Override | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
97 public void skip(int bytes) throws IOException { | 
| 
26
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
98 assert bytes >= 0; | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
99 if (buffer == null) { | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
100 position += bytes; | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
101 return; | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
102 } | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
103 if (buffer.remaining() > bytes) { | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
104 buffer.position(buffer.position() + bytes); | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
105 } else { | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
106 position += buffer.position() + bytes; | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
107 buffer = null; | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
108 } | 
| 
10
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
109 } | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
110 | 
| 
26
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
111 private void fill() throws IOException { | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
112 if (buffer != null) { | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
113 position += buffer.position(); | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
114 } | 
| 
10
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
115 long left = size - position; | 
| 
26
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
116 buffer = fileChannel.map(FileChannel.MapMode.READ_ONLY, position, left < memBufferSize ? left : memBufferSize); | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
117 } | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
118 | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
119 @Override | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
120 public void readBytes(byte[] buf, int offset, int length) throws IOException { | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
121 if (buffer == null || !buffer.hasRemaining()) { | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
122 fill(); | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
123 } | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
124 // XXX in fact, we may try to create a MappedByteBuffer of exactly length size here, and read right away | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
125 while (length > 0) { | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
126 int tail = buffer.remaining(); | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
127 if (tail == 0) { | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
128 throw new IOException(); | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
129 } | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
130 if (tail >= length) { | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
131 buffer.get(buf, offset, length); | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
132 } else { | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
133 buffer.get(buf, offset, tail); | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
134 fill(); | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
135 } | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
136 offset += tail; | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
137 length -= tail; | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
138 } | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
139 } | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
140 | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
141 @Override | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
142 public byte readByte() throws IOException { | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
143 if (buffer == null || !buffer.hasRemaining()) { | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
144 fill(); | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
145 } | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
146 if (buffer.hasRemaining()) { | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
147 return buffer.get(); | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
148 } | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
149 throw new IOException(); | 
| 
10
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
150 } | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
151 | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
152 @Override | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
153 public void done() { | 
| 
26
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
154 buffer = null; | 
| 
10
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
155 if (fileChannel != null) { | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
156 try { | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
157 fileChannel.close(); | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
158 } catch (IOException ex) { | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
159 ex.printStackTrace(); // log debug | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
160 } | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
161 fileChannel = null; | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
162 } | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
163 } | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
164 } | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
165 | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
166 // (almost) regular file access - FileChannel and buffers. | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
167 private static class FileAccess extends DataAccess { | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
168 private FileChannel fileChannel; | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
169 private final long size; | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
170 private ByteBuffer buffer; | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
171 private long bufferStartInFile = 0; // offset of this.buffer in the file. | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
172 | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
173 public FileAccess(FileChannel fc, long channelSize, int bufferSizeHint, boolean useDirect) { | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
174 fileChannel = fc; | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
175 size = channelSize; | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
176 final int capacity = size < bufferSizeHint ? (int) size : bufferSizeHint; | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
177 buffer = useDirect ? ByteBuffer.allocateDirect(capacity) : ByteBuffer.allocate(capacity); | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
178 buffer.flip(); // or .limit(0) to indicate it's empty | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
179 } | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
180 | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
181 @Override | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
182 public boolean isEmpty() { | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
183 return bufferStartInFile + buffer.position() >= size; | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
184 } | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
185 | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
186 @Override | 
| 
51
 
9429c7bd1920
Try DataAccess to reach revision data instead of plain byte arrays
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
27 
diff
changeset
 | 
187 public long length() { | 
| 
 
9429c7bd1920
Try DataAccess to reach revision data instead of plain byte arrays
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
27 
diff
changeset
 | 
188 return size; | 
| 
 
9429c7bd1920
Try DataAccess to reach revision data instead of plain byte arrays
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
27 
diff
changeset
 | 
189 } | 
| 
 
9429c7bd1920
Try DataAccess to reach revision data instead of plain byte arrays
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
27 
diff
changeset
 | 
190 | 
| 
 
9429c7bd1920
Try DataAccess to reach revision data instead of plain byte arrays
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
27 
diff
changeset
 | 
191 @Override | 
| 
 
9429c7bd1920
Try DataAccess to reach revision data instead of plain byte arrays
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
27 
diff
changeset
 | 
192 public void reset() throws IOException { | 
| 
 
9429c7bd1920
Try DataAccess to reach revision data instead of plain byte arrays
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
27 
diff
changeset
 | 
193 seek(0); | 
| 
 
9429c7bd1920
Try DataAccess to reach revision data instead of plain byte arrays
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
27 
diff
changeset
 | 
194 } | 
| 
 
9429c7bd1920
Try DataAccess to reach revision data instead of plain byte arrays
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
27 
diff
changeset
 | 
195 | 
| 
 
9429c7bd1920
Try DataAccess to reach revision data instead of plain byte arrays
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
27 
diff
changeset
 | 
196 @Override | 
| 
10
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
197 public void seek(long offset) throws IOException { | 
| 
23
 
6f9aca1a97be
Severe defect in buffer wrap on seek
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
10 
diff
changeset
 | 
198 if (offset > size) { | 
| 
 
6f9aca1a97be
Severe defect in buffer wrap on seek
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
10 
diff
changeset
 | 
199 throw new IllegalArgumentException(); | 
| 
 
6f9aca1a97be
Severe defect in buffer wrap on seek
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
10 
diff
changeset
 | 
200 } | 
| 
10
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
201 if (offset < bufferStartInFile + buffer.limit() && offset >= bufferStartInFile) { | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
202 buffer.position((int) (offset - bufferStartInFile)); | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
203 } else { | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
204 // out of current buffer, invalidate it (force re-read) | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
205 // XXX or ever re-read it right away? | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
206 bufferStartInFile = offset; | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
207 buffer.clear(); | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
208 buffer.limit(0); // or .flip() to indicate we switch to reading | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
209 fileChannel.position(offset); | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
210 } | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
211 } | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
212 | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
213 @Override | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
214 public void skip(int bytes) throws IOException { | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
215 final int newPos = buffer.position() + bytes; | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
216 if (newPos >= 0 && newPos < buffer.limit()) { | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
217 // no need to move file pointer, just rewind/seek buffer | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
218 buffer.position(newPos); | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
219 } else { | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
220 // | 
| 
23
 
6f9aca1a97be
Severe defect in buffer wrap on seek
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
10 
diff
changeset
 | 
221 seek(bufferStartInFile + newPos); | 
| 
10
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
222 } | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
223 } | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
224 | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
225 private boolean fill() throws IOException { | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
226 if (!buffer.hasRemaining()) { | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
227 bufferStartInFile += buffer.limit(); | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
228 buffer.clear(); | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
229 if (bufferStartInFile < size) { // just in case there'd be any exception on EOF, not -1 | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
230 fileChannel.read(buffer); | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
231 // may return -1 when EOF, but empty will reflect this, hence no explicit support here | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
232 } | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
233 buffer.flip(); | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
234 } | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
235 return buffer.hasRemaining(); | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
236 } | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
237 | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
238 @Override | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
239 public void readBytes(byte[] buf, int offset, int length) throws IOException { | 
| 
26
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
240 if (!buffer.hasRemaining()) { | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
241 fill(); | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
242 } | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
243 while (length > 0) { | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
244 int tail = buffer.remaining(); | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
245 if (tail == 0) { | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
246 throw new IOException(); // shall not happen provided stream contains expected data and no attempts to read past isEmpty() == true are made. | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
247 } | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
248 if (tail >= length) { | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
249 buffer.get(buf, offset, length); | 
| 
10
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
250 } else { | 
| 
26
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
251 buffer.get(buf, offset, tail); | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
252 fill(); | 
| 
10
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
253 } | 
| 
26
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
254 offset += tail; | 
| 
 
71a9ba42cee8
Memory-mapped files for bigger files. Defect reading number of bytes greater than size of the buffer fixed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
23 
diff
changeset
 | 
255 length -= tail; | 
| 
10
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
256 } | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
257 } | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
258 | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
259 @Override | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
260 public byte readByte() throws IOException { | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
261 if (buffer.hasRemaining()) { | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
262 return buffer.get(); | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
263 } | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
264 if (fill()) { | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
265 return buffer.get(); | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
266 } | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
267 throw new IOException(); | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
268 } | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
269 | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
270 @Override | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
271 public void done() { | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
272 if (buffer != null) { | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
273 buffer = null; | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
274 } | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
275 if (fileChannel != null) { | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
276 try { | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
277 fileChannel.close(); | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
278 } catch (IOException ex) { | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
279 ex.printStackTrace(); // log debug | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
280 } | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
281 fileChannel = null; | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
282 } | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
283 } | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
284 } | 
| 
 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
285 } | 
