1 21 package com.db4o.ext; 22 23 import com.db4o.*; 24 import com.db4o.foundation.*; 25 import com.db4o.query.*; 26 import com.db4o.types.*; 27 28 29 37 public class Db4oDatabase implements Db4oType, Internal4{ 38 39 40 43 public byte[] i_signature; 44 45 50 public long i_uuid; 52 53 private static final String CREATIONTIME_FIELD = "i_uuid"; 54 55 56 59 private transient YapStream i_stream; 60 61 64 private transient int i_id; 65 66 69 public Db4oDatabase(){ 70 } 71 72 75 public Db4oDatabase(byte[] signature, long creationTime){ 76 i_signature = signature; 78 i_uuid = creationTime; 79 } 80 81 84 public static Db4oDatabase generate() { 85 return new Db4oDatabase( 86 Unobfuscated.generateSignature(), 87 System.currentTimeMillis()); 88 } 89 90 93 public boolean equals(Object obj) { 94 if(obj==this) { 95 return true; 96 } 97 if(obj==null||this.getClass()!=obj.getClass()) { 98 return false; 99 } 100 Db4oDatabase other = (Db4oDatabase)obj; 101 if (null == other.i_signature || null == this.i_signature) { 102 return false; 103 } 104 return Arrays4.areEqual(other.i_signature, this.i_signature); 105 } 106 107 112 public int getID(Transaction trans) { 113 YapStream stream = trans.stream(); 114 if(stream != i_stream) { 115 i_stream = stream; 116 i_id = bind(trans); 117 } 118 return i_id; 119 } 120 121 public long getCreationTime(){ 122 return i_uuid; 123 } 124 125 128 public byte[] getSignature(){ 129 return i_signature; 130 } 131 132 public String toString(){ 133 return "db " + i_signature; 134 } 135 136 public boolean isOlderThan(Db4oDatabase peer){ 137 138 if(peer == this) 139 throw new IllegalArgumentException (); 140 141 if(i_uuid != peer.i_uuid){ 142 return i_uuid < peer.i_uuid; 143 } 144 145 149 152 154 if(i_signature.length != peer.i_signature.length ){ 155 return i_signature.length < peer.i_signature.length; 156 } 157 158 for (int i = 0; i < i_signature.length; i++) { 159 if(i_signature[i] != peer.i_signature[i]){ 160 return i_signature[i] < peer.i_signature[i]; 161 } 162 } 163 164 166 throw new RuntimeException (); 169 } 170 171 174 public int bind(Transaction trans){ 175 YapStream stream = trans.stream(); 176 Db4oDatabase stored = (Db4oDatabase)stream.db4oTypeStored(trans,this); 177 if (stored == null) { 178 stream.showInternalClasses(true); 179 stream.set3(trans,this, 2, false); 180 int newID = stream.getID1(this); 181 stream.showInternalClasses(false); 182 return newID; 183 } 184 if(stored == this){ 185 return stream.getID1(this); 186 } 187 if(i_uuid == 0){ 188 i_uuid = stored.i_uuid; 189 } 190 stream.showInternalClasses(true); 191 int id = stream.getID1(stored); 192 stream.bind(this, id); 193 stream.showInternalClasses(false); 194 return id; 195 } 196 197 200 public Db4oDatabase query(Transaction trans){ 201 if(i_uuid > 0){ 203 Db4oDatabase res = query(trans, true); 205 if(res != null){ 206 return res; 207 } 208 } 209 return query(trans, false); 211 } 212 213 private Db4oDatabase query(Transaction trans, boolean constrainByUUID){ 214 YapStream stream = trans.stream(); 215 Query q = stream.query(trans); 216 q.constrain(getClass()); 217 if(constrainByUUID){ 218 q.descend(CREATIONTIME_FIELD).constrain(new Long (i_uuid)); 219 } 220 ObjectSet objectSet = q.execute(); 221 while (objectSet.hasNext()) { 222 Db4oDatabase storedDatabase = (Db4oDatabase) objectSet.next(); 223 stream.activate1(null, storedDatabase, 4); 224 if (storedDatabase.equals(this)) { 225 return storedDatabase; 226 } 227 } 228 return null; 229 } 230 231 232 } | Popular Tags |