[Top][All Lists]
[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):
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- gnue/common/src/datasources/drivers/appserver/a...,
Jan Ischebeck <=