Commit 72071445 authored by Guido van Rossum's avatar Guido van Rossum

More changes merging the StandaloneZODB-1.0 release branch into the

trunk.  I'm *almost* done with the merge; the only file not yet merged
is FileStorage.py.
parent 9e42202f
/* fsBTree - FileStorage index BTree
This BTree implments a mapping from 2-character strings
to six-character strings. This allows us to effieciently store
a FileStorage index as a nested mapping of 6-character oid prefix
to mapping of 2-character oid suffix to 6-character (byte) file
positions.
*/
#include <string.h>
typedef unsigned char char2[2];
typedef unsigned char char6[6];
/* Setup template macros */
#define MASTER_ID "$Id: _fsBTree.c,v 1.2 2002/02/12 22:33:07 gvanrossum Exp $\n"
#define PERSISTENT
#define MOD_NAME_PREFIX "fs"
#define INITMODULE init_fsBTree
#define DEFAULT_MAX_BUCKET_SIZE 500
#define DEFAULT_MAX_BTREE_SIZE 500
/*#include "intkeymacros.h"*/
#define KEYMACROS_H "$Id: _fsBTree.c,v 1.2 2002/02/12 22:33:07 gvanrossum Exp $\n"
#define KEY_TYPE char2
#define KEY_CHECK(K) (PyString_Check(K) && PyString_GET_SIZE(K)==2)
#define TEST_KEY(K, T) ((*(K) < *(T) || (*(K) == *(T) && (K)[1] < (T)[1])) ? -1 : ((*(K) == *(T) && (K)[1] == (T)[1]) ? 0 : 1))
#define DECREF_KEY(KEY)
#define INCREF_KEY(k)
#define COPY_KEY(KEY, E) (*(KEY)=*(E), (KEY)[1]=(E)[1])
#define COPY_KEY_TO_OBJECT(O, K) O=PyString_FromStringAndSize(K,2)
#define COPY_KEY_FROM_ARG(TARGET, ARG, STATUS) \
if (KEY_CHECK(ARG)) memcpy(TARGET, PyString_AS_STRING(ARG), 2); else { \
PyErr_SetString(PyExc_TypeError, "expected two-character string key"); \
(STATUS)=0; }
/*#include "intvaluemacros.h"*/
#define VALUEMACROS_H "$Id: _fsBTree.c,v 1.2 2002/02/12 22:33:07 gvanrossum Exp $\n"
#define VALUE_TYPE char6
#define TEST_VALUE(K, T) strncmp(K,T,6)
#define DECLARE_VALUE(NAME) VALUE_TYPE NAME
#define DECREF_VALUE(k)
#define INCREF_VALUE(k)
#define COPY_VALUE(V, E) (memcpy(V, E, 6))
#define COPY_VALUE_TO_OBJECT(O, K) O=PyString_FromStringAndSize(K,6)
#define COPY_VALUE_FROM_ARG(TARGET, ARG, STATUS) \
if ((PyString_Check(ARG) && PyString_GET_SIZE(ARG)==6)) \
memcpy(TARGET, PyString_AS_STRING(ARG), 6); else { \
PyErr_SetString(PyExc_TypeError, "expected six-character string key"); \
(STATUS)=0; }
#define NORMALIZE_VALUE(V, MIN)
#include "BTreeModuleTemplate.c"
...@@ -14,9 +14,9 @@ ...@@ -14,9 +14,9 @@
"""Python implementation of persistent base types """Python implementation of persistent base types
$Id: PersistentMapping.py,v 1.18 2002/02/11 23:40:42 gvanrossum Exp $""" $Id: PersistentMapping.py,v 1.19 2002/02/12 22:33:08 gvanrossum Exp $"""
__version__='$Revision: 1.18 $'[11:-2] __version__='$Revision: 1.19 $'[11:-2]
import Persistence import Persistence
from UserDict import UserDict from UserDict import UserDict
...@@ -43,7 +43,6 @@ class PersistentMapping(UserDict, Persistence.Persistent): ...@@ -43,7 +43,6 @@ class PersistentMapping(UserDict, Persistence.Persistent):
__super_clear = UserDict.clear __super_clear = UserDict.clear
__super_update = UserDict.update __super_update = UserDict.update
__super_setdefault = UserDict.setdefault __super_setdefault = UserDict.setdefault
__super_popitem = UserDict.popitem
def __delitem__(self, key): def __delitem__(self, key):
self.__super_delitem(key) self.__super_delitem(key)
...@@ -69,6 +68,11 @@ class PersistentMapping(UserDict, Persistence.Persistent): ...@@ -69,6 +68,11 @@ class PersistentMapping(UserDict, Persistence.Persistent):
self._p_changed = 1 self._p_changed = 1
return self.__super_setdefault(key, failobj) return self.__super_setdefault(key, failobj)
try:
__super_popitem = UserDict.popitem
except AttributeError:
pass
else:
def popitem(self): def popitem(self):
self._p_changed = 1 self._p_changed = 1
return self.__super_popitem() return self.__super_popitem()
......
##############################################################################
#
# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
# All Rights Reserved.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.0 (ZPL). A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE
#
##############################################################################
"""Tests of the ZEO cache""" """Tests of the ZEO cache"""
from ZODB.Transaction import Transaction from ZODB.Transaction import Transaction
......
##############################################################################
#
# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
# All Rights Reserved.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.0 (ZPL). A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE
#
##############################################################################
"""Library for forking storage server and connecting client storage""" """Library for forking storage server and connecting client storage"""
import asyncore import asyncore
...@@ -48,7 +62,7 @@ if os.name == "nt": ...@@ -48,7 +62,7 @@ if os.name == "nt":
args = (sys.executable, script, str(port), storage_name) + args args = (sys.executable, script, str(port), storage_name) + args
d = os.environ.copy() d = os.environ.copy()
d['PYTHONPATH'] = os.pathsep.join(sys.path) d['PYTHONPATH'] = os.pathsep.join(sys.path)
pid = os.spawnve(os.P_NOWAIT, sys.executable, args, os.environ) pid = os.spawnve(os.P_NOWAIT, sys.executable, args, d)
return ('localhost', port), ('localhost', port + 1), pid return ('localhost', port), ('localhost', port + 1), pid
else: else:
......
##############################################################################
#
# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
# All Rights Reserved.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.0 (ZPL). A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE
#
##############################################################################
"""A multi-client test of the ZEO storage server""" """A multi-client test of the ZEO storage server"""
import ZODB, ZODB.DB, ZODB.FileStorage, ZODB.POSException import ZODB, ZODB.DB, ZODB.FileStorage, ZODB.POSException
......
##############################################################################
#
# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
# All Rights Reserved.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.0 (ZPL). A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE
#
##############################################################################
"""A ZEO client-server stress test to look for leaks. """A ZEO client-server stress test to look for leaks.
The stress test should run in an infinite loop and should involve The stress test should run in an infinite loop and should involve
......
##############################################################################
#
# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
# All Rights Reserved.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.0 (ZPL). A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE
#
##############################################################################
"""Test suite for ZEO based on ZODB.tests""" """Test suite for ZEO based on ZODB.tests"""
import asyncore import asyncore
......
...@@ -14,9 +14,9 @@ ...@@ -14,9 +14,9 @@
"""Python implementation of persistent base types """Python implementation of persistent base types
$Id: PersistentMapping.py,v 1.18 2002/02/11 23:40:42 gvanrossum Exp $""" $Id: PersistentMapping.py,v 1.19 2002/02/12 22:33:08 gvanrossum Exp $"""
__version__='$Revision: 1.18 $'[11:-2] __version__='$Revision: 1.19 $'[11:-2]
import Persistence import Persistence
from UserDict import UserDict from UserDict import UserDict
...@@ -43,7 +43,6 @@ class PersistentMapping(UserDict, Persistence.Persistent): ...@@ -43,7 +43,6 @@ class PersistentMapping(UserDict, Persistence.Persistent):
__super_clear = UserDict.clear __super_clear = UserDict.clear
__super_update = UserDict.update __super_update = UserDict.update
__super_setdefault = UserDict.setdefault __super_setdefault = UserDict.setdefault
__super_popitem = UserDict.popitem
def __delitem__(self, key): def __delitem__(self, key):
self.__super_delitem(key) self.__super_delitem(key)
...@@ -69,6 +68,11 @@ class PersistentMapping(UserDict, Persistence.Persistent): ...@@ -69,6 +68,11 @@ class PersistentMapping(UserDict, Persistence.Persistent):
self._p_changed = 1 self._p_changed = 1
return self.__super_setdefault(key, failobj) return self.__super_setdefault(key, failobj)
try:
__super_popitem = UserDict.popitem
except AttributeError:
pass
else:
def popitem(self): def popitem(self):
self._p_changed = 1 self._p_changed = 1
return self.__super_popitem() return self.__super_popitem()
......
import unittest, sys
from ZODB.fsIndex import fsIndex
from ZODB.utils import p64
class Test(unittest.TestCase):
def testInserts(self):
index=fsIndex()
for i in range(200):
index[p64(i*1000)]=(i*1000L+1)
for i in range(0,200):
self.assertEqual((i,index[p64(i*1000)]), (i,(i*1000L+1)))
self.assertEqual(len(index), 200)
key=p64(2000)
self.assertEqual(index.get(key), 2001)
key=p64(2001)
self.assertEqual(index.get(key), None)
self.assertEqual(index.get(key, ''), '')
# self.failUnless(len(index._data) > 1)
def testUpdate(self):
index=fsIndex()
d={}
for i in range(200):
d[p64(i*1000)]=(i*1000L+1)
index.update(d)
for i in range(400,600):
d[p64(i*1000)]=(i*1000L+1)
index.update(d)
for i in range(100, 500):
d[p64(i*1000)]=(i*1000L+2)
index.update(d)
self.assertEqual(index.get(p64(2000)), 2001)
self.assertEqual(index.get(p64(599000)), 599001)
self.assertEqual(index.get(p64(399000)), 399002)
self.assertEqual(len(index), 600)
def test_suite():
loader=unittest.TestLoader()
return loader.loadTestsFromTestCase(Test)
if __name__=='__main__':
unittest.TextTestRunner().run(test_suite())
...@@ -14,9 +14,9 @@ ...@@ -14,9 +14,9 @@
"""Python implementation of persistent base types """Python implementation of persistent base types
$Id: mapping.py,v 1.18 2002/02/11 23:40:42 gvanrossum Exp $""" $Id: mapping.py,v 1.19 2002/02/12 22:33:08 gvanrossum Exp $"""
__version__='$Revision: 1.18 $'[11:-2] __version__='$Revision: 1.19 $'[11:-2]
import Persistence import Persistence
from UserDict import UserDict from UserDict import UserDict
...@@ -43,7 +43,6 @@ class PersistentMapping(UserDict, Persistence.Persistent): ...@@ -43,7 +43,6 @@ class PersistentMapping(UserDict, Persistence.Persistent):
__super_clear = UserDict.clear __super_clear = UserDict.clear
__super_update = UserDict.update __super_update = UserDict.update
__super_setdefault = UserDict.setdefault __super_setdefault = UserDict.setdefault
__super_popitem = UserDict.popitem
def __delitem__(self, key): def __delitem__(self, key):
self.__super_delitem(key) self.__super_delitem(key)
...@@ -69,6 +68,11 @@ class PersistentMapping(UserDict, Persistence.Persistent): ...@@ -69,6 +68,11 @@ class PersistentMapping(UserDict, Persistence.Persistent):
self._p_changed = 1 self._p_changed = 1
return self.__super_setdefault(key, failobj) return self.__super_setdefault(key, failobj)
try:
__super_popitem = UserDict.popitem
except AttributeError:
pass
else:
def popitem(self): def popitem(self):
self._p_changed = 1 self._p_changed = 1
return self.__super_popitem() return self.__super_popitem()
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment