Skip to content

Commit d718304

Browse files
author
Richard Jones
committed
more metakit fixes
1 parent 2bebd3a commit d718304

File tree

2 files changed

+62
-35
lines changed

2 files changed

+62
-35
lines changed

roundup/backends/back_metakit.py

Lines changed: 61 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# $Id: back_metakit.py,v 1.67 2004-03-22 07:45:39 richard Exp $
1+
# $Id: back_metakit.py,v 1.68 2004-03-24 05:33:13 richard Exp $
22
'''Metakit backend for Roundup, originally by Gordon McMillan.
33
44
Known Current Bugs:
@@ -48,6 +48,7 @@
4848
from indexer_dbm import Indexer
4949
import locking
5050
from roundup.date import Range
51+
from blobfiles import files_in_dir
5152

5253
# view modes for opening
5354
# XXX FIXME BPK -> these don't do anything, they are ignored
@@ -324,6 +325,12 @@ def setid(self, classname, maxid):
324325
''' No-op in metakit
325326
'''
326327
pass
328+
329+
def numfiles(self):
330+
'''Get number of files in storage, even across subdirectories.
331+
'''
332+
files_dir = os.path.join(self.config.DATABASE, 'files')
333+
return files_in_dir(files_dir)
327334

328335
_STRINGTYPE = type('')
329336
_LISTTYPE = type([])
@@ -377,6 +384,7 @@ def __init__(self, db, classname, **properties):
377384
if view:
378385
self.maxid = view[-1].id + 1
379386
self.uncommitted = {}
387+
self.comactions = []
380388
self.rbactions = []
381389

382390
# people reach inside!!
@@ -1533,11 +1541,15 @@ def _commit(self):
15331541
''' called post commit of the DB.
15341542
interested subclasses may override '''
15351543
self.uncommitted = {}
1544+
for action in self.comactions:
1545+
action()
1546+
self.comactions = []
15361547
self.rbactions = []
15371548
self.idcache = {}
15381549
def _rollback(self):
15391550
''' called pre rollback of the DB.
15401551
interested subclasses may override '''
1552+
self.comactions = []
15411553
for action in self.rbactions:
15421554
action()
15431555
self.rbactions = []
@@ -1551,6 +1563,10 @@ def _clear(self):
15511563
iv = self.getindexview(READWRITE)
15521564
if iv:
15531565
iv[:] = []
1566+
def commitaction(self, action):
1567+
''' call this to register a callback called on commit
1568+
callback is removed on end of transaction '''
1569+
self.comactions.append(action)
15541570
def rollbackaction(self, action):
15551571
''' call this to register a callback called on rollback
15561572
callback is removed on end of transaction '''
@@ -1732,6 +1748,8 @@ def get(self, nodeid, propname, default=_marker, cache=1):
17321748
if propname == 'content':
17331749
poss_msg = 'Possibly an access right configuration problem.'
17341750
fnm = self.gen_filename(nodeid)
1751+
if not os.path.exists(fnm):
1752+
fnm = fnm + '.tmp'
17351753
try:
17361754
f = open(fnm, 'rb')
17371755
except IOError, (strerror):
@@ -1758,16 +1776,56 @@ def create(self, **propvalues):
17581776

17591777
# figure a filename
17601778
nm = self.gen_filename(newid)
1761-
open(nm, 'wb').write(content)
1779+
f = open(nm + '.tmp', 'wb')
1780+
f.write(content)
1781+
f.close()
17621782

17631783
mimetype = propvalues.get('type', self.default_mime_type)
17641784
self.db.indexer.add_text((self.classname, newid, 'content'), content,
17651785
mimetype)
1786+
1787+
# register commit and rollback actions
1788+
def commit(fnm=nm):
1789+
os.rename(fnm + '.tmp', fnm)
1790+
self.commitaction(commit)
17661791
def undo(fnm=nm):
1767-
os.remove(fnm)
1792+
os.remove(fnm + '.tmp')
17681793
self.rollbackaction(undo)
17691794
return newid
17701795

1796+
def set(self, itemid, **propvalues):
1797+
if not propvalues:
1798+
return
1799+
self.fireAuditors('set', None, propvalues)
1800+
1801+
content = propvalues.get('content', None)
1802+
if content is not None:
1803+
del propvalues['content']
1804+
1805+
propvalues, oldnode = Class.set_inner(self, itemid, **propvalues)
1806+
1807+
# figure a filename
1808+
if content is not None:
1809+
nm = self.gen_filename(itemid)
1810+
f = open(nm + '.tmp', 'wb')
1811+
f.write(content)
1812+
f.close()
1813+
mimetype = propvalues.get('type', self.default_mime_type)
1814+
self.db.indexer.add_text((self.classname, itemid, 'content'),
1815+
content, mimetype)
1816+
1817+
# register commit and rollback actions
1818+
def commit(fnm=nm):
1819+
if os.path.exists(fnm):
1820+
os.remove(fnm)
1821+
os.rename(fnm + '.tmp', fnm)
1822+
self.commitaction(commit)
1823+
def undo(fnm=nm):
1824+
os.remove(fnm + '.tmp')
1825+
self.rollbackaction(undo)
1826+
1827+
self.fireReactors('set', oldnode, propvalues)
1828+
17711829
def index(self, nodeid):
17721830
Class.index(self, nodeid)
17731831
mimetype = self.get(nodeid, 'type')

test/test_metakit.py

Lines changed: 1 addition & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
# BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
1616
# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
1717
#
18-
# $Id: test_metakit.py,v 1.4 2004-03-18 01:58:46 richard Exp $
18+
# $Id: test_metakit.py,v 1.5 2004-03-24 05:33:13 richard Exp $
1919
import unittest, os, shutil, time, weakref
2020

2121
from db_test_base import DBTest, ROTest, SchemaTest, ClassicInitTest, config, password
@@ -31,37 +31,6 @@ def nuke_database(self):
3131
shutil.rmtree(config.DATABASE)
3232

3333
class metakitDBTest(metakitOpener, DBTest):
34-
def testTransactions(self):
35-
# remember the number of items we started
36-
num_issues = len(self.db.issue.list())
37-
self.db.issue.create(title="don't commit me!", status='1')
38-
self.assertNotEqual(num_issues, len(self.db.issue.list()))
39-
self.db.rollback()
40-
self.assertEqual(num_issues, len(self.db.issue.list()))
41-
self.db.issue.create(title="please commit me!", status='1')
42-
self.assertNotEqual(num_issues, len(self.db.issue.list()))
43-
self.db.commit()
44-
self.assertNotEqual(num_issues, len(self.db.issue.list()))
45-
self.db.rollback()
46-
self.assertNotEqual(num_issues, len(self.db.issue.list()))
47-
self.db.file.create(name="test", type="text/plain", content="hi")
48-
self.db.rollback()
49-
num_files = len(self.db.file.list())
50-
for i in range(10):
51-
self.db.file.create(name="test", type="text/plain",
52-
content="hi %d"%(i))
53-
self.db.commit()
54-
# TODO: would be good to be able to ensure the file is not on disk after
55-
# a rollback...
56-
num_files2 = len(self.db.file.list())
57-
self.assertNotEqual(num_files, num_files2)
58-
self.db.file.create(name="test", type="text/plain", content="hi")
59-
num_rfiles = len(os.listdir(self.db.config.DATABASE + '/files/file/0'))
60-
self.db.rollback()
61-
num_rfiles2 = len(os.listdir(self.db.config.DATABASE + '/files/file/0'))
62-
self.assertEqual(num_files2, len(self.db.file.list()))
63-
self.assertEqual(num_rfiles2, num_rfiles-1)
64-
6534
def testBooleanUnset(self):
6635
# XXX: metakit can't unset Booleans :(
6736
nid = self.db.user.create(username='foo', assignable=1)

0 commit comments

Comments
 (0)