From 14012c989ccb380f35bf84b88bdf9ec3bed19061 Mon Sep 17 00:00:00 2001 From: grubert Date: Mon, 25 Feb 2002 14:25:41 +0000 Subject: [PATCH] . add module blobfiles in backends with file access functions. not yet activated. git-svn-id: http://svn.roundup-tracker.org/svnroot/roundup/trunk@657 57a73879-2fb5-44c3-a270-3262357dd7e2 --- CHANGES.txt | 1 + roundup/backends/blobfiles.py | 106 ++++++++++++++++++++++++++++++++++ 2 files changed, 107 insertions(+) create mode 100644 roundup/backends/blobfiles.py diff --git a/CHANGES.txt b/CHANGES.txt index 8b1f0c8..0f1e2dc 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -3,6 +3,7 @@ are given with the most recent entry first. 2002-02-?? - 0.4.1 Feature: + . add module blobfiles in backends with file access functions. . roundup db catch only IOError in getfile. . roundup db catches retrieving not existing files. . #503204 ] mailgw needs a default class diff --git a/roundup/backends/blobfiles.py b/roundup/backends/blobfiles.py new file mode 100644 index 0000000..2080ab4 --- /dev/null +++ b/roundup/backends/blobfiles.py @@ -0,0 +1,106 @@ +# +# Copyright (c) 2001 Bizar Software Pty Ltd (http://www.bizarsoftware.com.au/) +# This module is free software, and you may redistribute it and/or modify +# under the same terms as Python, so long as this copyright message and +# disclaimer are retained in their original form. +# +# IN NO EVENT SHALL BIZAR SOFTWARE PTY LTD BE LIABLE TO ANY PARTY FOR +# DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING +# OUT OF THE USE OF THIS CODE, EVEN IF THE AUTHOR HAS BEEN ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +# BIZAR SOFTWARE PTY LTD SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +# BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE. THE CODE PROVIDED HEREUNDER IS ON AN "AS IS" +# BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE, +# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +# +#$Id: blobfiles.py,v 1.1 2002-02-25 14:25:41 grubert Exp $ +''' +This module exports file storage for roundup backends. +Files are stored into a directory hierarchy. +''' + +import os, os.path + +class FileStorage: + """Store files in some directory structure""" + def __init__(self): + # maybe set "files" + pass + + def filename(self, classname, nodeid, property=None): + '''Determine what the filename for the given node and optionally + property is. + ''' + if property: + name = '%s%s.%s'%(classname, nodeid, property) + else: + # roundupdb.FileClass never specified the property name, so don't + # include it + name = '%s%s'%(classname, nodeid) + + # have a separate subdir for every thousand messages + subdir = str(int(nodeid) / 1000) + return os.path.join(self.dir, 'files', classname, subdir, name) + + def filename_flat(self, classname, nodeid, property=None): + '''Determine what the filename for the given node and optionally + property is. + ''' + if property: + return os.path.join(self.dir, 'files', '%s%s.%s'%(classname, + nodeid, property)) + else: + # roundupdb.FileClass never specified the property name, so don't + # include it + return os.path.join(self.dir, 'files', '%s%s'%(classname, + nodeid)) + + def storefile(self, classname, nodeid, property, content): + '''Store the content of the file in the database. The property may be + None, in which case the filename does not indicate which property + is being saved. + ''' + name = self.filename(classname, nodeid, property) + if not os.path.exists(os.path.dirname(name)): + os.makedirs(os.path.dirname(name)) + open(name + '.tmp', 'wb').write(content) + self.transactions.append((self._doStoreFile, (name, ))) + + + def getfile(self, classname, nodeid, property): + '''Get the content of the file in the database. + ''' + filename = self.filename(classname, nodeid, property) + try: + return open(filename, 'rb').read() + except: + try: + return open(filename+'.tmp', 'rb').read() + except: + # fallback to flat file storage + filename = self.filename_flat(classname, nodeid, property) + return open(filename, 'rb').read() + + def numfiles(self): + '''Get number of files in storage, even across subdirectories. + ''' + files_dir = os.path.join(self.dir, 'files') + + def files_in_dir(dir): + if not os.path.exists(dir): + return 0 + num_files = 0 + for dir_entry in os.listdir(dir): + full_filename = os.path.join(dir,dir_entry) + if os.path.isfile(full_filename): + num_files = num_files + 1 + elif os.path.isdir(full_filename): + num_files = num_files + files_in_dir(full_filename) + return num_files + + return files_in_dir(files_dir) + + + -- 2.30.2