From 93b30d5403b836d75e15aa91935d1cc4dca3e4cc Mon Sep 17 00:00:00 2001 From: Ruben de Laat Date: Thu, 18 Sep 2014 17:50:10 +1200 Subject: [PATCH] Fixing https://github.com/opensourceBIM/BIMserver/issues/119 Not done yet. --- .../migrations/NewAttributeChange.java | 84 +++++++------- .../migrations/NewReferenceChange.java | 106 +++++++++--------- .../bimserver/database/migrations/Schema.java | 10 +- Builds/build/bimserver.build.xml | 2 + Builds/build/common.build.xml | 1 + 5 files changed, 104 insertions(+), 99 deletions(-) diff --git a/BimServer/src/org/bimserver/database/migrations/NewAttributeChange.java b/BimServer/src/org/bimserver/database/migrations/NewAttributeChange.java index 7ec81950d5..637a2670e3 100644 --- a/BimServer/src/org/bimserver/database/migrations/NewAttributeChange.java +++ b/BimServer/src/org/bimserver/database/migrations/NewAttributeChange.java @@ -38,57 +38,59 @@ public class NewAttributeChange implements Change { private final Schema schema; private int nrFeaturesBefore; - public NewAttributeChange(Schema schema, int nrFeaturesBefore, EAttribute eAttribute) { - this.schema = schema; - this.nrFeaturesBefore = nrFeaturesBefore; + public NewAttributeChange(Schema schema, int nrFeaturesBefore, EAttribute eAttribute) { + this.schema = schema; + this.nrFeaturesBefore = nrFeaturesBefore; this.eAttribute = eAttribute; } - - @Override + + @Override public void change(Database database, DatabaseSession databaseSession) throws NotImplementedException, BimserverDatabaseException { EClass eClass = eAttribute.getEContainingClass(); KeyValueStore keyValueStore = database.getKeyValueStore(); for (EClass subClass : schema.getSubClasses(eClass)) { - try { + try { // No data migration if the database is new - if (subClass.getEAnnotation("nodatabase") == null) { - RecordIterator recordIterator = keyValueStore.getRecordIterator(subClass.getEPackage().getName() + "_" + subClass.getName(), databaseSession); - try { - Record record = recordIterator.next(); - while (record != null) { - ByteBuffer buffer = ByteBuffer.wrap(record.getValue()); + if (!database.getKeyValueStore().isNew()) { + if (subClass.getEAnnotation("nodatabase") == null) { + RecordIterator recordIterator = keyValueStore.getRecordIterator(subClass.getEPackage().getName() + "_" + subClass.getName(), databaseSession); + try { + Record record = recordIterator.next(); + while (record != null) { + ByteBuffer buffer = ByteBuffer.wrap(record.getValue()); - int nrStartBytesBefore = (int) Math.ceil(nrFeaturesBefore / 8.0); - int nrStartBytesAfter = (int) Math.ceil((nrFeaturesBefore + 1) / 8.0); - - byte x = buffer.get(); - - if (x != nrStartBytesBefore) { - throw new BimserverDatabaseException("Size does not match"); + int nrStartBytesBefore = (int) Math.ceil(nrFeaturesBefore / 8.0); + int nrStartBytesAfter = (int) Math.ceil((nrFeaturesBefore + 1) / 8.0); + + byte x = buffer.get(); + + if (x != nrStartBytesBefore) { + throw new BimserverDatabaseException("Size does not match"); + } + + byte[] unsetted = new byte[nrStartBytesAfter]; + buffer.get(unsetted, 0, x); + + unsetted[(nrFeaturesBefore) / 8] |= (1 << ((nrFeaturesBefore) % 8)); + + int extra = 0; + + ByteBuffer newBuffer = ByteBuffer.allocate(record.getValue().length + (nrStartBytesAfter - nrStartBytesBefore) + extra); + newBuffer.put((byte)nrStartBytesAfter); + newBuffer.put(unsetted); + buffer.position(1 + nrStartBytesBefore); + newBuffer.put(buffer); + + keyValueStore.store(subClass.getEPackage().getName() + "_" + subClass.getName(), record.getKey(), newBuffer.array(), databaseSession); + record = recordIterator.next(); } - - byte[] unsetted = new byte[nrStartBytesAfter]; - buffer.get(unsetted, 0, x); - - unsetted[(nrFeaturesBefore) / 8] |= (1 << ((nrFeaturesBefore) % 8)); - - int extra = 0; - - ByteBuffer newBuffer = ByteBuffer.allocate(record.getValue().length + (nrStartBytesAfter - nrStartBytesBefore) + extra); - newBuffer.put((byte)nrStartBytesAfter); - newBuffer.put(unsetted); - buffer.position(1 + nrStartBytesBefore); - newBuffer.put(buffer); - - keyValueStore.store(subClass.getEPackage().getName() + "_" + subClass.getName(), record.getKey(), newBuffer.array(), databaseSession); - record = recordIterator.next(); - } - } catch (BimserverDatabaseException e) { - LOGGER.error("", e); - } finally { - recordIterator.close(); + } catch (Exception e) { + LOGGER.error("", e); + } finally { + recordIterator.close(); + } } - } + } } catch (BimserverLockConflictException e) { LOGGER.error("", e); } diff --git a/BimServer/src/org/bimserver/database/migrations/NewReferenceChange.java b/BimServer/src/org/bimserver/database/migrations/NewReferenceChange.java index fc1f9fc552..e2f00f5d76 100644 --- a/BimServer/src/org/bimserver/database/migrations/NewReferenceChange.java +++ b/BimServer/src/org/bimserver/database/migrations/NewReferenceChange.java @@ -50,60 +50,62 @@ public void change(Database database, DatabaseSession databaseSession) throws No KeyValueStore keyValueStore = database.getKeyValueStore(); for (EClass subClass : schema.getSubClasses(eClass)) { try { - if (subClass.getEAnnotation("nodatabase") == null) { - RecordIterator recordIterator = keyValueStore.getRecordIterator(subClass.getEPackage().getName() + "_" + subClass.getName(), databaseSession); - try { - Record record = recordIterator.next(); - while (record != null) { - ByteBuffer buffer = ByteBuffer.wrap(record.getValue()); - - int nrStartBytesBefore = (int) Math.ceil(nrFeaturesBefore / 8.0); - int nrStartBytesAfter = (int) Math.ceil((nrFeaturesBefore + 1) / 8.0); - - byte x = buffer.get(); - - if (x != nrStartBytesBefore) { - throw new BimserverDatabaseException("Size to not match"); - } - - byte[] unsetted = new byte[nrStartBytesAfter]; - buffer.get(unsetted, 0, x); - - if (eReference.isUnsettable()) { - unsetted[(nrFeaturesBefore + 1) / 8] |= (1 << ((nrFeaturesBefore + 1) % 8)); - } - - int extra = 0; - - if (!eReference.isUnsettable()) { - if (eReference.isMany()) { - extra = 4; - } else { - extra = 2; + if (!keyValueStore.isNew()) { + if (subClass.getEAnnotation("nodatabase") == null) { + RecordIterator recordIterator = keyValueStore.getRecordIterator(subClass.getEPackage().getName() + "_" + subClass.getName(), databaseSession); + try { + Record record = recordIterator.next(); + while (record != null) { + ByteBuffer buffer = ByteBuffer.wrap(record.getValue()); + + int nrStartBytesBefore = (int) Math.ceil(nrFeaturesBefore / 8.0); + int nrStartBytesAfter = (int) Math.ceil((nrFeaturesBefore + 1) / 8.0); + + byte x = buffer.get(); + + if (x != nrStartBytesBefore) { + throw new BimserverDatabaseException("Size to not match"); + } + + byte[] unsetted = new byte[nrStartBytesAfter]; + buffer.get(unsetted, 0, x); + + if (eReference.isUnsettable()) { + unsetted[(nrFeaturesBefore + 1) / 8] |= (1 << ((nrFeaturesBefore + 1) % 8)); + } + + int extra = 0; + + if (!eReference.isUnsettable()) { + if (eReference.isMany()) { + extra = 4; + } else { + extra = 2; + } } - } - - ByteBuffer newBuffer = ByteBuffer.allocate(record.getValue().length + (nrStartBytesAfter - nrStartBytesBefore) + extra); - newBuffer.put((byte)nrStartBytesAfter); - newBuffer.put(unsetted); - buffer.position(1 + nrStartBytesBefore); - newBuffer.put(buffer); - - if (!eReference.isUnsettable()) { - if (eReference.isMany()) { - newBuffer.putInt(0); - } else { - newBuffer.putShort((short)-1); + + ByteBuffer newBuffer = ByteBuffer.allocate(record.getValue().length + (nrStartBytesAfter - nrStartBytesBefore) + extra); + newBuffer.put((byte)nrStartBytesAfter); + newBuffer.put(unsetted); + buffer.position(1 + nrStartBytesBefore); + newBuffer.put(buffer); + + if (!eReference.isUnsettable()) { + if (eReference.isMany()) { + newBuffer.putInt(0); + } else { + newBuffer.putShort((short)-1); + } } - } - - keyValueStore.store(subClass.getEPackage().getName() + "_" + subClass.getName(), record.getKey(), newBuffer.array(), databaseSession); - record = recordIterator.next(); - } - } catch (BimserverDatabaseException e) { - LOGGER.error("", e); - } finally { - recordIterator.close(); + + keyValueStore.store(subClass.getEPackage().getName() + "_" + subClass.getName(), record.getKey(), newBuffer.array(), databaseSession); + record = recordIterator.next(); + } + } catch (BimserverDatabaseException e) { + LOGGER.error("", e); + } finally { + recordIterator.close(); + } } } } catch (BimserverLockConflictException e) { diff --git a/BimServer/src/org/bimserver/database/migrations/Schema.java b/BimServer/src/org/bimserver/database/migrations/Schema.java index bfd089eb4f..fcbe56f70f 100644 --- a/BimServer/src/org/bimserver/database/migrations/Schema.java +++ b/BimServer/src/org/bimserver/database/migrations/Schema.java @@ -226,14 +226,12 @@ public void upgradeDatabase(Database database, int version, DatabaseSession data LOGGER.info("Upgrading database to version " + version); initSubClasses(); for (Change change : changes) { - try { - change.change(database, databaseSession); - } catch (NotImplementedException e) { - LOGGER.error("", e); - } catch (BimserverDatabaseException e) { + try { + change.change(database, databaseSession); + } catch (Exception e) { LOGGER.error("", e); } - } + } try { database.setDatabaseVersion(version, databaseSession); } catch (BimserverLockConflictException e) { diff --git a/Builds/build/bimserver.build.xml b/Builds/build/bimserver.build.xml index c565fe9091..58443cffe9 100644 --- a/Builds/build/bimserver.build.xml +++ b/Builds/build/bimserver.build.xml @@ -12,6 +12,7 @@ + @@ -83,6 +84,7 @@ + diff --git a/Builds/build/common.build.xml b/Builds/build/common.build.xml index 2fd1761e79..c24005cc7b 100644 --- a/Builds/build/common.build.xml +++ b/Builds/build/common.build.xml @@ -64,6 +64,7 @@ +