only one portalocker

This commit is contained in:
mdipierro
2016-08-01 03:46:51 -05:00
parent 35eaba1096
commit cc1ff02079
6 changed files with 8 additions and 176 deletions
+1 -1
View File
@@ -30,7 +30,6 @@ import hashlib
import datetime import datetime
import tempfile import tempfile
from gluon import recfile from gluon import recfile
from gluon import portalocker
from collections import defaultdict from collections import defaultdict
from collections import OrderedDict from collections import OrderedDict
@@ -40,6 +39,7 @@ try:
except ImportError: except ImportError:
have_settings = False have_settings = False
from pydal import portalocker
from pydal._compat import pickle, thread, to_bytes, to_native, hashlib_md5 from pydal._compat import pickle, thread, to_bytes, to_native, hashlib_md5
try: try:
+1 -1
View File
@@ -28,7 +28,7 @@ from gluon import recfile
from gluon.cache import CacheInRam from gluon.cache import CacheInRam
from gluon.fileutils import copystream from gluon.fileutils import copystream
import hashlib import hashlib
from gluon import portalocker from pydal import portalocker
from pickle import Pickler, MARK, DICT, EMPTY_DICT from pickle import Pickler, MARK, DICT, EMPTY_DICT
#from types import DictionaryType #from types import DictionaryType
import datetime import datetime
+4 -3
View File
@@ -18,10 +18,11 @@ import pkgutil
import logging import logging
from cgi import escape from cgi import escape
from threading import RLock from threading import RLock
from pydal._compat import copyreg, PY2, maketrans, iterkeys, unicodeT, to_unicode, to_bytes, iteritems, to_native, pjoin
from local_html_escape import local_html_escape
from gluon.portalocker import read_locked, LockedFile
from gluon.utf8 import Utf8 from gluon.utf8 import Utf8
from local_html_escape import local_html_escape
from pydal._compat import copyreg, PY2, maketrans, iterkeys, unicodeT, to_unicode, to_bytes, iteritems, to_native, pjoin
from pydal.portalocker import read_locked, LockedFile
from gluon.fileutils import listdir from gluon.fileutils import listdir
from gluon.cfs import getcfs from gluon.cfs import getcfs
+1 -1
View File
@@ -19,7 +19,6 @@ import sched
import re import re
import datetime import datetime
import platform import platform
import portalocker
import fileutils import fileutils
from functools import reduce from functools import reduce
try: try:
@@ -27,6 +26,7 @@ try:
except: except:
import pickle import pickle
from gluon.settings import global_settings from gluon.settings import global_settings
from pydal import portalocker
logger = logging.getLogger("web2py.cron") logger = logging.getLogger("web2py.cron")
_cron_stopping = False _cron_stopping = False
-169
View File
@@ -1,169 +0,0 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Cross-platform (posix/nt) API for flock-style file locking.
Synopsis::
import portalocker
file = open(\"somefile\", \"r+\")
portalocker.lock(file, portalocker.LOCK_EX)
file.seek(12)
file.write(\"foo\")
file.close()
If you know what you're doing, you may choose to::
portalocker.unlock(file)
before closing the file, but why?
Methods::
lock( file, flags )
unlock( file )
Constants::
LOCK_EX
LOCK_SH
LOCK_NB
I learned the win32 technique for locking files from sample code
provided by John Nielsen <nielsenjf@my-deja.com> in the documentation
that accompanies the win32 modules.
Author: Jonathan Feinberg <jdf@pobox.com>
Version: $Id: portalocker.py,v 1.3 2001/05/29 18:47:55 Administrator Exp $
"""
import logging
import platform
logger = logging.getLogger("web2py")
os_locking = None
try:
import google.appengine
os_locking = 'gae'
except:
try:
import fcntl
os_locking = 'posix'
except:
try:
import win32con
import pywintypes
import win32file
os_locking = 'windows'
except:
pass
if os_locking == 'windows':
LOCK_EX = win32con.LOCKFILE_EXCLUSIVE_LOCK
LOCK_SH = 0 # the default
LOCK_NB = win32con.LOCKFILE_FAIL_IMMEDIATELY
# is there any reason not to reuse the following structure?
__overlapped = pywintypes.OVERLAPPED()
def lock(file, flags):
hfile = win32file._get_osfhandle(file.fileno())
win32file.LockFileEx(hfile, flags, 0, 0x7fff0000, __overlapped)
def unlock(file):
hfile = win32file._get_osfhandle(file.fileno())
win32file.UnlockFileEx(hfile, 0, 0x7fff0000, __overlapped)
elif os_locking == 'posix':
LOCK_EX = fcntl.LOCK_EX
LOCK_SH = fcntl.LOCK_SH
LOCK_NB = fcntl.LOCK_NB
def lock(file, flags):
fcntl.flock(file.fileno(), flags)
def unlock(file):
fcntl.flock(file.fileno(), fcntl.LOCK_UN)
else:
if platform.system() == 'Windows':
logger.error('no file locking, you must install the win32 extensions from: http://sourceforge.net/projects/pywin32/files/')
elif os_locking != 'gae':
logger.debug('no file locking, this will cause problems')
LOCK_EX = None
LOCK_SH = None
LOCK_NB = None
def lock(file, flags):
pass
def unlock(file):
pass
class LockedFile(object):
def __init__(self, filename, mode='rb'):
self.filename = filename
self.mode = mode
self.file = None
if 'r' in mode:
self.file = open(filename, mode)
lock(self.file, LOCK_SH)
elif 'w' in mode or 'a' in mode:
self.file = open(filename, mode.replace('w', 'a'))
lock(self.file, LOCK_EX)
if not 'a' in mode:
self.file.seek(0)
self.file.truncate(0)
else:
raise RuntimeError("invalid LockedFile(...,mode)")
def read(self, size=None):
return self.file.read() if size is None else self.file.read(size)
def readline(self):
return self.file.readline()
def readlines(self):
return self.file.readlines()
def write(self, data):
self.file.write(data)
self.file.flush()
def close(self):
if not self.file is None:
unlock(self.file)
self.file.close()
self.file = None
def __del__(self):
if not self.file is None:
self.close()
def read_locked(filename):
fp = LockedFile(filename, 'rb')
data = fp.read()
fp.close()
return data
def write_locked(filename, data):
fp = LockedFile(filename, 'wb')
data = fp.write(data)
fp.close()
if __name__ == '__main__':
import sys
f = LockedFile('test.txt', mode='wb')
f.write('test ok')
f.close()
f = LockedFile('test.txt', mode='rb')
sys.stdout.write(f.read()+'\n')
f.close()
+1 -1
View File
@@ -12,8 +12,8 @@ Provides:
- Storage; like dictionary allowing also for `obj.foo` for `obj['foo']` - Storage; like dictionary allowing also for `obj.foo` for `obj['foo']`
""" """
from pydal import portalocker
from pydal._compat import copyreg, pickle, PY2 from pydal._compat import copyreg, pickle, PY2
import gluon.portalocker as portalocker
__all__ = ['List', 'Storage', 'Settings', 'Messages', __all__ = ['List', 'Storage', 'Settings', 'Messages',
'StorageList', 'load_storage', 'save_storage'] 'StorageList', 'load_storage', 'save_storage']