commit-gnue
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

gnue/common/src/datasources/drivers/appserver/a...


From: Jan Ischebeck
Subject: gnue/common/src/datasources/drivers/appserver/a...
Date: Sun, 23 Mar 2003 18:07:05 -0500

CVSROOT:        /cvsroot/gnue
Module name:    gnue
Changes by:     Jan Ischebeck <address@hidden>  03/03/23 18:07:05

Modified files:
        common/src/datasources/drivers/appserver/appserver: Driver.py 

Log message:
        appserver dbdriver now uses the new aooserver api

CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/common/src/datasources/drivers/appserver/appserver/Driver.py.diff?tr1=1.11&tr2=1.12&r1=text&r2=text

Patches:
Index: gnue/common/src/datasources/drivers/appserver/appserver/Driver.py
diff -c gnue/common/src/datasources/drivers/appserver/appserver/Driver.py:1.11 
gnue/common/src/datasources/drivers/appserver/appserver/Driver.py:1.12
*** gnue/common/src/datasources/drivers/appserver/appserver/Driver.py:1.11      
Mon Feb 17 02:32:49 2003
--- gnue/common/src/datasources/drivers/appserver/appserver/Driver.py   Sun Mar 
23 18:07:04 2003
***************
*** 31,62 ****
  
  VERSION="0.0.1"
  
! from gnue.common.datasources import GDataObjects, GConditions
! from gnue.common.apps import GDebug
! from gnue.common.rpc import GComm
  import string
  import types
  import md5
  import sys
  
! class GEASv2_RecordSet(GDataObjects.RecordSet):
!   def setAssoziatedInstance(self,instance):
!     self._instance=instance
      
    def _postChanges(self):
      if self._deleteFlag:
        GDebug.printMesg(5, 'AppServer database driver: Instance deleted')
!       self._instance.delete()
! #      self._instance._close()
  
      if self._insertFlag:      
        GDebug.printMesg(5, 'AppServer database driver: new Instance '+\
                         'created and inserted')
!       self._instance=self._parent._cursor.insertNewInstance()
!       
!     for field in (self._modifiedFlags.keys()):      
!       self._instance.put(field,self._fields[field])
        
      self._updateFlag = 0
      self._insertFlag = 0
      self._deleteFlag = 0
--- 31,213 ----
  
  VERSION="0.0.1"
  
! try:
!   from gnue.common import GDebug,GDataObjects,GConditions,GComm
! except:
!   from gnue.common.datasources import GDataObjects, GConditions
!   from gnue.common.apps import GDebug
!   from gnue.common.rpc import GComm
! 
  import string
  import types
  import md5
  import sys
  
! class GEASv2_Connector:
!   def __init__(self, connectData):
!     
!     user = connectData['_username']
!     passwd = connectData['_password']
! 
!     params = { 'host': connectData['host'],
!                'port': connectData['port'],
!                'transport': connectData['transport']}
!     
!     self._server = GComm.attach(connectData['rpctype'],params)
!     
!     GDebug.printMesg(3,"Setup the link to the session manager")
!     self._sm = self._server.request("Session")
!    
!     #GDebug.printMesg(3,"Get the status of the session manager")
!     #GDebug.printMesg(3,"Status: "+sessionManager.Status())
!     
!     try:
!       GDebug.printMesg(3,"Open Session ...")  
!       GDebug.printMesg(1,"Logging into appserver as user '%s'" % (user))
!       self._sess_id = self._sm.open({'user':user,'password':passwd})
!     except Exception,msg:
!       tmsg = _("Error loging into appserver: %s") % msg
!       raise GDataObjects.ConnectionError, tmsg
!     
!     if self._sess_id == 0:
!       tmsg = _("Error loging into appserver")
!       raise GDataObjects.ConnectionError, tmsg
! 
!     self._updateCursor = GEASv2_UpdateCursor(self)
!      
!   def cursor(self):
!     return self._updateCursor
! 
!   def request(self,table,filter,sort,fieldlist):
!     listid = self._sm.request(self._sess_id,table,filter,sort,fieldlist)
!     return GEASv2_ListCursor(self,listid,fieldlist)
! 
!   def commit(self,classname):
!     self._updateCursor.execute(classname)
!     self._sm.commit(self._sess_id)
!   
!   def rollback(self,classname):
!     self._updateCursor.revert(classname)
!     self._sm.rollback(self._sess_id)
! 
!   def close(self,commit):
!     self._sm.close(self._sess_id,commit)
! 
! class GEASv2_ListCursor:
!   def __init__(self,dataCon,listid,fieldlist):
!     self._dataCon=dataCon
!     self._listid=listid
!     self._fieldlist=fieldlist
!     self._stackpos=0
! 
!   def fetch(self,count=5):
!     if self._stackpos == -1:
!       return []
!     
!     result = self._dataCon._sm.fetch(self._dataCon._sess_id,
!                                      self._listid,self._stackpos,count)
!     if len(result)<count:
!       self._stackpos=-1
!       
!     else:
!       self._stackpos=self._stackpos+len(result)
! 
!     list = []
!     for i in result:
!       # xmlrpc GNURPC driver changes None into 1
!       # so we have to check for None or 1
!       # while (Instance!=None) and (Instance!=1):
!       dict = {}
!       j = 1
!       for fieldName in self._fieldlist:
!         dict[fieldName] = i[j]
!         j=j+1
!         
!       dict["__id__"]=i[0]
!       list.append(dict)      
!     return list
! 
!   def count(self):
!     if not hasattr(self,"_count"):
!       self._count = 
self._dataCon._sm.count(self._dataCon._sess_id,self._listid)
! 
!     return self._count
! 
! class GEASv2_UpdateCursor:
!   def __init__(self,dataCon):
!     self._dataCon=dataCon
!     self._deleteList={}
!     self._updateList={}
!     self._updateKeyList={}
! 
!   def delete(self,classname,id):
!     if not self._deleteList.has_key(classname):
!        self._deleteList[classname]=[]
!        
!     self._deleteList[classname].append(id)
! 
!   def update(self, classname, id, fieldDict):
!     if not self._updateList.has_key(classname):
!        self._updateList[classname]=[]
!        self._updateKeyList[classname]=[]
!     self._updateList[classname].append(fieldDict)
!     self._updateKeyList[classname].append(id)
! 
!   def execute(self,classname):
!     #try:
!       if self._deleteList.has_key(classname): 
!         result = self._dataCon._sm.delete(self._dataCon._sess_id,classname,
!                                         self._deleteList[classname])
!       
!         self._deleteList[classname]=[]
!       
!     #except:
!     #  return
! 
!    # try:
!       while len(self._updateList[classname]):
!         id = self._updateKeyList[classname].pop()
!         dict = self._updateList[classname].pop()
!         # TODO: merge calls with similar updated fields (=dict.values())
!         result = 
self._dataCon._sm.store(self._dataCon._sess_id,classname,[id],
!                                          dict.keys(),[dict.values()])
!       
!       self._updateList[classname]=[]
!       self._updateKeyList[classname]=[]
!       
!     #except:
!     #  return
      
+   def revert(self,classname):
+     if self._deleteList.has_key(classname):
+       self._deleteList[classname]=[]
+     if self._updateList.has_key(classname):
+       self._updateList[classname]=[]
+       self._updateKeyList[classname]=[] 
+ 
+ 
+ class GEASv2_RecordSet(GDataObjects.RecordSet):
    def _postChanges(self):
      if self._deleteFlag:
        GDebug.printMesg(5, 'AppServer database driver: Instance deleted')
!       self._parent._update_cursor.delete(self._parent._dataObject.table,
!                                          self._fields["__id__"])
  
      if self._insertFlag:      
        GDebug.printMesg(5, 'AppServer database driver: new Instance '+\
                         'created and inserted')
!       ## Set __id__ to "0" for new instances
!       self._parent._update_cursor.update(self._parent._dataObject.table,
!                                          0, self._fields)
        
+     elif self._updateFlag:
+       modifiedFields={}
+       for field in (self._modifiedFlags.keys()):
+         modifiedFields[field]=self._fields[field]
+         
+       self._parent._update_cursor.update(self._parent._dataObject.table,
+                                          self._fields["__id__"], 
modifiedFields)
+             
      self._updateFlag = 0
      self._insertFlag = 0
      self._deleteFlag = 0
***************
*** 64,70 ****
    # this function calls a per entry function on server side
    def callFunc(self,name,params):
      if hasattr(self,"_instance"):
!       self._instance.call(name,params)
      else:
        print ("BUG: Function %s could not be called on a newly created and 
not"+
               "commited object (this has to be fixed)") % name
--- 215,221 ----
    # this function calls a per entry function on server side
    def callFunc(self,name,params):
      if hasattr(self,"_instance"):
!       self._parent._dataObject._dataConnection.call(name,params)
      else:
        print ("BUG: Function %s could not be called on a newly created and 
not"+
               "commited object (this has to be fixed)") % name
***************
*** 86,200 ****
      GDataObjects.ResultSet.__init__(
             self,dataObject,cursor,defaultValues,masterRecordSet)
      self._recordSetClass = GEASv2_RecordSet
-     
-     # Populate field names
-     self._fieldNames = self._dataObject.getFields(self._dataObject.table)    
- 
      GDebug.printMesg(5, 'ResultSet created')
  
- 
    def _loadNextRecord(self): 
      if self._cursor:
!    
!       # Populate the result set
!     
!       # load all instances into the cache
        
!       Instance=self._cursor.nextInstance()
!       dict = {}
!         
!       # xmlrpc GNURPC driver changes None into 1
!       # so we have to check for None or 1
!       while (Instance!=None) and (Instance!=1):
!         dict = {}
!         for fieldName in self._fieldNames:
!             dict[fieldName] = Instance.get(fieldName)
!             
!         record=self._recordSetClass(parent=self,initialData=dict)
!         record.setAssoziatedInstance(Instance)
!         self._cachedRecords.append (record)
  
!         # increase record count by one
!         # (should be replaced by a geasList.getQueryCount() later)
!         self._recordCount=self._recordCount+1
  
!         # try to load next instance
!         Instance=self._cursor.nextInstance()
  
!       # check if an record has added to the cache
!       if dict != {}:
!         return 1 
  
      # if no record returned return a zero
!     return 0
!     
!   # Post changes to the database
!   # similar function like in GDataObjects, just with an missing line
!   def post(self, foreign_keys={}):
!     # post our changes
! 
!     recordPosition = 0
!     while recordPosition < len(self._cachedRecords):
!       record = self._cachedRecords[recordPosition]
! 
!       delete = record._emptyFlag or record._deleteFlag
!       if not delete:
!         # Flip the flag for 'default' values to true so that hidden
!         # default fields are included in insert statements
!         if record.isPending():
!           for field in self._dataObject._defaultValues.keys():
!             record._modifiedFlags[field] = 1
! 
!         for field in foreign_keys.keys():
!           record._fields[field] = foreign_keys[field]
!           # Some DBs will throw an exception if you update a Primary Key
!           # (even if you are updating to the same value)
!           if record._insertFlag:
!             record._modifiedFlags[field] = 1
! 
!         recordPosition += 1
!       else:
!         # Adjust the current record if a preceding record
!         # or the current record is deleted
!         if recordPosition <= self._currentRecord:
!           self._currentRecord -= 1
!         self._cachedRecords.pop(recordPosition)
!         self._recordCount -= 1
! 
!       record.post()
! 
!     # Move to record 0 if all preceding records were deleted
!     # (or set to -1 if all records were deleted)
!     if self._currentRecord < 0:
!       if len(self._cachedRecords):
!         self._currentRecord = 0
!       else:
!         self._currentRecord = -1
  
  
  class GEASv2_DataObject(GDataObjects.DataObject):
-   # ConditionalName (min args, max args, field creation, bypass function )
-   #
-   # Commented out conditionals are a bad thing
-   conditionElements = {
-        'add':             (2, 999, None,                   'None'      ),
-        'sub':             (2, 999, None,                   'None'      ),
-        'mul':             (2, 999, None,                   'None'      ),
-        'div':             (2, 999, None,                   'None'      ),
-        'and':             (1, 999, None,                   'None'      ),
-        'or':              (2, 999, None,                   'None'      ),
-        'not':             (1,   1, None,                   'None'      ),
-        'negate':          (1,   1, None,                   'None'      ),
-        'eq':              (2,   2, '(%s == %s)',                None     ),
-        'ne':              (2,   2, '(%s != %s)',             None     ),
-        'gt':              (2,   2, '(%s > %s)',              None     ),
-        'ge':              (2,   2, '(%s >= %s)',                None     ),
-        'lt':              (2,   2, '(%s < %s)',                 None     ),
-        'le':              (2,   2, '(%s <= %s)',                None     ),
-        'like':            (2,   2, '(%s LIKE %s)',               None     ),
-        'notlike':         (2,   2, '%s NOT LIKE %s',            None     ),
-        'between':         (3,   3, '%s BETWEEN %s AND %s',      None     )
-        }
  
    def __init__(self):
      GDataObjects.DataObject.__init__(self)
--- 237,267 ----
      GDataObjects.ResultSet.__init__(
             self,dataObject,cursor,defaultValues,masterRecordSet)
      self._recordSetClass = GEASv2_RecordSet
      GDebug.printMesg(5, 'ResultSet created')
  
    def _loadNextRecord(self): 
+ 
+     more = 0
      if self._cursor:
!        
!       # load next records into local cache
        
!       instances=self._cursor.fetch()
!       for i in instances:
  
!         more = 1
  
!         record=self._recordSetClass(parent=self,initialData=i)
  
!         self._cachedRecords.append (record)
  
+         self._recordCount=self._recordCount+1
+         
      # if no record returned return a zero
!     return more
  
  
  class GEASv2_DataObject(GDataObjects.DataObject):
  
    def __init__(self):
      GDataObjects.DataObject.__init__(self)
***************
*** 205,272 ****
  
    def connect(self, connectData={}): 
      GDebug.printMesg(1,"AppServer database driver connecting...")
-     # Extract the username and password...
-     user = connectData['_username']
-     passwd = connectData['_password']
- 
-     params = { 'host': connectData['host'],
-                'port': connectData['port'],
-                'transport': connectData['transport']}
-     
-     self._server = GComm.attach( connectData['rpctype'],params)
-     
-     GDebug.printMesg(3,"Setup an link to the session manager")
-     sessionManager = self._server.request("SessionManager")
-     
-     GDebug.printMesg(3,"Get the status of the session manager")
-     GDebug.printMesg(3,"Status: "+sessionManager.Status())
-     
-     GDebug.printMesg(3,"Creating session object ...")  
-     self._session=sessionManager.getNewSession()
- 
-     try:
-       GDebug.printMesg(1,"Logging into appserver as user '%s'" % (user))
-       if (user == 'guest') or (user == ''):
  
!         # TODO: (jcater) I'm not so sure about guest logins. This
!         # TODO: (jcater) should be discussed. At a minimum, I think
!         # TODO: (jcater) we need gnue.conf flags:
!         # TODO: (jcater)     allowGuestLogin = [0|1]
!         # TODO: (jcater)     guestLogin = guest
!         # TODO: (jcater)     allowBlankLogin = [0|1]
!         if not self._session.login(user,passwd):
!           # self._session.close()
!           tmsg = _("Error loging into appserver")
!           raise GDataObjects.ConnectionError, tmsg
!       else:
! 
!         # TODO: (jcater) The GEAS docs say this is not supported and
!         # TODO: (jcater) CORBA-based security should instead be used.
!         # TODO: (jcater) As I don't know jack about CORBA security,
!         # TODO: (jcater) this will have to do for now (even though,
!         # TODO: (jcater) IIRC, is does nothing to validate the user/pass
!         # TODO: (jcater) supplied to it.)
!         if not self._session.login(user,passwd):
!           # self._session.close()
!           tmsg = _("Error loging into appserver")
!           raise GDataObjects.ConnectionError, tmsg
! 
!       self.triggerExtensions =  GEASv2_TriggerExtensions(self._session)
! 
!     except:
!       tmsg = _("Error loging into appserver")
!       raise GDataObjects.ConnectionError, tmsg
    
!  
! 
!     #
!     # Enter transactional mode...
!     #   TODO: (jcater) As transaction support does not yet exist in GEAS, 
!     #   TODO: (jcater) I have no idea if this works, if it will change, 
!     #   TODO: (jcater) or, well, anything for that matter. Think of it  
!     #   TODO: (jcater) as a placeholder.
! #    self._transaction = self._dataConnection.new()
! 
  
    # We only need the basics -- username and password -- to log in
    def getLoginFields(self): 
--- 272,281 ----
  
    def connect(self, connectData={}): 
      GDebug.printMesg(1,"AppServer database driver connecting...")
  
!     self._dataConnection = GEASv2_Connector(connectData)
    
!     self.triggerExtensions =  GEASv2_TriggerExtensions(self._dataConnection)
  
    # We only need the basics -- username and password -- to log in
    def getLoginFields(self): 
***************
*** 296,356 ****
                                  conditions=GConditions.GCimpossible,\
                                  masterRecordSet=masterRecordSet)
  
!   def _createResultSet(self, conditions={}, readOnly=0, masterRecordSet=None):
!     try:
!         self._list = self._session.createList (self.table)
!     except:
!         tmsg = _("Error during creation of object list")
!         raise GDataObjects.ConnectionError, tmsg
    
      GDebug.printMesg (5,"Setting up list object ...");
  
      # the fieldnames seem to be stored in _fieldReferences
      fieldlist=self._fieldReferences.keys()
-     self._list.setPrefetch (fieldlist);
      
      GDebug.printMesg (5,"Using "+str(fieldlist)+" as fieldlist");
! 
      if hasattr(self,"order_by"):
        GDebug.printMesg (5,"Sorting list by fields '"+self.order_by+"'");
        sort=string.splitfields(self.order_by,",")
-       self._list.setSort (sort)
  
      try:
        if conditions:
          GDebug.printMesg (5,"Setting Conditions ...");
!         self._list.setConditions(self._buildQuery(conditions))      
      except self._DatabaseError, err: 
        raise GDataObjects.ConnectionError, err
-   
  
!     GDebug.printMesg (5,"Populating list ...");
!     self._list.populate ()
!     
!     rs = self._resultSetClass(self, cursor=self._list, masterRecordSet=None)
      
      if readOnly: 
        rs._readonly = readOnly
      return rs
  
    def commit(self): 
      GDebug.printMesg (5,"AppServer database driver: commit()")
   
!     try:
!         # at the moment there is only commit on session layer
!         self._session.commit()
!     except self._DatabaseError, value:
!       raise GDataObjects.ConnectionError, value
  
    def rollback(self): 
      GDebug.printMesg (5,"AppServer database driver: rollback()")
  
!     try:
!       # at the moment there is only rollback on session layer
!       self._session.rollback()      
!     except: 
!       tmsg = _("Error during Rollback")
!       raise GDataObjects.ConnectionError, tmsg
  
  ### The folowing methods are not working and just copies from the old geas
  ### driver
--- 305,363 ----
                                  conditions=GConditions.GCimpossible,\
                                  masterRecordSet=masterRecordSet)
  
!   def _createResultSet(self, conditions={}, readOnly=0,
!                        masterRecordSet=None, sql=""):
    
      GDebug.printMesg (5,"Setting up list object ...");
  
+     sort=[]
+     filter=[]
+     
      # the fieldnames seem to be stored in _fieldReferences
      fieldlist=self._fieldReferences.keys()
      
      GDebug.printMesg (5,"Using "+str(fieldlist)+" as fieldlist");
!     
      if hasattr(self,"order_by"):
        GDebug.printMesg (5,"Sorting list by fields '"+self.order_by+"'");
        sort=string.splitfields(self.order_by,",")
  
      try:
        if conditions:
          GDebug.printMesg (5,"Setting Conditions ...");
!         filter = self._buildQuery(conditions)
      except self._DatabaseError, err: 
        raise GDataObjects.ConnectionError, err
  
!     try:
!       listcursor = 
self._dataConnection.request(self.table,filter,sort,fieldlist)
!     except:
!       tmsg = _("Error during creation of object list")
!       raise GDataObjects.ConnectionError, tmsg
! 
!     rs = self._resultSetClass(self, cursor=listcursor, masterRecordSet=None)
      
      if readOnly: 
        rs._readonly = readOnly
+       
      return rs
  
    def commit(self): 
      GDebug.printMesg (5,"AppServer database driver: commit()")
   
!     #try:
!     self._dataConnection.commit(self.table)
!     #except self._DatabaseError, value:
!     #  raise GDataObjects.ConnectionError, value
  
    def rollback(self): 
      GDebug.printMesg (5,"AppServer database driver: rollback()")
  
!     #try:
!     self._dataConnection.rollback(self.table)      
!     #except: 
!     #  tmsg = _("Error during Rollback")
!     #  raise GDataObjects.ConnectionError, tmsg
  
  ### The folowing methods are not working and just copies from the old geas
  ### driver
***************
*** 396,403 ****
  #
  class GEASv2_TriggerExtensions:
  
!   def __init__(self, session):
!     self.__session = session
      
    # Return a sequence number from sequence 'name'
    # def getSequence(self, name):
--- 403,410 ----
  #
  class GEASv2_TriggerExtensions:
  
!   def __init__(self, dataConnection):
!     self._dataCon = dataConnection
      
    # Return a sequence number from sequence 'name'
    # def getSequence(self, name):




reply via email to

[Prev in Thread] Current Thread [Next in Thread]