witten
/
luminotes
Archived
1
0
Fork 0

Fixed cache behavior so we don't touch the cache within Database.save() if

there's no commit flag. Then, when Database.commit() is called, any pending
saves are put into the cache.
This commit is contained in:
Dan Helfman 2008-03-07 23:00:07 +00:00
parent 6dcad328b0
commit 7a0368b5d9
1 changed files with 31 additions and 7 deletions

View File

@ -7,6 +7,15 @@ import random
from model.Persistent import Persistent
class Connection_wrapper( object ):
def __init__( self, connection ):
self.connection = connection
self.pending_saves = []
def __getattr__( self, name ):
return getattr( self.connection, name )
class Database( object ):
ID_BITS = 128 # number of bits within an id
ID_DIGITS = "0123456789abcdefghijklmnopqrstuvwxyz"
@ -26,6 +35,15 @@ class Database( object ):
# makes SQLite angry.
os.putenv( "PGTZ", "UTC" )
# forcibly replace psycopg's connect() function with another function that returns the psycopg
# connection wrapped in a class with a pending_saves member, used in save() and commit() below
original_connect = psycopg.connect
def connect( *args, **kwargs ):
return Connection_wrapper( original_connect( *args, **kwargs ) )
psycopg.connect = connect
if connection:
self.__connection = connection
self.__pool = None
@ -72,15 +90,21 @@ class Database( object ):
if commit:
connection.commit()
# FIXME: we shouldn't touch the cache unless there's actually a commit.
# the problem is that in self.commit() below, we don't know which objects
# to actually save into the cache
if self.__cache:
self.__cache.set( obj.cache_key, obj )
if self.__cache:
self.__cache.set( obj.cache_key, obj )
else:
# no commit yet, so don't touch the cache
connection.pending_saves.append( obj )
def commit( self ):
self.__get_connection().commit()
connection = self.__get_connection()
connection.commit()
# save any pending saves to the cache
for obj in connection.pending_saves:
self.__cache.set( obj.cache_key, obj )
connection.pending_saves = []
def load( self, Object_type, object_id, revision = None ):
"""