index ccf3976ec7be9b5e87c9c1548dd7f95e30b28ad3..e099a97cfe4da8ebc0b1911beec6c0036e3e99ce 100644 (file)
# BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
#
# BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
#
-#$Id: blobfiles.py,v 1.3 2002-02-27 07:33:34 grubert Exp $
+#$Id: blobfiles.py,v 1.8 2002-07-19 03:36:34 richard Exp $
'''
This module exports file storage for roundup backends.
Files are stored into a directory hierarchy.
'''
'''
This module exports file storage for roundup backends.
Files are stored into a directory hierarchy.
'''
-import os, os.path
+import os
def files_in_dir(dir):
if not os.path.exists(dir):
def files_in_dir(dir):
if not os.path.exists(dir):
class FileStorage:
"""Store files in some directory structure"""
class FileStorage:
"""Store files in some directory structure"""
-# TODO: maybe set "files"
-# def __init__(self):
-# pass
-
def filename(self, classname, nodeid, property=None):
'''Determine what the filename for the given node and optionally
property is.
def filename(self, classname, nodeid, property=None):
'''Determine what the filename for the given node and optionally
property is.
None, in which case the filename does not indicate which property
is being saved.
'''
None, in which case the filename does not indicate which property
is being saved.
'''
+ # determine the name of the file to write to
name = self.filename(classname, nodeid, property)
name = self.filename(classname, nodeid, property)
+
+ # make sure the file storage dir exists
if not os.path.exists(os.path.dirname(name)):
os.makedirs(os.path.dirname(name))
if not os.path.exists(os.path.dirname(name)):
os.makedirs(os.path.dirname(name))
+
+ # open the temp file for writing
open(name + '.tmp', 'wb').write(content)
open(name + '.tmp', 'wb').write(content)
- self.transactions.append((self._doStoreFile, (name, )))
+ # save off the commit action
+ self.transactions.append((self.doStoreFile, (classname, nodeid,
+ property)))
def getfile(self, classname, nodeid, property):
'''Get the content of the file in the database.
def getfile(self, classname, nodeid, property):
'''Get the content of the file in the database.
try:
return open(filename, 'rb').read()
except:
try:
return open(filename, 'rb').read()
except:
+ # now try the temp pre-commit filename
try:
return open(filename+'.tmp', 'rb').read()
except:
try:
return open(filename+'.tmp', 'rb').read()
except:
files_dir = os.path.join(self.dir, 'files')
return files_in_dir(files_dir)
files_dir = os.path.join(self.dir, 'files')
return files_in_dir(files_dir)
- def _doStoreFile(self, name, **databases):
- '''Must be implemented by subclass
+ def doStoreFile(self, classname, nodeid, property, **databases):
+ '''Store the file as part of a transaction commit.
+ '''
+ # determine the name of the file to write to
+ name = self.filename(classname, nodeid, property)
+
+ # the file is currently ".tmp" - move it to its real name to commit
+ os.rename(name+".tmp", name)
+
+ # return the classname, nodeid so we reindex this content
+ return (classname, nodeid)
+
+ def rollbackStoreFile(self, classname, nodeid, property, **databases):
+ '''Remove the temp file as a part of a rollback
'''
'''
- raise NotImplementedError
+ # determine the name of the file to delete
+ name = self.filename(classname, nodeid, property)
+ if os.path.exists(name+".tmp"):
+ os.remove(name+".tmp")
# $Log: not supported by cvs2svn $
# $Log: not supported by cvs2svn $
+# Revision 1.7 2002/07/14 06:14:40 richard
+# Some more TODOs
+#
+# Revision 1.6 2002/07/09 03:02:52 richard
+# More indexer work:
+# - all String properties may now be indexed too. Currently there's a bit of
+# "issue" specific code in the actual searching which needs to be
+# addressed. In a nutshell:
+# + pass 'indexme="yes"' as a String() property initialisation arg, eg:
+# file = FileClass(db, "file", name=String(), type=String(),
+# comment=String(indexme="yes"))
+# + the comment will then be indexed and be searchable, with the results
+# related back to the issue that the file is linked to
+# - as a result of this work, the FileClass has a default MIME type that may
+# be overridden in a subclass, or by the use of a "type" property as is
+# done in the default templates.
+# - the regeneration of the indexes (if necessary) is done once the schema is
+# set up in the dbinit.
+#
+# Revision 1.5 2002/07/08 06:58:15 richard
+# cleaned up the indexer code:
+# - it splits more words out (much simpler, faster splitter)
+# - removed code we'll never use (roundup.roundup_indexer has the full
+# implementation, and replaces roundup.indexer)
+# - only index text/plain and rfc822/message (ideas for other text formats to
+# index are welcome)
+# - added simple unit test for indexer. Needs more tests for regression.
+#
+# Revision 1.4 2002/06/19 03:07:19 richard
+# Moved the file storage commit into blobfiles where it belongs.
+#
+# Revision 1.3 2002/02/27 07:33:34 grubert
+# . add, vim line and cvs log key.
+#
#
# vim: set filetype=python ts=4 sw=4 et si
#
# vim: set filetype=python ts=4 sw=4 et si