1.1 --- a/ItemSupport.py Wed Oct 30 15:38:24 2013 +0100
1.2 +++ b/ItemSupport.py Wed Nov 06 00:24:17 2013 +0100
1.3 @@ -6,11 +6,95 @@
1.4 @license: GNU GPL (v2 or later), see COPYING.txt for details.
1.5 """
1.6
1.7 +from MoinMoin.Page import RootPage
1.8 from MoinMoin.util import lock
1.9 import os
1.10
1.11 # Content storage support.
1.12
1.13 +class ItemStoreBase:
1.14 +
1.15 + "Common item store functionality."
1.16 +
1.17 + def __init__(self, lock_dir):
1.18 +
1.19 + "Initialise an item store with the given 'lock_dir' guarding access."
1.20 +
1.21 + self.lock_dir = lock_dir
1.22 + self.writelock = lock.WriteLock(lock_dir)
1.23 + self.readlock = lock.ReadLock(lock_dir)
1.24 +
1.25 + def deduce_next(self):
1.26 +
1.27 + "Deduce the next item number from the existing item files."
1.28 +
1.29 + return max(self.get_keys() or [-1]) + 1
1.30 +
1.31 + # High-level methods.
1.32 +
1.33 + def __len__(self):
1.34 +
1.35 + """
1.36 + Return the number of items.
1.37 + """
1.38 +
1.39 + return len(self.keys())
1.40 +
1.41 + def __iter__(self):
1.42 +
1.43 + "Return an iterator over the items in the store."
1.44 +
1.45 + return ItemIterator(self)
1.46 +
1.47 + def keys(self):
1.48 +
1.49 + "Return a list of keys for items in the store."
1.50 +
1.51 + self.readlock.acquire()
1.52 + try:
1.53 + return self.get_keys()
1.54 + finally:
1.55 + self.readlock.release()
1.56 +
1.57 + def __getitem__(self, number):
1.58 +
1.59 + "Return the item with the given 'number'."
1.60 +
1.61 + self.readlock.acquire()
1.62 + try:
1.63 + try:
1.64 + return self.read_item(number)
1.65 + except (IOError, OSError):
1.66 + raise IndexError, number
1.67 + finally:
1.68 + self.readlock.release()
1.69 +
1.70 + def __delitem__(self, number):
1.71 +
1.72 + "Remove the item with the given 'number' from the store."
1.73 +
1.74 + self.writelock.acquire()
1.75 + try:
1.76 + try:
1.77 + self.remove_item(number)
1.78 + except (IOError, OSError):
1.79 + raise IndexError, number
1.80 + finally:
1.81 + self.writelock.release()
1.82 +
1.83 + def next(self):
1.84 +
1.85 + """
1.86 + Return the number of the next item (which should also be the number of
1.87 + items if none have been deleted).
1.88 + """
1.89 +
1.90 + self.writelock.acquire()
1.91 + try:
1.92 + return self.get_next()
1.93 + finally:
1.94 + self.writelock.release()
1.95 +
1.96 class ItemDirectoryStore:
1.97
1.98 "A directory-based item store."
1.99 @@ -47,12 +131,6 @@
1.100
1.101 return [int(filename) for filename in os.listdir(self.path) if filename.isdigit()]
1.102
1.103 - def deduce_next(self):
1.104 -
1.105 - "Deduce the next item number from the existing item files."
1.106 -
1.107 - return max(self.get_keys() or [-1]) + 1
1.108 -
1.109 def read_next(self):
1.110
1.111 "Read the next item number from a special file."
1.112 @@ -131,69 +209,6 @@
1.113 finally:
1.114 self.writelock.release()
1.115
1.116 - def __len__(self):
1.117 -
1.118 - """
1.119 - Return the number of items.
1.120 - """
1.121 -
1.122 - return len(self.keys())
1.123 -
1.124 - def __iter__(self):
1.125 -
1.126 - "Return an iterator over the items in the store."
1.127 -
1.128 - return ItemIterator(self)
1.129 -
1.130 - def keys(self):
1.131 -
1.132 - "Return a list of keys for items in the store."
1.133 -
1.134 - self.readlock.acquire()
1.135 - try:
1.136 - return self.get_keys()
1.137 - finally:
1.138 - self.readlock.release()
1.139 -
1.140 - def __getitem__(self, number):
1.141 -
1.142 - "Return the item with the given 'number'."
1.143 -
1.144 - self.readlock.acquire()
1.145 - try:
1.146 - try:
1.147 - return self.read_item(number)
1.148 - except (IOError, OSError):
1.149 - raise IndexError, number
1.150 - finally:
1.151 - self.readlock.release()
1.152 -
1.153 - def __delitem__(self, number):
1.154 -
1.155 - "Remove the item with the given 'number' from the store."
1.156 -
1.157 - self.writelock.acquire()
1.158 - try:
1.159 - try:
1.160 - self.remove_item(number)
1.161 - except (IOError, OSError):
1.162 - raise IndexError, number
1.163 - finally:
1.164 - self.writelock.release()
1.165 -
1.166 - def next(self):
1.167 -
1.168 - """
1.169 - Return the number of the next item (which should also be the number of
1.170 - items if none have been deleted).
1.171 - """
1.172 -
1.173 - self.writelock.acquire()
1.174 - try:
1.175 - return self.get_next()
1.176 - finally:
1.177 - self.writelock.release()
1.178 -
1.179 class ItemIterator:
1.180
1.181 "An iterator over items in a store."