open-commerce-svn Mailing List for Open Commerce
Status: Pre-Alpha
Brought to you by:
debrice
You can subscribe to this list here.
2007 |
Jan
|
Feb
(14) |
Mar
(19) |
Apr
(7) |
May
(10) |
Jun
(10) |
Jul
(1) |
Aug
|
Sep
(34) |
Oct
|
Nov
|
Dec
|
---|---|---|---|---|---|---|---|---|---|---|---|---|
2008 |
Jan
|
Feb
(2) |
Mar
(5) |
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: <ope...@li...> - 2008-03-04 00:58:56
|
Revision: 120 http://open-commerce.svn.sourceforge.net/open-commerce/?rev=120&view=rev Author: debrice Date: 2008-03-03 16:59:01 -0800 (Mon, 03 Mar 2008) Log Message: ----------- fix docstring Modified Paths: -------------- open-commerce/trunk/Database/DatabaseError.py Modified: open-commerce/trunk/Database/DatabaseError.py =================================================================== --- open-commerce/trunk/Database/DatabaseError.py 2008-03-03 08:37:46 UTC (rev 119) +++ open-commerce/trunk/Database/DatabaseError.py 2008-03-04 00:59:01 UTC (rev 120) @@ -35,7 +35,7 @@ ## Indicate errors like "Database can not be reached" class DatabaseAccessError(DatabaseError): pass -## Indicate errors like "Database can not be recorded" +## Indicate errors like "Data can not be recorded" class DatabaseRecordError(DatabaseError): pass ## Indicate if an object is locked This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ope...@li...> - 2008-03-03 08:39:33
|
Revision: 119 http://open-commerce.svn.sourceforge.net/open-commerce/?rev=119&view=rev Author: debrice Date: 2008-03-03 00:37:46 -0800 (Mon, 03 Mar 2008) Log Message: ----------- fix a mistake in getParent method Modified Paths: -------------- open-commerce/trunk/Database/DatabaseObject.py Modified: open-commerce/trunk/Database/DatabaseObject.py =================================================================== --- open-commerce/trunk/Database/DatabaseObject.py 2008-03-03 08:27:09 UTC (rev 118) +++ open-commerce/trunk/Database/DatabaseObject.py 2008-03-03 08:37:46 UTC (rev 119) @@ -326,7 +326,8 @@ ## Return parent object of current object # # This method return object who's contain current object. If it's not - # connected to a database it will return the buffered value + # connected to a database it will return None (because it's an + # related relation content) # @return Parent object dict or None if doesn't exist # @since 0.02 def getParent(self): @@ -339,7 +340,7 @@ object_id = self.getObjectId(), relation_name = "content") else: - return self.getRelation("parent"); + return None ## Lock current object # This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ope...@li...> - 2008-03-03 08:29:29
|
Revision: 118 http://open-commerce.svn.sourceforge.net/open-commerce/?rev=118&view=rev Author: debrice Date: 2008-03-03 00:27:09 -0800 (Mon, 03 Mar 2008) Log Message: ----------- Implementing getParent Method Modified Paths: -------------- open-commerce/trunk/Database/DatabaseObject.py Modified: open-commerce/trunk/Database/DatabaseObject.py =================================================================== --- open-commerce/trunk/Database/DatabaseObject.py 2008-03-03 08:23:13 UTC (rev 117) +++ open-commerce/trunk/Database/DatabaseObject.py 2008-03-03 08:27:09 UTC (rev 118) @@ -325,13 +325,21 @@ ## Return parent object of current object # - # This method return object who's contain current object + # This method return object who's contain current object. If it's not + # connected to a database it will return the buffered value # @return Parent object dict or None if doesn't exist # @since 0.02 def getParent(self): - #XXX TODO: This method should work with database to return - # an up to date response - raise NotImplementedError, "This method is not yet defined." + if self.getObjectId() is None: + return None + database_engine = self.getDatabaseEngine() + if database_engine: + return database_engine.getRelatedRelationForObject( + type_name = self.getTypeName(), + object_id = self.getObjectId(), + relation_name = "content") + else: + return self.getRelation("parent"); ## Lock current object # This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ope...@li...> - 2008-03-03 08:26:06
|
Revision: 117 http://open-commerce.svn.sourceforge.net/open-commerce/?rev=117&view=rev Author: debrice Date: 2008-03-03 00:23:13 -0800 (Mon, 03 Mar 2008) Log Message: ----------- Adding a new test for add parent Modified Paths: -------------- open-commerce/trunk/Database/test_MysqlDatabase.py Modified: open-commerce/trunk/Database/test_MysqlDatabase.py =================================================================== --- open-commerce/trunk/Database/test_MysqlDatabase.py 2008-03-03 07:52:50 UTC (rev 116) +++ open-commerce/trunk/Database/test_MysqlDatabase.py 2008-03-03 08:23:13 UTC (rev 117) @@ -789,6 +789,9 @@ test_object_2.addContent(test_object_3) test_object_2.storeObject() + self.assertEqual(test_object_2.getParent(), { + test_object_1.getTypeName() :(test_object_1.getObjectId(),) }) + test_object_3.addContent(test_object_1) self.assertRaises(AddContentError, test_object_3.storeObject ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ope...@li...> - 2008-03-03 07:55:29
|
Revision: 116 http://open-commerce.svn.sourceforge.net/open-commerce/?rev=116&view=rev Author: debrice Date: 2008-03-02 23:52:50 -0800 (Sun, 02 Mar 2008) Log Message: ----------- Fix doc string Modified Paths: -------------- open-commerce/trunk/Database/test_MysqlDatabase.py Modified: open-commerce/trunk/Database/test_MysqlDatabase.py =================================================================== --- open-commerce/trunk/Database/test_MysqlDatabase.py 2008-02-29 20:54:58 UTC (rev 115) +++ open-commerce/trunk/Database/test_MysqlDatabase.py 2008-03-03 07:52:50 UTC (rev 116) @@ -794,8 +794,7 @@ def test_deleteContent(self): """ - We will try to add an object to a grandparent object that - should not be allowed and raise an AddContentError exception + We will try to delete content of an object in different way. """ class TestObject(DatabaseObject): """ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ope...@li...> - 2008-02-29 20:54:54
|
Revision: 115 http://open-commerce.svn.sourceforge.net/open-commerce/?rev=115&view=rev Author: debrice Date: 2008-02-29 12:54:58 -0800 (Fri, 29 Feb 2008) Log Message: ----------- First step of UID management of object Modified Paths: -------------- open-commerce/trunk/Database/DatabaseObject.py Modified: open-commerce/trunk/Database/DatabaseObject.py =================================================================== --- open-commerce/trunk/Database/DatabaseObject.py 2008-02-29 17:09:03 UTC (rev 114) +++ open-commerce/trunk/Database/DatabaseObject.py 2008-02-29 20:54:58 UTC (rev 115) @@ -24,7 +24,7 @@ """ -__version__ = '0.02' +__version__ = '0.03' __author__ = 'Brice LEROY' __email__ = 'br...@op...' __credits__ = 'Guido van Rossum, for his excellent programming language.' @@ -77,6 +77,11 @@ # It's not a good idea to set manualy id, Database.StoreObject do it # if necessary. __id = None + + # UID represent the unique object id. It is stored in unique table + # named object. + __uid = None + __property_dictionnary = {} @@ -1139,6 +1144,29 @@ type_name = property(getTypeName, setTypeName) + ## Set the Uid of current object + # + # By default, new object has an UID = None. + # + # WARNING : If you set manually the uid of object + # database engine will try to replace object, not to store a new object. + # @param UID Object UID. + # @exception TypeError if you not submit an unsigned int or long value for UID parameter + # @since 0.03 + def setObjectUid(self, UID): + if UID is None or ( isinstance(UID,(long,int)) and UID >= 0 ): + self.__uid = UID + else: + raise TypeError, "DatabaseObject : setObjectUId method, id parameter should "\ + "be uint." + + ## Return current object UID + # + # @return Object UID + # @since 0.03 + def getObjectUid(self): + return self.__uid + ## Set the Id of current object # # By default, new object has an ID = None. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ope...@li...> - 2008-02-29 17:09:26
|
Revision: 114 http://open-commerce.svn.sourceforge.net/open-commerce/?rev=114&view=rev Author: debrice Date: 2008-02-29 09:09:03 -0800 (Fri, 29 Feb 2008) Log Message: ----------- Fix doc string Modified Paths: -------------- open-commerce/trunk/Database/DatabaseError.py Modified: open-commerce/trunk/Database/DatabaseError.py =================================================================== --- open-commerce/trunk/Database/DatabaseError.py 2007-09-22 17:44:16 UTC (rev 113) +++ open-commerce/trunk/Database/DatabaseError.py 2008-02-29 17:09:03 UTC (rev 114) @@ -47,10 +47,10 @@ ## Indicate if an object already exist on base class DatabaseAlreadyExistError(DatabaseRecordError): pass -## Indicate an error on adding object to anothers +## Indicate an error on adding object to another one class AddContentError(DatabaseRecordError): pass -## Indicate an error on adding object to anothers +## Indicate an error on adding object to another one class NotAllowedError(DatabaseRecordError): pass ## Global Warning Class This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ope...@li...> - 2007-09-22 17:44:15
|
Revision: 113 http://open-commerce.svn.sourceforge.net/open-commerce/?rev=113&view=rev Author: debrice Date: 2007-09-22 10:44:16 -0700 (Sat, 22 Sep 2007) Log Message: ----------- - Now commit method keyword is call transactional - Correcting some doc string Modified Paths: -------------- open-commerce/trunk/Database/Database.py Modified: open-commerce/trunk/Database/Database.py =================================================================== --- open-commerce/trunk/Database/Database.py 2007-09-22 08:26:51 UTC (rev 112) +++ open-commerce/trunk/Database/Database.py 2007-09-22 17:44:16 UTC (rev 113) @@ -46,7 +46,7 @@ ## Base class of database engine # -# Database could not be instancied, she should be inherited from +# Database could not be instancied, it should be inherited from # a specilized database engine # @version 0.01 # @author Brice LEROY @@ -144,9 +144,6 @@ """ if self.database_available_type_list_correspondence.has_key(database_type): db_type = self.database_available_type_list_correspondence[database_type] - #for (key, elt) in self.database_available_type_list_correspondence.items() : - #if (eval("database_type in %s" % elt)): - # Return the fisrt available type in list return eval ("%s()" % db_type.split(",")[0][1:]) return None @@ -232,7 +229,7 @@ def connect(self): """ - Disconnect is there just in case of a connection is necessary to init + Connect is there just in case of a connection is necessary to init the Database. """ raise NotImplementedError, "Database : connect is an abstract method, "\ @@ -240,10 +237,11 @@ def disconnect(self): """ - Disconnect is there just in case of a database + Disconnect is there just in case of connection is need """ raise NotImplementedError, "Database : disconnect is an abstract method,"\ " it should be redefined." + def getObject(self, type_name, object_id=None, restriction_list=None, **kw): """ return the first object can be found whith the restriction applied @@ -359,24 +357,24 @@ restriction_list["locked_object_type_name"] = database_object.getTypeName() self.deleteObjectList(type_name="lock", restriction_list=restriction_list) - def deleteObject(self,type_name, object_id=None, commit=True): + def deleteObject(self,type_name, object_id=None, transactional=True): """ Delete an object on the Database """ - if commit: + if transactional: self.startTransaction() try: self._deleteObject(type_name=type_name,object_id=object_id) except DatabaseWarning, e: self.log(e, WARNING) - if commit: + if transactional: self.commitTransaction() except Exception, e: - if commit: + if transactional: self.rollbackTransaction() raise Exception, e else: - if commit: + if transactional: self.commitTransaction() def _deleteObject(self, type_name,object_id): @@ -386,24 +384,24 @@ raise NotImplementedError, "Database : deleteObject is an abstract"\ " method, it should be redefined." - def deleteObjectList(self,type_name, restriction_list, commit=True): + def deleteObjectList(self,type_name, restriction_list, transactional=True): """ Delete list of object on the Database """ - if commit: + if transactional: self.startTransaction() try: self._deleteObjectList(type_name=type_name,restriction_list=restriction_list) except DatabaseWarning, e: self.log(e, WARNING) - if commit: + if transactional: self.commitTransaction() except Exception, e: - if commit: + if transactional: self.rollbackTransaction() raise Exception, e else: - if commit: + if transactional: self.commitTransaction() @@ -536,28 +534,28 @@ relation_ligne.setRelationId(relation_id) self._storeObject(relation_ligne) - def storeObject(self, database_object, ignore_lock=False, commit=True): + def storeObject(self, database_object, ignore_lock=False, transactional=True): """ save object. The method try to know if the object has been already saved on database by checking it's id. """ if isinstance(database_object, DatabaseObject): - if commit: + if transactional: self.startTransaction() try: object_id = self._storeObject( database_object, ignore_lock=ignore_lock ) except DatabaseWarning,e : self.log(e, WARNING) - if commit: + if transactional: self.commitTransaction() return object_id except Exception, e: self.log(e, ERROR) - if commit: + if transactional: self.rollbackTransaction() raise else: - if commit : + if transactional : self.commitTransaction() return object_id else: @@ -642,13 +640,13 @@ return "host : %s:%s\ndatabase : %s\nusername : %s\npassword : %s" \ % ( self.host, self.port, self.database, self.username, password ) - def storeNewObject(self, object, auto_create_table = 1, extend_if_necessary=0, ignore_lock=False, commit=True): + def storeNewObject(self, object, auto_create_table = 1, extend_if_necessary=0, ignore_lock=False, transactional=True): """ store new object will create a new object - The object.id property will return. - If something Wrong append, it return None + The object.id property will be returned. + If something wrong append, it return None """ - if commit: + if transactional: self.startTransaction() try: return self._storeNewObject( object=object @@ -657,40 +655,40 @@ , ignore_lock = ignore_lock ) except DatabaseWarning, e: self.log(e, WARNING) - if commit: + if transactional: self.commitTransaction() except Exception, e: - if commit: + if transactional: self.rollbackTransaction() raise Exception, e else: - if commit: + if transactional: self.commitTransaction() def _storeNewObject(self, object, auto_create_table = 1, extend_if_necessary=0, ignore_lock=False): raise NotImplementedError, "Database : _storeNewObject is an abstract"\ " method, it should be redefined." - def replaceObject(self, object, ignore_lock=False, commit=True): + def replaceObject(self, object, ignore_lock=False, transactional=True): """ replaceObject will replace the object with the same ID in the Database. If something Wrong append, it return None """ - if commit: + if transactional: self.startTransaction() try: return self._replaceObject( object = object , ignore_lock = ignore_lock) except DatabaseWarning, e: self.log(e, WARNING) - if commit: + if transactional: self.commitTransaction() except Exception, e: - if commit: + if transactional: self.rollbackTransaction() raise Exception, e else: - if commit: + if transactional: self.commitTransaction() def _replaceObject(self, object, ignore_lock=False): """ @@ -701,6 +699,9 @@ " method, it should be redefined." def commitTransaction(self): + """ + Commit current Transaction + """ if self.is_transaction_running : self.log("Commiting Transaction...", IMPORTANT) self.is_transaction_running = False @@ -717,6 +718,9 @@ " method, it should be redefined." def startTransaction(self): + """ + Start a new Transaction + """ if not self.is_transaction_running: self.log("Start a new transaction...", IMPORTANT) self.is_transaction_running = True @@ -725,7 +729,7 @@ def _startTransaction(self): """ - Revert all modification during current Transaction + Start a new Transaction """ raise NotImplementedError, "Database : _startTransaction is an abstract"\ " method, it should be redefined." @@ -753,6 +757,9 @@ def rollbackTransaction(self): + """ + Revert all modification done during current Transaction + """ if self.is_transaction_running : self.log("RollBack current transaction...", IMPORTANT) self.is_transaction_running = False @@ -762,7 +769,7 @@ def _rollbackTransaction(self): """ - Return list of available type object (like "sale order", "sale invoice"...) + Revert all modifications done during current Transaction """ raise NotImplementedError, "Database : _rollbackTransaction is an abstract"\ " method, it should be redefined." This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ope...@li...> - 2007-09-22 08:26:49
|
Revision: 112 http://open-commerce.svn.sourceforge.net/open-commerce/?rev=112&view=rev Author: debrice Date: 2007-09-22 01:26:51 -0700 (Sat, 22 Sep 2007) Log Message: ----------- Changing Database transactionnal structure : - private method does no longer manage transaction - now public method rollback transaction on exception Modified Paths: -------------- open-commerce/trunk/Database/Database.py open-commerce/trunk/Database/MysqlDatabase.py Modified: open-commerce/trunk/Database/Database.py =================================================================== --- open-commerce/trunk/Database/Database.py 2007-09-16 12:21:17 UTC (rev 111) +++ open-commerce/trunk/Database/Database.py 2007-09-22 08:26:51 UTC (rev 112) @@ -35,8 +35,15 @@ from DatabaseObject import DatabaseObject from SearchResult import SearchResult, SearchResultList from Util import deleteDoubledInList -from DatabaseError import DatabaseAccessError, DatabaseRecordError, LockError, RelatedObjectError, DatabaseAlreadyExistError, AddContentError +from DatabaseError import *#DatabaseAccessError, DatabaseRecordError, LockError, RelatedObjectError, DatabaseAlreadyExistError, AddContentError +# Log constant +INFORMATION = 0 +IMPORTANT = 100 +WARNING = 200 +DEBUG = 300 +ERROR = 400 + ## Base class of database engine # # Database could not be instancied, she should be inherited from @@ -356,9 +363,23 @@ """ Delete an object on the Database """ - self._deleteObject(type_name=type_name,object_id=object_id, commit=commit) + if commit: + self.startTransaction() + try: + self._deleteObject(type_name=type_name,object_id=object_id) + except DatabaseWarning, e: + self.log(e, WARNING) + if commit: + self.commitTransaction() + except Exception, e: + if commit: + self.rollbackTransaction() + raise Exception, e + else: + if commit: + self.commitTransaction() - def _deleteObject(self, type_name,object_id, commit=True): + def _deleteObject(self, type_name,object_id): """ Delete an object on the Database """ @@ -369,10 +390,24 @@ """ Delete list of object on the Database """ - self._deleteObjectList(type_name=type_name,restriction_list=restriction_list, commit=commit) + if commit: + self.startTransaction() + try: + self._deleteObjectList(type_name=type_name,restriction_list=restriction_list) + except DatabaseWarning, e: + self.log(e, WARNING) + if commit: + self.commitTransaction() + except Exception, e: + if commit: + self.rollbackTransaction() + raise Exception, e + else: + if commit: + self.commitTransaction() - def _deleteObjectList(self,type_name, restriction_list, commit=True): + def _deleteObjectList(self,type_name, restriction_list): """ Delete list of object on the Database """ @@ -455,8 +490,8 @@ for relation_name in database_object.getRelationNameList(): #for each relation, we will save relation into relation table relation_list = database_object.getRelationList(relation_name) - self.log(relation_list, 300) - self.log(relation_name, 300) + self.log(relation_list, DEBUG) + self.log(relation_name, DEBUG) # first, we try to get relation if exist restriction_list={} restriction_list['name'] = relation_name @@ -465,7 +500,7 @@ if relation_object is None: relation_object = Relation() relation_object.setName(relation_name) - self.storeObject(relation_object,commit=False) + self._storeObject(relation_object) relation_id = relation_object.getObjectId() else: relation_id = relation_object.getObjectId() @@ -475,7 +510,7 @@ restriction_list['source'] = source_id restriction_list['source_type_name'] = source_type_name restriction_list['relation_id'] = relation_object.getObjectId() - self.deleteObjectList("relation_table",restriction_list=restriction_list, commit=False) + self._deleteObjectList("relation_table",restriction_list=restriction_list) # We will not allow to store object in two differents # places, so we test if it is not already contained @@ -487,7 +522,7 @@ restriction_list['destination'] = object_id restriction_list['destination_type_name'] = destination_type_name restriction_list['relation_id'] = relation_object.getObjectId() - content_relation = self.deleteObjectList("relation_table",restriction_list=restriction_list, commit=False) + content_relation = self._deleteObjectList("relation_table",restriction_list=restriction_list) #relation_list contain {"type_name",(1,2),...} for (destination_type_name, id_list) in relation_list.items(): @@ -499,33 +534,58 @@ relation_ligne.setDestination(destination_id) relation_ligne.setDestinationTypeName(destination_type_name) relation_ligne.setRelationId(relation_id) - self.storeObject(relation_ligne, commit=False) + self._storeObject(relation_ligne) - def storeObject(self, database_object, ignore_lock=False, commit=True): """ save object. The method try to know if the object has been already saved on database by checking it's id. """ + if isinstance(database_object, DatabaseObject): + if commit: + self.startTransaction() + try: + object_id = self._storeObject( database_object, ignore_lock=ignore_lock ) + except DatabaseWarning,e : + self.log(e, WARNING) + if commit: + self.commitTransaction() + return object_id + except Exception, e: + self.log(e, ERROR) + if commit: + self.rollbackTransaction() + raise + else: + if commit : + self.commitTransaction() + return object_id + else: + raise TypeError, "Database : storeObject, parameter database_object,"\ + " should be a DatabaseObject." + + + def _storeObject(self, database_object, ignore_lock=False): + """ + save object. The method try to know if the object has been already + saved on database by checking it's id. + """ if isinstance(database_object, DatabaseObject): if database_object.getObjectId() is None: # the object has never been stored - if commit: - self.startTransaction() try: - object_id = self.storeNewObject(database_object, ignore_lock=ignore_lock) + object_id = self._storeNewObject(database_object, ignore_lock=ignore_lock) self._storeObjectRelation(database_object) database_object.database_engine=self - except DatabaseAccessError,e : - self.rollbackTransaction() - raise DatabaseAccessError,e - except EnvironmentError, e: - self.rollbackTransaction() - raise DatabaseAccessError,e - if commit : - self.commitTransaction() - return object_id + except DatabaseWarning,e : + self.log(e, WARNING) + return object_id + except Exception, e: + self.log(e, ERROR) + raise Exception, e + else: + return object_id # if object is locked in database, we have to test if # the object is not lock itself (if it's not we are the proprietary of the lock ): elif self.isLockedObject(database_object): @@ -534,56 +594,38 @@ # was unlock before and a locked copy was saved, so we try to know if # the object is locked or not (to avoid to saved an old revision of document! ) if not database_object.isLocked(): - if commit: - self.startTransaction() try : self._storeObjectRelation(database_object) - self.replaceObject(database_object, ignore_lock=True) - except DatabaseAccessError,e : - self.rollbackTransaction() - raise DatabaseAccessError,e - except EnvironmentError, e: - self.rollbackTransaction() - raise DatabaseAccessError,e + self._replaceObject(database_object, ignore_lock=True) + except DatabaseWarning,e : + self.log(e, WARNING) + return database_object.getObjectId() except Exception, e: - self.rollbackTransaction() + self.log(e, ERROR) raise Exception, e - if commit : - self.commitTransaction() - return database_object.getObjectId() + else: + return database_object.getObjectId() # If we ask to ignore lock : elif ignore_lock: - return self.replaceObject(database_object, ignore_lock=ignore_lock) + return self._replaceObject(database_object, ignore_lock=ignore_lock) # Else we don't have to store this object else: raise LockError, "Database : storeObject "\ "method, object %s (ID:%s) is locked" % \ (database_object.getTypeName(), database_object.getObjectId()) else: - if commit: - self.startTransaction() try : self._storeObjectRelation(database_object) - self.replaceObject(database_object, ignore_lock=ignore_lock) - except AddContentError, e: - self.rollbackTransaction() - raise AddContentError,e - except DatabaseAccessError,e : - self.rollbackTransaction() - raise DatabaseAccessError,e - except EnvironmentError, e: - self.rollbackTransaction() - raise DatabaseAccessError,e + self._replaceObject(database_object, ignore_lock=ignore_lock) + except DatabaseWarning,e : + self.log(e, WARNING) + return database_object.getObjectId() except Exception, e: - self.rollbackTransaction() - import pdb;pdb.set_trace() - raise Exception,e - if commit : - self.commitTransaction() - return database_object.getObjectId() - else: - raise TypeError, "Database : storeObject, parameter database_object,"\ - " should be a DatabaseObject." + #self.rollbackTransaction() + self.log(e, ERROR) + raise Exception, e + else: + return database_object.getObjectId() def getAvailableTypeList(self): """ @@ -600,30 +642,71 @@ return "host : %s:%s\ndatabase : %s\nusername : %s\npassword : %s" \ % ( self.host, self.port, self.database, self.username, password ) - def storeNewObject(self, object, ignore_lock=False): + def storeNewObject(self, object, auto_create_table = 1, extend_if_necessary=0, ignore_lock=False, commit=True): """ store new object will create a new object The object.id property will return. If something Wrong append, it return None """ - raise NotImplementedError, "Database : storeNewObject is an abstract"\ + if commit: + self.startTransaction() + try: + return self._storeNewObject( object=object + , auto_create_table = auto_create_table + , extend_if_necessary = extend_if_necessary + , ignore_lock = ignore_lock ) + except DatabaseWarning, e: + self.log(e, WARNING) + if commit: + self.commitTransaction() + except Exception, e: + if commit: + self.rollbackTransaction() + raise Exception, e + else: + if commit: + self.commitTransaction() + + def _storeNewObject(self, object, auto_create_table = 1, extend_if_necessary=0, ignore_lock=False): + raise NotImplementedError, "Database : _storeNewObject is an abstract"\ " method, it should be redefined." - def replaceObject(self, object, ignore_lock=False): + def replaceObject(self, object, ignore_lock=False, commit=True): """ replaceObject will replace the object with the same ID in the Database. If something Wrong append, it return None """ - raise NotImplementedError, "Database : replaceObject is an abstract"\ + if commit: + self.startTransaction() + try: + return self._replaceObject( object = object + , ignore_lock = ignore_lock) + except DatabaseWarning, e: + self.log(e, WARNING) + if commit: + self.commitTransaction() + except Exception, e: + if commit: + self.rollbackTransaction() + raise Exception, e + else: + if commit: + self.commitTransaction() + def _replaceObject(self, object, ignore_lock=False): + """ + replaceObject will replace the object with the same ID in the Database. + If something Wrong append, it return None + """ + raise NotImplementedError, "Database : _replaceObject is an abstract"\ " method, it should be redefined." def commitTransaction(self): if self.is_transaction_running : - self.log("Commiting Transaction...", 100) + self.log("Commiting Transaction...", IMPORTANT) self.is_transaction_running = False self._commitTransaction() else: - self.log("Trying to commit a transaction but no transaction is running !", 200) + self.log("Trying to commit a transaction but no transaction is running !", WARNING) def _commitTransaction(self): @@ -635,10 +718,10 @@ def startTransaction(self): if not self.is_transaction_running: - self.log("Start a new transaction...", 100) + self.log("Start a new transaction...", IMPORTANT) self.is_transaction_running = True else: - self.log("Trying to start a transaction but a transaction is already running !", 200) + self.log("Trying to start a transaction but a transaction is already running !", WARNING) def _startTransaction(self): """ @@ -652,13 +735,13 @@ from datetime import datetime log_file = open(self.logfilename, 'at') current_date = datetime.today() - if log_level < 100: + if log_level < IMPORTANT: log_level_message = "INFORMATION" - elif log_level < 200 : + elif log_level < WARNING : log_level_message = "IMPORTANT" - elif log_level < 300 : + elif log_level < DEBUG : log_level_message = "WARNING" - elif log_level < 400 : + elif log_level < ERROR : log_level_message = "DEBUG" else : log_level_message = "ERROR" @@ -671,11 +754,11 @@ def rollbackTransaction(self): if self.is_transaction_running : - self.log("RollBack current transaction...", 100) + self.log("RollBack current transaction...", IMPORTANT) self.is_transaction_running = False self._rollbackTransaction() else: - self.log("Trying to RollBack a transaction but no transaction is running !", 200) + self.log("Trying to RollBack a transaction but no transaction is running !", WARNING) def _rollbackTransaction(self): """ Modified: open-commerce/trunk/Database/MysqlDatabase.py =================================================================== --- open-commerce/trunk/Database/MysqlDatabase.py 2007-09-16 12:21:17 UTC (rev 111) +++ open-commerce/trunk/Database/MysqlDatabase.py 2007-09-22 08:26:51 UTC (rev 112) @@ -36,7 +36,7 @@ database=None, port=3306): Database.__init__(self) self.logfilename = "MySQLDatabase.log" - self.min_log_level_to_display = 0 + self.min_log_level_to_display = 200 self.setHost(host) self.setUsername(username) self.setPassword(password) @@ -85,9 +85,7 @@ """ if self.cursor is not None : try : - if self.cursor.execute("SHOW TABLES") : - print "Database number : %s" % self.cursor.execute("SHOW TABLES") - else: + if not self.cursor.execute("SHOW TABLES") : return True except MySQLdb.OperationalError, message: errorMessage = "Error %d:\n%s" % (message[0], message[1] ) @@ -108,12 +106,8 @@ query = "show columns from `%s`;" % object.getTypeName() self.cursor.execute(query) result = self.cursor.fetchall() - #print result - #print query object_property_list = object.getPropertyList() database_property_list = [ elt[0] for elt in result] - #print database_property_list - #print object_property_list # if lists does not have the same len so they're different if len(database_property_list) != len(object_property_list): return False @@ -150,7 +144,6 @@ query = "%s,\n\t`%s` %s" % (query, property_name, self.getConvertedDatabaseType( object.getPropertyType(property_name) ) ) query = "%s\n) ENGINE = %s;" % ( query, self.database_engine) - #print query try : self.log("launching INITIALIZE DATABASE query : %s " % query) self.cursor.execute(query) @@ -355,31 +348,26 @@ raise TypeError, "MysqlDatabase : getObject method, "\ "type_name parameter should be str." - def _deleteObjectList(self, type_name, restriction_list=None,commit=True): + def _deleteObjectList(self, type_name, restriction_list=None): """ Delete list of object on the Database """ object_list = self.getObjectIdList(type_name = type_name, restriction_list = restriction_list) if object_list: - if commit: - self.startTransaction() for (type_name, object_id_list) in object_list.items(): for object_id in object_id_list: - # We should never commit a list of deletion - self.deleteObject(type_name=type_name, object_id=object_id, commit=False) - if commit: - self.commitTransaction() + self._deleteObject(type_name=type_name, object_id=object_id) - def _deleteObject(self, type_name, object_id=None,commit=True): + def _deleteObject(self, type_name, object_id=None): """ Delete one object on the Database """ if isinstance(type_name,DatabaseObject): # In case on submition of object directly we submit # id and type name to delete method - self.deleteObject(type_name = type_name.getTypeName(), object_id = type_name.getObjectId(), commit=commit ) + self._deleteObject(type_name = type_name.getTypeName(), object_id = type_name.getObjectId() ) elif type_name not in ("", [], None) and isinstance(type_name,str) and object_id is not None and isinstance(object_id, (int, long)) : if self.cursor is not None : # We scan relation_table to know if current object @@ -397,11 +385,9 @@ # we will looking for more relation by deleting relation type criterion del control_restriction_dict["relation_id"] object_relation_id_list = self.getObjectIdList("relation_table", restriction_list=control_restriction_dict) - #del object_relation_id_list[] if len(object_relation_id_list["relation_table"]) > len(object_contained_id_list["relation_table"]): - # Rollback transaction and raise an RelatedObjectError - # because object has at least 1 relation different of content - self.rollbackTransaction() + # raise an RelatedObjectError because object + # has at least 1 relation different of content raise RelatedObjectError, "Object %s with id %s cannot be delete, it's"\ " related with another object" % (type_name, object_id) else: @@ -411,7 +397,6 @@ object_relation_id_list = self.getObjectIdList("relation_table", restriction_list=control_restriction_dict) if object_relation_id_list is not None: # RAISE AN ERROR, object has at least 1 relation different of content - self.rollbackTransaction() raise RelatedObjectError, "Object %s with id %s cannot be delete, it's"\ " related with another object" % (type_name, object_id) property_list = self._getStoredPropertyList(type_name = type_name) @@ -421,16 +406,14 @@ restriction_dict["destination"]=object_id restriction_dict["destination_type_name"]=type_name restriction_dict["relation_id"]=content_relation_id - self.deleteObjectList(type_name="relation_table",restriction_list=restriction_dict, commit=False ) + self._deleteObjectList(type_name="relation_table",restriction_list=restriction_dict ) query = "DELETE FROM `%s` WHERE id = %d ;" % (type_name, object_id) try : - if commit: - self.startTransaction() for (type_name, object_id_list) in object_to_delete.getContentList().items(): for object_id in object_id_list: # We delete the object - self.deleteObject(type_name=type_name, object_id=object_id, commit=False) + self._deleteObject(type_name=type_name, object_id=object_id) # It could be usefull to write-lock table on delete action self.log("launching DELETE query : %s " % query) self.cursor.execute(query) @@ -439,17 +422,12 @@ restriction_dict={} restriction_dict["source"]=object_id restriction_dict["source_type_name"]=type_name - self.deleteObjectList(type_name="relation_table",restriction_list=restriction_dict, commit=False ) + self._deleteObjectList(type_name="relation_table",restriction_list=restriction_dict ) - if commit : - self.commitTransaction() - #self.connection.commit() except MySQLdb.OperationalError, message: - self.rollbackTransaction() errorMessage = "Error %d:\n%s\n %s" % (message[0], message[1], query ) raise DatabaseAccessError, errorMessage except MySQLdb.ProgrammingError, message: - self.rollbackTransaction() errorMessage = "Error %d:\n%s\n %s" % (message[0], message[1], query ) raise DatabaseAccessError, errorMessage else: @@ -477,7 +455,6 @@ type_name_list.append(sub_elt) else : type_name_list.append(elt) - #print type_name_list return type_name_list except MySQLdb.OperationalError, message: @@ -555,6 +532,7 @@ "type_name parameter should be str or tuple of string object." def extendDatabaseSpace(self, object): + # TODO: See if it's necessary to launch a transaction here if self.cursor is not None : # First, we control that each alerady existing property type doesn't change # The database Engine doesn't provide the change of already property type @@ -573,7 +551,6 @@ try : self.log("launching ALTER TABLE query : %s " % query) self.cursor.execute(query) - self.connection.commit() except MySQLdb.OperationalError, message: errorMessage = "Error %d:\n%s" % (message[0], message[1] ) raise DatabaseAccessError, errorMessage @@ -586,13 +563,12 @@ "method, cursor is not connected" - def storeNewObject(self, object, auto_create_table = 1, extend_if_necessary=0, ignore_lock=False): + def _storeNewObject(self, object, auto_create_table = 1, extend_if_necessary=0, ignore_lock=False): """ store new object will create a new object The object.id property will be returned. If something wrong append, it return None """ - #FIXME: commit should be used here # If the object does not already exist and we ask to create the table # so we'll do if object.getTypeName() not in self.getAvailableTypeList() and auto_create_table: @@ -638,25 +614,22 @@ self.log("launching STORAGE query : %s " % query) self.cursor.execute(query) inserted_id = self.connection.insert_id() - #if commit : - #self.connection.commit() if isinstance(inserted_id,(long,int)) and inserted_id > 0: object.setObjectId(inserted_id) return inserted_id except MySQLdb.OperationalError, message: self._addError("Error %d:\n%s" % (message[0], message[1] )) - return None + raise else: - print "Warning : MysqlDatabase - storeNewObject method, cursor"\ + raise DatabaseAccessError, "Warning : MysqlDatabase - storeNewObject method, cursor"\ " is not connected ! Unable to store %s Object" % object.getTypeName() - return None - def replaceObject(self, object, ignore_lock=False): + + def _replaceObject(self, object, ignore_lock=False): """ replaceObject will replace the object with the same ID in the Database. If something Wrong append, it return None """ - #FIXME: commit should be used here if self.cursor is not None : query = "UPDATE `%s` SET" % object.getTypeName() @@ -683,14 +656,12 @@ self.log("launching REPLACE query : %s " % query) self.cursor.execute(query) inserted_id = self.connection.insert_id() - #if commit : - #self.connection.commit() return object.getObjectId() except MySQLdb.OperationalError, message: self._addError("Error %d:\n%s" % (message[0], message[1] )) - return None + raise else: - print "Warning : MysqlDatabase - replaceObject method, cursor"\ + raise DatabaseAccessError, "Warning : MysqlDatabase - replaceObject method, cursor"\ " is not connected ! Unable to store %s Object" % object.getTypeName() def _commitTransaction(self): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ope...@li...> - 2007-09-16 12:21:13
|
Revision: 111 http://open-commerce.svn.sourceforge.net/open-commerce/?rev=111&view=rev Author: debrice Date: 2007-09-16 05:21:17 -0700 (Sun, 16 Sep 2007) Log Message: ----------- Replace %% search char to %. Modified Paths: -------------- open-commerce/trunk/Database/test_MysqlDatabase.py Modified: open-commerce/trunk/Database/test_MysqlDatabase.py =================================================================== --- open-commerce/trunk/Database/test_MysqlDatabase.py 2007-09-16 11:56:52 UTC (rev 110) +++ open-commerce/trunk/Database/test_MysqlDatabase.py 2007-09-16 12:21:17 UTC (rev 111) @@ -409,7 +409,7 @@ first_object2_id = self.database.storeObject(object2) second_object2_id = self.database.storeObject(object2bis) third_object2_id = self.database.storeObject(object2ter) - result = self.database.getObjectIdList(("test_2","test_1"), {'name' : '%%rich%%' , 'age' : 5}) + result = self.database.getObjectIdList(("test_2","test_1"), {'name' : '%rich%' , 'age' : 5}) self.assertEqual(result, {'test_2': [2L], 'test_1': [1L]}) def testRelatedRelationDynamicAccessor(self): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ope...@li...> - 2007-09-16 11:56:57
|
Revision: 110 http://open-commerce.svn.sourceforge.net/open-commerce/?rev=110&view=rev Author: debrice Date: 2007-09-16 04:56:52 -0700 (Sun, 16 Sep 2007) Log Message: ----------- Adding new Warning Exception : DatabaseWarning. Modified Paths: -------------- open-commerce/trunk/Database/DatabaseError.py Modified: open-commerce/trunk/Database/DatabaseError.py =================================================================== --- open-commerce/trunk/Database/DatabaseError.py 2007-09-09 16:48:00 UTC (rev 109) +++ open-commerce/trunk/Database/DatabaseError.py 2007-09-16 11:56:52 UTC (rev 110) @@ -30,7 +30,7 @@ __date__ = '2007-09-08' ## Global Database Error -class DatabaseError(IOError): pass +class DatabaseError(Exception): pass ## Indicate errors like "Database can not be reached" class DatabaseAccessError(DatabaseError): pass @@ -53,4 +53,5 @@ ## Indicate an error on adding object to anothers class NotAllowedError(DatabaseRecordError): pass - +## Global Warning Class +class DatabaseWarning(Warning):pass This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ope...@li...> - 2007-09-09 16:47:58
|
Revision: 109 http://open-commerce.svn.sourceforge.net/open-commerce/?rev=109&view=rev Author: debrice Date: 2007-09-09 09:48:00 -0700 (Sun, 09 Sep 2007) Log Message: ----------- Now % is not directly added to search string. Modified Paths: -------------- open-commerce/trunk/Database/MysqlDatabase.py open-commerce/trunk/Database/test_MysqlDatabase.py Modified: open-commerce/trunk/Database/MysqlDatabase.py =================================================================== --- open-commerce/trunk/Database/MysqlDatabase.py 2007-09-09 09:36:38 UTC (rev 108) +++ open-commerce/trunk/Database/MysqlDatabase.py 2007-09-09 16:48:00 UTC (rev 109) @@ -210,7 +210,7 @@ if not isinstance(element, str): where_block.append("`%s`.`%s` = %s" % (filtered_type_name,key,element)) else: - where_block.append("`%s`.`%s` like \"%%%s%%\"" % (filtered_type_name,key,element.replace(';',''))) + where_block.append("`%s`.`%s` like \"%s\"" % (filtered_type_name,key,element.replace(';',''))) where.append(" OR ".join(where_block)) query = "SELECT %s " % select @@ -292,7 +292,7 @@ for (key,value) in restriction_list.items(): #XXX TODO: add tuple test to create OR WHERE clause if isinstance(value, str): - query = "%sAND %s " % (query, "`%s` LIKE \"%%%s%%\"" % (key,value)) + query = "%sAND %s " % (query, "`%s` LIKE \"%s\"" % (key,value)) else: query = "%sAND %s " % (query, "`%s` = %s" % (key,value)) query = query + ";" @@ -527,7 +527,7 @@ for (key,value) in restriction_list.items(): #XXX TODO: add tuple test to create OR WHERE clause if isinstance(value, str): - query = "%sAND %s " % (query, "`%s` LIKE \"%%%s%%\"" % (key,value)) + query = "%sAND %s " % (query, "`%s` LIKE \"%s\"" % (key,value)) else: query = "%sAND %s " % (query, "`%s` = %s" % (key,value)) query = "%s LIMIT %s;" % (query, limit) Modified: open-commerce/trunk/Database/test_MysqlDatabase.py =================================================================== --- open-commerce/trunk/Database/test_MysqlDatabase.py 2007-09-09 09:36:38 UTC (rev 108) +++ open-commerce/trunk/Database/test_MysqlDatabase.py 2007-09-09 16:48:00 UTC (rev 109) @@ -409,7 +409,7 @@ first_object2_id = self.database.storeObject(object2) second_object2_id = self.database.storeObject(object2bis) third_object2_id = self.database.storeObject(object2ter) - result = self.database.getObjectIdList(("test_2","test_1"), {'name' : 'rich' , 'age' : 5}) + result = self.database.getObjectIdList(("test_2","test_1"), {'name' : '%%rich%%' , 'age' : 5}) self.assertEqual(result, {'test_2': [2L], 'test_1': [1L]}) def testRelatedRelationDynamicAccessor(self): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ope...@li...> - 2007-09-09 09:36:34
|
Revision: 108 http://open-commerce.svn.sourceforge.net/open-commerce/?rev=108&view=rev Author: debrice Date: 2007-09-09 02:36:38 -0700 (Sun, 09 Sep 2007) Log Message: ----------- Adding doc to remember to correct transaction management on some method Modified Paths: -------------- open-commerce/trunk/Database/MysqlDatabase.py Modified: open-commerce/trunk/Database/MysqlDatabase.py =================================================================== --- open-commerce/trunk/Database/MysqlDatabase.py 2007-09-09 09:33:57 UTC (rev 107) +++ open-commerce/trunk/Database/MysqlDatabase.py 2007-09-09 09:36:38 UTC (rev 108) @@ -592,6 +592,7 @@ The object.id property will be returned. If something wrong append, it return None """ + #FIXME: commit should be used here # If the object does not already exist and we ask to create the table # so we'll do if object.getTypeName() not in self.getAvailableTypeList() and auto_create_table: @@ -655,6 +656,7 @@ replaceObject will replace the object with the same ID in the Database. If something Wrong append, it return None """ + #FIXME: commit should be used here if self.cursor is not None : query = "UPDATE `%s` SET" % object.getTypeName() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ope...@li...> - 2007-09-09 09:33:55
|
Revision: 107 http://open-commerce.svn.sourceforge.net/open-commerce/?rev=107&view=rev Author: debrice Date: 2007-09-09 02:33:57 -0700 (Sun, 09 Sep 2007) Log Message: ----------- Mass update : - deletion of some stupid try...except (oups...) - adding rollback call on error on some places - now set an object as contain to another reset all contain relation to this one before record content relation, this avoid to store object as content in more than one object - getXXXList should return empty list, not None Modified Paths: -------------- open-commerce/trunk/Database/Database.py open-commerce/trunk/Database/DatabaseObject.py open-commerce/trunk/Database/MysqlDatabase.py open-commerce/trunk/Database/test_DatabaseObject.py open-commerce/trunk/Database/test_MysqlDatabase.py Modified: open-commerce/trunk/Database/Database.py =================================================================== --- open-commerce/trunk/Database/Database.py 2007-09-08 17:21:32 UTC (rev 106) +++ open-commerce/trunk/Database/Database.py 2007-09-09 09:33:57 UTC (rev 107) @@ -35,7 +35,7 @@ from DatabaseObject import DatabaseObject from SearchResult import SearchResult, SearchResultList from Util import deleteDoubledInList -from DatabaseError import DatabaseAccessError, DatabaseRecordError, LockError, RelatedObjectError, DatabaseAlreadyExistError +from DatabaseError import DatabaseAccessError, DatabaseRecordError, LockError, RelatedObjectError, DatabaseAlreadyExistError, AddContentError ## Base class of database engine # @@ -62,6 +62,8 @@ 'boolean':'(bool,)'} def __init__(self): + self.logfilename = "Database.log" + self.min_log_level_to_display = 0 self.is_transaction_running = False self.__host = None self.__username = None @@ -447,12 +449,14 @@ source_type_name = database_object.getTypeName() if source_id is None: raise DatabaseAccessError, "unable to store relation, Current object %s has no ID" % source_type_name + # we want to avoid relation with relation object if source_type_name == "relation" : return for relation_name in database_object.getRelationNameList(): #for each relation, we will save relation into relation table relation_list = database_object.getRelationList(relation_name) - + self.log(relation_list, 300) + self.log(relation_name, 300) # first, we try to get relation if exist restriction_list={} restriction_list['name'] = relation_name @@ -466,105 +470,119 @@ else: relation_id = relation_object.getObjectId() - # We clearing the list before doing any record + # We clearing all relation before doing any record restriction_list={} restriction_list['source'] = source_id restriction_list['source_type_name'] = source_type_name restriction_list['relation_id'] = relation_object.getObjectId() - self.deleteObjectList("relation_table",restriction_list=restriction_list) - + self.deleteObjectList("relation_table",restriction_list=restriction_list, commit=False) + + # We will not allow to store object in two differents + # places, so we test if it is not already contained + # by another object. + if relation_name == "content" : + for (destination_type_name, object_id_list) in relation_list.items(): + for object_id in object_id_list: + restriction_list={} + restriction_list['destination'] = object_id + restriction_list['destination_type_name'] = destination_type_name + restriction_list['relation_id'] = relation_object.getObjectId() + content_relation = self.deleteObjectList("relation_table",restriction_list=restriction_list, commit=False) + #relation_list contain {"type_name",(1,2),...} - if relation_list is not None: - for (destination_type_name, id_list) in relation_list.items(): - if len(id_list): - for destination_id in id_list: - relation_ligne = RelationTable() - relation_ligne.setSource(source_id) - relation_ligne.setSourceTypeName(source_type_name) - relation_ligne.setDestination(destination_id) - relation_ligne.setDestinationTypeName(destination_type_name) - relation_ligne.setRelationId(relation_id) - self.storeObject(relation_ligne, commit=False) + for (destination_type_name, id_list) in relation_list.items(): + if len(id_list): + for destination_id in id_list: + relation_ligne = RelationTable() + relation_ligne.setSource(source_id) + relation_ligne.setSourceTypeName(source_type_name) + relation_ligne.setDestination(destination_id) + relation_ligne.setDestinationTypeName(destination_type_name) + relation_ligne.setRelationId(relation_id) + self.storeObject(relation_ligne, commit=False) def storeObject(self, database_object, ignore_lock=False, commit=True): """ - save object. The method try to know if the object it has already been - save on database by checking it's id. - For new object ID is None else it's an Uint value. + save object. The method try to know if the object has been already + saved on database by checking it's id. """ if isinstance(database_object, DatabaseObject): if database_object.getObjectId() is None: # the object has never been stored + if commit: + self.startTransaction() try: + object_id = self.storeNewObject(database_object, ignore_lock=ignore_lock) + self._storeObjectRelation(database_object) + database_object.database_engine=self + except DatabaseAccessError,e : + self.rollbackTransaction() + raise DatabaseAccessError,e + except EnvironmentError, e: + self.rollbackTransaction() + raise DatabaseAccessError,e + if commit : + self.commitTransaction() + return object_id + # if object is locked in database, we have to test if + # the object is not lock itself (if it's not we are the proprietary of the lock ): + elif self.isLockedObject(database_object): + # We inspect object to know if the object is lock on database and if + # we want to pass through the lock. It's possible that the object + # was unlock before and a locked copy was saved, so we try to know if + # the object is locked or not (to avoid to saved an old revision of document! ) + if not database_object.isLocked(): if commit: self.startTransaction() - try: - object_id = self.storeNewObject(database_object, ignore_lock=ignore_lock) + try : self._storeObjectRelation(database_object) - database_object.database_engine=self + self.replaceObject(database_object, ignore_lock=True) except DatabaseAccessError,e : self.rollbackTransaction() raise DatabaseAccessError,e except EnvironmentError, e: self.rollbackTransaction() raise DatabaseAccessError,e - finally: + except Exception, e: + self.rollbackTransaction() + raise Exception, e if commit : self.commitTransaction() - return object_id + return database_object.getObjectId() + # If we ask to ignore lock : + elif ignore_lock: + return self.replaceObject(database_object, ignore_lock=ignore_lock) + # Else we don't have to store this object + else: + raise LockError, "Database : storeObject "\ + "method, object %s (ID:%s) is locked" % \ + (database_object.getTypeName(), database_object.getObjectId()) else: - # We inspect object to know if the object is lock on database and if - # we want to pass through the lock. It's possible that the object - # was unlock before and a locked copy was saved, so we try to know if - # the object is locked or not (to avoid to saved an old revision of document! ) - if self.isLockedObject(database_object): - # Warning, object is locked in database. We have to test if - # the object is not lock (if it's not it is the proprietary of the lock ): - if not database_object.isLocked(): - try : - if commit: - self.startTransaction() - try : - self._storeObjectRelation(database_object) - self.replaceObject(database_object, ignore_lock=True) - except DatabaseAccessError,e : - self.rollbackTransaction() - raise DatabaseAccessError,e - except EnvironmentError, e: - self.rollbackTransaction() - raise DatabaseAccessError,e - finally: - if commit : - self.commitTransaction() - return database_object.getObjectId() - # If we ask to ignore lock : - elif ignore_lock: - return self.replaceObject(database_object, ignore_lock=ignore_lock) - # Else we don't have to store this object - else: - raise LockError, "Database : storeObject "\ - "method, object %s (ID:%s) is locked" % \ - (database_object.getTypeName(), database_object.getObjectId()) - try : if commit: self.startTransaction() try : self._storeObjectRelation(database_object) self.replaceObject(database_object, ignore_lock=ignore_lock) + except AddContentError, e: + self.rollbackTransaction() + raise AddContentError,e except DatabaseAccessError,e : self.rollbackTransaction() raise DatabaseAccessError,e except EnvironmentError, e: self.rollbackTransaction() raise DatabaseAccessError,e - finally: + except Exception, e: + self.rollbackTransaction() + import pdb;pdb.set_trace() + raise Exception,e if commit : self.commitTransaction() return database_object.getObjectId() else: - raise TypeError, "Database : saveObject, parameter database_object,"\ + raise TypeError, "Database : storeObject, parameter database_object,"\ " should be a DatabaseObject." def getAvailableTypeList(self): @@ -601,37 +619,69 @@ def commitTransaction(self): if self.is_transaction_running : + self.log("Commiting Transaction...", 100) self.is_transaction_running = False self._commitTransaction() + else: + self.log("Trying to commit a transaction but no transaction is running !", 200) + def _commitTransaction(self): """ Commit current Transaction """ - raise NotImplementedError, "Database : commitTransaction is an abstract"\ + raise NotImplementedError, "Database : _commitTransaction is an abstract"\ " method, it should be redefined." def startTransaction(self): if not self.is_transaction_running: + self.log("Start a new transaction...", 100) self.is_transaction_running = True + else: + self.log("Trying to start a transaction but a transaction is already running !", 200) def _startTransaction(self): """ Revert all modification during current Transaction """ - raise NotImplementedError, "Database : commitTransaction is an abstract"\ + raise NotImplementedError, "Database : _startTransaction is an abstract"\ " method, it should be redefined." + + def log(self, message, log_level=0): + if self.logfilename != "" and log_level >= self.min_log_level_to_display: + from datetime import datetime + log_file = open(self.logfilename, 'at') + current_date = datetime.today() + if log_level < 100: + log_level_message = "INFORMATION" + elif log_level < 200 : + log_level_message = "IMPORTANT" + elif log_level < 300 : + log_level_message = "WARNING" + elif log_level < 400 : + log_level_message = "DEBUG" + else : log_level_message = "ERROR" + + current_date_string = "(%s) %s %s : " % (log_level_message, current_date.date(), current_date.time()) + log_file.write(current_date_string) + log_file.write("%s"%message) + log_file.write("\n") + log_file.close() + def rollbackTransaction(self): if self.is_transaction_running : + self.log("RollBack current transaction...", 100) self.is_transaction_running = False self._rollbackTransaction() + else: + self.log("Trying to RollBack a transaction but no transaction is running !", 200) def _rollbackTransaction(self): """ Return list of available type object (like "sale order", "sale invoice"...) """ - raise NotImplementedError, "Database : commitTransaction is an abstract"\ + raise NotImplementedError, "Database : _rollbackTransaction is an abstract"\ " method, it should be redefined." if __name__ == '__main__': Modified: open-commerce/trunk/Database/DatabaseObject.py =================================================================== --- open-commerce/trunk/Database/DatabaseObject.py 2007-09-08 17:21:32 UTC (rev 106) +++ open-commerce/trunk/Database/DatabaseObject.py 2007-09-09 09:33:57 UTC (rev 107) @@ -751,7 +751,7 @@ if isinstance(relation_name, str): if self.relation.has_key(relation_name): if self.relation_table.has_key(relation_name): - return getDictRangeSelection(self.relation_table[relation_name], + return getDictRangeSelection(self.relation_table[relation_name] or {}, start=start, stop=stop) else: Modified: open-commerce/trunk/Database/MysqlDatabase.py =================================================================== --- open-commerce/trunk/Database/MysqlDatabase.py 2007-09-08 17:21:32 UTC (rev 106) +++ open-commerce/trunk/Database/MysqlDatabase.py 2007-09-09 09:33:57 UTC (rev 107) @@ -22,7 +22,6 @@ MysqlDatabase is the MySQL database interface for open-commerce """ - from Database import Database from DatabaseError import DatabaseAccessError, DatabaseRecordError, DatabaseAlreadyExistError, LockError, RelatedObjectError from DatabaseObject import DatabaseObject @@ -36,6 +35,8 @@ def __init__(self, host="localhost", username=None, password="", database=None, port=3306): Database.__init__(self) + self.logfilename = "MySQLDatabase.log" + self.min_log_level_to_display = 0 self.setHost(host) self.setUsername(username) self.setPassword(password) @@ -75,6 +76,7 @@ def disconnect(self): #TODO: Verfy if a connection cannot be closed. + self.log("Closing connection to MySQL Database %s." % self.getDatabase(), 100) self.cursor.close() def isDatabaseEmpty(self): @@ -150,6 +152,7 @@ query = "%s\n) ENGINE = %s;" % ( query, self.database_engine) #print query try : + self.log("launching INITIALIZE DATABASE query : %s " % query) self.cursor.execute(query) except MySQLdb.OperationalError, message: mysqldb_error = "Error %d:\n%s" % ( message[0], message[1] ) @@ -184,9 +187,11 @@ self.connection = MySQLdb.connect(host="localhost", user=self.getUsername(), passwd=self._getPassword(), db=self.getDatabase() ) self.cursor = self.connection.cursor() + self.log("Connection successfull to MySQL database %s." % self.getDatabase(), 100) return 1 - except MySQLdb.OperationalError, message: - mysqldb_error = "Error %d:\n%s" % (message[0], message[1] ) + except MySQLdb.OperationalError, messages: + self.log("Cannot connect to MySQL database : %s." % "\n".join(message), 500) + mysqldb_error = "Error %d:\n%s" % (messages[0], messages[1] ) raise DatabaseAccessError, mysqldb_error def _search(self, type_name, **kw): @@ -232,7 +237,7 @@ query = query + "ORDER BY %s " % ", ".join(order_by_block) query = query + ";" query = query.split('\0')[0] - print query + self.log("launching SEARCH query : %s " % query) self.cursor.execute(query) prop_list = self.cursor.fetchall() if len (prop_list): @@ -293,7 +298,7 @@ query = query + ";" try : - #print query + self.log("launching GET query : %s " % query) self.cursor.execute(query) result = self.cursor.fetchall() new_object = self.getClass(type_name)() @@ -427,6 +432,7 @@ # We delete the object self.deleteObject(type_name=type_name, object_id=object_id, commit=False) # It could be usefull to write-lock table on delete action + self.log("launching DELETE query : %s " % query) self.cursor.execute(query) # and finaly we delete all relation from this object @@ -527,6 +533,7 @@ query = "%s LIMIT %s;" % (query, limit) if self.cursor is not None : try: + self.log("launching GET query : %s " % query) self.cursor.execute(query) result = self.cursor.fetchall() if len(result): @@ -564,6 +571,7 @@ self.getConvertedDatabaseType( object.getPropertyType(property_name) ) ) query = query + ";" try : + self.log("launching ALTER TABLE query : %s " % query) self.cursor.execute(query) self.connection.commit() except MySQLdb.OperationalError, message: @@ -626,6 +634,7 @@ else: query = "%s () VALUES () ;" % query try : + self.log("launching STORAGE query : %s " % query) self.cursor.execute(query) inserted_id = self.connection.insert_id() #if commit : @@ -657,17 +666,19 @@ continue if object.getPropertyValue(key) is not None: property_dict[key] = object.getPropertyValue(key) - - query_property_string = "" + query_property_string_list = [] for (key, value) in property_dict.items(): if isinstance(value, str): - query_property_string = "%s%s " % (query_property_string, "`%s` = `%s`" % (key,value)) + query_property_string_list.append("%s" % ( "`%s` = '%s'" % (key,value.replace("'", "\\'")))) else: - query_property_string = "%s%s " % (query_property_string, "`%s` = %s" % (key,value)) - - query = "%s %sWHERE id = %s ;" % ( query, query_property_string, object_id ) + query_property_string_list.append("%s" % ( "`%s` = %s" % (key,value))) + if len(query_property_string_list): + query = "%s %s WHERE id = %s ;" % ( query, ", ".join(query_property_string_list), object_id ) + else: + return None try : + self.log("launching REPLACE query : %s " % query) self.cursor.execute(query) inserted_id = self.connection.insert_id() #if commit : Modified: open-commerce/trunk/Database/test_DatabaseObject.py =================================================================== --- open-commerce/trunk/Database/test_DatabaseObject.py 2007-09-08 17:21:32 UTC (rev 106) +++ open-commerce/trunk/Database/test_DatabaseObject.py 2007-09-09 09:33:57 UTC (rev 107) @@ -140,7 +140,7 @@ self.assertRaises(KeyError,test_object.emptyRelation,"not_registered_relation") self.assertRaises(TypeError,test_object.emptyRelation,0) self.assertEqual(test_object.getRelation("my_relation"),None) - self.assertEqual(test_object.getRelationList("my_relation"),None) + self.assertEqual(test_object.getRelationList("my_relation"),{}) # Now we will allow unallowed object on the relation "my_relation" test_object.setRelationAllowedTypeName("my_relation",("person","organisation")) Modified: open-commerce/trunk/Database/test_MysqlDatabase.py =================================================================== --- open-commerce/trunk/Database/test_MysqlDatabase.py 2007-09-08 17:21:32 UTC (rev 106) +++ open-commerce/trunk/Database/test_MysqlDatabase.py 2007-09-09 09:33:57 UTC (rev 107) @@ -757,9 +757,10 @@ # This line should move object_2 from object_1 to object_3 self.assertEqual(test_object_3.getContentList(), {test_object_2.getTypeName():(test_object_2.getObjectId(), ) }) - self.assertEqual(test_object_1.getContentList(), None) + self.assertEqual(test_object_1.getContentList(), {}) + self.assertEqual(test_object_1.getContent(), None) - def test_addObjectToItsGrandparent(self): + def test_addGrandparentToItsChildObject(self): """ We will try to add an object to a grandparent object that should not be allowed and raise an AddContentError exception This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ope...@li...> - 2007-09-08 17:21:33
|
Revision: 106 http://open-commerce.svn.sourceforge.net/open-commerce/?rev=106&view=rev Author: debrice Date: 2007-09-08 10:21:32 -0700 (Sat, 08 Sep 2007) Log Message: ----------- Correcting none deletion of relation after object destruction. Modified Paths: -------------- open-commerce/trunk/Database/MysqlDatabase.py Modified: open-commerce/trunk/Database/MysqlDatabase.py =================================================================== --- open-commerce/trunk/Database/MysqlDatabase.py 2007-09-08 17:10:26 UTC (rev 105) +++ open-commerce/trunk/Database/MysqlDatabase.py 2007-09-08 17:21:32 UTC (rev 106) @@ -207,7 +207,7 @@ else: where_block.append("`%s`.`%s` like \"%%%s%%\"" % (filtered_type_name,key,element.replace(';',''))) where.append(" OR ".join(where_block)) - + query = "SELECT %s " % select query = query + "FROM `%s` " % filtered_type_name if len(where): @@ -282,7 +282,7 @@ restriction_list['id'] = object_id property_list = self._getStoredPropertyList(type_name = type_name) query = "SELECT `%s` FROM `%s` WHERE 1=1 " % ("`, `".join(property_list),type_name) - + if isinstance(restriction_list, dict) and restriction_list not in ({},): for (key,value) in restriction_list.items(): #XXX TODO: add tuple test to create OR WHERE clause @@ -291,7 +291,7 @@ else: query = "%sAND %s " % (query, "`%s` = %s" % (key,value)) query = query + ";" - + try : #print query self.cursor.execute(query) @@ -339,7 +339,7 @@ except MySQLdb.ProgrammingError, message: errorMessage = "Error %d:\n%s\n %s" % (message[0], message[1], query ) raise DatabaseAccessError, errorMessage - + except MySQLdb.OperationalError, message: errorMessage = "Error %d:\n%s" % (message[0], message[1] ) raise DatabaseAccessError, errorMessage @@ -410,20 +410,31 @@ raise RelatedObjectError, "Object %s with id %s cannot be delete, it's"\ " related with another object" % (type_name, object_id) property_list = self._getStoredPropertyList(type_name = type_name) + + # We delete all content relation to this object + restriction_dict={} + restriction_dict["destination"]=object_id + restriction_dict["destination_type_name"]=type_name + restriction_dict["relation_id"]=content_relation_id + self.deleteObjectList(type_name="relation_table",restriction_list=restriction_dict, commit=False ) + query = "DELETE FROM `%s` WHERE id = %d ;" % (type_name, object_id) try : if commit: self.startTransaction() for (type_name, object_id_list) in object_to_delete.getContentList().items(): for object_id in object_id_list: - restriction_dict={} - restriction_dict["destination"]=object_id - restriction_dict["destination_type_name"]=type_name - restriction_dict["relation_id"]=content_relation_id - self.deleteObjectList(type_name="relation_table",restriction_list=restriction_dict, commit=False ) + # We delete the object self.deleteObject(type_name=type_name, object_id=object_id, commit=False) # It could be usefull to write-lock table on delete action self.cursor.execute(query) + + # and finaly we delete all relation from this object + restriction_dict={} + restriction_dict["source"]=object_id + restriction_dict["source_type_name"]=type_name + self.deleteObjectList(type_name="relation_table",restriction_list=restriction_dict, commit=False ) + if commit : self.commitTransaction() #self.connection.commit() @@ -466,7 +477,7 @@ except MySQLdb.OperationalError, message: errorMessage = "Error %d:\n%s" % (message[0], message[1] ) raise DatabaseAccessError, errorMessage - + except MySQLdb.OperationalError, message: errorMessage = "Error %d:\n%s" % (message[0], message[1] ) raise DatabaseAccessError, errorMessage @@ -558,7 +569,7 @@ except MySQLdb.OperationalError, message: errorMessage = "Error %d:\n%s" % (message[0], message[1] ) raise DatabaseAccessError, errorMessage - + except MySQLdb.OperationalError, message: errorMessage = "Error %d:\n%s" % (message[0], message[1] ) raise DatabaseAccessError, errorMessage This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ope...@li...> - 2007-09-08 17:10:22
|
Revision: 105 http://open-commerce.svn.sourceforge.net/open-commerce/?rev=105&view=rev Author: debrice Date: 2007-09-08 10:10:26 -0700 (Sat, 08 Sep 2007) Log Message: ----------- Adding a delete test to verifying that relation (content relation only at this time) between 2 objects disapear after object deletion. Modified Paths: -------------- open-commerce/trunk/Database/test_MysqlDatabase.py Modified: open-commerce/trunk/Database/test_MysqlDatabase.py =================================================================== --- open-commerce/trunk/Database/test_MysqlDatabase.py 2007-09-08 16:56:44 UTC (rev 104) +++ open-commerce/trunk/Database/test_MysqlDatabase.py 2007-09-08 17:10:26 UTC (rev 105) @@ -556,8 +556,8 @@ self.database.deleteObject(test_object_3) self.database.deleteObject(test_object_1) # and we should not be able to find test_object_2 - dbobject_1 = self.database.getObject(type_name="TestObject", object_id=test_object_1.getObjectId()) - self.assertEqual(dbobject_1, None) + dbobject_2 = self.database.getObject(type_name="TestObject", object_id=test_object_2.getObjectId()) + self.assertEqual(dbobject_2, None) def test_deleteObject(self): """ @@ -791,6 +791,35 @@ test_object_3.addContent(test_object_1) self.assertRaises(AddContentError, test_object_3.storeObject ) + def test_deleteContent(self): + """ + We will try to add an object to a grandparent object that + should not be allowed and raise an AddContentError exception + """ + class TestObject(DatabaseObject): + """ + This is only a test object ;) + """ + def __init__(self): + DatabaseObject.__init__(self,"TestObject") + self.newRelation("test_relation",("TestObject")) + self.setContentAllowedTypeName("TestObject") + + self.database.addClass(TestObject) + test_object_1 = TestObject() + test_object_2 = TestObject() + + self.database.storeObject(test_object_1) + self.database.storeObject(test_object_2) + + test_object_1.addContent(test_object_2) + test_object_1.storeObject() + + self.database.deleteObject(test_object_2) + + test_object_1 = self.database.getObject(type_name=test_object_1.getTypeName(), object_id=test_object_1.getObjectId()) + + self.assertEqual(test_object_1.getContent(), None ) if __name__ == '__main__': unittest.main() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ope...@li...> - 2007-09-08 16:56:46
|
Revision: 104 http://open-commerce.svn.sourceforge.net/open-commerce/?rev=104&view=rev Author: debrice Date: 2007-09-08 09:56:44 -0700 (Sat, 08 Sep 2007) Log Message: ----------- Adding more code to transactionnal delete test that reveal an error after deleting an linked object. Modified Paths: -------------- open-commerce/trunk/Database/test_MysqlDatabase.py Modified: open-commerce/trunk/Database/test_MysqlDatabase.py =================================================================== --- open-commerce/trunk/Database/test_MysqlDatabase.py 2007-09-08 16:40:16 UTC (rev 103) +++ open-commerce/trunk/Database/test_MysqlDatabase.py 2007-09-08 16:56:44 UTC (rev 104) @@ -552,6 +552,12 @@ self.assertEqual(dbobject_1.getContent(), {dbobject_2.getTypeName():dbobject_2.getObjectId()}) self.assertEqual(dbobject_3.getTestRelation(), {dbobject_2.getTypeName():dbobject_2.getObjectId()}) + # but if we delete test_object_3 we should be able to delete test_object_1 + self.database.deleteObject(test_object_3) + self.database.deleteObject(test_object_1) + # and we should not be able to find test_object_2 + dbobject_1 = self.database.getObject(type_name="TestObject", object_id=test_object_1.getObjectId()) + self.assertEqual(dbobject_1, None) def test_deleteObject(self): """ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ope...@li...> - 2007-09-08 16:40:20
|
Revision: 103 http://open-commerce.svn.sourceforge.net/open-commerce/?rev=103&view=rev Author: debrice Date: 2007-09-08 09:40:16 -0700 (Sat, 08 Sep 2007) Log Message: ----------- Adding DatabaseError file who store database engine exception and DatabaseError exception. Now all exception inherite from DatabaseError exception. Modified Paths: -------------- open-commerce/trunk/Database/Database.py open-commerce/trunk/Database/DatabaseObject.py open-commerce/trunk/Database/MysqlDatabase.py open-commerce/trunk/Database/__init__.py open-commerce/trunk/Database/test_MysqlDatabase.py Added Paths: ----------- open-commerce/trunk/Database/DatabaseError.py Modified: open-commerce/trunk/Database/Database.py =================================================================== --- open-commerce/trunk/Database/Database.py 2007-09-08 16:25:44 UTC (rev 102) +++ open-commerce/trunk/Database/Database.py 2007-09-08 16:40:16 UTC (rev 103) @@ -35,25 +35,8 @@ from DatabaseObject import DatabaseObject from SearchResult import SearchResult, SearchResultList from Util import deleteDoubledInList +from DatabaseError import DatabaseAccessError, DatabaseRecordError, LockError, RelatedObjectError, DatabaseAlreadyExistError -#TODO: implement more generic exception for database -# and create a base class (DatabaseError and DatabaseWarning) - -## Indicate errors like "Database can not be reached" -class DatabaseAccessError(IOError): pass - -## Indicate errors like "Database can not be recorded" -class DatabaseRecordError(IOError): pass - -## Indicate if an object is locked -class LockError(IOError): pass - -## Indicate if an object related to another on delete action -class RelatedObjectError(IOError): pass - -## Indicate if an object already exist on base -class DatabaseAlreadyExistError(IOError): pass - ## Base class of database engine # # Database could not be instancied, she should be inherited from Added: open-commerce/trunk/Database/DatabaseError.py =================================================================== --- open-commerce/trunk/Database/DatabaseError.py (rev 0) +++ open-commerce/trunk/Database/DatabaseError.py 2007-09-08 16:40:16 UTC (rev 103) @@ -0,0 +1,56 @@ +# -*- coding: utf-8 -*- + +""" + Open Commerce - Open Source Small Business solution. + --- + Copyright (c) 2006 by Brice LEROY <br...@op...> + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + --- + Contain all Error related to Database object. + +""" + +__version__ = '0.02' +__author__ = 'Brice LEROY' +__email__ = 'br...@op...' +__credits__ = 'Guido van Rossum, for his excellent programming language.' +__date__ = '2007-09-08' + +## Global Database Error +class DatabaseError(IOError): pass + +## Indicate errors like "Database can not be reached" +class DatabaseAccessError(DatabaseError): pass + +## Indicate errors like "Database can not be recorded" +class DatabaseRecordError(DatabaseError): pass + +## Indicate if an object is locked +class LockError(DatabaseRecordError): pass + +## Indicate if an object related to another on delete action +class RelatedObjectError(DatabaseRecordError): pass + +## Indicate if an object already exist on base +class DatabaseAlreadyExistError(DatabaseRecordError): pass + +## Indicate an error on adding object to anothers +class AddContentError(DatabaseRecordError): pass + +## Indicate an error on adding object to anothers +class NotAllowedError(DatabaseRecordError): pass + + Modified: open-commerce/trunk/Database/DatabaseObject.py =================================================================== --- open-commerce/trunk/Database/DatabaseObject.py 2007-09-08 16:25:44 UTC (rev 102) +++ open-commerce/trunk/Database/DatabaseObject.py 2007-09-08 16:40:16 UTC (rev 103) @@ -31,13 +31,9 @@ __date__ = '2007-02-12' from Util import getDictRangeSelection, addOnceEachItem +from DatabaseError import AddContentError, NotAllowedError -## Indicate an error on adding object to anothers -class AddContentError(IOError): pass -## Indicate an error on adding object to anothers -class NotAllowedError(IOError): pass - ## DatabaseObject is the base of each Object intended to be store in Database # # Database Object purpose an interface for object intended to stored. Each object intended Modified: open-commerce/trunk/Database/MysqlDatabase.py =================================================================== --- open-commerce/trunk/Database/MysqlDatabase.py 2007-09-08 16:25:44 UTC (rev 102) +++ open-commerce/trunk/Database/MysqlDatabase.py 2007-09-08 16:40:16 UTC (rev 103) @@ -23,7 +23,8 @@ """ -from Database import Database, DatabaseAccessError, DatabaseRecordError, DatabaseAlreadyExistError, LockError, RelatedObjectError +from Database import Database +from DatabaseError import DatabaseAccessError, DatabaseRecordError, DatabaseAlreadyExistError, LockError, RelatedObjectError from DatabaseObject import DatabaseObject from SearchResult import SearchResult, SearchResultList from Lock import Lock Modified: open-commerce/trunk/Database/__init__.py =================================================================== --- open-commerce/trunk/Database/__init__.py 2007-09-08 16:25:44 UTC (rev 102) +++ open-commerce/trunk/Database/__init__.py 2007-09-08 16:40:16 UTC (rev 103) @@ -33,6 +33,7 @@ 'Database', 'MysqlDataBase', 'DatabaseObject', + 'DatabaseError', 'Lock', 'Relation', 'SearchResult', Modified: open-commerce/trunk/Database/test_MysqlDatabase.py =================================================================== --- open-commerce/trunk/Database/test_MysqlDatabase.py 2007-09-08 16:25:44 UTC (rev 102) +++ open-commerce/trunk/Database/test_MysqlDatabase.py 2007-09-08 16:40:16 UTC (rev 103) @@ -31,8 +31,8 @@ import unittest import MysqlDatabase -from Database import DatabaseAccessError, DatabaseRecordError, DatabaseAlreadyExistError, LockError, RelatedObjectError -from DatabaseObject import DatabaseObject, AddContentError +from DatabaseError import DatabaseAccessError, DatabaseRecordError, DatabaseAlreadyExistError, LockError, RelatedObjectError, AddContentError +from DatabaseObject import DatabaseObject import MySQLdb class TestMysqlDatabase(unittest.TestCase): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ope...@li...> - 2007-09-08 16:25:44
|
Revision: 102 http://open-commerce.svn.sourceforge.net/open-commerce/?rev=102&view=rev Author: debrice Date: 2007-09-08 09:25:44 -0700 (Sat, 08 Sep 2007) Log Message: ----------- Adding DatabaseRecordError en special recording error. Modified Paths: -------------- open-commerce/trunk/Database/Database.py open-commerce/trunk/Database/MysqlDatabase.py open-commerce/trunk/Database/test_MysqlDatabase.py Modified: open-commerce/trunk/Database/Database.py =================================================================== --- open-commerce/trunk/Database/Database.py 2007-09-08 16:12:29 UTC (rev 101) +++ open-commerce/trunk/Database/Database.py 2007-09-08 16:25:44 UTC (rev 102) @@ -42,6 +42,9 @@ ## Indicate errors like "Database can not be reached" class DatabaseAccessError(IOError): pass +## Indicate errors like "Database can not be recorded" +class DatabaseRecordError(IOError): pass + ## Indicate if an object is locked class LockError(IOError): pass Modified: open-commerce/trunk/Database/MysqlDatabase.py =================================================================== --- open-commerce/trunk/Database/MysqlDatabase.py 2007-09-08 16:12:29 UTC (rev 101) +++ open-commerce/trunk/Database/MysqlDatabase.py 2007-09-08 16:25:44 UTC (rev 102) @@ -23,7 +23,7 @@ """ -from Database import Database, DatabaseAccessError, DatabaseAlreadyExistError, LockError, RelatedObjectError +from Database import Database, DatabaseAccessError, DatabaseRecordError, DatabaseAlreadyExistError, LockError, RelatedObjectError from DatabaseObject import DatabaseObject from SearchResult import SearchResult, SearchResultList from Lock import Lock @@ -154,7 +154,7 @@ mysqldb_error = "Error %d:\n%s" % ( message[0], message[1] ) raise DatabaseAccessError, mysqldb_error else: - #XXX FIXME : force is never used + #XXX FIXME: force is never used raise DatabaseAlreadyExistError, "MysqlDatabase : initDatabaseSpace "\ "method, table %s already exist (use force=1 option if you want "\ "to modify existing table)." % object.getTypeName() Modified: open-commerce/trunk/Database/test_MysqlDatabase.py =================================================================== --- open-commerce/trunk/Database/test_MysqlDatabase.py 2007-09-08 16:12:29 UTC (rev 101) +++ open-commerce/trunk/Database/test_MysqlDatabase.py 2007-09-08 16:25:44 UTC (rev 102) @@ -31,7 +31,7 @@ import unittest import MysqlDatabase -from Database import DatabaseAccessError, DatabaseAlreadyExistError, LockError, RelatedObjectError +from Database import DatabaseAccessError, DatabaseRecordError, DatabaseAlreadyExistError, LockError, RelatedObjectError from DatabaseObject import DatabaseObject, AddContentError import MySQLdb @@ -101,7 +101,7 @@ second_object.setObjectId(None) second_object.addProperty("name","string") second_object.setPropertyValue("name", "Albert") - self.assertRaises(DatabaseAccessError, self.database.storeNewObject, second_object, extend_if_necessary=1) + self.assertRaises(DatabaseRecordError, self.database.storeNewObject, second_object, extend_if_necessary=1) def testObjectRelationStorageIntegrity(self): class NewObject(DatabaseObject): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ope...@li...> - 2007-09-08 16:12:34
|
Revision: 101 http://open-commerce.svn.sourceforge.net/open-commerce/?rev=101&view=rev Author: debrice Date: 2007-09-08 09:12:29 -0700 (Sat, 08 Sep 2007) Log Message: ----------- Adding Unit test to avoid adding grandparent to an object. Modified Paths: -------------- open-commerce/trunk/Database/test_MysqlDatabase.py Modified: open-commerce/trunk/Database/test_MysqlDatabase.py =================================================================== --- open-commerce/trunk/Database/test_MysqlDatabase.py 2007-09-03 21:10:45 UTC (rev 100) +++ open-commerce/trunk/Database/test_MysqlDatabase.py 2007-09-08 16:12:29 UTC (rev 101) @@ -32,7 +32,7 @@ import unittest import MysqlDatabase from Database import DatabaseAccessError, DatabaseAlreadyExistError, LockError, RelatedObjectError -from DatabaseObject import DatabaseObject +from DatabaseObject import DatabaseObject, AddContentError import MySQLdb class TestMysqlDatabase(unittest.TestCase): @@ -753,6 +753,38 @@ self.assertEqual(test_object_3.getContentList(), {test_object_2.getTypeName():(test_object_2.getObjectId(), ) }) self.assertEqual(test_object_1.getContentList(), None) - + def test_addObjectToItsGrandparent(self): + """ + We will try to add an object to a grandparent object that + should not be allowed and raise an AddContentError exception + """ + class TestObject(DatabaseObject): + """ + This is only a test object ;) + """ + def __init__(self): + DatabaseObject.__init__(self,"TestObject") + self.newRelation("test_relation",("TestObject")) + self.setContentAllowedTypeName("TestObject") + + self.database.addClass(TestObject) + test_object_1 = TestObject() + test_object_2 = TestObject() + test_object_3 = TestObject() + + self.database.storeObject(test_object_1) + self.database.storeObject(test_object_2) + self.database.storeObject(test_object_3) + + test_object_1.addContent(test_object_2) + test_object_1.storeObject() + + test_object_2.addContent(test_object_3) + test_object_2.storeObject() + + test_object_3.addContent(test_object_1) + self.assertRaises(AddContentError, test_object_3.storeObject ) + + if __name__ == '__main__': unittest.main() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ope...@li...> - 2007-09-03 21:11:40
|
Revision: 100 http://open-commerce.svn.sourceforge.net/open-commerce/?rev=100&view=rev Author: debrice Date: 2007-09-03 14:10:45 -0700 (Mon, 03 Sep 2007) Log Message: ----------- Modifying test to work on database restored object. Modified Paths: -------------- open-commerce/trunk/Database/test_MysqlDatabase.py Modified: open-commerce/trunk/Database/test_MysqlDatabase.py =================================================================== --- open-commerce/trunk/Database/test_MysqlDatabase.py 2007-09-03 21:03:54 UTC (rev 99) +++ open-commerce/trunk/Database/test_MysqlDatabase.py 2007-09-03 21:10:45 UTC (rev 100) @@ -745,9 +745,13 @@ test_object_3.addContent(test_object_2) self.database.storeObject(test_object_3) + # We should take object from database before test content values + test_object_3 = self.database.getObject(test_object_3.getTypeName(), test_object_3.getObjectId()) + test_object_1 = self.database.getObject(test_object_1.getTypeName(), test_object_1.getObjectId()) + # This line should move object_2 from object_1 to object_3 - self.assertEqual(test_object_3.getContent(), {test_object_2.getTypeName():test_object_2.getObjectId() }) - self.assertEqual(test_object_1.getContent(), None) + self.assertEqual(test_object_3.getContentList(), {test_object_2.getTypeName():(test_object_2.getObjectId(), ) }) + self.assertEqual(test_object_1.getContentList(), None) if __name__ == '__main__': This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ope...@li...> - 2007-09-03 21:03:52
|
Revision: 99 http://open-commerce.svn.sourceforge.net/open-commerce/?rev=99&view=rev Author: debrice Date: 2007-09-03 14:03:54 -0700 (Mon, 03 Sep 2007) Log Message: ----------- Adding new test to avoid adding two times the same object to another. Modified Paths: -------------- open-commerce/trunk/Database/test_DatabaseObject.py Modified: open-commerce/trunk/Database/test_DatabaseObject.py =================================================================== --- open-commerce/trunk/Database/test_DatabaseObject.py 2007-09-03 20:46:07 UTC (rev 98) +++ open-commerce/trunk/Database/test_DatabaseObject.py 2007-09-03 21:03:54 UTC (rev 99) @@ -309,5 +309,26 @@ self.assertEqual(len(db_object.getContentList()),1 ) self.assertEqual(db_object.getContentList(),({db_object2.getTypeName():(db_object2.getObjectId(),db_object4.getObjectId())}) ) self.assertRaises(NotAllowedError, db_object.addContent, {"test":(0,1),"not_allowed":(2,)}) + + def test_addSameObjectTwoTimes(self): + # We will try to add the same object two times two an object + class TestObject(DatabaseObject): + """ + Person is a person (hugh ?!) and can be related + with other person and organisation by subordination + relation + """ + def __init__(self): + DatabaseObject.__init__(self,"TestObject") + self.setContentAllowedTypeName("TestObject") + + test_object_1 = TestObject() + test_object_1.setObjectId(2) + test_object_2 = TestObject() + test_object_2.setObjectId(1) + test_object_1.addContent(test_object_2) + test_object_1.addContent(test_object_2) + self.assertEqual(test_object_1.getContentList(), {test_object_2.getTypeName():(test_object_2.getObjectId(), ) }) + if __name__ == '__main__': unittest.main() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ope...@li...> - 2007-09-03 20:46:09
|
Revision: 98 http://open-commerce.svn.sourceforge.net/open-commerce/?rev=98&view=rev Author: debrice Date: 2007-09-03 13:46:07 -0700 (Mon, 03 Sep 2007) Log Message: ----------- Adding test to avoid adding the same object to different object. Modified Paths: -------------- open-commerce/trunk/Database/test_MysqlDatabase.py Modified: open-commerce/trunk/Database/test_MysqlDatabase.py =================================================================== --- open-commerce/trunk/Database/test_MysqlDatabase.py 2007-09-03 20:34:50 UTC (rev 97) +++ open-commerce/trunk/Database/test_MysqlDatabase.py 2007-09-03 20:46:07 UTC (rev 98) @@ -715,5 +715,40 @@ #self.assertEqual(self.database.getObject()) + + def test_addSameObjectToDifferentObject(self): + # We will try to add the same object to different object + class TestObject(DatabaseObject): + """ + Person is a person (hugh ?!) and can be related + with other person and organisation by subordination + relation + """ + def __init__(self): + DatabaseObject.__init__(self,"TestObject") + self.newRelation("test_relation",("TestObject")) + self.setContentAllowedTypeName("TestObject") + + self.database.addClass(TestObject) + test_object_1 = TestObject() + test_object_2 = TestObject() + test_object_3 = TestObject() + + self.database.storeObject(test_object_1) + self.database.storeObject(test_object_2) + self.database.storeObject(test_object_3) + + # We add object 2 to object 1 + test_object_1.addContent(test_object_2) + self.database.storeObject(test_object_1) + # and again object 2 to object 1 + test_object_3.addContent(test_object_2) + self.database.storeObject(test_object_3) + + # This line should move object_2 from object_1 to object_3 + self.assertEqual(test_object_3.getContent(), {test_object_2.getTypeName():test_object_2.getObjectId() }) + self.assertEqual(test_object_1.getContent(), None) + + if __name__ == '__main__': unittest.main() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ope...@li...> - 2007-09-03 20:34:47
|
Revision: 97 http://open-commerce.svn.sourceforge.net/open-commerce/?rev=97&view=rev Author: debrice Date: 2007-09-03 13:34:50 -0700 (Mon, 03 Sep 2007) Log Message: ----------- Set a relation between an object and an not allowed object will now raise NotAllowedError exception. Modified Paths: -------------- open-commerce/trunk/Database/DatabaseObject.py open-commerce/trunk/Database/test_DatabaseObject.py Modified: open-commerce/trunk/Database/DatabaseObject.py =================================================================== --- open-commerce/trunk/Database/DatabaseObject.py 2007-09-03 20:29:30 UTC (rev 96) +++ open-commerce/trunk/Database/DatabaseObject.py 2007-09-03 20:34:50 UTC (rev 97) @@ -35,6 +35,8 @@ ## Indicate an error on adding object to anothers class AddContentError(IOError): pass +## Indicate an error on adding object to anothers +class NotAllowedError(IOError): pass ## DatabaseObject is the base of each Object intended to be store in Database # @@ -551,7 +553,7 @@ raise TypeError,"DatabaseObject : newRelation, the dict database_object "\ "parameter have a bad format. It should be like {'type_name':(1,2,3),'type_name':(2,)}." else: - raise TypeError,"DatabaseObject : setRelation, type %s"\ + raise NotAllowedError,"DatabaseObject : setRelation, type %s"\ " is not allowed for relation %s on %s object." % ( key, relation_name, self.getTypeName()) else: raise TypeError,"DatabaseObject : setRelation, dictionnary key on database_object parameter"\ Modified: open-commerce/trunk/Database/test_DatabaseObject.py =================================================================== --- open-commerce/trunk/Database/test_DatabaseObject.py 2007-09-03 20:29:30 UTC (rev 96) +++ open-commerce/trunk/Database/test_DatabaseObject.py 2007-09-03 20:34:50 UTC (rev 97) @@ -30,7 +30,7 @@ __date__ = '2006-09-11' import unittest -from DatabaseObject import DatabaseObject +from DatabaseObject import DatabaseObject, AddContentError, NotAllowedError class TestDatabaseObject(unittest.TestCase): def setUp(self): @@ -282,9 +282,9 @@ db_object3.setObjectId(2) # It should not be allowed to add object to itself - self.assertRaises(TypeError, db_object.addContent, db_object) + self.assertRaises(AddContentError, db_object.addContent, db_object) # It should not be allowed to add a non-allowed object - self.assertRaises(TypeError, db_object.addContent, db_object3) + self.assertRaises(NotAllowedError, db_object.addContent, db_object3) db_object.addContent(db_object2) self.assertEqual(db_object.getContentList(),({db_object2.getTypeName():(db_object2.getObjectId(),)}) ) @@ -303,11 +303,11 @@ self.assertEqual(db_object.getContentList(),({db_object2.getTypeName():(db_object2.getObjectId(),db_object4.getObjectId())}) ) # Same test but after trying to add a non allowed content type : - self.assertRaises(TypeError, db_object.addContent, db_object3) + self.assertRaises(NotAllowedError, db_object.addContent, db_object3) # Be care : len(db_object.getContentList()) return number of different type name self.assertEqual(len(db_object.getContentList()),1 ) self.assertEqual(db_object.getContentList(),({db_object2.getTypeName():(db_object2.getObjectId(),db_object4.getObjectId())}) ) - self.assertRaises(TypeError, db_object.addContent, {"test":(0,1),"not_allowed":(2,)}) + self.assertRaises(NotAllowedError, db_object.addContent, {"test":(0,1),"not_allowed":(2,)}) if __name__ == '__main__': unittest.main() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ope...@li...> - 2007-09-03 20:29:32
|
Revision: 96 http://open-commerce.svn.sourceforge.net/open-commerce/?rev=96&view=rev Author: debrice Date: 2007-09-03 13:29:30 -0700 (Mon, 03 Sep 2007) Log Message: ----------- Adding an object to itself now raise AddContentError exception. Modified Paths: -------------- open-commerce/trunk/Database/DatabaseObject.py Modified: open-commerce/trunk/Database/DatabaseObject.py =================================================================== --- open-commerce/trunk/Database/DatabaseObject.py 2007-09-03 20:16:20 UTC (rev 95) +++ open-commerce/trunk/Database/DatabaseObject.py 2007-09-03 20:29:30 UTC (rev 96) @@ -32,6 +32,10 @@ from Util import getDictRangeSelection, addOnceEachItem +## Indicate an error on adding object to anothers +class AddContentError(IOError): pass + + ## DatabaseObject is the base of each Object intended to be store in Database # # Database Object purpose an interface for object intended to stored. Each object intended @@ -365,12 +369,13 @@ # will be deleted if current object is deleted. # @param database_object could be list, database_object or dict of object. # @return nothing - # @since 0.02 + # @exception AddContentError Adding object to itself + # @since 0.02 def addContent(self, database_object): #TODO: Ensure that contained object is only contained by one object content = self.getContentList() if database_object is self: - raise TypeError, "addContent : Object cannot be added to itself." + raise AddContentError, "addContent : Object cannot be added to itself." if content is None: self.setContent(database_object) else: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |