fix some issues

git-svn-id: https://osmand.googlecode.com/svn/trunk@596 e29c36b1-1cfa-d876-8d93-3434fc2bb7b8
This commit is contained in:
Victor Shcherb 2010-10-27 20:04:09 +00:00
parent 37606d7f0d
commit c9982c0b97
2 changed files with 145 additions and 113 deletions

View file

@ -1,20 +1,19 @@
package net.osmand.binary; package net.osmand.binary;
import java.io.IOException; import java.io.IOException;
import java.io.OutputStream; import java.io.RandomAccessFile;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.Map; import java.util.Map;
import java.util.Stack; import java.util.Stack;
import net.osmand.Algoritms; import net.osmand.Algoritms;
import net.osmand.data.index.IndexConstants;
import com.google.protobuf.CodedOutputStream; import com.google.protobuf.CodedOutputStream;
import com.google.protobuf.WireFormat; import com.google.protobuf.WireFormat;
public class BinaryIndexWriter { public class BinaryMapIndexWriter {
private final OutputStream out; private RandomAccessFile raf;
private CodedOutputStream codedOutStream; private CodedOutputStream codedOutStream;
private static class Bounds { private static class Bounds {
@ -39,55 +38,45 @@ public class BinaryIndexWriter {
// internal constants to track state of index writing // internal constants to track state of index writing
private Stack<Integer> state = new Stack<Integer>(); private Stack<Integer> state = new Stack<Integer>();
private Stack<Long> stackSizes = new Stack<Long>();
private final static int OSMAND_STRUCTURE_INIT = 1; private final static int OSMAND_STRUCTURE_INIT = 1;
private final static int MAP_INDEX_INIT = 2; private final static int MAP_INDEX_INIT = 2;
private final static int MAP_ROOT_LEVEL_INIT = 3; private final static int MAP_ROOT_LEVEL_INIT = 3;
private final static int MAP_TREE = 4; private final static int MAP_TREE = 4;
public BinaryIndexWriter(OutputStream out) throws IOException{ public BinaryMapIndexWriter(RandomAccessFile raf, CodedOutputStream codedOutputStream) throws IOException{
this.out = out; this.raf = raf;
codedOutStream = CodedOutputStream.newInstance(out); codedOutStream = codedOutputStream;
codedOutStream.writeInt32(OsmandOdb.OsmAndStructure.VERSION_FIELD_NUMBER, IndexConstants.BINARY_MAP_VERSION);
state.push(OSMAND_STRUCTURE_INIT); state.push(OSMAND_STRUCTURE_INIT);
} }
// message MapTree {
// required sint32 left = 1; // delta encoded
// required sint32 right = 2; // delta encoded
// required sint32 top = 3; // delta encoded
// required sint32 bottom = 4; // delta encoded
//
// optional StringTable stringTable = 5;
// optional uint64 baseId = 6;
//
// repeated MapTree subtrees = 7;
// repeated MapData leafs = 8;
//
// }
// /// Simple messages
// message MapData {
// required bytes coordinates = 1; // array of delta x,y uin32 could be read by codedinputstream
// required bytes types = 2; // array of fixed int16
//
// required sint64 id = 3; // delta encoded
// optional uint32 stringId = 4;
//
// repeated sint64 restrictions = 5; // delta encoded 3 bytes for type and other for id
// optional int32 highwayMeta = 6;
// }
private void preserveInt32Size() throws IOException {
stackSizes.push(raf.getFilePointer());
codedOutStream.writeFixed32NoTag(0);
}
private void writeInt32Size() throws IOException{
long filePointer = raf.getFilePointer();
Long old = stackSizes.pop();
int length = (int) (filePointer - old);
raf.seek(old);
raf.writeInt(length);
raf.seek(filePointer);
}
public void startWriteMapIndex() throws IOException{ public void startWriteMapIndex() throws IOException{
assert state.peek() == OSMAND_STRUCTURE_INIT; assert state.peek() == OSMAND_STRUCTURE_INIT;
state.push(MAP_INDEX_INIT); state.push(MAP_INDEX_INIT);
codedOutStream.writeTag(OsmandOdb.OsmAndStructure.MAPINDEX_FIELD_NUMBER, WireFormat.FieldType.MESSAGE.getWireType()); codedOutStream.writeTag(OsmandOdb.OsmAndStructure.MAPINDEX_FIELD_NUMBER, WireFormat.FieldType.MESSAGE.getWireType());
// TODO write size of map index preserveInt32Size();
codedOutStream.writeFixed32NoTag(0);
} }
public void endWriteMapIndex() throws IOException{ public void endWriteMapIndex() throws IOException{
Integer st = state.pop(); Integer st = state.pop();
assert st == MAP_INDEX_INIT; assert st == MAP_INDEX_INIT;
codedOutStream.writeRawVarint32(0); writeInt32Size();
} }
public void startWriteMapLevelIndex(int maxZoom, int minZoom, int leftX, int rightX, int topY, int bottomY) throws IOException{ public void startWriteMapLevelIndex(int maxZoom, int minZoom, int leftX, int rightX, int topY, int bottomY) throws IOException{
@ -95,8 +84,7 @@ public class BinaryIndexWriter {
state.push(MAP_ROOT_LEVEL_INIT); state.push(MAP_ROOT_LEVEL_INIT);
codedOutStream.writeTag(OsmandOdb.OsmAndMapIndex.LEVELS_FIELD_NUMBER, WireFormat.FieldType.MESSAGE.getWireType()); codedOutStream.writeTag(OsmandOdb.OsmAndMapIndex.LEVELS_FIELD_NUMBER, WireFormat.FieldType.MESSAGE.getWireType());
// TODO write size of level map index preserveInt32Size();
codedOutStream.writeFixed32NoTag(0);
codedOutStream.writeInt32(OsmandOdb.MapRootLevel.MAXZOOM_FIELD_NUMBER, maxZoom); codedOutStream.writeInt32(OsmandOdb.MapRootLevel.MAXZOOM_FIELD_NUMBER, maxZoom);
codedOutStream.writeInt32(OsmandOdb.MapRootLevel.MINZOOM_FIELD_NUMBER, minZoom); codedOutStream.writeInt32(OsmandOdb.MapRootLevel.MINZOOM_FIELD_NUMBER, minZoom);
@ -111,9 +99,8 @@ public class BinaryIndexWriter {
public void endWriteMapLevelIndex() throws IOException{ public void endWriteMapLevelIndex() throws IOException{
assert state.peek() == MAP_ROOT_LEVEL_INIT; assert state.peek() == MAP_ROOT_LEVEL_INIT;
state.pop(); state.pop();
stackBounds.pop(); stackBounds.pop();
codedOutStream.writeRawVarint32(0); writeInt32Size();
} }
public void startMapTreeElement(int leftX, int rightX, int topY, int bottomY) throws IOException{ public void startMapTreeElement(int leftX, int rightX, int topY, int bottomY) throws IOException{
@ -123,8 +110,7 @@ public class BinaryIndexWriter {
} else { } else {
codedOutStream.writeTag(OsmandOdb.MapTree.SUBTREES_FIELD_NUMBER, WireFormat.FieldType.MESSAGE.getWireType()); codedOutStream.writeTag(OsmandOdb.MapTree.SUBTREES_FIELD_NUMBER, WireFormat.FieldType.MESSAGE.getWireType());
} }
// TODO write size of level map index preserveInt32Size();
codedOutStream.writeFixed32NoTag(0);
state.push(MAP_TREE); state.push(MAP_TREE);
@ -134,7 +120,7 @@ public class BinaryIndexWriter {
codedOutStream.writeSInt32(OsmandOdb.MapTree.TOP_FIELD_NUMBER, topY - bounds.topY); codedOutStream.writeSInt32(OsmandOdb.MapTree.TOP_FIELD_NUMBER, topY - bounds.topY);
codedOutStream.writeSInt32(OsmandOdb.MapTree.BOTTOM_FIELD_NUMBER, bottomY - bounds.bottomY); codedOutStream.writeSInt32(OsmandOdb.MapTree.BOTTOM_FIELD_NUMBER, bottomY - bounds.bottomY);
stackBounds.push(new Bounds(leftX, rightX, topY, bottomY)); stackBounds.push(new Bounds(leftX, rightX, topY, bottomY));
stackBaseIds.push(0L); stackBaseIds.push(-1L);
stackStringTable.push(null); stackStringTable.push(null);
} }
@ -144,47 +130,97 @@ public class BinaryIndexWriter {
stackBounds.pop(); stackBounds.pop();
Long l = stackBaseIds.pop(); Long l = stackBaseIds.pop();
if(l != 0){ if(l != -1){
codedOutStream.writeTag(OsmandOdb.MapTree.BASEID_FIELD_NUMBER, WireFormat.FieldType.UINT64.getWireType()); codedOutStream.writeTag(OsmandOdb.MapTree.BASEID_FIELD_NUMBER, WireFormat.FieldType.UINT64.getWireType());
codedOutStream.writeUInt64NoTag(l); codedOutStream.writeUInt64NoTag(l);
} }
Map<String, Integer> map = stackStringTable.peek(); Map<String, Integer> map = stackStringTable.peek();
if(map != null){ if(map != null){
codedOutStream.writeTag(OsmandOdb.MapTree.STRINGTABLE_FIELD_NUMBER, WireFormat.FieldType.MESSAGE.getWireType());
// TODO write size
codedOutStream.writeFixed32NoTag(0);
int i = 0; int i = 0;
int size = 0;
for(String s : map.keySet()){ for(String s : map.keySet()){
Integer integer = map.get(s); Integer integer = map.get(s);
if(integer != i){ if(integer != i){
throw new IllegalStateException(); throw new IllegalStateException();
} }
i++; i++;
codedOutStream.writeTag(OsmandOdb.StringTable.S_FIELD_NUMBER, WireFormat.FieldType.MESSAGE.getWireType()); size += CodedOutputStream.computeStringSize(OsmandOdb.StringTable.S_FIELD_NUMBER, s);
codedOutStream.writeStringNoTag(s); }
codedOutStream.writeTag(OsmandOdb.MapTree.STRINGTABLE_FIELD_NUMBER, WireFormat.FieldType.MESSAGE.getWireType());
codedOutStream.writeRawVarint32(size);
for(String s : map.keySet()){
codedOutStream.writeString(OsmandOdb.StringTable.S_FIELD_NUMBER, s);
} }
} }
writeInt32Size();
} }
public void writeMapData(long id, byte[] nodes, byte[] types, String name, int highwayAttributes, byte[] restrictions) throws IOException{ public void writeMapData(long id, byte[] nodes, byte[] types, String name, int highwayAttributes, byte[] restrictions) throws IOException{
assert state.peek() == MAP_TREE; assert state.peek() == MAP_TREE;
codedOutStream.writeTag(OsmandOdb.MapTree.LEAFS_FIELD_NUMBER, WireFormat.FieldType.MESSAGE.getWireType());
// TODO write size of map data !!! here
Bounds bounds = stackBounds.peek();
codedOutStream.writeTag(OsmandOdb.MapData.COORDINATES_FIELD_NUMBER, WireFormat.FieldType.BYTES.getWireType()); Bounds bounds = stackBounds.peek();
int size = 0; if(stackBaseIds.peek() == -1){
for(int i=0; i< nodes.length / 8; i++){ stackBaseIds.pop();
int x = Algoritms.parseIntFromBytes(nodes, i*8) - bounds.leftX; stackBaseIds.push(id);
int y = Algoritms.parseIntFromBytes(nodes, i*8 + 4) - bounds.topY;
size += CodedOutputStream.computeInt32SizeNoTag(x);
size += CodedOutputStream.computeInt32SizeNoTag(y);
} }
codedOutStream.writeRawVarint32(size); // calculate size
int allSize = CodedOutputStream.computeTagSize(OsmandOdb.MapData.COORDINATES_FIELD_NUMBER);
int sizeCoordinates = 0;
for(int i=0; i< nodes.length / 8; i++){ for(int i=0; i< nodes.length / 8; i++){
int x = Algoritms.parseIntFromBytes(nodes, i*8) - bounds.leftX; int x = Algoritms.parseIntFromBytes(nodes, i*8) - bounds.leftX;
int y = Algoritms.parseIntFromBytes(nodes, i*8 + 4) - bounds.topY; int y = Algoritms.parseIntFromBytes(nodes, i*8 + 4) - bounds.topY;
sizeCoordinates += CodedOutputStream.computeInt32SizeNoTag(x);
sizeCoordinates += CodedOutputStream.computeInt32SizeNoTag(y);
}
allSize += sizeCoordinates;
allSize += CodedOutputStream.computeTagSize(OsmandOdb.MapData.TYPES_FIELD_NUMBER);
allSize += CodedOutputStream.computeRawVarint32Size(types.length);
allSize += types.length;
allSize += CodedOutputStream.computeSInt64Size(OsmandOdb.MapData.ID_FIELD_NUMBER, id - stackBaseIds.peek());
int nameId = 0;
if(name != null){
if(stackStringTable.peek() == null) {
stackStringTable.pop();
stackStringTable.push(new LinkedHashMap<String, Integer>());
}
Map<String, Integer> map = stackStringTable.peek();
if(map.containsKey(name)) {
nameId = map.get(name);
} else {
nameId = map.size();
map.put(name, nameId);
}
allSize += CodedOutputStream.computeUInt32Size(OsmandOdb.MapData.STRINGID_FIELD_NUMBER, nameId);
}
int restrictionsSize = 0;
if(restrictions.length > 0){
allSize += CodedOutputStream.computeTagSize(OsmandOdb.MapData.RESTRICTIONS_FIELD_NUMBER);
for (int i = 0; i < restrictions.length / 8; i++) {
long l = Algoritms.parseLongFromBytes(restrictions, i * 8) - stackBaseIds.peek();
restrictionsSize += CodedOutputStream.computeSInt64SizeNoTag(l);
}
allSize += CodedOutputStream.computeRawVarint32Size(restrictionsSize);
allSize += restrictionsSize;
}
if(highwayAttributes != 0){
allSize += CodedOutputStream.computeInt32Size(OsmandOdb.MapData.HIGHWAYMETA_FIELD_NUMBER, highwayAttributes);
}
// writing data
codedOutStream.writeTag(OsmandOdb.MapTree.LEAFS_FIELD_NUMBER, WireFormat.FieldType.MESSAGE.getWireType());
codedOutStream.writeRawVarint32(allSize);
codedOutStream.writeTag(OsmandOdb.MapData.COORDINATES_FIELD_NUMBER, WireFormat.FieldType.BYTES.getWireType());
codedOutStream.writeRawVarint32(sizeCoordinates);
for (int i = 0; i < nodes.length / 8; i++) {
int x = Algoritms.parseIntFromBytes(nodes, i * 8) - bounds.leftX;
int y = Algoritms.parseIntFromBytes(nodes, i * 8 + 4) - bounds.topY;
codedOutStream.writeInt32NoTag(x); codedOutStream.writeInt32NoTag(x);
codedOutStream.writeInt32NoTag(y); codedOutStream.writeInt32NoTag(y);
} }
@ -193,47 +229,29 @@ public class BinaryIndexWriter {
codedOutStream.writeRawVarint32(types.length); codedOutStream.writeRawVarint32(types.length);
codedOutStream.writeRawBytes(types); codedOutStream.writeRawBytes(types);
if(stackBaseIds.peek() == 0){
stackBaseIds.pop(); codedOutStream.writeSInt64(OsmandOdb.MapData.ID_FIELD_NUMBER, id - stackBaseIds.peek());
stackBaseIds.push(id);
}
codedOutStream.writeTag(OsmandOdb.MapData.ID_FIELD_NUMBER, WireFormat.FieldType.SINT64.getWireType());
codedOutStream.writeSInt64NoTag(id - stackBaseIds.peek());
if(name != null){ if(name != null){
if(stackStringTable.peek() == null) { codedOutStream.writeUInt32(OsmandOdb.MapData.STRINGID_FIELD_NUMBER, nameId);
stackStringTable.pop();
stackStringTable.push(new LinkedHashMap<String, Integer>());
}
Map<String, Integer> map = stackStringTable.peek();
int s;
if(map.containsKey(name)) {
s = map.get(name);
} else {
s = map.size();
map.put(name, s);
}
codedOutStream.writeTag(OsmandOdb.MapData.STRINGID_FIELD_NUMBER, WireFormat.FieldType.UINT32.getWireType());
codedOutStream.writeUInt32NoTag(s);
} }
if(restrictions.length > 0){ if(restrictions.length > 0){
// TODO restrictions delta?
codedOutStream.writeTag(OsmandOdb.MapData.RESTRICTIONS_FIELD_NUMBER, WireFormat.FieldType.BYTES.getWireType()); codedOutStream.writeTag(OsmandOdb.MapData.RESTRICTIONS_FIELD_NUMBER, WireFormat.FieldType.BYTES.getWireType());
codedOutStream.writeRawVarint32(restrictions.length); codedOutStream.writeRawVarint32(restrictionsSize);
codedOutStream.writeRawBytes(restrictions); for (int i = 0; i < restrictions.length / 8; i++) {
long l = Algoritms.parseLongFromBytes(restrictions, i * 8) - stackBaseIds.peek();
codedOutStream.writeSInt64NoTag(l);
}
} }
if(highwayAttributes != 0){ if(highwayAttributes != 0){
codedOutStream.writeTag(OsmandOdb.MapData.HIGHWAYMETA_FIELD_NUMBER, WireFormat.FieldType.UINT32.getWireType()); codedOutStream.writeInt32(OsmandOdb.MapData.HIGHWAYMETA_FIELD_NUMBER, highwayAttributes);
codedOutStream.writeRawVarint32(highwayAttributes);
} }
} }
public void close() throws IOException{ public void close() throws IOException{
assert state.peek() == OSMAND_STRUCTURE_INIT; assert state.peek() == OSMAND_STRUCTURE_INIT;
codedOutStream.flush(); codedOutStream.flush();
out.close();
} }
} }

View file

@ -4,9 +4,9 @@ import java.awt.geom.Line2D;
import java.awt.geom.Point2D; import java.awt.geom.Point2D;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream;
import java.io.RandomAccessFile; import java.io.RandomAccessFile;
import java.sql.Connection; import java.sql.Connection;
import java.sql.DriverManager; import java.sql.DriverManager;
@ -28,7 +28,8 @@ import java.util.Map.Entry;
import net.osmand.Algoritms; import net.osmand.Algoritms;
import net.osmand.IProgress; import net.osmand.IProgress;
import net.osmand.binary.BinaryIndexWriter; import net.osmand.binary.BinaryMapIndexWriter;
import net.osmand.binary.OsmandOdb;
import net.osmand.data.Amenity; import net.osmand.data.Amenity;
import net.osmand.data.Building; import net.osmand.data.Building;
import net.osmand.data.City; import net.osmand.data.City;
@ -77,6 +78,8 @@ import rtree.RTree;
import rtree.RTreeException; import rtree.RTreeException;
import rtree.Rect; import rtree.Rect;
import com.google.protobuf.CodedOutputStream;
/** /**
* http://wiki.openstreetmap.org/wiki/OSM_tags_for_routing#Is_inside.2Foutside * http://wiki.openstreetmap.org/wiki/OSM_tags_for_routing#Is_inside.2Foutside
@ -148,13 +151,12 @@ public class IndexCreator {
private PreparedStatement addressStreetNodeStat; private PreparedStatement addressStreetNodeStat;
private File mapFile; private File mapFile;
private RandomAccessFile mapRAFile;
private Connection mapConnection; private Connection mapConnection;
private PreparedStatement mapBinaryStat; private PreparedStatement mapBinaryStat;
private static final int[] MAP_ZOOMS = new int[]{6, 9, 14, 22}; private static final int[] MAP_ZOOMS = new int[]{6, 9, 14, 22};
private RTree[] mapTree = null; private RTree[] mapTree = null;
private File binaryMapFile;
// MEMORY map : save it in memory while that is allowed // MEMORY map : save it in memory while that is allowed
private Map<Long, Set<Integer>> multiPolygonsWays0 = new LinkedHashMap<Long, Set<Integer>>(); private Map<Long, Set<Integer>> multiPolygonsWays0 = new LinkedHashMap<Long, Set<Integer>>();
private Map<Long, Set<Integer>> multiPolygonsWays1 = new LinkedHashMap<Long, Set<Integer>>(); private Map<Long, Set<Integer>> multiPolygonsWays1 = new LinkedHashMap<Long, Set<Integer>>();
@ -467,19 +469,13 @@ public class IndexCreator {
} }
public String getMapFileName() { public String getMapFileName() {
if(mapFileName == null){ if(mapFileName == null){
return getRegionName() + IndexConstants.MAP_INDEX_EXT; return getRegionName() + IndexConstants.BINARY_MAP_INDEX_EXT;
} }
return mapFileName; return mapFileName;
} }
public void setBinaryMapFileName(String mapFileName) { public String getTempMapDBFileName(){
this.binaryMapFileName = mapFileName; return getMapFileName() + ".tmp";
}
public String getBinaryMapFileName(){
if(binaryMapFileName == null){
return getRegionName() + IndexConstants.BINARY_MAP_INDEX_EXT;
}
return binaryMapFileName;
} }
public String getTransportFileName() { public String getTransportFileName() {
@ -1073,6 +1069,7 @@ public class IndexCreator {
type = MapRenderingTypes.RESTRICTION_ONLY_STRAIGHT_ON; type = MapRenderingTypes.RESTRICTION_ONLY_STRAIGHT_ON;
} }
if(type != -1){ if(type != -1){
loadEntityData(e, true);
Collection<EntityId> fromL = ((Relation) e).getMemberIds("from"); Collection<EntityId> fromL = ((Relation) e).getMemberIds("from");
Collection<EntityId> toL = ((Relation) e).getMemberIds("to"); Collection<EntityId> toL = ((Relation) e).getMemberIds("to");
if(!fromL.isEmpty() && !toL.isEmpty()) { if(!fromL.isEmpty() && !toL.isEmpty()) {
@ -1451,15 +1448,21 @@ public class IndexCreator {
} }
public void writeBinaryData() throws IOException, SQLException { public void writeBinaryMapIndex() throws IOException, SQLException {
try { try {
assert IndexConstants.IndexBinaryMapRenderObject.values().length == 6; assert IndexConstants.IndexBinaryMapRenderObject.values().length == 6;
PreparedStatement selectData = mapConnection.prepareStatement("SELECT * FROM " + IndexBinaryMapRenderObject.getTable() + " WHERE id = ?"); PreparedStatement selectData = mapConnection.prepareStatement("SELECT * FROM " + IndexBinaryMapRenderObject.getTable() + " WHERE id = ?");
binaryMapFile = new File(workingDir, getBinaryMapFileName()); CodedOutputStream codedOutStream = CodedOutputStream.newInstance(new OutputStream() {
FileOutputStream fout = new FileOutputStream(binaryMapFile); @Override
BinaryIndexWriter writer = new BinaryIndexWriter(fout); public void write(int b) throws IOException {
mapRAFile.write(b);
}
});
codedOutStream.writeInt32(OsmandOdb.OsmAndStructure.VERSION_FIELD_NUMBER, IndexConstants.BINARY_MAP_VERSION);
BinaryMapIndexWriter writer = new BinaryMapIndexWriter(mapRAFile, codedOutStream);
writer.startWriteMapIndex(); writer.startWriteMapIndex();
for (int i = 0; i < MAP_ZOOMS.length - 1; i++) { for (int i = 0; i < MAP_ZOOMS.length - 1; i++) {
@ -1483,7 +1486,7 @@ public class IndexCreator {
} }
} }
public void writeBinaryMapTree(rtree.Node parent, RTree r, BinaryIndexWriter writer, PreparedStatement selectData) throws IOException, RTreeException, SQLException { public void writeBinaryMapTree(rtree.Node parent, RTree r, BinaryMapIndexWriter writer, PreparedStatement selectData) throws IOException, RTreeException, SQLException {
Element[] e = parent.getAllElements(); Element[] e = parent.getAllElements();
for (int i = 0; i < parent.getTotalElements(); i++) { for (int i = 0; i < parent.getTotalElements(); i++) {
Rect re = e[i].getRect(); Rect re = e[i].getRect();
@ -1644,11 +1647,12 @@ public class IndexCreator {
if (indexMap) { if (indexMap) {
mapFile = new File(workingDir, getMapFileName()); mapFile = new File(workingDir, getMapFileName());
// to save space // to save space
if (mapFile.exists()) {
mapFile.delete();
}
mapFile.getParentFile().mkdirs(); mapFile.getParentFile().mkdirs();
mapConnection = DriverManager.getConnection("jdbc:sqlite:" + mapFile.getAbsolutePath()); File tempDBMapFile = new File(workingDir, getTempMapDBFileName());
if(tempDBMapFile.exists()){
tempDBMapFile.delete();
}
mapConnection = DriverManager.getConnection("jdbc:sqlite:" + tempDBMapFile.getAbsolutePath());
DataIndexWriter.createMapIndexStructure(mapConnection); DataIndexWriter.createMapIndexStructure(mapConnection);
mapBinaryStat = DataIndexWriter.createStatementMapBinaryInsert(mapConnection); mapBinaryStat = DataIndexWriter.createStatementMapBinaryInsert(mapConnection);
@ -1847,8 +1851,11 @@ public class IndexCreator {
pStatements.remove(mapBinaryStat); pStatements.remove(mapBinaryStat);
mapConnection.commit(); mapConnection.commit();
// TODO !!! create binary output stream in order to close it properly (finally) if(mapFile.exists()){
writeBinaryData(); mapFile.delete();
}
mapRAFile = new RandomAccessFile(mapFile, "rw");
writeBinaryMapIndex();
} }
} finally { } finally {
@ -1888,14 +1895,21 @@ public class IndexCreator {
transportIndexFile.setLastModified(lastModifiedDate); transportIndexFile.setLastModified(lastModifiedDate);
} }
} }
if(mapRAFile != null){
mapRAFile.close();
}
if (mapConnection != null) { if (mapConnection != null) {
mapConnection.commit(); mapConnection.commit();
mapConnection.close(); mapConnection.close();
mapConnection = null; mapConnection = null;
if (lastModifiedDate != null) { if (lastModifiedDate != null && mapFile.exists()) {
mapFile.setLastModified(lastModifiedDate); mapFile.setLastModified(lastModifiedDate);
} }
File tempDBFile = new File(getTempMapDBFileName());
if(tempDBFile.exists()){
tempDBFile.delete();
}
} }
if (addressConnection != null) { if (addressConnection != null) {