X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=roundup%2Fbackends%2Fblobfiles.py;h=e099a97cfe4da8ebc0b1911beec6c0036e3e99ce;hb=03694a1acfcf8704487c6c345de65a7940fd3583;hp=ccf3976ec7be9b5e87c9c1548dd7f95e30b28ad3;hpb=6744bff4f213db459841cd010da05e9138daecee;p=roundup.git diff --git a/roundup/backends/blobfiles.py b/roundup/backends/blobfiles.py index ccf3976..e099a97 100644 --- a/roundup/backends/blobfiles.py +++ b/roundup/backends/blobfiles.py @@ -15,13 +15,13 @@ # 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. ''' -import os, os.path +import os def files_in_dir(dir): if not os.path.exists(dir): @@ -37,10 +37,6 @@ def files_in_dir(dir): 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. @@ -74,12 +70,19 @@ class FileStorage: 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) + + # make sure the file storage dir exists 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) - 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. @@ -88,6 +91,7 @@ class FileStorage: try: return open(filename, 'rb').read() except: + # now try the temp pre-commit filename try: return open(filename+'.tmp', 'rb').read() except: @@ -101,11 +105,60 @@ class FileStorage: 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 $ +# 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