Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTomeu Vizoso <tomeu@sugarlabs.org>2009-01-07 09:44:28 (GMT)
committer Tomeu Vizoso <tomeu@sugarlabs.org>2009-01-07 09:44:28 (GMT)
commitf3506bddbf061f008555b6e1d60989b87426b5ff (patch)
tree16be7d374e8ceb33952c0492b5ee148a9b86925e
parente26f2127259aaeca25d2535d88a8027413a4ae62 (diff)
Reduce the number of stat() calls
-rw-r--r--src/jarabe/journal/model.py25
1 files changed, 14 insertions, 11 deletions
diff --git a/src/jarabe/journal/model.py b/src/jarabe/journal/model.py
index 9a686f8..29976a3 100644
--- a/src/jarabe/journal/model.py
+++ b/src/jarabe/journal/model.py
@@ -19,6 +19,7 @@ import os
from datetime import datetime
import time
import shutil
+from stat import S_IFMT, S_IFDIR, S_IFREG
import dbus
import gconf
@@ -101,11 +102,13 @@ class ResultSet(object):
files = []
for entry in os.listdir(dir_path):
full_path = os.path.join(dir_path, entry)
- if os.path.isdir(full_path):
+
+ stat = os.stat(full_path)
+ if S_IFMT(stat.st_mode) == S_IFDIR:
files.extend(self._get_all_files(full_path))
- elif os.path.isfile(full_path):
- stat = os.stat(full_path)
- files.append((full_path, stat.st_mtime))
+ elif S_IFMT(stat.st_mode) == S_IFREG:
+ files.append((full_path, stat))
+
return files
def _query_mount_point(self, mount_point, query):
@@ -116,12 +119,12 @@ class ResultSet(object):
limit = int(query.get('limit', len(files)))
total_count = len(files)
- files.sort(lambda a, b: int(b[1] - a[1]))
+ files.sort(lambda a, b: int(b[1].st_mtime - a[1].st_mtime))
files = files[offset:offset + limit]
result = []
- for file_path, timestamp_ in files:
- metadata = _get_file_metadata(file_path)
+ for file_path, stat in files:
+ metadata = _get_file_metadata(file_path, stat)
result.append(metadata)
logging.debug('_query_mount_point took %f s.' % (time.time() - t))
@@ -237,8 +240,7 @@ class ResultSet(object):
last_pos = self._position - self._offset + max_count
return self._cache[first_pos:last_pos]
-def _get_file_metadata(path):
- stat = os.stat(path)
+def _get_file_metadata(path, stat):
client = gconf.client_get_default()
return {'uid': path,
'title': os.path.basename(path),
@@ -290,7 +292,8 @@ def get(object_id):
"""Returns the metadata for an object
"""
if os.path.exists(object_id):
- metadata = _get_file_metadata(object_id)
+ stat = os.stat(path)
+ metadata = _get_file_metadata(object_id, stat)
metadata['mountpoint'] = _get_mount_point(object_id)
else:
metadata = _get_datastore().get_properties(object_id, byte_arrays=True)
@@ -341,7 +344,7 @@ def copy(metadata, mount_point):
def write(metadata, file_path='', update_mtime=True):
"""Creates or updates an entry for that id
"""
- logging.debug('model.write %r %r %r' % (metadata['uid'], file_path,
+ logging.debug('model.write %r %r %r' % (metadata.get('uid', ''), file_path,
update_mtime))
if update_mtime:
metadata['mtime'] = datetime.now().isoformat()