1.1 --- a/imip_store.py Mon Feb 09 15:32:36 2015 +0100
1.2 +++ b/imip_store.py Mon Feb 09 16:34:24 2015 +0100
1.3 @@ -25,6 +25,7 @@
1.4 from imiptools.filesys import fix_permissions, FileBase
1.5 from os.path import exists, isfile, join
1.6 from os import listdir, remove
1.7 +from time import sleep
1.8
1.9 class FileStore(FileBase):
1.10
1.11 @@ -33,6 +34,12 @@
1.12 def __init__(self, store_dir=STORE_DIR):
1.13 FileBase.__init__(self, store_dir)
1.14
1.15 + def acquire_lock(self, user, timeout=None):
1.16 + FileBase.acquire_lock(self, timeout, user)
1.17 +
1.18 + def release_lock(self, user):
1.19 + FileBase.release_lock(self, user)
1.20 +
1.21 def get_events(self, user):
1.22
1.23 "Return a list of event identifiers."
1.24 @@ -51,11 +58,15 @@
1.25 if not filename or not exists(filename):
1.26 return None
1.27
1.28 - f = open(filename, "rb")
1.29 + self.acquire_lock(user)
1.30 try:
1.31 - return parse_object(f, "utf-8")
1.32 + f = open(filename, "rb")
1.33 + try:
1.34 + return parse_object(f, "utf-8")
1.35 + finally:
1.36 + f.close()
1.37 finally:
1.38 - f.close()
1.39 + self.release_lock(user)
1.40
1.41 def set_event(self, user, uid, node):
1.42
1.43 @@ -65,12 +76,16 @@
1.44 if not filename:
1.45 return False
1.46
1.47 - f = open(filename, "w")
1.48 + self.acquire_lock(user)
1.49 try:
1.50 - to_stream(f, node)
1.51 + f = open(filename, "wb")
1.52 + try:
1.53 + to_stream(f, node)
1.54 + finally:
1.55 + f.close()
1.56 + fix_permissions(filename)
1.57 finally:
1.58 - f.close()
1.59 - fix_permissions(filename)
1.60 + self.release_lock(user)
1.61
1.62 return True
1.63
1.64 @@ -97,7 +112,7 @@
1.65 if not filename or not exists(filename):
1.66 return []
1.67 else:
1.68 - return self._get_freebusy(filename)
1.69 + return self._get_freebusy(user, filename)
1.70
1.71 def get_freebusy_for_other(self, user, other):
1.72
1.73 @@ -107,17 +122,24 @@
1.74 if not filename or not exists(filename):
1.75 return []
1.76 else:
1.77 - return self._get_freebusy(filename)
1.78 + return self._get_freebusy(user, filename)
1.79 +
1.80 + def _get_freebusy(self, user, filename):
1.81
1.82 - def _get_freebusy(self, filename):
1.83 - f = open(filename)
1.84 + "For the given 'user', get the free/busy details from 'filename'."
1.85 +
1.86 + self.acquire_lock(user)
1.87 try:
1.88 - l = []
1.89 - for line in f.readlines():
1.90 - l.append(tuple(line.strip().split("\t")))
1.91 - return l
1.92 + f = open(filename)
1.93 + try:
1.94 + l = []
1.95 + for line in f.readlines():
1.96 + l.append(tuple(line.strip().split("\t")))
1.97 + return l
1.98 + finally:
1.99 + f.close()
1.100 finally:
1.101 - f.close()
1.102 + self.release_lock(user)
1.103
1.104 def set_freebusy(self, user, freebusy):
1.105
1.106 @@ -127,7 +149,7 @@
1.107 if not filename:
1.108 return False
1.109
1.110 - self._set_freebusy(filename, freebusy)
1.111 + self._set_freebusy(user, filename, freebusy)
1.112 return True
1.113
1.114 def set_freebusy_for_other(self, user, freebusy, other):
1.115 @@ -138,17 +160,27 @@
1.116 if not filename:
1.117 return False
1.118
1.119 - self._set_freebusy(filename, freebusy)
1.120 + self._set_freebusy(user, filename, freebusy)
1.121 return True
1.122
1.123 - def _set_freebusy(self, filename, freebusy):
1.124 - f = open(filename, "w")
1.125 + def _set_freebusy(self, user, filename, freebusy):
1.126 +
1.127 + """
1.128 + For the given 'user', write to the file having the given 'filename' the
1.129 + 'freebusy' details.
1.130 + """
1.131 +
1.132 + self.acquire_lock(user)
1.133 try:
1.134 - for item in freebusy:
1.135 - f.write("\t".join([(value or "OPAQUE") for value in item]) + "\n")
1.136 + f = open(filename, "w")
1.137 + try:
1.138 + for item in freebusy:
1.139 + f.write("\t".join([(value or "OPAQUE") for value in item]) + "\n")
1.140 + finally:
1.141 + f.close()
1.142 + fix_permissions(filename)
1.143 finally:
1.144 - f.close()
1.145 - fix_permissions(filename)
1.146 + self.release_lock(user)
1.147
1.148 def _get_requests(self, user, queue):
1.149
1.150 @@ -158,11 +190,15 @@
1.151 if not filename or not exists(filename):
1.152 return None
1.153
1.154 - f = open(filename)
1.155 + self.acquire_lock(user)
1.156 try:
1.157 - return [line.strip() for line in f.readlines()]
1.158 + f = open(filename)
1.159 + try:
1.160 + return [line.strip() for line in f.readlines()]
1.161 + finally:
1.162 + f.close()
1.163 finally:
1.164 - f.close()
1.165 + self.release_lock(user)
1.166
1.167 def get_requests(self, user):
1.168
1.169 @@ -187,13 +223,17 @@
1.170 if not filename:
1.171 return False
1.172
1.173 - f = open(filename, "w")
1.174 + self.acquire_lock(user)
1.175 try:
1.176 - for request in requests:
1.177 - print >>f, request
1.178 + f = open(filename, "w")
1.179 + try:
1.180 + for request in requests:
1.181 + print >>f, request
1.182 + finally:
1.183 + f.close()
1.184 + fix_permissions(filename)
1.185 finally:
1.186 - f.close()
1.187 - fix_permissions(filename)
1.188 + self.release_lock(user)
1.189
1.190 return True
1.191
1.192 @@ -217,12 +257,16 @@
1.193 if not filename:
1.194 return False
1.195
1.196 - f = open(filename, "a")
1.197 + self.acquire_lock(user)
1.198 try:
1.199 - print >>f, request
1.200 + f = open(filename, "a")
1.201 + try:
1.202 + print >>f, request
1.203 + finally:
1.204 + f.close()
1.205 + fix_permissions(filename)
1.206 finally:
1.207 - f.close()
1.208 - fix_permissions(filename)
1.209 + self.release_lock(user)
1.210
1.211 return True
1.212