[ZODB-Dev] Multiple independant ZODB

2010-05-14 Thread Matthew Noble
I have only just started to use ZODB and have been able to use it with
ease so far.

 

I want to be able to have access to multiple ZODB databases at the same
time that are completely independent.

What I cannot see how to do is to keep the changes to the objects from
each database separate - that is making the transaction commits only
occur for one database at a time even if changes have occurred to
multiple databases between commits.

 

Can the transactions be made specific to a particular database or
connection?

 

Below is example code that accesses two independent databases.

It opens the databases, increments the value for an object in each
database, but I only want to commit the changes to one of databases.

The code here commits the changes for both databases.

 

How do I stop that happening?

I am assuming that I need to do something different than just
transaction.commit() but what do I need to do?

 

Thanks

Matt

 

# START CODE

 

 

from ZODB import FileStorage, DB

import transaction

 

from persistent import Persistent

 

 

def get_item_root(file_name):

# open the database

storage = FileStorage.FileStorage(file_name)

db = DB(storage)

conn = db.open()

dbroot = conn.root()

return dbroot

 

def get_item(dbroot, name):

try:

item = dbroot[name]

except KeyError:

item = None

return item

 

def add_item(dbroot, item):

if item.name not in dbroot: 

dbroot[item.name] = item



def save_item(dbroot, item):

transaction.commit()

 

class Test(Persistent):

def __init__(self, name):

self.name = name

self.value = 0

 

 

db_1 = get_item_root(db_1)

db_2 = get_item_root(db_2)

 

test_1 = get_item(db_1, test_1)

if test_1 is None:

test_1 = Test(test_1)

add_item(db_1, test_1)

 

test_2 = get_item(db_2, test_2)

if test_2 is None:

test_2 = Test(test_2)

add_item(db_2, test_2)

 

print BEFORE: test_1: [%s] [%s] % (test_1.name, test_1.value)

print BEFORE: test_2: [%s] [%s] % (test_2.name, test_2.value)

 

# increment values

test_1.value = test_1.value + 1

test_2.value = test_2.value + 1

print AFTER: test_1: [%s] [%s] % (test_1.name, test_1.value)

print AFTER: test_2: [%s] [%s] % (test_2.name, test_2.value)

 

save_item(db_1, test_1)

 

 

# END CODE #

 


This e-mail and any attachment may contain confidential and/or privileged 
information. If you have received this e-mail and/or attachment in error, 
please notify the sender immediately and delete the e-mail and any attachment 
from your system. If you are not the intended recipient you must not copy, 
distribute, disclose or use the contents of the e-mail or any attachment. 
All e-mail sent to or from this address may be accessed by someone other than 
the recipient for system management and security reasons or for other lawful 
purposes. 

Xype Limited is registered in England and Wales under company number 04516192. 
The company's registered office is Unit 1 Brabazon Office Park, Golf Course 
Lane, Filton, Bristol, BS34 7PZ
___
For more information about ZODB, see the ZODB Wiki:
http://www.zope.org/Wikis/ZODB/

ZODB-Dev mailing list  -  ZODB-Dev@zope.org
https://mail.zope.org/mailman/listinfo/zodb-dev


Re: [ZODB-Dev] Multiple independant ZODB

2010-05-14 Thread Matthew Noble
Thanks Christian.
With a little rooting around based on your advice I have got the independent 
saving working.
Thanks for your help.
Matt

-Original Message-
From: zodb-dev-bounces+mnoble=xype@zope.org 
[mailto:zodb-dev-bounces+mnoble=xype@zope.org] On Behalf Of Christian Theune
Sent: 14 May 2010 09:31
To: zodb-dev@zope.org
Subject: Re: [ZODB-Dev] Multiple independant ZODB

On 05/14/2010 10:06 AM, Matthew Noble wrote:
 I have only just started to use ZODB and have been able to use it with
 ease so far.

 I want to be able to have access to multiple ZODB databases at the same
 time that are completely independent.

 What I cannot see how to do is to keep the changes to the objects from
 each database separate - that is making the transaction commits only
 occur for one database at a time even if changes have occurred to
 multiple databases between commits.

 Can the transactions be made specific to a particular database or
 connection?

Yes.

The default transaction functions in transaction.commit/abort/... work 
with a transaction manager that selects the active transaction based on 
the thread from which it is called.

Whenever you open a connection using DB.open() you can pass in a 
different transaction manager and thus get different transactions with 
as many databases as you like.

Christian

-- 
Christian Theune · c...@gocept.com
gocept gmbh  co. kg · forsterstraße 29 · 06112 halle (saale) · germany
http://gocept.com · tel +49 345 1229889 0 · fax +49 345 1229889 1
Zope and Plone consulting and development

___
For more information about ZODB, see the ZODB Wiki:
http://www.zope.org/Wikis/ZODB/

ZODB-Dev mailing list  -  ZODB-Dev@zope.org
https://mail.zope.org/mailman/listinfo/zodb-dev

This e-mail and any attachment may contain confidential and/or privileged 
information. If you have received this e-mail and/or attachment in error, 
please notify the sender immediately and delete the e-mail and any attachment 
from your system. If you are not the intended recipient you must not copy, 
distribute, disclose or use the contents of the e-mail or any attachment. 
All e-mail sent to or from this address may be accessed by someone other than 
the recipient for system management and security reasons or for other lawful 
purposes. 

Xype Limited is registered in England and Wales under company number 04516192. 
The company's registered office is Unit 1 Brabazon Office Park, Golf Course 
Lane, Filton, Bristol, BS34 7PZ
___
For more information about ZODB, see the ZODB Wiki:
http://www.zope.org/Wikis/ZODB/

ZODB-Dev mailing list  -  ZODB-Dev@zope.org
https://mail.zope.org/mailman/listinfo/zodb-dev