ASPN ActiveState Programmer Network
ActiveState
/ Home / Perl / PHP / Python / Tcl / XSLT /
/ Safari / My ASPN /
Cookbooks | Documentation | Mailing Lists | Modules | News Feeds | Products | User Groups


Recent Messages
List Archives
About the List
List Leaders
Subscription Options

View Subscriptions
Help

View by Topic
ActiveState
.NET Framework
Open Source
Perl
PHP
Python
Tcl
Web Services
XML & XSLT

View by Category
Database
General
SOAP
System Administration
Tools
User Interfaces
Web Programming
XML Programming


MyASPN >> Mail Archive >> zodb
zodb
[ZODB-Dev] ZODB design. Size and saving records
by Tsmiller other posts by this author
Jun 22 2008 8:54AM messages near this date
Re: [ZODB-Dev] Blob savepoints leaving garbage? | Re: [ZODB-Dev] ZODB design. Size and saving records
ZODB guys,

I have a bookstore application in which I use the ZODB in a simple way.  The
database saves stores and records in the stores.
I open the database as follows where the databasePath argument points to my
bookserver.fs file.

from ZODB import FileStorage, DB
import  transaction
import BTrees.OOBTree,  BTrees.IOBTree

       def open(self, databasePath):
                self.bookDatabase_storage     =
FileStorage.FileStorage(databasePath)
                self.bookDatabase_db          =
DB(self.bookDatabase_storage)
                self.bookDatabase_connection  = self.bookDatabase_db.open()
                self.dbRoot = self.bookDatabase_connection.root()

       # our btrees
        ibTree = BTrees.IOBTree

I define the key 'books' to be an IOBTree

        db.dbRoot['books'] = ibTree.IOBTree()

And when the user creates a store I define the book number to be an IOBTree

        db.dbRoot['books'][storeNumber] = ibTree.IOBTree()

Then I save the book using storeNumber and bookNumber as keys.

	record = {'title':"The Grapes of Wrath", 'author':"John
Steinbeck",'publisher':"Randomhouse"}
        db.dbRoot['books'][storeNumber][bookNumber] = record

So now I can qualify an entire store by using

				currentStore = db.dbRoot['books'][storeNumber]

And a single book by

				currentBook= db.dbRoot['books'][storeNumber][bookNumber]

And look at the books in the store by
			  for k, v in currentStore.values():
						print k, v

I have two questions.
		1)  When I already have a storeNumber and I save a record to 

             			db.dbRoot['books'][storeNumber][bookNumber] = record

		 I have to set the _p_changed flag on the 'books' IOBTREE structure to get
the book to save.

				db.dbRoot['books']._p_changed = True

		Which means that it saves the ENTIRE 'books' IOBTREE' structure every time
a save a single book.  (at least it looks like it is doing this).  When I
edit a book and save it the database grows by more than 64k.  And it looks
like it will get worse and worse as more books are added.

		Am I looking at this correctly.  Or am I doing something really ignorant?

		2)  When I assign a value to the db such as 

             		db.dbRoot['books'][storeNumber][bookNumber] = record

			I initially assumed that setting the _p_changed flag on the storeNumber
key would only save the single record that I want to save.   As mentioned
above, I am setting the flag on the 'books' IOBTREE also.  Should I have to
set it on both.  I have come to the conclusion that the _p_changed flag must
be set at the highest key level.  ie.. 'books'.  Again, Am I doing something
really ignorant?  


Thank you for your responses.  I really need to know and get this fixed
before my wife divorces me!  She spends time entering books and we still
seem to not really know when the changes are going to permanently be saved.  

Tom




-- 
View this message in context: http://www.nabble.com/ZODB-design.-Size-and-saving-records-tp1
8055895p18055895.html
Sent from the Zope - ZODB-Dev mailing list archive at Nabble.com.

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

ZODB-Dev mailing list  -  ZODB-Dev@[...].org
http://mail.zope.org/mailman/listinfo/zodb-dev
Thread:
Tsmiller
Marius Gedminas
Chris Bainbridge
Andreas Jung

Privacy Policy | Email Opt-out | Feedback | Syndication
© ActiveState Software Inc. All rights reserved