1- # $Id: rdbms_common.py,v 1.95 2004-04-26 20:59:25 richard Exp $
1+ # $Id: rdbms_common.py,v 1.96 2004-05-02 23:16:05 richard Exp $
22''' Relational database (SQL) backend common code.
33
44Basics:
@@ -438,7 +438,7 @@ def create_journal_table(self, spec):
438438 for x in 'nodeid date tag action params' .split ()])
439439 sql = '''create table %s__journal (
440440 nodeid integer, date timestamp, tag varchar(255),
441- action varchar(255), params varchar(25) )''' % spec .classname
441+ action varchar(255), params text )''' % spec .classname
442442 if __debug__ :
443443 print >> hyperdb .DEBUG , 'create_journal_table' , (self , sql )
444444 self .cursor .execute (sql )
@@ -619,12 +619,14 @@ def clear(self):
619619
620620 hyperdb_to_sql_value = {
621621 hyperdb .String : str ,
622+ # fractional seconds by default
622623 hyperdb .Date : lambda x : x .formal (sep = ' ' , sec = '%.3f' ),
623624 hyperdb .Link : int ,
624625 hyperdb .Interval : str ,
625626 hyperdb .Password : str ,
626627 hyperdb .Boolean : lambda x : x and 'TRUE' or 'FALSE' ,
627628 hyperdb .Number : lambda x : x ,
629+ hyperdb .Multilink : lambda x : x , # used in journal marshalling
628630 }
629631 def addnode (self , classname , nodeid , node ):
630632 ''' Add the specified node to its class's db.
@@ -820,6 +822,7 @@ def setnode(self, classname, nodeid, values, multilink_changes={}):
820822 hyperdb .Password : lambda x : password .Password (encrypted = x ),
821823 hyperdb .Boolean : int ,
822824 hyperdb .Number : _num_cvt ,
825+ hyperdb .Multilink : lambda x : x , # used in journal marshalling
823826 }
824827 def getnode (self , classname , nodeid ):
825828 ''' Get a node from the database.
@@ -973,6 +976,26 @@ def addjournal(self, classname, nodeid, action, params, creator=None,
973976 if __debug__ :
974977 print >> hyperdb .DEBUG , 'addjournal' , (nodeid , journaldate ,
975978 journaltag , action , params )
979+
980+ # make the journalled data marshallable
981+ if isinstance (params , type ({})):
982+ properties = self .getclass (classname ).getprops ()
983+ for param , value in params .items ():
984+ property = properties [param ]
985+ cvt = self .hyperdb_to_sql_value [property .__class__ ]
986+ if isinstance (property , Password ):
987+ params [param ] = cvt (value )
988+ elif isinstance (property , Date ):
989+ params [param ] = cvt (value )
990+ elif isinstance (property , Interval ):
991+ params [param ] = cvt (value )
992+ elif isinstance (property , Boolean ):
993+ params [param ] = cvt (value )
994+
995+ params = repr (params )
996+
997+ dc = self .hyperdb_to_sql_value [hyperdb .Date ]
998+ journaldate = dc (journaldate )
976999
9771000 self .save_journal (classname , cols , nodeid , journaldate ,
9781001 journaltag , action , params )
@@ -1001,16 +1024,34 @@ def getjournal(self, classname, nodeid):
10011024 raise IndexError , '%s has no node %s' % (classname , nodeid )
10021025
10031026 cols = ',' .join ('nodeid date tag action params' .split ())
1004- return self .load_journal (classname , cols , nodeid )
1027+ journal = self .load_journal (classname , cols , nodeid )
1028+
1029+ # now unmarshal the data
1030+ dc = self .sql_to_hyperdb_value [hyperdb .Date ]
1031+ res = []
1032+ properties = self .getclass (classname ).getprops ()
1033+ for nodeid , date_stamp , user , action , params in journal :
1034+ params = eval (params )
1035+ for param , value in params .items ():
1036+ property = properties [param ]
1037+ cvt = self .sql_to_hyperdb_value [property .__class__ ]
1038+ if isinstance (property , Password ):
1039+ params [param ] = cvt (value )
1040+ elif isinstance (property , Date ):
1041+ params [param ] = cvt (value )
1042+ elif isinstance (property , Interval ):
1043+ params [param ] = cvt (value )
1044+ elif isinstance (property , Boolean ):
1045+ params [param ] = cvt (value )
1046+ # XXX numeric ids
1047+ res .append ((str (nodeid ), dc (date_stamp ), user , action , params ))
1048+ return res
10051049
10061050 def save_journal (self , classname , cols , nodeid , journaldate ,
10071051 journaltag , action , params ):
10081052 ''' Save the journal entry to the database
10091053 '''
1010- # make the params db-friendly
1011- params = repr (params )
1012- dc = self .hyperdb_to_sql_value [hyperdb .Date ]
1013- entry = (nodeid , dc (journaldate ), journaltag , action , params )
1054+ entry = (nodeid , journaldate , journaltag , action , params )
10141055
10151056 # do the insert
10161057 a = self .arg
@@ -1029,13 +1070,7 @@ def load_journal(self, classname, cols, nodeid):
10291070 if __debug__ :
10301071 print >> hyperdb .DEBUG , 'load_journal' , (self , sql , nodeid )
10311072 self .cursor .execute (sql , (nodeid ,))
1032- res = []
1033- dc = self .sql_to_hyperdb_value [hyperdb .Date ]
1034- for nodeid , date_stamp , user , action , params in self .cursor .fetchall ():
1035- params = eval (params )
1036- # XXX numeric ids
1037- res .append ((str (nodeid ), dc (date_stamp ), user , action , params ))
1038- return res
1073+ return self .cursor .fetchall ()
10391074
10401075 def pack (self , pack_before ):
10411076 ''' Delete all journal entries except "create" before 'pack_before'.
0 commit comments