[Zope-dev] delete feature to z3c.extfile
Jürgen kartnaller
juergen.kartnaller at gmail.com
Wed Sep 24 02:04:32 EDT 2008
Hi jayaraj,
it is definitely not a good idea to implicitily delete files.
What if two ExtFile objects reference the same file ?
Jürgen
On Wed, Sep 24, 2008 at 4:37 AM, Jayarajan Jn <jayarajan at musmo.com> wrote:
> Hi,
> i am now doing some prototypes for my projects which will be dealing with
> tones of files. After a little scouting i decided to try z3c.extfile. Every
> thing works fine. But i found it strange that there is no delete feature in
> z3c.extfile. ie, even if i can delete a ExtFile object, the file in the hash
> directory is not getting deleted! and it keeps on accumulating...
>
> So i thought i 'll add a delete feature... but my __del__() approach
> doesn't work for me. but i added an additional delete() function too which
> can be invoked explicitly to delete the file before trying to delete ExtFile
> object.
>
> i made following changes to the source...
> inside z3c.extfile.file.file.ExtFile,
>
>
> ----------------------------------------------------------------------------------------------
> class ExtFile(Persistent):
>
> """A zope file implementation based on z3c.extfile"""
>
> interface.implements(IExtFile)
> data = ExtBytesProperty('data')
>
> def __init__(self, data='', contentType=''):
> self.data = data
> self.contentType = contentType
>
> # added the following lines#
>
> * def __del__(self): # <- this is not being invoked when i try to
> delete an extfile object
> del self.data
> #print "deleted data via destructor"
>
> def delete(self): # <- added this to be able to manually able to
> delete files
> del self.data
> #print "deleted data via delete()"
>
> # # # # # # # # # # # # # # #
> *
> def getSize(self):
> return len(self.data)
>
>
> ----------------------------------------------------------------------------------------------
>
> and the 'data' is a 'property' (ExtBytesProperty)
> so i made following changes to z3c.extfile.property.ExtBytesProperty
>
>
> ----------------------------------------------------------------------------------------------
> class ExtBytesProperty(object):
>
> """a property which's values are stored as external files"""
>
> def __init__(self, name):
> self.__name = name
>
>
>
> # added the following lines#
>
> * def __delete__(self,inst):
> digest = inst.__dict__[self.__name]
> self.hd.delete(digest)
>
> * *# # # # # # # # # # # # # # #
>
>
>
> * @property
> def hd(self):
> return component.getUtility(interfaces.IHashDir)
>
> def __get__(self, inst, klass):
>
> if inst is None:
> return self
> digest = inst.__dict__.get(self.__name, _marker)
> if digest is _marker:
> return None
> return getFile(digest)
>
> def __set__(self, inst, value):
> # ignore if value is None
> if value is None:
> if inst.__dict__.has_key(self.__name):
> del inst.__dict__[self.__name]
> return
> # Handle case when value is a string
> if isinstance(value, unicode):
> value = value.encode('UTF-8')
> if isinstance(value, str):
> value = StringIO(value)
> value.seek(0)
> f = self.hd.new()
> while True:
> chunk = value.read(BLOCK_SIZE)
> if not chunk:
> newDigest = f.commit()
> oldDigest = inst.__dict__.get(self.__name, _marker)
> if newDigest == oldDigest:
> # we have no change, so we have to seek to zero
> # because this is normal behaviour when setting a
> # new value
> if hasattr(_storage, 'dataManager'):
> if newDigest in _storage.dataManager.files:
> f = _storage.dataManager.files[newDigest]
> f.seek(0)
> else:
> inst.__dict__[self.__name] = newDigest
> break
> f.write(chunk)
>
> ----------------------------------------------------------------------------------------------------
>
> and at last added the real code which delete the file in hash directory too
>
> i added following codes inside z3c.extfile.hashdir.HashDir class
> ---------------------------------------------------
> def delete(self,digest):
> """delete the file"""
> path=self.getPath(digest)
> if os.path.exists(path):
> os.remove(path)
> return
> ----------------------------------------------------
>
> Now, everything works fine when i try to delete an ExtFile object in ZODB,
> __del__() is not being invoked!!!!!
>
> can anyone tell me how can i fix this???
>
> thanks in advance
>
> jayaraj
>
> _______________________________________________
> Zope-Dev maillist - Zope-Dev at zope.org
> http://mail.zope.org/mailman/listinfo/zope-dev
> ** No cross posts or HTML encoding! **
> (Related lists -
> http://mail.zope.org/mailman/listinfo/zope-announce
> http://mail.zope.org/mailman/listinfo/zope )
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.zope.org/pipermail/zope-dev/attachments/20080924/6f036ef4/attachment-0001.html
More information about the Zope-Dev
mailing list