diff --git a/VERSION b/VERSION
index 6bac85e1..d4fe3220 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-Version 1.99.4 (2012-01-12 14:04:26) stable
+Version 1.99.4 (2012-01-12 14:14:38) stable
diff --git a/applications/examples/views/default/who.html b/applications/examples/views/default/who.html
index 387a69ac..bb57110e 100644
--- a/applications/examples/views/default/who.html
+++ b/applications/examples/views/default/who.html
@@ -26,6 +26,7 @@
- Alexey Nezhdanov (GAE and database performance)
- Alvaro Justen (dynamical translations)
+
- Anders Roos (file locking)
- Andrew Willimott (documentation)
- Angelo Compagnucci (mobile devices)
- Anthony Bastardi (book, poweredby site, multiple contributions)
diff --git a/gluon/languages.py b/gluon/languages.py
index e68dbe10..dfd43bae 100644
--- a/gluon/languages.py
+++ b/gluon/languages.py
@@ -37,11 +37,18 @@ regex_language = \
re.compile('^[a-zA-Z]{2}(\-[a-zA-Z]{2})?(\-[a-zA-Z]+)?$')
+class FilenoFile():
+ """ Class to wrap a file descriptor like a file object does. """
+ def __init__(self, fd):
+ self.fd = fd
+
+ def fileno(self):
+ return self.fd
+
def read_dict_aux(filename):
fp = open(filename, 'r')
portalocker.lock(fp, portalocker.LOCK_SH)
lang_text = fp.read().replace('\r\n', '\n')
- portalocker.unlock(fp)
fp.close()
if not lang_text.strip():
return {}
@@ -91,20 +98,20 @@ def utf8_repr(s):
def write_dict(filename, contents):
try:
- fp = open(filename, 'w')
- except IOError:
+ fd = os.open(filename, os.O_RDWR | os.O_CREAT)
+ except (IOError, OSError):
if not is_gae:
logging.warning('Unable to write to file %s' % filename)
return
- portalocker.lock(fp, portalocker.LOCK_EX)
+ portalocker.lock(FilenoFile(fd), portalocker.LOCK_EX)
+ os.ftruncate(fd, 0)
+ fp = os.fdopen(fd, 'w')
fp.write('# coding: utf8\n{\n')
for key in sorted(contents):
fp.write('%s: %s,\n' % (utf8_repr(key), utf8_repr(contents[key])))
fp.write('}\n')
- portalocker.unlock(fp)
fp.close()
-
class lazyT(object):
"""