about summary refs log tree commit diff stats
path: root/client/trunk/src/com/fourisland
diff options
context:
space:
mode:
authorKelly Rauchenberger <fefferburbia@gmail.com>2008-08-06 20:31:54 +0000
committerKelly Rauchenberger <fefferburbia@gmail.com>2008-08-06 20:31:54 +0000
commit9bd0475cc6fd11a014242cb7ecca1a04ca7396a1 (patch)
treee4dd167998f7b9f53725982e6fd9718dbd259952 /client/trunk/src/com/fourisland
parent5c55fdeec103cd854d41333f987e6709ef022467 (diff)
downloadinstadisc-9bd0475cc6fd11a014242cb7ecca1a04ca7396a1.tar.gz
instadisc-9bd0475cc6fd11a014242cb7ecca1a04ca7396a1.tar.bz2
instadisc-9bd0475cc6fd11a014242cb7ecca1a04ca7396a1.zip
Client: Transactionalized the database
Now, the database is ACID-compliant. Also fixed the error that occurs when you get sent an item you don't have a subscription for, and it tries to delete the subscription's entry off of the Central Server and fails. The error was because the Client was attempting to look up the Subscription's URL in the database after it already had the URL and ensured that the Subscription wasn't there.
Diffstat (limited to 'client/trunk/src/com/fourisland')
-rw-r--r--client/trunk/src/com/fourisland/instadisc/Database/Wrapper.java137
-rw-r--r--client/trunk/src/com/fourisland/instadisc/Item/WellFormedItem.java6
2 files changed, 111 insertions, 32 deletions
diff --git a/client/trunk/src/com/fourisland/instadisc/Database/Wrapper.java b/client/trunk/src/com/fourisland/instadisc/Database/Wrapper.java index 3423e97..86b22d8 100644 --- a/client/trunk/src/com/fourisland/instadisc/Database/Wrapper.java +++ b/client/trunk/src/com/fourisland/instadisc/Database/Wrapper.java
@@ -7,6 +7,7 @@ package com.fourisland.instadisc.Database;
7import com.sleepycat.je.DatabaseException; 7import com.sleepycat.je.DatabaseException;
8import com.sleepycat.je.Environment; 8import com.sleepycat.je.Environment;
9import com.sleepycat.je.EnvironmentConfig; 9import com.sleepycat.je.EnvironmentConfig;
10import com.sleepycat.je.Transaction;
10import com.sleepycat.persist.EntityCursor; 11import com.sleepycat.persist.EntityCursor;
11import com.sleepycat.persist.EntityStore; 12import com.sleepycat.persist.EntityStore;
12import com.sleepycat.persist.PrimaryIndex; 13import com.sleepycat.persist.PrimaryIndex;
@@ -38,6 +39,8 @@ public class Wrapper {
38 StoreConfig esConfig = new StoreConfig(); 39 StoreConfig esConfig = new StoreConfig();
39 envConfig.setAllowCreate(true); 40 envConfig.setAllowCreate(true);
40 esConfig.setAllowCreate(true); 41 esConfig.setAllowCreate(true);
42 envConfig.setTransactional(true);
43 esConfig.setTransactional(true);
41 try { 44 try {
42 e = new Environment(new File(loc), envConfig); 45 e = new Environment(new File(loc), envConfig);
43 es = new EntityStore(e, "EntityStore", esConfig); 46 es = new EntityStore(e, "EntityStore", esConfig);
@@ -73,15 +76,23 @@ public class Wrapper {
73 public static void setConfig(String key, String value) { 76 public static void setConfig(String key, String value) {
74 synchronized (idConfig) { 77 synchronized (idConfig) {
75 try { 78 try {
76 if (idConfig.contains(key)) { 79 Transaction t = e.beginTransaction(null, null);
77 IDConfig temp = idConfig.get(key); 80
78 temp.setValue(value); 81 try {
79 idConfig.put(temp); 82 if (idConfig.contains(key)) {
80 } else { 83 IDConfig temp = idConfig.get(key);
81 IDConfig temp = new IDConfig(); 84 temp.setValue(value);
82 temp.setKey(key); 85 idConfig.put(t, temp);
83 temp.setValue(value); 86 } else {
84 idConfig.put(temp); 87 IDConfig temp = new IDConfig();
88 temp.setKey(key);
89 temp.setValue(value);
90 idConfig.put(t, temp);
91 }
92
93 t.commit();
94 } catch (Exception ex) {
95 t.abort();
85 } 96 }
86 } catch (DatabaseException ex) { 97 } catch (DatabaseException ex) {
87 Logger.getLogger(Wrapper.class.getName()).log(Level.SEVERE, null, ex); 98 Logger.getLogger(Wrapper.class.getName()).log(Level.SEVERE, null, ex);
@@ -112,14 +123,22 @@ public class Wrapper {
112 public static void emptyOldVerID() { 123 public static void emptyOldVerID() {
113 synchronized (oldVerID) { 124 synchronized (oldVerID) {
114 try { 125 try {
115 EntityCursor<OldVerID> ec = oldVerID.entities(); 126 Transaction t = e.beginTransaction(null, null);
127
116 try { 128 try {
117 Iterator<OldVerID> i = ec.iterator(); 129 EntityCursor<OldVerID> ec = oldVerID.entities();
118 while (i.hasNext()) { 130 try {
119 i.remove(); 131 Iterator<OldVerID> i = ec.iterator();
132 while (i.hasNext()) {
133 oldVerID.delete(t, i.next().getID());
134 }
135 } finally {
136 ec.close();
120 } 137 }
121 } finally { 138
122 ec.close(); 139 t.commit();
140 } catch (Exception ex) {
141 t.abort();
123 } 142 }
124 } catch (DatabaseException ex) { 143 } catch (DatabaseException ex) {
125 Logger.getLogger(Wrapper.class.getName()).log(Level.SEVERE, null, ex); 144 Logger.getLogger(Wrapper.class.getName()).log(Level.SEVERE, null, ex);
@@ -130,9 +149,17 @@ public class Wrapper {
130 public static void addOldVerID(Integer id) { 149 public static void addOldVerID(Integer id) {
131 synchronized (oldVerID) { 150 synchronized (oldVerID) {
132 try { 151 try {
133 OldVerID temp = new OldVerID(); 152 Transaction t = e.beginTransaction(null, null);
134 temp.setID(id); 153
135 oldVerID.put(temp); 154 try {
155 OldVerID temp = new OldVerID();
156 temp.setID(id);
157 oldVerID.put(t, temp);
158
159 t.commit();
160 } catch (Exception ex) {
161 t.abort();
162 }
136 } catch (DatabaseException ex) { 163 } catch (DatabaseException ex) {
137 Logger.getLogger(Wrapper.class.getName()).log(Level.SEVERE, null, ex); 164 Logger.getLogger(Wrapper.class.getName()).log(Level.SEVERE, null, ex);
138 } 165 }
@@ -164,7 +191,15 @@ public class Wrapper {
164 public static void addSubscription(Subscription s) { 191 public static void addSubscription(Subscription s) {
165 synchronized (subscription) { 192 synchronized (subscription) {
166 try { 193 try {
167 subscription.put(s); 194 Transaction t = e.beginTransaction(null, null);
195
196 try {
197 subscription.put(t, s);
198
199 t.commit();
200 } catch (Exception ex) {
201 t.abort();
202 }
168 } catch (DatabaseException ex) { 203 } catch (DatabaseException ex) {
169 Logger.getLogger(Wrapper.class.getName()).log(Level.SEVERE, null, ex); 204 Logger.getLogger(Wrapper.class.getName()).log(Level.SEVERE, null, ex);
170 } 205 }
@@ -175,10 +210,10 @@ public class Wrapper {
175 synchronized (subscription) { 210 synchronized (subscription) {
176 Collection vals = subscription.map().values(); 211 Collection vals = subscription.map().values();
177 Subscription subs[] = new Subscription[vals.size()]; 212 Subscription subs[] = new Subscription[vals.size()];
178 Iterator<Subscription> i = vals.iterator(); 213 Iterator i = vals.iterator();
179 int j = 0; 214 int j = 0;
180 while (i.hasNext()) { 215 while (i.hasNext()) {
181 subs[j] = i.next(); 216 subs[j] = (Subscription) i.next();
182 j++; 217 j++;
183 } 218 }
184 return subs; 219 return subs;
@@ -188,7 +223,15 @@ public class Wrapper {
188 public static void deleteSubscription(String url) { 223 public static void deleteSubscription(String url) {
189 synchronized (subscription) { 224 synchronized (subscription) {
190 try { 225 try {
191 subscription.delete(url); 226 Transaction t = e.beginTransaction(null, null);
227
228 try {
229 subscription.delete(t, url);
230
231 t.commit();
232 } catch (Exception ex) {
233 t.abort();
234 }
192 } catch (DatabaseException ex) { 235 } catch (DatabaseException ex) {
193 Logger.getLogger(Wrapper.class.getName()).log(Level.SEVERE, null, ex); 236 Logger.getLogger(Wrapper.class.getName()).log(Level.SEVERE, null, ex);
194 } 237 }
@@ -203,7 +246,15 @@ public class Wrapper {
203 246
204 synchronized (filter) { 247 synchronized (filter) {
205 try { 248 try {
206 filter.put(f); 249 Transaction t = e.beginTransaction(null, null);
250
251 try {
252 filter.put(t, f);
253
254 t.commit();
255 } catch (Exception ex) {
256 t.abort();
257 }
207 } catch (DatabaseException ex) { 258 } catch (DatabaseException ex) {
208 Logger.getLogger(Wrapper.class.getName()).log(Level.SEVERE, null, ex); 259 Logger.getLogger(Wrapper.class.getName()).log(Level.SEVERE, null, ex);
209 } 260 }
@@ -224,7 +275,15 @@ public class Wrapper {
224 public static void deleteFilter(Integer id) { 275 public static void deleteFilter(Integer id) {
225 synchronized (filter) { 276 synchronized (filter) {
226 try { 277 try {
227 filter.delete(id); 278 Transaction t = e.beginTransaction(null, null);
279
280 try {
281 filter.delete(t, id);
282
283 t.commit();
284 } catch (Exception ex) {
285 t.abort();
286 }
228 } catch (DatabaseException ex) { 287 } catch (DatabaseException ex) {
229 Logger.getLogger(Wrapper.class.getName()).log(Level.SEVERE, null, ex); 288 Logger.getLogger(Wrapper.class.getName()).log(Level.SEVERE, null, ex);
230 } 289 }
@@ -235,10 +294,10 @@ public class Wrapper {
235 synchronized (filter) { 294 synchronized (filter) {
236 Collection vals = filter.map().values(); 295 Collection vals = filter.map().values();
237 Filter fils[] = new Filter[vals.size()]; 296 Filter fils[] = new Filter[vals.size()];
238 Iterator<Filter> i = vals.iterator(); 297 Iterator i = vals.iterator();
239 int j = 0; 298 int j = 0;
240 while (i.hasNext()) { 299 while (i.hasNext()) {
241 fils[j] = i.next(); 300 fils[j] = (Filter) i.next();
242 j++; 301 j++;
243 } 302 }
244 return fils; 303 return fils;
@@ -254,8 +313,16 @@ public class Wrapper {
254 public static void dropFromTopItem() { 313 public static void dropFromTopItem() {
255 synchronized (item) { 314 synchronized (item) {
256 try { 315 try {
257 Iterator<Entry<Integer, Item>> i = item.map().entrySet().iterator(); 316 Transaction t = e.beginTransaction(null, null);
258 item.delete(i.next().getKey()); 317
318 try {
319 Iterator<Entry<Integer, Item>> i = item.map().entrySet().iterator();
320 item.delete(t, i.next().getKey());
321
322 t.commit();
323 } catch (Exception ex) {
324 t.abort();
325 }
259 } catch (DatabaseException ex) { 326 } catch (DatabaseException ex) {
260 Logger.getLogger(Wrapper.class.getName()).log(Level.SEVERE, null, ex); 327 Logger.getLogger(Wrapper.class.getName()).log(Level.SEVERE, null, ex);
261 } 328 }
@@ -266,10 +333,10 @@ public class Wrapper {
266 synchronized (item) { 333 synchronized (item) {
267 Collection vals = item.map().values(); 334 Collection vals = item.map().values();
268 Item items[] = new Item[vals.size()]; 335 Item items[] = new Item[vals.size()];
269 Iterator<Item> i = vals.iterator(); 336 Iterator i = vals.iterator();
270 int j = 0; 337 int j = 0;
271 while (i.hasNext()) { 338 while (i.hasNext()) {
272 items[j] = i.next(); 339 items[j] = (Item) i.next();
273 j++; 340 j++;
274 } 341 }
275 return items; 342 return items;
@@ -279,7 +346,15 @@ public class Wrapper {
279 public static void addItem(Item i) { 346 public static void addItem(Item i) {
280 synchronized (item) { 347 synchronized (item) {
281 try { 348 try {
282 item.put(i); 349 Transaction t = e.beginTransaction(null, null);
350
351 try {
352 item.put(t, i);
353
354 t.commit();
355 } catch (Exception ex) {
356 t.abort();
357 }
283 } catch (DatabaseException ex) { 358 } catch (DatabaseException ex) {
284 Logger.getLogger(Wrapper.class.getName()).log(Level.SEVERE, null, ex); 359 Logger.getLogger(Wrapper.class.getName()).log(Level.SEVERE, null, ex);
285 } 360 }
diff --git a/client/trunk/src/com/fourisland/instadisc/Item/WellFormedItem.java b/client/trunk/src/com/fourisland/instadisc/Item/WellFormedItem.java index 91d95aa..7ba5f3b 100644 --- a/client/trunk/src/com/fourisland/instadisc/Item/WellFormedItem.java +++ b/client/trunk/src/com/fourisland/instadisc/Item/WellFormedItem.java
@@ -5,6 +5,7 @@
5package com.fourisland.instadisc.Item; 5package com.fourisland.instadisc.Item;
6 6
7import com.fourisland.instadisc.Database.Filter; 7import com.fourisland.instadisc.Database.Filter;
8import com.fourisland.instadisc.Database.Subscription;
8import com.fourisland.instadisc.Database.Wrapper; 9import com.fourisland.instadisc.Database.Wrapper;
9import com.fourisland.instadisc.Item.Categories.Category; 10import com.fourisland.instadisc.Item.Categories.Category;
10import com.fourisland.instadisc.XmlRpc; 11import com.fourisland.instadisc.XmlRpc;
@@ -162,7 +163,10 @@ public class WellFormedItem {
162 private boolean checkForSubscription() { 163 private boolean checkForSubscription() {
163 boolean good = Wrapper.existsSubscription(aThis.headerMap.get("Subscription")); 164 boolean good = Wrapper.existsSubscription(aThis.headerMap.get("Subscription"));
164 if (!good) { 165 if (!good) {
165 SubscriptionFile.deleteSubscription(Wrapper.getSubscription(aThis.headerMap.get("Subscription")), false); 166 Subscription s = new Subscription();
167 s.setURL(aThis.headerMap.get("Subscription"));
168
169 SubscriptionFile.deleteSubscription(s, false);
166 } 170 }
167 return good; 171 return good;
168 } 172 }